深度学习 基本理论 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 通过考虑更多的几何因素,能够更准确地评估和优化边界框的位置、尺寸和形状。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码

)">
< <上一篇
下一篇>>