IOU
IOU(Intersection over Union)交并比损失是一种常用于物体检测和语义分割任务中的评价指标和损失函数。它衡量了预测边界框(或掩膜)与真实边界框(或掩膜)之间的重叠程度。IOU的定义如下:交集和并集的比值
IOU
=
Area of Intersection
Area of Union
\text{IOU} = \frac{\text{Area of Intersection}}{\text{Area of Union}}
IOU=Area of UnionArea of Intersection
具体来说,给定两个边界框A和B,IOU是A和B的交集面积除以它们的并集面积。其值范围在0到1之间,值越大表示两个边界框重叠程度越高。
IOU损失
IOU损失的目标是最大化预测边界框与真实边界框的IOU。常见的IOU损失函数包括:
-
1-IOU损失:
L IOU = 1 − IOU L_{\text{IOU}} = 1 - \text{IOU} LIOU=1−IOU
这种损失函数直接最小化1减去IOU,IOU越大,损失越小。 -
GIOU(Generalized IOU)损失:
GIOU是对IOU的改进,考虑了边界框的包围情况。其定义如下:
GIOU = IOU − ∣ C − ( A ∪ B ) ∣ ∣ C ∣ \text{GIOU} = \text{IOU} - \frac{|C-(A \cup B)|}{|C|} GIOU=IOU−∣C∣∣C−(A∪B)∣
其中,C是能够包围A和B的最小矩形。GIOU损失为:
L GIOU = 1 − GIOU L_{\text{GIOU}} = 1 - \text{GIOU} LGIOU=1−GIOU -
DIOU(Distance IOU)和CIOU(Complete IOU)损失:
DIOU和CIOU进一步考虑了边界框中心点之间的距离和长宽比的影响。-
DIOU损失:
DIOU = IOU − ρ 2 ( b , b g ) c 2 \text{DIOU} = \text{IOU} - \frac{\rho^2(b, b_g)}{c^2} DIOU=IOU−c2ρ2(b,bg)
其中, ρ \rho ρ是两个边界框中心点之间的欧氏距离,c 是包围两个边界框的最小矩形的对角线长度。 -
CIOU损失:
CIOU = IOU − ( ρ 2 ( b , b g ) c 2 + α v ) \text{CIOU} = \text{IOU} - \left(\frac{\rho^2(b, b_g)}{c^2} + \alpha v \right) CIOU=IOU−(c2ρ2(b,bg)+αv)
其中, v \ v v 是边界框长宽比的一致性度量, α \alpha α 是一个权重因子。再实际应用中CIOU 损失函数不仅考虑到边界框的重叠区域,中心点距离,还通过惩罚宽高比的不同,进一步提高边界框回归的精度。
-
实际应用
在实际应用中,IOU损失常用于以下场景:
- 物体检测:在训练物体检测模型时,IOU损失可以用来优化模型预测的边界框,使其更贴近真实边界框。
- 语义分割:在语义分割任务中,IOU可以用来衡量预测的掩膜与真实掩膜的重叠程度,从而优化模型的性能。
IOU损失在这些任务中能够有效提高模型的准确性和鲁棒性,尤其是在边界框重叠度较高的情况下表现尤为明显。
MAP
在机器视觉领域,MAP(Mean Average Precision) 是一种常用的评估指标,特别是在目标检测任务中,用于衡量模型在多个类别上的整体性能。MAP 结合了每个类别的平均精度(AP),并对所有类别的AP取均值。
1. 平均精度 (Average Precision, AP)
AP 是用于衡量目标检测模型对某个类别的预测质量的指标。AP 是通过对模型在多个阈值下的 Precision-Recall 曲线进行计算得到的。AP 的计算步骤如下:
- 通过将预测的边界框按照置信度排序。
- 根据每个置信度阈值,计算精度(Precision)和召回率(Recall)。
- 绘制 Precision-Recall 曲线,并计算曲线下的面积,得到 AP。
在机器视觉和目标检测任务中,AP(Average Precision,平均精度) 是评估模型性能的常用指标,特别是衡量模型对单一类别目标的检测效果。AP 的计算结合了 Precision(精度) 和 Recall(召回率),通过绘制 Precision-Recall 曲线,并计算该曲线下的面积,得到 AP。
2. Precision(精度)和 Recall(召回率)
-
精度(Precision) 表示模型预测的正确性,定义为:
Precision = TP TP + FP \text{Precision} = \frac{\text{TP}}{\text{TP} + \text{FP}} Precision=TP+FPTP
其中,TP(True Positive)是正确检测到的目标数,FP(False Positive)是错误检测到的目标数。 -
召回率(Recall) 表示模型能找到的所有正例目标的比例,定义为:
Recall = TP TP + FN \text{Recall} = \frac{\text{TP}}{\text{TP} + \text{FN}} Recall=TP+FNTP
其中,FN(False Negative)是漏检的目标数。
这是核心部分。精度和召回率确实词如其名。
3. Precision-Recall 曲线
在目标检测中,通过改变置信度阈值,可以得到不同的精度和召回率。通过将不同阈值下的精度和召回率绘制成曲线,我们得到 Precision-Recall 曲线。
- 精度-召回率曲线 展示了在不同置信度阈值下的精度和召回率的关系。通常,召回率越高,精度会降低,因为模型会检出更多的目标,但也可能产生更多的错误检测。
4. AP(平均精度)计算
AP 是 Precision-Recall 曲线下的面积(Area Under the Curve, AUC)。具体步骤如下:
- 按置信度对预测结果排序。
- 对每个置信度计算精度和召回率。
- 计算曲线下的面积,即为 AP 值。
5. 不同阈值下的 AP
在目标检测评估中,AP 还会结合 IOU阈值进行评估。例如,PASCAL VOC 数据集使用 IOU > 0.5 作为阈值来计算 AP,称为 AP0.5。而 COCO 数据集则会在不同 IOU 阈值(如 0.5 到 0.95)下计算 AP。
举例说明
其实说了那么多,只要看下面这一个例子就懂了。假设有如下检测结果:
- 正确检测(TP):8个
- 错误检测(FP):2个
- 漏检目标(FN):3个
在某一置信度阈值下,精度为:
Precision
=
8
8
+
2
=
0.80
\text{Precision} = \frac{8}{8 + 2} = 0.80
Precision=8+28=0.80
召回率为:
Recall
=
8
8
+
3
=
0.727
\text{Recall} = \frac{8}{8 + 3} = 0.727
Recall=8+38=0.727
通过绘制多个阈值下的精度-召回率曲线,并计算曲线下的面积,得到 AP 值。
实际应用
AP 是评估单一类别检测效果的重要指标,而 Mean Average Precision (MAP) 则是对多个类别的 AP 取平均,用于衡量模型的总体检测性能。
6. MAP(Mean Average Precision)计算
MAP 是所有类别的 AP 值的平均值。它综合了模型在每个类别上的检测性能,适用于多类别的目标检测任务。
MAP 的公式为:
MAP
=
1
N
∑
i
=
1
N
AP
i
\text{MAP} = \frac{1}{N} \sum_{i=1}^{N} \text{AP}_i
MAP=N1i=1∑NAPi
其中,( N ) 是类别的总数,( \text{AP}_i ) 是第 ( i ) 个类别的平均精度。
举例说明
假设你在目标检测任务中有3个类别:猫、狗和鸟。对于每个类别,你可以计算其 AP 值,例如:
- AP(猫) = 0.85
- AP(狗) = 0.75
- AP(鸟) = 0.90
那么,MAP 就是这三个类别的 AP 的平均值:
MAP
=
0.85
+
0.75
+
0.90
3
=
0.833
\text{MAP} = \frac{0.85 + 0.75 + 0.90}{3} = 0.833
MAP=30.85+0.75+0.90=0.833
实际应用
MAP 在目标检测中广泛应用,如评估模型在 COCO、PASCAL VOC 等数据集上的表现。在这些数据集中,MAP 的计算通常是在不同的 IOU 阈值下进行的。例如,在 PASCAL VOC 中,常用的 IOU 阈值是 0.5,称为 mAP@0.5,而在 COCO 中,评估时使用多个 IOU 阈值(如 mAP@[0.5:0.95])。
这种方式可以更全面地反映模型在不同重叠程度下的检测性能。
损失函数
YOLO(You Only Look Once)的损失函数是核心的组成部分,它结合了边界框预测误差和分类误差,并通过一个综合的损失函数来同时优化目标的定位和分类。YOLO的损失函数由三部分组成:定位损失、置信度损失和分类损失。具体介绍如下:
1. 定位损失(Localization Loss)
定位损失用于衡量预测的边界框与真实边界框之间的差异,它基于边界框的中心坐标 (x, y)
和宽高 (w, h)
的误差计算。YOLO使用了均方误差(MSE)来计算这个损失:
- 对于每个网格中的目标,YOLO会预测该目标的边界框坐标。
- 损失函数的这一部分重点关注中心点坐标
(x, y)
和宽高(w, h)
的准确性。
定位损失 = λ coord ∑ i = 0 S 2 ∑ j = 0 B 1 i j obj [ ( x i − x ^ i ) 2 + ( y i − y ^ i ) 2 + ( w i − w ^ i ) 2 + ( h i − h ^ i ) 2 ] \text{定位损失} = \lambda_{\text{coord}} \sum_{i=0}^{S^2} \sum_{j=0}^{B} \mathbb{1}_{ij}^{\text{obj}} \left[ (x_i - \hat{x}_i)^2 + (y_i - \hat{y}_i)^2 + (w_i - \hat{w}_i)^2 + (h_i - \hat{h}_i)^2 \right] 定位损失=λcoordi=0∑S2j=0∑B1ijobj[(xi−x^i)2+(yi−y^i)2+(wi−w^i)2+(hi−h^i)2]
其中:
- λ coord \lambda_{\text{coord}} λcoord是用于调节定位误差的权重,通常设置为较大的值(如5),因为定位准确性比其他部分更重要。
- 1 i j obj \mathbb{1}_{ij}^{\text{obj}} 1ijobj是指示函数,表示网格中是否有目标存在,如果存在为1,否则为0。
- ( x i , y i , w i , h i ) (x_i, y_i, w_i, h_i) (xi,yi,wi,hi) 是预测的边界框, ( x ^ i , y ^ i , w ^ i , h ^ i ) (\hat{x}_i, \hat{y}_i, \hat{w}_i, \hat{h}_i) (x^i,y^i,w^i,h^i)是真实边界框。
- S 2 S^2 S2 代表了输入图像被划分成的网格数量。在 YOLO 中,输入图像被均匀地划分为 S × S S \times S S×S 的网格(即 S 2 S^2 S2 个小网格)。每个网格都负责检测该区域内是否有目标物体,并预测目标的边界框和类别。通常, S S S 是固定的数值,例如在 YOLOv1 中, S = 7 S=7 S=7,因此图像被划分为 7 × 7 = 49 7 \times 7 = 49 7×7=49 个网格。每个网格会输出目标物体的位置、置信度和类别。
- B B B 代表每个网格预测的边界框的数量。在 YOLO 的模型设计中,每个网格不仅预测一个边界框,而是预测 B B B 个边界框,以适应复杂场景中可能存在多个目标的情况。通常, B B B 是固定的数值,例如在 YOLOv1 中, B = 2 B=2 B=2,即每个网格可以预测 2 个候选边界框。每个边界框包含预测的位置( x , y , w , h x, y, w, h x,y,w,h)和置信度。
2. 置信度损失(Confidence Loss)
置信度损失用于衡量模型预测的边界框是否包含目标以及其置信度的准确性。YOLO输出的每个边界框都带有一个置信度得分,表示这个框中是否有目标及其准确性。置信度损失分为两部分:
- 有目标的置信度损失:网格内确实有目标时,衡量预测框的置信度与真实框是否匹配。
- 无目标的置信度损失:网格内没有目标时,衡量模型在这些区域的预测置信度。
公式如下:
置信度损失 = ∑ i = 0 S 2 ∑ j = 0 B 1 i j obj ( C i − C ^ i ) 2 + λ noobj ∑ i = 0 S 2 ∑ j = 0 B 1 i j noobj ( C i − C ^ i ) 2 \text{置信度损失} = \sum_{i=0}^{S^2} \sum_{j=0}^{B} \mathbb{1}_{ij}^{\text{obj}} \left( C_i - \hat{C}_i \right)^2 + \lambda_{\text{noobj}} \sum_{i=0}^{S^2} \sum_{j=0}^{B} \mathbb{1}_{ij}^{\text{noobj}} \left( C_i - \hat{C}_i \right)^2 置信度损失=i=0∑S2j=0∑B1ijobj(Ci−C^i)2+λnoobji=0∑S2j=0∑B1ijnoobj(Ci−C^i)2
其中:
- C i C_i Ci 是预测的置信度, C ^ i \hat{C}_i C^i是真实的置信度。
- λ noobj \lambda_{\text{noobj}} λnoobj是调节没有目标时的置信度损失的权重,通常设置为较小的值(如0.5),以减少对无目标区域的关注。
3. 分类损失(Classification Loss)
分类损失用于衡量目标类别预测的准确性。每个网格预测多个类别的概率,分类损失通过多类交叉熵损失来衡量预测类别和真实类别之间的差异。
公式如下:
分类损失 = ∑ i = 0 S 2 1 i obj ∑ c ∈ classes ( p i ( c ) − p ^ i ( c ) ) 2 \text{分类损失} = \sum_{i=0}^{S^2} \mathbb{1}_{i}^{\text{obj}} \sum_{c \in \text{classes}} \left( p_i(c) - \hat{p}_i(c) \right)^2 分类损失=i=0∑S21iobjc∈classes∑(pi(c)−p^i(c))2
其中:
- p i ( c ) p_i(c) pi(c) 是第 ( i ) 个网格对类别 c c c 的预测概率, p ^ i ( c ) \hat{p}_i(c) p^i(c)是真实的类别概率。
- 1 i obj \mathbb{1}_{i}^{\text{obj}} 1iobj 表示网格是否包含目标,如果有目标为1,否则为0。
4. 总损失函数
YOLO的总损失函数是上述三部分损失的加权和:
总损失 = λ coord ⋅ 定位损失 + 置信度损失 + 分类损失 \text{总损失} = \lambda_{\text{coord}} \cdot \text{定位损失} + \text{置信度损失} + \text{分类损失} 总损失=λcoord⋅定位损失+置信度损失+分类损失
YOLO通过调节
λ
coord
\lambda_{\text{coord}}
λcoord 和
λ
noobj
\lambda_{\text{noobj}}
λnoobj的权重,使得模型更注重准确定位,同时减少在无目标区域的误报。
通过将定位、置信度和分类损失结合在一起,YOLO能够有效优化目标检测任务,在保证速度的同时提高定位和分类精度。
Batch Normalization
Batch Normalization (BN) 是一种用于加速训练过程并提升模型性能的技术。它通过标准化网络的每一层的输入,减少梯度消失和梯度爆炸的风险,从而使模型在训练过程中更稳定。
1. 标准化每个批次的输入
在每个训练批次中,BN会对输入进行标准化处理,将其均值调整为0,标准差调整为1。公式如下:
x
^
(
k
)
=
x
(
k
)
−
μ
B
(
k
)
σ
B
(
k
)
2
+
ϵ
\hat{x}^{(k)} = \frac{x^{(k)} - \mu_B^{(k)}}{\sqrt{\sigma_B^{(k)2} + \epsilon}}
x^(k)=σB(k)2+ϵx(k)−μB(k)
其中:
- x ( k ) x^{(k)} x(k) 是输入的第 k k k 个特征。
- μ B ( k ) \mu_B^{(k)} μB(k) 和 σ B ( k ) \sigma_B^{(k)} σB(k) 分别是当前批次中第 k k k 个特征的均值和标准差。
- ϵ \epsilon ϵ 是一个小的常数,用于防止分母为0。
2. 缩放和平移
标准化后的值通常被进一步缩放和偏移,以保证网络仍然能够表达原始的非线性:
y ( k ) = γ ( k ) x ^ ( k ) + β ( k ) y^{(k)} = \gamma^{(k)} \hat{x}^{(k)} + \beta^{(k)} y(k)=γ(k)x^(k)+β(k)
其中:
- γ ( k ) \gamma^{(k)} γ(k) 是可学习的缩放参数。
- β ( k ) \beta^{(k)} β(k) 是可学习的平移参数。
3. 加速训练
通过使输入在每层网络中保持均匀的分布,BN能有效减少梯度消失或梯度爆炸现象,从而提高模型的训练速度。
4. 正则化效果
BN还能起到一定的正则化作用,因为每个批次都会引入噪声(由于每批次的均值和标准差不同),这对减少过拟合有帮助。
YOLO中BN的优点
- 稳定训练过程:通过标准化每层输入,模型的梯度更新更加稳定。
- 加快收敛速度:由于网络的每一层输入被标准化,YOLO能够更快速地学习到权重更新。
- 减少对权重初始化的依赖:BN使得模型对参数的初始选择不那么敏感。
- 防止过拟合:在一定程度上,BN引入了噪声,有助于防止模型在训练集上过拟合。
聚类算法
在目标检测中,聚类算法用于提取先验框(或称为锚框、默认框),这些框用来预测目标的边界框。提取先验框的过程通常包括以下步骤:
1. 数据准备
- 收集数据:准备一个标注好的数据集,其中每个图像都包含目标的真实边界框(ground truth boxes)。
- 提取边界框:从数据集中提取所有目标的真实边界框。
2. 聚类算法选择
常用的聚类算法包括:
- K-means聚类:通过最小化目标边界框与聚类中心之间的距离来确定最佳的先验框。
- K-medoids聚类:与K-means类似,但使用实际的数据点作为中心,更具鲁棒性。
- 基于IoU的聚类:根据边界框的交并比(IoU)进行聚类,通常用于生成先验框。
3. K-means聚类算法
以K-means聚类为例,提取先验框的步骤如下:
3.1 确定聚类数量
选择一个适当的聚类数量 K K K,通常是基于经验或者在交叉验证过程中选择的。这个数量代表了我们希望得到的先验框的个数。
3.2 数据准备
将每个真实边界框的宽高(宽度和高度)作为特征输入K-means算法。为了提高K-means的效果,可以将宽高归一化。
3.3 执行K-means算法
- 初始化:随机选择K个边界框作为初始的中心。
- 分配:将每个边界框分配到距离最近的中心。
- 更新:计算每个簇的新中心,即簇中所有边界框的平均值。
- 重复:重复步骤2和3,直到中心不再发生显著变化或达到迭代次数的上限。
3.4 提取先验框
最终的K个聚类中心就是我们提取的先验框。这些先验框将用于目标检测模型的锚框生成,以帮助模型在训练过程中更好地预测目标的边界框。
4. 实际应用
在YOLO等目标检测模型中,这些先验框被用作初始的锚框(anchor boxes),模型通过调整这些框来拟合真实的目标边界框。通过将预测的边界框与这些先验框进行匹配,模型可以更准确地进行目标定位和分类。
感受野
在YOLO(You Only Look Once)中,感受野的设计和选择对于目标检测任务至关重要。YOLO通过卷积神经网络(CNN)对整个输入图像进行一次前向传播,从而直接输出目标的边界框和类别信息。感受野决定了模型中每个神经元在输入图像中的有效感知区域,它影响了模型对目标物体的定位精度以及对图像全局信息的感知能力。
1. YOLO中的感受野概念
在YOLO中,感受野指的是网络中每个输出特征图位置的神经元能够“看到”输入图像的多大区域。由于YOLO模型在网络的输出端使用的是特征图上的网格来预测目标框,因此这些特征点必须感知足够大的输入图像区域,才能准确预测目标的边界框。
- 局部感受野:较浅层的卷积层的感受野较小,主要用于捕捉图像的局部特征,如边缘、纹理等。
- 全局感受野:在较深的层,感受野逐渐扩大,允许模型捕捉到更大的图像上下文,适合对目标的整体进行识别和定位。
2. YOLO网络中的感受野如何扩大
在YOLO中,感受野会随着网络层数的增加而扩大,深层的特征图具有更大的感受野,这对目标检测尤其重要,尤其是对于大物体的检测。YOLO通过以下几种方式来逐步增大感受野:
- 多层卷积堆叠:通过堆叠多个卷积层,YOLO的感受野逐渐增大,每一层的神经元能够感知输入图像的更大区域。
- 卷积核大小:YOLO使用的卷积核(如 3 × 3 3 \times 3 3×3)能够逐渐扩大感受野。卷积核越大,单层的感受野就越大,但计算复杂度也会增加。
- 下采样操作:YOLO使用池化层和步长为2的卷积来减少特征图的分辨率(即下采样),这有助于增大感受野。每次下采样都会将感受野成倍增加,从而允许网络感知更多的全局信息。
3. 感受野对YOLO性能的影响
YOLO的感受野大小直接影响网络的目标检测能力,具体表现如下:
-
精确定位小目标:为了检测小目标,模型需要较大的感受野,以确保特征图上的神经元能够感知到足够的上下文信息。对于小目标,YOLO的多尺度预测机制能够缓解感受野过大的问题。
-
检测大目标:对于大目标,感受野较大时,网络能够捕捉到整个物体的全局特征,这对于准确检测大目标的边界框非常重要。
-
全图上下文信息的利用:较大的感受野帮助YOLO不仅关注目标的局部信息,还能捕捉目标周围的背景信息,有助于提高分类和定位的准确性。
4. YOLO中的感受野优化
YOLO通过多尺度特征预测和感受野的设计来平衡对小目标和大目标的检测能力。以下是YOLO中对感受野的优化方式:
-
多尺度预测:YOLOv3引入了多尺度预测机制,即在不同的特征图上进行目标检测。较深层的特征图具有更大的感受野,适合检测大目标;而较浅层的特征图感受野较小,适合检测小目标。
-
FPN(Feature Pyramid Network)结构:从YOLOv4开始,模型引入了FPN结构,使得不同尺度的特征图之间能够共享信息,从而更好地利用不同层次的感受野来检测不同尺寸的目标。
5. YOLO感受野的局限与挑战
虽然YOLO的感受野通过深层卷积和多尺度特征预测得到了有效增大,但它也有一定的局限性:
- 小物体检测的挑战:对于特别小的物体,感受野的扩大可能会导致背景信息过多,反而影响小物体的检测效果。
- 极大和极小目标的兼容性:增大感受野有助于大物体的检测,但可能会损害小物体的定位能力,因此感受野的设计需要在不同目标尺寸之间进行平衡。
个人总结
YOLO通过多层卷积、下采样和多尺度特征预测等机制来逐渐增大感受野,从而确保模型能够有效地检测不同大小的目标。感受野通俗理解,就是卷积时所能处理的内容,因此将图片池化(缩小面积),增大卷积核,多层卷积,都能扩大感受野。
以上内容来自chatGPT和草履虫都能学会!OpenCV+YOLO 实时目标检测,计算机博士手把手带你做毕设!(深度学习丨计算机视觉丨YOLO丨OpenCV)和自己的理解。发现反正都要做笔记,优快云这种东西非常适合,还能在线保存,很好,以后多些积累。