一、基本信息
标题:YOLO9000: Better, Faster, Stronger
时间:2016
引用格式:Redmon, Joseph, and Ali Farhadi. “YOLO9000: better, faster, stronger.” Proceedings of the IEEE conference on computer vision and pattern recognition. 2017.
二、研究背景
YOLO v1虽然速度上比Faster R-CNN快了不少,但是Recall不如后者,每个gird也就2个bbox,全图也就7 * 7 * 2 = 96个bbox,比不上Faster RCNN的50 * 38 * 9 = 17100个Anchor的Recall。
三、创新点
所以YOLO v2就借鉴了Faster RCNN的Anchor思想,以及多个改进,从而使得mPA轻微下降(总体是提升)的情况下,Recall大幅提升。最重要的是保持yolo系列的速度:快!
从标题可以看到 Better, Faster, Stronger
Better:一系列改进方法提升mPA和Recall,好!
Faster:骨架网络与时俱进换成了更快的Darknet-19(v1用的是基于GoogLeNet的一个网络),快!
Stronger:利用WordTree实现了可以对9000种对象检测的模型,强!
Better
batch normalization 批归一化
mAP有2.4的提升
整理了笔记,传送到->batch normalization
总结就是batch normalization这个方法很流行、有效。
批归一化有助于解决反向传播过程中的梯度消失和梯度爆炸问题,降低对一些超参数(比如学习率、网络参数的大小范围、激活函数的选择)的敏感性,并且每个batch分别进行归一化的时候,起到了一定的正则化效果(YOLO2不再使用dropout),从而能够获得更好的收敛速度和收敛效果。
High Resolution Classifier 高分辨率图像微调分类模型
mAP提升了3.7
目前大部分的检测模型都会在先在ImageNet分类数据集上预训练模型的主体部分(CNN特征提取器),ImageNet分类模型基本采用大小为 224*224 的图片作为输入,分辨率相对较低,不利于检测模型。
YOLOv1在采用 224224 分类模型预训练后,将分辨率增加至 448448 ,并使用这个较高分辨率在检测数据集上finetune。但是直接切换分辨率,检测模型可能难以快速适应高分辨率。
因此,YOLOv2增加了在ImageNet数据集上使用 448*448 输入来finetune分类网络这一中间过程(10 epochs),这可以使得模型在检测数据集上finetune之前已经适用高分辨率输入。使用高分辨率分类器后,YOLOv2的mAP提升了约4%。
Convolutional With Anchor Boxes 采用先验框
召回率大幅提升到88%,同时mAP轻微下降了0.2
借鉴Faster RCNN的做法,YOLO2也尝试采用先验框(anchor)。在每个grid预先设定一组不同大小和宽高比的边框,来覆盖整个图像的不同位置和多种尺度,这些先验框作为预定义的候选区在神经网络中将检测其中是否存在对象,以及微调边框的位置。
同时YOLO2移除了全连接层。另外去掉了一个池化层,使网络卷积层输出具有更高的分辨率。
之前YOLO1并没有采用先验框,并且每个grid只预测两个bounding box,整个图像98个。YOLO2如果每个grid采用9个先验框,总共有13139=1521个先验框。所以,相对YOLO1的81%的召回率,YOLO2的召回率大幅提升到88%。同时mAP有0.2%的轻微下降。
不过YOLO2接着进一步对先验框进行了改良。聚类
Dimension Clusters 聚类提取先验框尺度
mAP有4.8的提升
在Faster R-CNN和SSD中,先验框的维度(长和宽)都是手动设定的,带有一定的主观性。如果选取的先验框维度比较合适,那么模型更容易学习,从而做出更好的预测。因此,YOLOv2采用k-means聚类方法对训练集中的groud truth做了聚类分析。因为设置先验框的主要目的是为了使预测的BBox与ground truth的IOU更高,所以聚类分析时选用box与聚类中心box之间的IOU值作为距离指标:
d
(
box, centroid
)
=
1
−
I
O
U
(
box, centroid
)
d(\text {box, centroid})=1-I O U(\text {box, centroid})
d(box, centroid)=1−IOU(box, centroid)
centroid是聚类时被选作中心的边框,box就是其它边框,d就是两者间的“距离”。IOU越大,“距离”越近。YOLO2给出的聚类分析结果如下图所示:
上图容易误解,以为它是一幅图上框的分布,错!anchor是基于gird上的,位移不会在全图上,仅在gird内。所以上图我们只看形状不要看位置!
上图左边是选择不同的聚类k值情况下,得到的k个centroid边框,计算样本中标注的边框与各centroid的Avg IOU。显然,边框数k越多,Avg IOU越大。YOLO2选择k=5作为边框数量与IOU的折中。对比手工选择的先验框,使用5个聚类框即可达到61 Avg IOU,相当于9个手工设置的先验框60.9 Avg IOU。
上图右边显示了5种聚类得到的先验框,VOC和COCO数据集略有差异,不过都有较多的瘦高形边框。
Direct location prediction 约束预测边框的位置
对Anchor的改进和具体实施
推理时怎么算x和y:
x = ( t x ∗ w a ) + x a y = ( t y ∗ h a ) + y a \begin{array}{l} x=\left(t_{x} * w_{a}\right)+x_{a} \\ y=\left(t_{y} * h_{a}\right)+y_{a} \end{array} x=(tx∗wa)+xay=(ty∗ha)+ya
其中, x , y x, y x,y 是预测边框的中心, x a , y a \quad x_{a}, y_{a} xa,ya 是先验框 (anchor) 的中心点坐标, w a , h a w_{a}, h_{a} wa,ha 是先验框 (anchor) 的宽和高, t x , t y \quad t_{x}, t_{y} tx,ty 是要学习的参数。
由于
t
x
,
t
y
t_{x}, t_{y}
tx,ty的取值没有任何约束,因此预测边框的中心可能出现在任何位置,训练早期阶段不容易稳定。
YOLO调整了预测公式,将预测边框的中心约束在特定gird网格内(先将网格大小归一化,即令一个网格的宽=1,高=1)。
物体中心对应一个grid,所以不要乱跑啊,我们只需在grid内再精确一下xy位移就行。 p w , p h p_w, p_h pw,ph是聚类得到的先验框w和h,这也验证了上面提到的“所以上图我们只看形状不要看位置!”。为什么是e指数函数,我认为网络初始化时倾斜与输出0,所以希望在最开始时和先验框最接近?
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}{c} b_{x}=\sigma\left(t_{x}\right)+c_{x} \\ b_{y}=\sigma\left(t_{y}\right)+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
其中,σ是sigmoid函数。
t
x
,
t
y
,
t
w
,
t
h
t_{x}, t_{y}, t_{w}, t_{h}
tx,ty,tw,th是要学习的参数,分别用于预测边框的中心和宽高。
关于置信度:
P
r
(
object
)
∗
I
O
U
(
b
,
object
)
=
σ
(
t
o
)
{Pr}(\text {object}) * I O U(b, \text {object})=\sigma\left(t_{o}\right)
Pr(object)∗IOU(b,object)=σ(to)
yolo v1是根据选2个bbox中IOU大的,此时
Pr
(
\operatorname{Pr}(
Pr( Object
)
=
1
)=1
)=1,
C
o
n
f
i
d
e
n
c
e
=
I
O
U
pred
truth
Confidence =IOU_{\text {pred}}^{\text {truth }}
Confidence=IOUpredtruth
yolo v2则是直接预测一个值即
t
0
t_0
t0,然后经过sigmoid函数,作为Confidence。
Confidence表示当前bbox的可信度
通过将confidence和最大可能输出的类的probability相乘之后,要是得出的结果大于门限0.24,就会输出当前计算出的bbox的大小和位置,同时会输出是哪一个类(所以一个gird可以输出多个类),probability大小是多少。一共会生成13135个bbox,然后根据probability,通过filter,产生出最后预测的物体和其边框。
Fine-Grained Features 检测细粒度特征
通过passthrough层检测细粒度特征使mAP提升1。
passthrough层与ResNet网络的shortcut类似,以前面更高分辨率的特征图为输入,然后将其连接到后面的低分辨率特征图上。前面的特征图维度是后面的特征图的2倍,passthrough层抽取前面层的每个 2*2 的局部区域,然后将其转化为channel维度
YOLO2中的passthrough
对于 2626512 的特征图,经passthrough层(下路)处理之后就变成了 13132048 的新特征图(特征图大小降低4倍,而channles增加4倍),这样就可以与后面(上路)的 13131024 特征图连接在一起形成 13133072 大小的特征图,然后在此特征图基础上卷积做预测。
Multi-Scale Training 多尺度图像训练
多尺度图像训练对mAP有1.4的提升。
因为去掉了全连接层,YOLO2可以输入任何尺寸的图像。因为整个网络下采样倍数是32,作者采用了{320,352,…,608}等10种输入图像的尺寸,这些尺寸的输入图像对应输出的特征图宽和高是{10,11,…19}。训练时每10个batch就随机更换一种尺寸,使网络能够适应各种大小的对象检测。
Further Experiments
个hi-res detector,使mAP提高了1.8。
因为YOLO2调整网络结构后能够支持多种尺寸的输入图像。通常是使用416416的输入图像,如果用较高分辨率的输入图像,比如544544,则mAP可以达到78.6,有1.8的提升。
另外,作者在后期的实现中借鉴了ResNet网络,不是直接对高分辨特征图处理,而是增加了一个中间卷积层,先采用64个 11 卷积核进行卷积,然后再进行passthrough处理,这样 2626512 的特征图得到 1313*256 的特征图。这算是实现上的一个小细节。使用Fine-Grained Features之后YOLOv2的性能有1%的提升。可以看下面的对象检测模型各层的结构。
Faster
为了进一步提升速度,YOLO2提出了Darknet-19(有19个卷积层和5个MaxPooling层)网络结构。DarkNet-19比VGG-16小一些,精度不弱于VGG-16,但浮点运算量减少到约1/5,以保证更快的运算速度。
Darknet-19 分类模型:
对象检测模型各层的结构如下:
看一下passthrough层。图中第25层route 16,意思是来自16层的output,即2626512,这是passthrough层的来源(细粒度特征)。第26层11卷积降低通道数,从512降低到64(这一点论文在讨论passthrough的时候没有提到),输出262664。第27层进行拆分(passthrough层)操作,1拆4分成1313256。第28层叠加27层和24层的输出,得到13131280。后面再经过33卷积和11卷积,最后输出1313*125。
损失
公式中:
1
MaxIOU
<
T
h
r
e
s
h
1_{\text {MaxIOU}<T h r e s h}
1MaxIOU<Thresh意思是预测边框中,与真实对象边框IOU最大的那个,其IOU<阈值Thresh,此系数
为1,即计入误差,否则为0,不计入误差。YOLO2使用Thresh=0.6。
1
t
<
128000
1_{t<128000}
1t<128000 意思是前128000次迭代计入误差。注意这里是与先验框的误差,而不是与真实对象边框 的误差。可能是为了在训练早期使模型更快学会先预测先验框的位置。
1
k
t
r
u
t
h
1_{k}^{t r u t h}
1ktruth 意思是该边框负责预测一个真实对象(边框内有对象)。
各种
λ
\lambda
λ 是不同类型误差的调节系数。
感觉和yolo v1中差不多
Stronger
利用Wordtree识别对象更多,YOLO9000