yolov2
一、模型简介
yolov2是yolov1的升级版,yolov1主要存在如下的缺点:
- 误差方面:与Fast R-CNN相比,yolov1的会有更多的定位误差
- 召回率:与区域候选框的方法相比,yolov1的召回率更低
由此,作者在yolov2模型中做了一系列的改进来优化定位效果和提升召回率,包括增加BN层、增大分辨率、引入候选框、多尺度训练等。
二、模型结构
三、模型优化点
1. Better
(1) Batch Normalization
原始图像输入到模型之前,通常先将图像归一化,以保证数据输入层获取的数据处于相同的分布。但后续每层网络的输入数据分布是一直变化的,这就导致模型训练时难以收敛。BN可以在网络的任意层进行归一化,这可以使中间层网络的输入更稳定(数据归一化到以0为均值,1为方差的分布),然而这样会使得上一层网络学习到的信息,在下一层输入前被归一化而丢失信息。由此引入了缩放变量
γ
\gamma
γ和平移变量
β
\beta
β,这两个变量是训练过程根据前面的数据分布学习到的,这样就保证BN既能实现归一化,又能保留下学习到的特征,BN层的具体公式如下。
引入BN层的优点:
- BN层引入后,初始学习率和初始化权重对模型训练的影响变小,可以调整使用更大的学习率,随机初始化权重
- BN层使得网络中间层输入分布更稳定,数据分布更多处于激活函数的不饱和区域,有利于模型学习到更大的梯度,加速模型收敛
- BN本身也是一种正则化参数,可以代替dropout层,防止过拟合
(2) High Resolution Classifier
ImageNet数据集上训练的图像分类网络的输入分辨率大都小于256 x 256。yolov1模型也是在224 x 224图像上训练分类网络,然后增加分辨率到448 x 448用于检测。这意味着网络需要学习去适应在新的分辨率图像上进行目标检测。
yolov2直接在448 x 448图像上训练分类网络,这使得在训练检测网络之前就能很好得适应高分辨率。使用高分辨率得分类网络是模型mAP从65.8提升到69.5。
(3) Convolutional With Anchor Boxes
yolov1通过全连接层直接预测物体框坐标,而yolov2借鉴了Faster R-CNN人工预选锚框anchor的方法。通过引入anchor,相当于预先确定了一套宽高尺寸,使得预测层只需要预测anchor相对于真实框的偏移量(中心点偏移量、宽高偏移量),而不用预测整个物体位置,这简化了网络的学习。
- 首先,yolov2网络移除了全连接层和最后一个池化层,这使得网络卷积层输出更高的分辨率
- 其次,输入图像尺寸由448调整为416,从而得到奇数宽高的特征图
输入图像416尺寸经过下采样后,得到13 x 13的特征图,奇数宽高的特征图会有一个中心cell,大物体更倾向于占据图像中心,有一个中心的cell负责预测物体要好过四个靠近中心的cell; - 最后,yolov2对每一个anchor都会预测物体类别
在yolov1中将图像划分7 x 7的网格,每个网格能生成2个边界框,边界框与真实框IOU最大的负责预测物体,即最多只会对49个边界框预测类别。在yolov2中,输入416尺寸可输出13 x 13的特征图,每个网格可以有5个anchor,由此会有13 x 13 x 5 = 845个anchor预测类别。
不使用anchor时,yolov2模型能达到69.5mAP和81%的召回率,使用anchor后,网络达到69.2mAP和88%的召回率。虽然mAP略有下降,但是召回率有明显的提升。
(4) Dimension Cluster
yolov2中使用预选框anchor,网络基于预设定anchor能够通过学习进行调整以检测目标,而如果预先设定更好的anchor来训练网络,则能使网络更容易学习从而达到更好的检测效果。例如,对于车辆和行人较多的数据集,可预先设定一些矮胖和瘦高尺寸的anchor。
人工挑选anchor的工作量是比较大的,论文中使用k-means聚类方法来自动发现更好的anchor。作者在VOC数据集和COCO数据集中聚类效果如下图,当聚类中心k=5时,达到较好的平衡效果,随着k继续增加,IOU梯度越来越小,而模型复杂度则会越来越高。下右图则是VOC和COCO数据集上聚类后产生的5个anchor尺寸图。
作者在论文中也对人工选取的anchor和k-means产生的anchor计算Avg IOU。如下图,人工挑选9个anchor达到Avg IOU为60.9,而k-means只需要5个anchor就能达到Avg IOU为61.0,当k-means同样生成9个anchor时,能达到Avg IOU为67.2。这表明k-means方法生成的anchor更具有代表性,使得网络更容易学习。
备注:作者在使用k-means方法时对距离计算公式做了调整。标准的k-means方法使用欧氏距离,这样会使尺寸大的物体产生更大的距离误差,然而实际需要的是物体间的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) = 1 - IOU(box, centroid)
d(box,centroid)=1−IOU(box,centroid)
即物体与聚类中心IOU值越大的,距离越小。
(5) Direct location prediction
yolov2中的对物体的坐标预测沿用yolov1的方法,仍然预测相对于所处网格cell的位置。如下图所示,图像被划分为13 x 13的网格,每个网格能够出预测5个物体框,每个物体框的预测值表示为:
t
x
,
t
y
,
t
w
,
t
h
t_x, t_y, t_w, t_h
tx,ty,tw,th和
t
o
t_o
to。假设下图为其中某个网格预测出的某个物体框,黑色虚线为其对应的anchor,其宽高为
p
w
p_w
pw、
p
h
p_h
ph,则物体框的预测值需要通过下面的公式转换为图中蓝色框:
其中,
σ
\sigma
σ表示sigmoid函数,
t
x
t_x
tx和
t
y
t_y
ty经过sigmoid函数处理后范围限制在0~1之间,这保证了预测物体框的中心位置(
b
x
b_x
bx,
b
y
b_y
by)限制在所处网格中,而对宽高(
b
w
b_w
bw,
b
h
b_h
bh)没有做限制,可能真实存在大尺寸的物体,置信度仍然用IOU表示。
(6) Fine-Grain Features
从yolov2网络的结构中能看出,网络增加了一个跳跃层(PassThrough Layer),这使得模型能够融合更原始的细粒度的特征,该方式有点类似于ResNet。具体来说PassThrough Layer将26 x 26特征图转化为 13 x 13特征图,宽高减半,通道数变为原来的4倍,再与后面网络输出的13 x 13特征图在通道层叠加融合。PassTrough Layer的过程,如下图所示。
(7) Multi-Scale Training
由于yolov2模型中只有卷积层和池化层,所以yolov2的输入可以不限于大小的图片。为了增强模型的鲁棒性,yolov2采用了多尺度输入训练策略,具体来说就是在训练过程中每间隔一定的iters后改变模型的输入图片大小。由于yolov2的下采样总步长为32,输入图片大小选择一系列为32倍数的值: {320, 352,…,608}。这意味着模型网络可以在不同分辨率图像上执行预测,使得yolov2能在性能与精度上有更简单的权衡策略。作者验证yolov2在不同图像分辨率上预测效果与其他网络的比较如下表。
2. Faster
3. Stronger
四、模型损失函数
在yolov2的论文中并没有明确提出损失函数的计算公式,根据开源代码,网络上流传最多的是如下损失函数表达公式:
l
o
s
s
t
=
∑
i
=
0
W
∑
j
=
0
H
∑
k
=
0
A
ı
M
a
x
I
O
U
<
T
h
r
e
s
h
λ
n
o
o
b
j
∗
(
−
b
i
j
k
o
)
2
loss_t = \displaystyle\sum_{i=0}^W\displaystyle\sum_{j=0}^H\displaystyle\sum_{k=0}^A\hspace{1em} \text{\i}_{Max IOU<Thresh}\lambda_{noobj}*(-b_{ijk}^o)^2
losst=i=0∑Wj=0∑Hk=0∑AıMaxIOU<Threshλnoobj∗(−bijko)2
+ ı 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 +\hspace{0.5em}\text{\i}_{t<12800}\lambda_{prior}*\textstyle\sum_{r\epsilon(x,y,w,h)}(prior_{k}^r-b_{ijk}^r)^2 +ıt<12800λprior∗∑rϵ(x,y,w,h)(priorkr−bijkr)2
+ ı 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 +\hspace{0.5em}\text{\i}_{k}^{truth}\Big(\lambda_{coord}*\textstyle\sum_{r\epsilon(x,y,w,h)}(truth^r-b_{ijk}^r)^2 +ıktruth(λcoord∗∑rϵ(x,y,w,h)(truthr−bijkr)2
+ λ o b j ∗ ( I O U t r u t h k − b i j k o ) 2 +\hspace{0.5em}\lambda_{obj}*(IOU_{truth}^k-b_{ijk}^o)^2 +λobj∗(IOUtruthk−bijko)2
+ λ c l a s s ∗ ( ∑ c = 1 C ( t r u t h c − b i j k c ) 2 ) ) +\hspace{0.5em}\lambda_{class}*(\displaystyle\sum_{c=1}^C(truth^c-b_{ijk}^c)^2)\Bigr) +λclass∗(c=1∑C(truthc−bijkc)2))
损失函数的计算明显是要遍历所有的预测框,可以将损失函数划分为三部分说明:
第一部分:
ı
M
a
x
I
O
U
<
T
h
r
e
s
h
λ
n
o
o
b
j
∗
(
−
b
i
j
k
o
)
2
\text{\i}_{Max IOU<Thresh}\lambda_{noobj}*(-b_{ijk}^o)^2
ıMaxIOU<Threshλnoobj∗(−bijko)2
该部分表示不负责预测物体的预测框的置信度损失。这里需要计算每个预测框与所有真实框的IOU,如此每个预测框的都会有一个Max IOU,如果预测框的Max IOU都小于阈值(论文中为0.6),则说明该预测框不负责预测物体,预测框范围内为背景,其预测出物体的置信度应该为0。
第二部分:
ı
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
\text{\i}_{t<12800}\lambda_{prior}*\textstyle\sum_{r\epsilon(x,y,w,h)}(prior_{k}^r-b_{ijk}^r)^2
ıt<12800λprior∗∑rϵ(x,y,w,h)(priorkr−bijkr)2
该部分是计算anchor和预测框的坐标误差,但只在前12800个iter计算,该项表示网络训练的初期应该先学习到正确预测anchor的形状。
第三部分:
ı
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
\text{\i}_{k}^{truth}\Big(\lambda_{coord}*\textstyle\sum_{r\epsilon(x,y,w,h)}(truth^r-b_{ijk}^r)^2
ıktruth(λcoord∗∑rϵ(x,y,w,h)(truthr−bijkr)2 — 定位误差
+
λ
o
b
j
∗
(
I
O
U
t
r
u
t
h
k
−
b
i
j
k
o
)
2
+\hspace{0.5em}\lambda_{obj}*(IOU_{truth}^k-b_{ijk}^o)^2
+λobj∗(IOUtruthk−bijko)2 — 置信度误差
+
λ
c
l
a
s
s
∗
(
∑
c
=
1
C
(
t
r
u
t
h
c
−
b
i
j
k
c
)
2
)
)
+\hspace{0.5em}\lambda_{class}*(\displaystyle\sum_{c=1}^C(truth^c-b_{ijk}^c)^2)\Bigr)
+λclass∗(c=1∑C(truthc−bijkc)2)) — 分类误差