论文:YOLO9000:Better, Faster, Stronger(CVPR 2016)
关键点
1、加入BN去掉dropout
Batch Normalization有助于解决反向传播过程中的梯度消失和爆炸问题,降低对一些超参数(比如学习率、网络参数的大小范围、激活函数的选择)的敏感性,并且起到了正则化效果,从而能够获得更好的收敛速度和收敛效果。
2、High Resolution 图像微调Classifier
先用
224
∗
224
224*224
224∗224从头开始训练网络,大概160个epoch,然后调整到448*448, 再训练10个epoch(注意:这两步都是在ImageNet数据集上操作),最后再在检测的数据集上fine-tuning,以缓解分辨率变化的影响
3、引入anchor
YOLOv1中是直接预测目标尺寸和位置,v2引入了Anchor,学习调整Anchor,且用聚类的方法选择anchor尺寸
约束预测边框的位置
Faster RCNN中:
t
x
=
(
x
−
x
a
)
/
w
a
,
t
y
=
(
y
−
y
a
)
/
h
a
t
w
=
log
(
w
/
w
a
)
,
t
h
=
log
(
h
/
h
a
)
t
x
∗
=
(
x
∗
−
x
a
)
/
w
a
,
t
y
∗
=
(
y
∗
−
y
a
)
/
h
a
t
w
∗
=
log
(
w
∗
−
w
)
,
t
h
∗
=
log
(
h
∗
/
h
a
)
\begin{aligned} t_x &= (x - x_a) /w_a \ ,\ \ t_y = (y - y_a) / h_a\\[1ex]t_w &= \log(w/ w_a), \quad \ \ t_h = \log(h/h_a)\\[1ex]t_x^* &= (x^* - x_a) / w_a,\ t_y^* = (y^* - y_a) /h_a\\[1ex]t_w^* &= \log(w^* - w),\ \ t_h^* = \log(h^*/h_a) \end{aligned}
txtwtx∗tw∗=(x−xa)/wa , ty=(y−ya)/ha=log(w/wa), th=log(h/ha)=(x∗−xa)/wa, ty∗=(y∗−ya)/ha=log(w∗−w), th∗=log(h∗/ha)
x
,
y
\color{blue}x,y
x,y是预测边框的中心,
x
a
,
y
a
\color{blue}x_a,y_a
xa,ya是先验框(anchor)的中心点坐标,
w
a
,
h
a
\color{blue}w_a,h_a
wa,ha是先验框(anchor)的宽和高,
t
x
,
t
y
\color{blue}t_x,t_y
tx,ty是要学习的参数
而
t
x
,
t
y
\color{blue}t_x,t_y
tx,ty的范围并没有任何约束,因此预测边框的中心可能出现在任何位置,训练早期阶段不容易稳定。YOLO调整了预测公式,将预测边框的中心约束在特定gird网格内
YOLOv2中:
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
Pr
(
object
)
∗
I
O
U
(
b
,
object
)
=
σ
(
t
o
)
\begin{aligned} 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}} \\ \operatorname{Pr}(\text { object }) * I O U(b, \text { object }) &=\sigma\left(t_{o}\right)\end{aligned}
bxbybwbhPr( object )∗IOU(b, object )=σ(tx)+cx=σ(ty)+cy=pwetw=pheth=σ(to)
- t x , t y \color{blue}{t_x,t_y} tx,ty:经过sigmoid函数处理后范围在0到1之间,模型训练更加稳定
- c x , c y \color{blue}{c_x,c_y} cx,cy:当前网格左上角到全图左上角距离,每个格子长宽都被归一化
- p w , p h \color{blue}{p_w,p_h} pw,ph:表示先验框的宽高
- b x , b y , b w , b h \color{blue}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 ) \color{blue}Pr(Object)*IOU(b,object) Pr(Object)∗IOU(b,object)是预测边框的置信度
4、passthrough层检测细粒度特征
输入
416
∗
416
416*416
416∗416经过卷积网络下采样最后输出的特征图大小为
13
∗
13
13*13
13∗13,是输入图片的
1
/
32
1/32
1/32,这时小目标的特征已经不明显了。想要对小目标进行很好地检测需要有更多细节的特征图,文中做法是将在最后一个pooling之前大小为
26
∗
26
∗
512
26*26*512
26∗26∗512的特征图,先用
1
∗
1
1* 1
1∗1卷积从
26
∗
26
∗
512
26 *26* 512
26∗26∗512 降维到
26
∗
26
∗
64
26* 26* 64
26∗26∗64,再1拆4,直接传递到原先的pooling+conv之后的特征图处,合并到一起作为输出的特征图
![](https://i-blog.csdnimg.cn/blog_migrate/77acb1e7f5d031a2408898670857fdc5.png)
具体的拆分方式
上图取自参考文献【2】
5、高分辨率图像的对象检测
YOLOv2调整网络结构后能够支持多种尺寸的输入图像。通常是使用
416
∗
416
416*416
416∗416的输入图像,如果用较高分辨率的输入图像,比如544*544,则mAP可以达到78.6,有1.8的提升。
6、速度更快
YOLO2提出了Darknet-19(有19个卷积层和5个MaxPooling层)网络结构,比VGG-16小一些,精度不弱于VGG-16,但浮点运算量减少到约1/5,运算速度更快
模型架构
训练
- 先在ImageNet分类数据集上预训练Darknet-19,先用 224 ∗ 224 224*224 224∗224的输入训练160个epochs
- 将输入调整到 448 ∗ 448 448*448 448∗448 ,继续在ImageNet数据集上finetune分类模型,训练10个epochs
- 修改Darknet-19分类模型为检测模型,移除最后一个卷积层、global average pooling层以及softmax层,添加三个 3 ∗ 3 ∗ 1024 3*3*1024 3∗3∗1024卷积层,同时加上passthrough层,最后用 1*1 卷积层输出预测结果 n u m _ a n c h o r s ∗ ( 5 + n u m _ c l a s s e s ) num\_anchors*(5+num\_classes) num_anchors∗(5+num_classes),因此与训练的数据集有关
- 多尺度训练,每训练10个epoch,会随机选择一种size 32的倍数如:320,352,…,608 输入
实验
参考文献
【1】YOLO v2算法详解
【2】YOLOv2 / YOLO9000 深入理解
【3】Batch Normalization原理与实战
【4】目标检测算法之YOLOv2损失函数详解