【目标检测】【深度学习】【Pytorch版本】YOLOV2模型算法详解
文章目录
前言
YOLOV2是由华盛顿大学的Joseph Redmon等人在《YOLO9000:Better, Faster, Stronger【CVPR-2017】》【论文地址】中提出的YOLO系列单阶段目标检测模型的升级改进版,核心思想是在YOLOV1基础上,通过一系列改进措施提升检测性能,即引入批量归一化(Batch Normalization)、使用高分辨率分类器/检查器、设计新的网络结构Darknet-19、采用多尺度训练(Multi-Scale Training)使得YOLOV2在保持高速的同时,大幅提升了检测精度;提出了全卷积的Anchor Boxes机制,借鉴了Faster R-CNN中的区域建议思想,但将其整合到单阶段框架中,避免了复杂的候选区域生成步骤;引入了维度聚类(Dimension Clustering)方法,通过对训练数据中边界框尺寸进行聚类分析,选择最优的Anchor Box形状,从而进一步提高检测效果。
传统目标检测方法以及早期的深度学习模型(如R-CNN系列)虽然在精度上表现出色,但通常存在计算复杂度高、推理速度慢的问题。而YOLOv1虽然以速度见长,但其精度相对较低,尤其是在小目标检测方面效果不足。yolov2较好的解决了yolov1中定位不准确和检测召回率较低的问题,但在小目标检测方面提升有限。
YOLOV2的模型结构
YOLOV2模型的基本执行流程
下图是博主根据原论文绘制了YOLOV2模型流程示意图:
基本流程: 将输入图像调整为固定大小(416x416),使用改进版的Darknet-19作为骨干网络来提取图像的特征(包含了检测框位置、大小、置信度以及分类概率)并划分网格,每个单元网格负责预测一定数量的边界框及其对应的类别概率。
YOLOV2模型的网络参数
YOLOV2网络参数: YOLOV2采用的Darknet-19结构由于没有全连接层,模型的输入可以是任意图片大小,不管是448×448还是224×224,因此可以进行多尺度训练。
19是指有19个Convolutional层,注意这里的YOLOV2模型是非完成版的,还缺少缺少了passthough结构,在YOLOV2的核心思想部分会介绍完整版模型。
YOLOV2模型的训练方式
YOLOV2训练分为两个阶段:
- 在ImageNet分类数据集上预训练分类模型。网络模型的输入先是224x224,训练160轮次;
- 将网络的输入调整为448x448,继续在ImageNet分类数据集上再次训练10轮次;
- 将分类模型调整为检测模型。多尺度训练,动态调整(每训练10个批次随机调整)网络模型的输入尺寸{320×320,352×352,… ,608×608},去除最后一层1×1×1000的卷积层(目的是完成1000分类)和全局平均池化层,并新加入3个3x3x1024卷积层以及1个1×1×125卷积,最后模型的输出为{10×10×125,11×11×125,… ,19×19×125}的向量大小。
输入尺寸取值是32的倍数,最小是320,最大是608,详细原因在后续中会解释。
YOLOV2的核心思想
前向传播阶段
添加Batch Normalization: BN层是在InceptionV2中提出的,具体的原理参考【博文】。
多特征输入数据
X
=
{
x
1
,
x
2
,
x
3
.
.
.
.
x
n
−
1
,
x
n
}
X = \left\{ {{{\rm{x}}_1},{{\rm{x}}_2},{{\rm{x}}_3}....{{\rm{x}}_{{\rm{n - 1}}}},{{\rm{x}}_{\rm{n}}}} \right\}
X={x1,x2,x3....xn−1,xn},每个特征
x
i
x_i
xi都对应着不同的物理含义,每个物理含义的标准通常都不一致,因此不同特征
x
i
x_i
xi对应的数值大小范围千差万别。如下图所示,特征
X
X
X都有与之对应的权重系数
W
=
{
w
1
,
w
2
,
w
3
.
.
.
.
w
n
−
1
,
w
n
}
W = \left\{ {{{\rm{w}}_1},{{\rm{w}}_2},{{\rm{w}}_3}....{{\rm{w}}_{{\rm{n - 1}}}},{{\rm{w}}_{\rm{n}}}} \right\}
W={w1,w2,w3....wn−1,wn},所有特征
x
i
x_i
xi单独乘以各自的权重
w
i
w_i
wi后,再累加得到结果。就结果好坏的影响而言,可能小数值特征
x
1
x_1
x1重要程度比较高,相反,大数值特征
x
4
x_4
x4重要程度比较低,这就要求权重
w
1
w_1
w1恰当的大,保证小数值特征
x
1
x_1
x1的影响力被有效加强,而权重
w
4
w_4
w4恰当的小,保证大数值特征
x
4
x_4
x4的影响力被明显削弱。
这里的 w 1 w_1 w1恰当的大或者 w 4 w_4 w4恰当的小,不是指 w 1 w_1 w1就一定比 w 4 w_4 w4大,只是对于 x 1 x_1 x1和 x 4 x_4 x4, w 1 w_1 w1和 w 4 w_4 w4需要对它们加强或削弱,平衡之后能够有好的输出结果就好。博主在这里举例比较极端是方便大家理解。
权重
W
W
W的更新幅度是由
W
W
W的梯度和学习率相乘计算而来:
W
n
e
w
=
W
o
l
d
−
γ
∂
L
∂
W
{W_{{\rm{new}}}} = {W_{{\rm{old}}}} - \gamma \frac{{\partial L}}{{\partial W}}
Wnew=Wold−γ∂W∂L
γ
\gamma
γ是学习率,决定了我们在梯度方向上迈出的步长大小;
∂
L
∂
W
\frac{{\partial L}}{{\partial W}}
∂W∂L是损失函数
L
L
L关于权重
W
W
W的偏导数,即梯度;
γ
∂
L
∂
W
\gamma \frac{{\partial L}}{{\partial W}}
γ∂W∂L就是本次权重
W
W
W的更新幅度。
W
W
W更新学习过程中如下图所示:权重
w
1
w_1
w1梯度
∂
L
∂
w
1
\frac{{\partial L}}{{\partial w_1}}
∂w1∂L比较剧烈,大的学习率
γ
\gamma
γ可以得出尽可能大的更新幅度
γ
∂
L
∂
w
1
\gamma \frac{{\partial L}}{{\partial w_1}}
γ∂w1∂L,尽快移动到最优位置,但由于
w
1
w_1
w1需要恰当的大,因此仍然需要漫长的迭代学习;权重
w
4
w_4
w4的梯度
∂
L
∂
w
4
\frac{{\partial L}}{{\partial w_4}}
∂w4∂L尽管快速变缓,但因为
w
4
w_4
w4需要恰当的小,在大的学习率下更新幅度
γ
∂
L
∂
w
4
\gamma \frac{{\partial L}}{{\partial w_4}}
γ∂w4∂L仍旧比较大,很难准确移动到在最优位置,因此在最优位置反复震荡,更新困难。
为了方便讲解,下图是只关于的 w 1 w_1 w1和 w 4 w_4 w4的简易更新学习流程图,loss最低点代表 w 1 w_1 w1和 w 4 w_4 w4的最佳取值点;圆环表示 w w w的取值区域,越接近loss最低点中心代表 w w w的值越有价值,loss越低。
w 1 w_1 w1的更新是在X轴左右挪动; w 4 w_4 w4的更新是在Y轴上下挪动。
总结,此前深度神经网络训练过程常常伴随以下主要问题:
- 内部协变量偏移:网络中每一层的输入数据分布 X = { x 1 , x 2 , x 3 . . . . x n − 1 , x n } X = \left\{ {{{\rm{x}}_1},{{\rm{x}}_2},{{\rm{x}}_3}....{{\rm{x}}_{{\rm{n - 1}}}},{{\rm{x}}_{\rm{n}}}} \right\} X={x1,x2,x3....xn−1,xn}是一直在发生变化的,因为每一层的输入分布会随着前面层参数的更新而不断变化。以某一层的某个输入特征 x 1 x_1 x1的分布变化为例,之前 x 1 x_1 x1分布范围是0到9,由于前面层参数更新, x 1 x_1 x1的分布范围变成了100到999,导致每一层需要不断适应新的分布,训练过程变得不稳定且缓慢。
- 减少对初始化的依赖:权重的初始化对训练结果有很大影响。假设 w 1 w_1 w1初始值和最优值差距很大,训练过程就很缓慢。
- 学习率的设置:较大的学习率可能会导致训练不稳定甚至发散。 w 1 w_1 w1和 w 4 w_4 w4在学习率上的选择存在着矛盾, w 4 w_4 w4的最优值的取值(如0.008)比较小,当 w 4 w_4 w4的值接近最优值(如0.007)时,适合小学习率进行学习,但此时 w 1 w_1 w1的值与最优值差距甚远,此时仍是大学习率,导致 w 4 w_4 w4更新幅度(如0.005)也很大, w 4 w_4 w4(如0.012)变得糟糕。
BN层的出现,通过规范化每一层的输入数据分布,解决了训练过程中的一些关键问题,从而提升了模型的性能和训练效率。如下图所示,将
X
=
{
x
1
,
x
2
,
x
3
.
.
.
.
x
n
−
1
,
x
n
}
X = \left\{ {{{\rm{x}}_1},{{\rm{x}}_2},{{\rm{x}}_3}....{{\rm{x}}_{{\rm{n - 1}}}},{{\rm{x}}_{\rm{n}}}} \right\}
X={x1,x2,x3....xn−1,xn}中的所有特征都进行归一化,统一不同特征
x
i
x_i
xi数值大小范围标准。即使特征
x
1
x_1
x1重要程度比较高,特征
x
4
x_4
x4重要程度比较低,由于特征间的数值差异极具缩小,因此权重
w
1
w_1
w1和权重
w
4
w_4
w4的差异也不再巨大。
BN层对深度神经网络的作用:
- 缓解内部协变量偏移:通过对每一层的输入进行归一化处理,将其均值和方差调整为固定值,使得每一层的输入分布更加稳定。这样可以减少内部协变量偏移的影响,优化器(如SGD或Adam)在参数空间中的搜索路径变得更加平滑,减少了梯度消失或梯度爆炸的风险,加速模型收敛。
- 更高的学习率:通过规范化输入分布,增强了模型对学习率的鲁棒性。如 w 1 w_1 w1远未达到最优,而 w 4 w_4 w4(如5.8)已接近最优(如6),使用更高的学习率, w 4 w_4 w4更新幅度(如0.9)较大的影响(如0.67)也不是很剧烈,从而整体进一步加速训练。
- 正则化作用:使用小批量的统计信息均值和方差来归一化数据,这引入了一定的噪声,类似于Dropout的效果(但与Dropout不能共用),一定程度上起到了正则化的作用,可以减少过拟合。
全卷积的Anchor boxes(预选框): YOLOV2最后是通过全连接网络直接预测目标位置,YOLOV2在YOLOV1基础上进行了优化改造:
- 网络模型的输入大小由原来的448×448被替换成416×416。检测任务中,目标物体通常出现在图像中心,因此输出特征图的分辨率设定通常为奇数的(如7×7),否则,为偶数时(如8×8),物体的中心点很容易落在网格的角落,不容易确定归属那个小方格(四个小方格)。因此论文作者才更改模型的输入尺寸。
- 移除最后一个池化层,去掉最后的全连接层部分,使得卷积层输出更高分辨率特征图;
- 利用预选框来预测目标的空间位置和类别。YOLOV1是直接预测出物体的检测框大小和坐标,由于目标物体的大小不一,直接根据主干网络提取的信息进行边界检测框大小和坐标的预测存在极大的困难。因此,YOLOV2则借鉴了Faster R-CNN和SSD的做法,基于现有的合理的预选框预测真实的边界检测框,相比YOLOV1直接预测检测框难度大幅降低。
- 将分类和空间检测解耦。YOLOV1每个网格单元的输出深度是30:
(
x
,
y
,
w
,
h
,
c
)
×
2
+
P
{\rm{(x,y,w,h,c)}} \times {\rm{2}}+ P
(x,y,w,h,c)×2+P,现在YOLOV2更改:为125:
(
x
,
y
,
w
,
h
,
c
,
P
)
×
9
{\rm{(x,y,w,h,c,P)}} \times {\rm{9}}
(x,y,w,h,c,P)×9。YOLOV1中2个边界检测框绑定共用一个分类概率P,YOLOV2则是5个边界检测框都有独立的分类概率P,意味着一个网格单元可以检测多个类别。
后续的YOLOV3、YOLOV4以及YOLOV5都是基于anchor box进行预测的,三种尺寸(小128、中256、大512)和三种宽高比例(1:1、1:2、2:1)可以组合成3×3=9种不同的预选框。
预选框–欧式距离聚类: YOLOV2引入Anchor boxes的过程中,相比人为指定Anchor boxes的尺寸比例,原作者提出了自动化的手段,在训练数据集中使用k-means算法得到k个尺寸比例。
手选预选框尺寸,如果先验尺寸分配合理,会加快学习的速度和效果;反之会影响学习的速度和效果。
K-means算法是一种广泛应用于数据挖掘和机器学习领域的典型的基于距离(欧式距离、曼哈顿距离)聚类分析方法。采用距离作为相似性的评价指标,它的目标是将给定的数据集划分为k个簇,其中每个簇的数据都尽可能相似,而不同簇的数据尽可能不同。“k”是用户指定的参数,表示想要划分出的簇的数量。【参考】
YOLOV2使用欧氏距离的K-mean算法获得预选框的步骤如下:
- 1.所有的真实框样本都以左上角为基准点对齐,自定义簇类总数K(5个),并随机选取K个样本(彩色加粗框的中心点)作为簇中心;
- 2.分别计算所有样本框到K个簇中心的欧式距离,即样本框中心点
(
x
i
,
y
i
)
(x_i,y_i)
(xi,yi)到蔟中心点
(
x
k
j
,
y
k
j
)
\left( {{{\rm{x}}_{{\rm{kj}}}}{\rm{,}}{{\rm{y}}_{{\rm{kj}}}}} \right)
(xkj,ykj)的距离,下面展示部分样本框(虚线框)的中心到某个蔟中心点的距离
d
d
d,样本框中心离哪个蔟中心距离更近,就属于个簇中心;
- 3.更新聚类中心,对于每个聚类,计算的所有样本框的中心点的均值作为新的簇中心;
- 4.重复2和3,直到新的中心和原来的中心基本不变化,或者循环次数达到事先规定的次数时,算法结束。获得合适的k个预选框,即根据各个簇中心到左上角对齐点的距离可以计算出预选框的宽高。
存在的问题: 在使用标准欧氏距离进行距离度量时,大真实框和小真实框之间的中心点距离差异导致误差分布不均。核心在于尺度敏感性:对于尺寸较小的框而言,即使中心点的偏移相对很小,这个偏移相对于框的大小来说也是一个显著的变化,如30×30和10×10的小框,中心点的距离是 ( 15 − 5 ) 2 + ( 15 − 5 ) 2 ≈ 14.1 \sqrt {{{(15 - 5)}^2} + {{(15 - 5)}^2}} \approx 14.1 (15−5)2+(15−5)2≈14.1;相反,对于尺寸较大的框,同样(相似)的中心点偏移只代表了较为微小的变化,如130×130和110×110的大框,中心点的距离是 ( 65 − 55 ) 2 + ( 65 − 55 ) 2 ≈ 14.1 \sqrt {{{(65 - 55)}^2} + {{(65 - 55)}^2}} \approx 14.1 (65−55)2+(65−55)2≈14.1。因此,标准欧氏距离并没有考虑框的尺寸差异,大真实框的聚类会比小真实框产生更多的误差。这可能会导致大框被划分到更多的簇,而中小框则被只划分到极少的簇。假设k等于5的情况下,大的box被分成4个簇,而中小的box被分到一个簇中。
预选框–IoU聚类(改进): 为了消除欧式距离对聚类的影响,寻找合理的预选框,利用IoU来进行聚类的评判指标:
d
(
b
o
x
,
c
e
n
t
r
o
i
d
)
=
1
−
I
O
U
(
b
o
x
,
c
e
n
t
r
o
i
d
)
d(box,centroid){\rm{ }} = {\rm{ }}1 - IOU(box,centroid)
d(box,centroid)=1−IOU(box,centroid)
改进后,YOLOV2使用IoU距离的K-mean算法获得预选框的步骤如下:
-
1.所有的真实框样本都以中心点为基准点对齐,自定义簇类总数K(5个),并随机选取K个样本(彩色加粗框的)作为簇中心框;
-
2.分别计算所有样本框与K个簇中心的 I o U IoU IoU,根据样本框与蔟中心框的 I o U IoU IoU计算距离 d d d,下面展示部分样本框(虚线框)的中心到某个蔟中心点的距离 d d d,样本框中心离哪个蔟中心距离更近,就属于个簇中心框;
同样使用 I o U IoU IoU距离进行距离度量,30×30和10×10的小框的距离是 1 − ( 10 × 10 ) ( 30 × 30 ) ≈ 0 . 89 {\rm{1 - }}\frac{{\left( {10 \times {\rm{10}}} \right)}}{{\left( {30 \times 30} \right)}} \approx {\rm{0}}{\rm{.89}} 1−(30×30)(10×10)≈0.89;130×130和110×110的大框的距离是 1 − ( 110 × 110 ) ( 130 × 130 ) ≈ 0 . 28 {\rm{1 - }}\frac{{\left( {110 \times {\rm{110}}} \right)}}{{\left( {130 \times 130} \right)}} \approx {\rm{0}}{\rm{.28}} 1−(130×130)(110×110)≈0.28。可以发现,使用 I o U IoU IoU距离进行距离度量更合理。
-
- 更新聚类中心:对于每个聚类,计算所有分配给它的标注框的平均宽度和高度,并将这些平均值作为新的聚类中心的尺寸。
- 更新聚类中心:对于每个聚类,计算所有分配给它的标注框的平均宽度和高度,并将这些平均值作为新的聚类中心的尺寸。
-
4.重复2和3,直到新的中心框和原来的中心框基本不变化,或者循环次数达到事先规定的次数时,算法结束。获得合适的k个预选框。
需要注意的是,预选框聚类算法的目标是选择一组适合于数据集的先验框尺寸,以便在目标检测任务中能够更好地适应不同大小的目标。聚类算法根据数据集中目标的分布来自动确定先验框的尺寸,以提高检测的准确性和效果。
论文作者在VOC2007数据集(黑色)和COCO数据集(蓝色)中,尝试了1~15个聚类数,最后发现5个(拐点)是最合理的,因为5之后曲线上升变缓了:
位置预测: YOLOV2借鉴了RPN网络利用预选框来预测边界框相对预选框之间的误差补偿(offsets),预测边界框中心点相对于所属网格单元左上角位置的相对偏移值。使用sigmoid函数处理偏移值,将边界框中心点约束在所属网格单元中,网格单元的尺度为1,而偏移值在(0,1)范围内,防止过度偏移:
b
x
=
σ
(
t
x
)
+
c
x
b
y
=
σ
(
t
y
)
+
c
y
b
w
=
p
w
e
t
w
b
h
=
p
h
e
t
h
\begin{array}{l} {b_x} = \sigma ({t_x}) + {c_x}\\ {b_y} = \sigma ({t_y}) + {c_y}\\ {b_w} = {p_w}{e^{{t_w}}}\\ {b_h} = {p_h}{e^{{t_h}}} \end{array}
bx=σ(tx)+cxby=σ(ty)+cybw=pwetwbh=pheth
(
c
x
,
c
y
)
({c_x},{c_y})
(cx,cy)是网格单元的左上角坐标,
p
w
p_w
pw和
p
h
p_h
ph是预选框的宽度与长度,
e
t
w
e^{{t_w}}
etw和
e
t
h
e^{{t_h}}
eth则没有过多约束是因为物体的大小是不受限制的。
RPN网络方法: 预测边界框的实际中心位置 ( x , y ) ({\rm{x,y}}) (x,y)是需要根据预测的缩放值 ( d x , d y ) ({\rm{d}}_x{\rm{,d}}_y) (dx,dy),以及预选框的尺寸 ( w a , h a ) ({w_a}{\rm{,}}{h_a}) (wa,ha)计算而来:
x = x a + ( d x × w a ) y = y a + ( d y × h a ) \begin{array}{l} x = {x_a} + ({d_x} \times {w_a})\\ y = {y_a} + ({d_y} \times {h_a}) \end{array} x=xa+(dx×wa)y=ya+(dy×ha)
x a x_a xa和 y a y_a ya是预选框的中心点, x x x和 y y y是预测框的中心点。但是这种方式计算的偏移值 d x × w a {d_x} \times {w_a} dx×wa是无约束的,预测边界框很容易在任何方向上大范围偏移,每个位置预测的边界框可以落在图片任何位置,这导致模型的不稳定性,需要很长时间训练出正确的offsets。
直通层Passthrough: 将浅层特征图与深层特征图进行融合。输入图像经过多层网络提取特征,最后输出的特征图中较小的对象特征已经不再明显,甚至被忽略掉了。为了更好的检测出较小的对象,最后输出的特征图需要保留一些浅层特征图的细节信息。
Passthrough具体操作:提取Darknet-19最后一个池化层的26×26×512的输入特征图,经过passthrough处理变成4个13×13×256的特征图,再与Darknet-19输出的13×13×1024的特征图连接变成13×13×3072的特征图,最后在这个特征图上做预测。
特征图拆分成四块的方式:抽取原特征图每个2×2的局部区域组成新的特征图,原特征图大小降低4倍,通道数增加4倍。
完整版Darknet-19-检测模型:新增了3个3x3x1024卷积层,同时增加了1个passthrough层,最后使用1x1卷积层输出预测结果。
多尺度训练: YOLOV2模型只使用卷积层和池化层,因此可以实时调整大小,因此应用多尺度训练(输入图像尺寸动态变化),让模型能够鲁棒地运行在不同尺寸的图像上。训练过程中,每10个批次,网络就会随机选择一个新的图像尺寸。
由于YOLOV2模型缩减了32倍,因此图像尺寸范围都是32的倍数 ( 320 , 352 , … , 608 ) (320, 352, …, 608) (320,352,…,608),最小的选项是320×320,最大的是608×608。图像尺寸越大,计算量越大,速度越慢,mAP越大。
反向传播阶段
损失函数: YOLOV2的损失函数公式为:
L
o
s
s
t
=
∑
i
=
0
W
∑
j
=
0
H
∑
k
=
0
A
(
1
M
a
x
I
O
U
<
T
h
r
e
s
h
λ
n
o
o
b
j
(
−
b
i
j
k
o
)
2
+
1
t
<
12800
λ
p
r
i
o
r
∑
r
∈
(
x
,
y
,
w
,
h
)
(
p
r
i
o
r
k
r
−
b
i
j
k
r
)
2
+
1
k
t
r
u
t
h
(
λ
c
o
o
r
d
∑
r
∈
(
x
,
y
,
w
,
h
)
(
t
r
u
t
h
r
−
b
i
j
k
r
)
2
+
λ
o
b
j
(
I
O
U
t
r
u
t
h
r
−
b
i
j
k
o
)
2
+
λ
c
l
a
s
s
∑
c
=
1
C
(
t
r
u
t
h
c
−
b
i
j
k
c
)
2
)
)
Los{s_{\rm{t}}} = \sum\limits_{{\rm{i = 0}}}^W {\sum\limits_{{\rm{j = 0}}}^H {\sum\limits_{{\rm{k = 0}}}^A {\left( {{1_{MaxIOU < Thresh}}{\lambda _{noobj}}{{\left( { - b_{ijk}^o} \right)}^2} + {1_{t < 12800}}{\lambda _{prior}}{{\sum\limits_{r \in (x,y,w,h)} {\left( {prior_k^r - b_{ijk}^r} \right)} }^2} + 1_k^{truth}\left( {{\lambda _{coord}}{{\sum\limits_{r \in (x,y,w,h)} {\left( {trut{h^r} - b_{ijk}^r} \right)} }^2} + {\lambda _{obj}}{{\left( {IOU_{truth}^r - b_{ijk}^o} \right)}^2} + {\lambda _{class}}{{\sum\limits_{c = 1}^C {(trut{h^c} - b_{ijk}^c)} }^2}} \right)} \right)} } }
Losst=i=0∑Wj=0∑Hk=0∑A
1MaxIOU<Threshλnoobj(−bijko)2+1t<12800λpriorr∈(x,y,w,h)∑(priorkr−bijkr)2+1ktruth
λcoordr∈(x,y,w,h)∑(truthr−bijkr)2+λobj(IOUtruthr−bijko)2+λclassc=1∑C(truthc−bijkc)2
- ∑ i = 0 W ∑ j = 0 H \sum\limits_{{\rm{i = 0}}}^W {\sum\limits_{{\rm{j = 0}}}^H {} } i=0∑Wj=0∑H表示遍历所有网格单元并进行累加;
- ∑ k = 0 A {\sum\limits_{{\rm{k = 0}}}^A {} } k=0∑A表示遍历所有预测边界框并进行累加;
背景置信度损失: 如果预测框中的是背景(标签为0),则预测框的置信度尽可能等于0:
1
M
a
x
I
O
U
<
T
h
r
e
s
h
λ
n
o
o
b
j
(
−
b
i
j
k
o
)
2
{{1_{MaxIOU < Thresh}}{\lambda _{noobj}}{{\left( { - b_{ijk}^o} \right)}^2}}
1MaxIOU<Threshλnoobj(−bijko)2
- 1 M a x I O U < T h r e s h {{1_{MaxIOU < Thresh}}} 1MaxIOU<Thresh作为是否是背景的判定条件:计算当前预测框和所有真实框的IOU,假设IOU最大的值MaxIOU小于指定阈值,该预测框就标记为背景;
- λ n o o b j {{\lambda _{noobj}}} λnoobj表示缩放系数,值为1;
- b b b表示预测框,上标表示预测框具体信息,根据下标表示预测框具体序号;
- b i j k o b_{ijk}^o bijko预测框,上标 o o o表示置信度,即是物体的概率。
预选框和预测框的损失: 预选框是从训练集中聚类得来,在训练前期快速学习到预选框的形状。保证模型输出的预测框比较合理。
1
t
<
12800
λ
p
r
i
o
r
∑
r
∈
(
x
,
y
,
w
,
h
)
(
p
r
i
o
r
k
r
−
b
i
j
k
r
)
2
{{1_{t < 12800}}{\lambda _{prior}}{{\sum\limits_{r \in (x,y,w,h)} {\left( {prior_k^r - b_{ijk}^r} \right)} }^2}}
1t<12800λpriorr∈(x,y,w,h)∑(priorkr−bijkr)2
- 1 t < 12800 {{1_{t < 12800}}} 1t<12800表示只在前12800批次内计算,目的是在训练前期使预测框快速学习到 预选框的形状;
- λ p r i o r {{\lambda _{prior}}} λprior表示缩放系数,值为0.01;
- p r i o r k r prior_k^r priorkr预选框,上标 r ∈ ( x , y , w , h ) r \in (x,y,w,h) r∈(x,y,w,h)表示坐标和宽高;
- b i j k r b_{ijk}^r bijkr预测框,上标 r ∈ ( x , y , w , h ) r \in (x,y,w,h) r∈(x,y,w,h)表示坐标和宽高。
预选框和真实框的损失: 预测框中有物体的损失,包括坐标损失,置信度损失以及分类损失。
1
k
t
r
u
t
h
(
λ
c
o
o
r
d
∑
r
∈
(
x
,
y
,
w
,
h
)
(
t
r
u
t
h
r
−
b
i
j
k
r
)
2
+
λ
o
b
j
(
I
O
U
t
r
u
t
h
r
−
b
i
j
k
o
)
2
+
λ
c
l
a
s
s
∑
c
=
1
C
(
t
r
u
t
h
c
−
b
i
j
k
c
)
2
)
{1_k^{truth}\left( {{\lambda _{coord}}{{\sum\limits_{r \in (x,y,w,h)} {\left( {trut{h^r} - b_{ijk}^r} \right)} }^2} + {\lambda _{obj}}{{\left( {IOU_{truth}^r - b_{ijk}^o} \right)}^2} + {\lambda _{class}}{{\sum\limits_{c = 1}^C {(trut{h^c} - b_{ijk}^c)} }^2}} \right)}
1ktruth
λcoordr∈(x,y,w,h)∑(truthr−bijkr)2+λobj(IOUtruthr−bijko)2+λclassc=1∑C(truthc−bijkc)2
-
1
k
t
r
u
t
h
{1_k^{truth}}
1ktruth 表示匹配到真实框的预测框,一个真实框只匹配一个预测框;
计算真实框(橙色实线)位于那个网格单元,将对应网格单元中所有预测框(蓝色虚线)与真实框中心对齐(只考虑形状不考虑坐标位置),在IoU大于阈值的预测框中选择IoU最大的预测框(绿色实线),其他IoU大于阈值的预测框舍弃,小于阈值的预测框计算置信度损失。
- λ c o o r d {{\lambda _{coord}}} λcoord表示定位损失的缩放系数,值为1;
- t r u t h r {trut{h^r}} truthr真实框,上标 r ∈ ( x , y , w , h ) r \in (x,y,w,h) r∈(x,y,w,h)表示坐标和宽高;
- b i j k r b_{ijk}^r bijkr预测框,上标 r ∈ ( x , y , w , h ) r \in (x,y,w,h) r∈(x,y,w,h)表示坐标和宽高;
- λ o b j {{\lambda _{obj}}} λobj表示置信度损失的缩放系数,值为5;
- I O U t r u t h r {IOU_{truth}^r} IOUtruthr表示匹配到真实框与预测框的IoU;
- b i j k o b_{ijk}^o bijko预测框,上标 o o o表示置信度;
- λ c l a s s {{\lambda _{class}}} λclass表示分类损失的缩放系数,值为1;
- t r u t h c {trut{h^c}} truthc真实框,上标 c c c表示类别;
- b i j k c b_{ijk}^c bijkc预测框,上标 c c c表示类别。
总结
尽可能简单、详细的介绍了YOLOV2模型的结构,深入讲解了YOLOV2核心思想。