深度学习 基本理论 3 :之物体检测(Anchor base/NMS/softmax/损失函数/BCE/CE/zip

本文主要是介绍深度学习 基本理论 3 :之物体检测(Anchor base/NMS/softmax/损失函数/BCE/CE/zip,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1、 Anchor base和Anchor free

1.1 Anchor base

  1. Anchor base,译为基于锚点的一个物体检测方法,也可以叫做基于一组预定义的框
  2. 模型会预测每个锚点是否存在对象,并预测需要对锚点进行的调整以更好地适应该对象
  3. Anchor base物体检测方法:Fast R-CNN、SSD、YOLO、RetinaNet

1.2 Anchor Free

  1. Anchor Free,无锚点方法则不依赖于预定义的锚点框
  2. 直接在图像的每个空间位置预测对象的存在或对象的特征
  3. CenterNet、CornerNet、FCOS 、DETR

2、NMS基本流程

非极大值抑制(Non-Maximum Suppression, NMS),是当物体检测中同一个物体最后预测出多个候选框的情况,采用NMS后可以有效解决这个问题。

  1. 收集所有边界框
  2. 根据置信度(即预测该框的概率)进行排序
  3. 取出最高置信度的框,与其他所有的框计算IOU
  4. 如果计算出某一个IOU的值,超过设定的阈值(假设是0.5),则认为这个框是重复的,则删除这两个框中置信度比较低的那一个
  5. 重复3-4过程,最终剩下的框全部都是预测的边界框
  6. 这个过程也就是说,置信度最高的那一个框永远都不会被移除,且其他的框也只会与这个框计算IOU值

3、常用的损失函数

3.1 回归

MSE:预测值与真实值差值的平方
MAE:预测值与真实值差值的绝对值

3.2 分类

CE:Cross-EnTropy,二元交叉熵,【(y标签对应的值)乘以(p预测正类别的概率值取对数)的相反数】+【1-(y标签对应的值)乘以(1-p预测正类别的概率值取对数)】的相反数,然后会累加样本数,再除以样本数的就是损失的均值

BCE:Binary Cross-EnTropy,多元交叉熵,(y标签对应的值)乘以(p预测该类别的概率值取对数)的相反数,然后会累加每个类别和样本数,再除以样本数的就是损失的均值

4、BCE和CE除了预测种类个数的区别还有其他区别吗?

BCE通常与sigmoid激活函数一起使用,最后输出是单个神经元,输出预测为正类的概率
CE通常与softmax激活函数一起使用,最后输出是多个神经元,输出每个类别的概率分布

5、两个list变成对应的字典,一个是key一个是values

# Given two lists, one for keys and the other for values, we will convert them into a dictionary.
keys = ['key1', 'key2', 'key3']
values = [1, 2, 3]# Creating the dictionary using zip function
dictionary = dict(zip(keys, values))

6、zip怎么理解和使用

zip 是 Python 中一个非常有用的内置函数,它用于将多个可迭代对象(如列表、元组等)中的元素配对,创建一个新的迭代器。其工作原理可以通过以下几个要点来理解:

  1. 配对元素zip 函数将多个可迭代对象中的对应元素组合在一起,形成一个个元组。例如,如果有两个列表 list1 = [1, 2, 3]list2 = ['a', 'b', 'c']zip(list1, list2) 会生成 [(1, 'a'), (2, 'b'), (3, 'c')]

  2. 不同长度处理:如果可迭代对象的长度不同,zip 会停止于最短的输入序列的末尾。例如,如果一个列表有 3 个元素,另一个列表有 4 个元素,那么 zip 生成的迭代器将只包含 3 个元组

  3. 转换为其他数据结构:虽然 zip 返回的是一个迭代器,但你可以将其转换为列表或字典等其他数据结构。例如,list(zip(list1, list2))dict(zip(list1, list2))

  4. 多个迭代对象zip 不仅限于两个迭代对象,它可以接受任意数量的迭代对象

  5. 解压缩:使用 * 运算符,可以将 zip 的结果“解压缩”回多个独立的序列

下面展示 zip 函数的基本用法:

# 将两个列表压缩成一个由元组组成的列表
list1 = [1, 2, 3]
list2 = ['a', 'b', 'c']
zipped = list(zip(list1, list2))
print(zipped)  # 输出: [(1, 'a'), (2, 'b'), (3, 'c')]# 将两个列表转换为字典
keys = ['key1', 'key2', 'key3']
values = [1, 2, 3]
dictionary = dict(zip(keys, values))
print(dictionary)  # 输出: {'key1': 1, 'key2': 2, 'key3': 3}# 解压缩
pairs = [(1, 'a'), (2, 'b'), (3, 'c')]
numbers, letters = zip(*pairs)
print(numbers)  # 输出: (1, 2, 3)
print(letters)  # 输出: ('a', 'b', 'c')

7、除了交并比(即IOU)还有没有其他计算两个候选框的重叠程度方法

除了交并比(IoU)之外,确实存在其他几种方法来评估和处理目标检测中的边界框重叠情况。这些方法各有特点,适用于不同的场景和需求。以下是一些常见的替代方法:

  1. 交集面积(Intersection Area):直接计算两个边界框的交集面积。
  2. 中心距离(Center Distance)
    • 计算两个边界框中心点之间的距离。
    • 适用于判断边界框是否足够接近,可能用于跟踪或者一些需要边界框位置精确度的应用

8. GIOU:广义交并比

(Generalized Intersection over Union, GIoU),GIoU 在 IoU 的基础上增加了对边界框的尺寸和形状差异的考量,首先计算常规的 IoU,然后找到包含两个边界框的最小闭合区域(通常是一个更大的矩形)

在IoU的计算中,只有当两个边界框存在重叠时,IoU的值才会大于0。这意味着如果两个框不重叠,IoU将始终为0,即使这两个框非常接近。这就是IoU的一个局限性,因为它无法区分“完全不重叠但非常接近”的情况和“相距很远”的情况。

  1. 计算常规IoU:首先计算两个边界框之间的标准IoU。
  2. 找到最小闭合区域:接着,找到能够同时包含这两个边界框的最小闭合矩形区域。
  3. 计算GIoU:GIoU的值是标准IoU减去最小闭合区域与两边界框并集的面积差占最小闭合区域面积的比例。公式可以表示为:

G I o U = I o U − ∣ C − U ∣ ∣ C ∣ GIoU = IoU - \frac{|C - U|}{|C|} GIoU=IoUCCU, 其中,C 是最小闭合区域的面积,U是两边界框并集的面积。

这种计算方式允许GIoU在没有重叠的情况下提供比0更丰富的信息。此时,GIoU不仅表明两个框之间没有重叠(IoU为0),而且还提供了关于它们相对位置和大小的信息。GIoU的值可能小于0,如果两个框完全不重叠但相对较接近,其值将接近0;如果两个框相距很远,其值将更小。

9、DIOU 距离交并比

(Distance Intersection over Union, DIoU)

  • 基本概念:DIoU 除了考虑 IoU 外,还加入了两个边界框中心点之间的距离。
  • 计算方法
    • 计算两个边界框中心点的欧氏距离。
    • 根据中心点距离和 IoU 计算 DIoU。
  • 优点:DIoU 在调整边界框对齐和重叠的同时,还能保持中心点的一致性,特别适用于需要精确中心对齐的应用

10、CIOU完整交并比

(Complete Intersection over Union, CIoU)

  • 基本概念:CIoU 是目前最全面的变体,它考虑了 IoU、中心点距离以及长宽比的一致性。
  • 计算方法
    • 计算 IoU 和两个边界框中心点的距离。
    • 加入对边界框长宽比的考量。
    • 综合这三个因素来计算 CIoU。
  • 优点:CIoU 通过考虑更多的几何因素,能够更准确地评估和优化边界框的位置、尺寸和形状。

这篇关于深度学习 基本理论 3 :之物体检测(Anchor base/NMS/softmax/损失函数/BCE/CE/zip的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/581684

相关文章

Java中Redisson 的原理深度解析

《Java中Redisson的原理深度解析》Redisson是一个高性能的Redis客户端,它通过将Redis数据结构映射为Java对象和分布式对象,实现了在Java应用中方便地使用Redis,本文... 目录前言一、核心设计理念二、核心架构与通信层1. 基于 Netty 的异步非阻塞通信2. 编解码器三、

Java HashMap的底层实现原理深度解析

《JavaHashMap的底层实现原理深度解析》HashMap基于数组+链表+红黑树结构,通过哈希算法和扩容机制优化性能,负载因子与树化阈值平衡效率,是Java开发必备的高效数据结构,本文给大家介绍... 目录一、概述:HashMap的宏观结构二、核心数据结构解析1. 数组(桶数组)2. 链表节点(Node

Java 虚拟线程的创建与使用深度解析

《Java虚拟线程的创建与使用深度解析》虚拟线程是Java19中以预览特性形式引入,Java21起正式发布的轻量级线程,本文给大家介绍Java虚拟线程的创建与使用,感兴趣的朋友一起看看吧... 目录一、虚拟线程简介1.1 什么是虚拟线程?1.2 为什么需要虚拟线程?二、虚拟线程与平台线程对比代码对比示例:三

Python函数作用域与闭包举例深度解析

《Python函数作用域与闭包举例深度解析》Python函数的作用域规则和闭包是编程中的关键概念,它们决定了变量的访问和生命周期,:本文主要介绍Python函数作用域与闭包的相关资料,文中通过代码... 目录1. 基础作用域访问示例1:访问全局变量示例2:访问外层函数变量2. 闭包基础示例3:简单闭包示例4

Redis 基本数据类型和使用详解

《Redis基本数据类型和使用详解》String是Redis最基本的数据类型,一个键对应一个值,它的功能十分强大,可以存储字符串、整数、浮点数等多种数据格式,本文给大家介绍Redis基本数据类型和... 目录一、Redis 入门介绍二、Redis 的五大基本数据类型2.1 String 类型2.2 Hash

Python中isinstance()函数原理解释及详细用法示例

《Python中isinstance()函数原理解释及详细用法示例》isinstance()是Python内置的一个非常有用的函数,用于检查一个对象是否属于指定的类型或类型元组中的某一个类型,它是Py... 目录python中isinstance()函数原理解释及详细用法指南一、isinstance()函数

python中的高阶函数示例详解

《python中的高阶函数示例详解》在Python中,高阶函数是指接受函数作为参数或返回函数作为结果的函数,下面:本文主要介绍python中高阶函数的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录1.定义2.map函数3.filter函数4.reduce函数5.sorted函数6.自定义高阶函数

Python中的sort方法、sorted函数与lambda表达式及用法详解

《Python中的sort方法、sorted函数与lambda表达式及用法详解》文章对比了Python中list.sort()与sorted()函数的区别,指出sort()原地排序返回None,sor... 目录1. sort()方法1.1 sort()方法1.2 基本语法和参数A. reverse参数B.

C#自动化实现检测并删除PDF文件中的空白页面

《C#自动化实现检测并删除PDF文件中的空白页面》PDF文档在日常工作和生活中扮演着重要的角色,本文将深入探讨如何使用C#编程语言,结合强大的PDF处理库,自动化地检测并删除PDF文件中的空白页面,感... 目录理解PDF空白页的定义与挑战引入Spire.PDF for .NET库核心实现:检测并删除空白页

Java Instrumentation从概念到基本用法详解

《JavaInstrumentation从概念到基本用法详解》JavaInstrumentation是java.lang.instrument包提供的API,允许开发者在类被JVM加载时对其进行修改... 目录一、什么是 Java Instrumentation主要用途二、核心概念1. Java Agent