1 介绍
YoLoV2又叫YoLo9000,对比YoLoV1,YoLoV2使用VOC+ImageNet数据集联合训练,识别对象增加到了9000个,预测种类增多,而且速度快,准确度高。下面,我们主要通过对比YoLoV1,学习YoLoV2在YoLoV1基础上做了哪些改进和提升。
2 YoLoV2
2.1 YoLoV2模型结构
DarkNet网络结构
通过对比我们发现,YoLOV2使用DarkNet19网络结构作为特征提取网络。将DarkNet网络的最后一个Convolutional去除,添加3个3x3(卷积核的大小,下同)的Convolutional和1个1x1卷积。另外,在最后一个池化前的Convolutional用1个1x1的Convolutional进行卷积、批标准化、经过激活函数后进行细粒度特征融合(后面分析),再和倒数第二个Convolutional 进行concat,大大增加了特征图的细节信息,在一定程度上提升了模型的mAP。
2.2 对比YoLoV1做出的改进
2.2.1 加入批标准化(Batch Normalization)
在YoLoV1中作者没有加入BN层,而在YoLoV2中作者通过尝试在每一个卷积后加入BN层,提升了模型训练的收敛速度和收敛效果,同时也起到了一定的正则化效果,降低了模型对一些超参数的敏感度。最终的结果就是提升了2%的mAP。
2.2.2 使用高分辨率图像微调分类模型(High Resolution Classifier)
在YoLoV1中训练backbone时使用的是224x224作为输入样本,但是在检测时候使用的是高分辨率的448x448,打个比方,本来骑自行车去上班,老板突然一高兴给你一辆小汽车,你有点不适应呢(因为你不会开啊),这就导致YoLoV1在预测时可能会对高分辨率图像泛化性能不是很好。
YoLoV2在YoLoV1的基础上做出了改进,虽然都是使用224x224分辨率进行训练,又加了一个步骤,就是再使用448x448的高分辨率样本对模型进行微调和修正,让模型适应高分辨率图像。该方法提升了4%的mAP。
2.2.3 采用Anchor Boxes(Convolutional With Anchor Boxes)
在学习YoLoV1时,我们知道YoLoV1没有采用先验框,只是在每一个grid预测两个bounding box,共98个bounding boxes。而在YoLoV2中,加入了先验框的思想,虽然mAP没有提升,但是召回率有了较大的提升,说明了模型有很大的提升空间。
2.2.4 聚类提取anchor尺度(Dimension Clusters)
通过聚类算法预测anchor尺寸。Faster-RCNN中生成的anchor是人为指定的尺寸大小,并不是很贴合数据集的标签值。而在YoLoV2中,提前对训练集的标签值进行K-means聚类进行分析,尽可能找到匹配样本的anchor尺寸,因此在后续调整anchor尺寸时能很快与标签值进行拟合,降低了训练的难度和训练时间。
在上图中可以看出,前5个anchor box尺寸对提升Avg IOU较明显,因此在YoLoV2中选择了前5种anchor box 的尺寸。
2.2.5 边框位置的预测(Direct location prediction)
在学习YoLoV1时,我们知道如果中心点落在哪个grid里,该grid负责预测该对象是否存在,也就是该grid cell内的anchor box进行一系列回归参数和偏移,拟合目标框。同样,YoLoV2也是同样的原理。举个例子:
如果我们不对预测框的位置进行限制,刚开始预测框的位置在左上角,如上图位置,通过预测,会有回归参数和偏移量,这时该预测框位置将要改变。因为回归参数和偏移量的大小不固定,因此该预测框可能在上图中的任意一位置,比如移动到了上图的右下角,这就导致模型在预测的时候和原理相违背,导致预测性能不稳定。因此,我们需要将该预测框固定在它原来的grid cell内。
边框的预测结果公式:
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{aligned} b_x=\sigma(t_x)+c_x \\b_y=\sigma(t_y)+c_y \\b_w=p_we^{t_w} \\b_h=p_he^{t_h} \end{aligned}
bx=σ(tx)+cxby=σ(ty)+cybw=pwetwbh=pheth
P
r
(
o
b
j
e
c
t
)
∗
I
O
U
(
b
,
o
b
j
e
c
t
)
=
σ
(
t
o
)
P_r(object)*IOU(b,object)=\sigma(t_o)
Pr(object)∗IOU(b,object)=σ(to)
- b x , b y , b w , b h b_x,b_y,b_w,b_h bx,by,bw,bh是预测边框的中心点和宽高
- P r ( o b j e c t ) ∗ I O U ( b , o b j e c t ) P_r(object)*IOU(b,object) Pr(object)∗IOU(b,object)是预测边框的置信度
- c x , c y c_x,c_y cx,cy是当前网格左上角到图像左上角的距离
- p w , p h p_w,p_h pw,ph是先验框的宽和高
- σ \sigma σ是sigmoid函数
- t x , t y , t h , t o t_x,t_y,t_h,t_o tx,ty,th,to是回归参数,用来预测边框的中心点、宽、高和置信度
sigmoid函数的输出值是在[0,1]范围之内,因此,不管 σ ( t x ) 、 σ ( t y ) \sigma(t_x)、\sigma(t_y) σ(tx)、σ(ty)值有多大,经过sigmoid后输出值只能在0-1之间,因此,预测框的中心点只能在上图中的蓝色区域内。经过约束后的边框使得模型更加稳定,更容易学习。
2.2.6 细粒度特征融合(Fine-Grained Features)
图像中的对象大小不同,输入图像经过多层网络提取特征后,最后输出的特征图中,比较小的对象可能特征就很不明显了甚至被卷掉。在YoLoV2中,为了也能检测出较小的特征,引入了passthrough层,经过该网络层能保留较小的对象的特征的一些细节信息。具体说就是在最后一个pooling之前,特征图的大小是26x26x512,将其1分为4,passthrough到pooling后,的特征图,两者叠加到一起作为输出的特征图:
具体拆分方法如下图:
2.2.7 多尺度训练(Multi-Scale Training)
在YoLoV2中,去除了全连接层,因此可以输入任意尺度的图像。在整个网络下进行了32倍的下采样,采用{320,352,…,608}等10种输入图像的尺寸,这些尺寸的输入图像对应输出的特征图宽和高是{10,11,…19}。训练时每10个batch就随机更换一种尺寸,使网络能够适应各种大小的对象检测。