YOLO-V2速度优化
针对YOLO准确率不高,容易漏检,对长宽比不常见物体效果差等问题,结合SSD的特点,
2016提出了YOLO-V2。为了精度与速度并重,作者在速度上也作了一些改进措施。
大多数检测网络依赖于VGG-16作为特征提取网络,VGG-16是一个强大而准确的分类网络,但是确过于复杂。
224
∗
224
224*224
224∗224的图片进行一次前向传播,其卷积层就需要多达306.9亿次浮点数运算。
YOLO使用的是基于Googlenet的自定制网络,比VGG-16更快,一次前向传播仅需85.2亿次运算,不过它的精度要略低于VGG-16。
作者使用Darknet-19在标准1000类的ImageNet上训练了160周期。训练的时候仍然使用了很多常见的数据扩充方法。初始的224*224训练后把分辨率上调到了
448
∗
448
448*448
448∗448,又训练了10次。高分辨率下训练的分类网络top1准确率76.5%,top-5准确率93.3%。
YOLO-V2精确度优化
为了达到更精确(Better)的目的,YOLO v2主要做了如下改进:
1.High Resolution Classifier
YOLOv2首先修改预训练分类网络的分辨率为
448
∗
448
448*448
448∗448,在ImageNet数据集上训练10个周期(10epochs)。这个过程让网络有足够的时间去适应高分辨率的输入。然后再fine tune为检测网络,mAP获得了4%的提升。
2.Convolutional With Anchor Boxes YOLO(v1)使用全连接层数据进行bounding box预测,这会丢失较多的空间信息,导致定位不准。YOLOv2借鉴了Faster R-CNN中的anchor思想:简单理解为卷积特征图上进行滑动窗口采样,每个中心预测9种不同大小和比例的anchor。总的来说就是移除全连接层(以获得更多空间信息)使用anchor boxes去预测bounding boxes。并且,YOLOv2由anchor box同时预测类别和坐标。
2.Convolutional With Anchor Boxes具体做法:
·去掉最后的池化层确保输出的卷积特征图有更高的分辨率。
·缩减网络,让图片输入分辨率为416*416,目的是让后面产生的卷积特征图宽高都为奇数,这样就可以产生一个center cell。因为作者观察到,大物体通常占据了图像的中间位置,可以只用一个中心的cell来预测这些物体的位置,否则就要用中间的4个cell来进行预测,这个技巧可稍稍提升效率。
使用卷积层降采样(factor为32),使得输入卷积网络的
416
∗
416
416*416
416∗416图片最终得到
13
∗
13
13*13
13∗13的卷积特征图(416/32=13),也就是原始图片是最终输出的特征图的32倍。
·由anchor box同时预测类别和坐标。因为YOLO是由每个cell来负责预测类别,每个cell对应的2个bounding box负责预测坐标(回想YOLO中最后输出
7
∗
7
∗
30
7*7*30
7∗7∗30的特征,每介cell对应
1
∗
1
∗
30
1*1*30
1∗1∗30,前10个主要是2个bounding box用来预测坐标和置信度,后20个表示该cell在0g假设包含物体的条件下属于20个类别的概率)。YOLOv2中,不再让类别的预测与每个cell(空间位置)绑定一起,而是全部放到anchor box中。
加入了anchor boxes后,我们来计算一下,假设每个cell预测9个anchor,那么总共会预测
13
∗
13
∗
9
=
1521
13*13*9=1521
13∗13∗9=1521个boxes,而之前的网络(YOLO-V1)仅仅预测
7
∗
7
∗
2
=
98
7*7*2=98
7∗7∗2=98个boxes。根据作者的研究,具体数据为:没有anchor boxes,模型recall为81%,mAP为69.5%;加入anchor boxes,模型recall为88%,mAP为69.2%。
YOLOv1每个格子存放了30个值,具体的值见下图
第1到第5个值是第1个预选框的值
第6到第10个值是第2个预选框的值
第11到第30个值是20个对象检测的概率值
对比YOLO1的输出张量,YOLO2的主要变化就是会输出5个先验框,且每个先验框都会尝试预测一个对象。输出的 13135*25 张量中,25维向量包含 20个对象的分类概率+4个边框坐标+1个边框置信度。
3.Dimension Clusters(维度聚类)
在使用anchor时,Faster-RCNN中anchor boxes的个数和宽高维度往往是手动精选(带有很多人为设置的因素,可能设置的并不好)的先验框(hand-picked priors),如果能够一开始就选择了更好的、更有代表性的先验boxes维度,那么网络就应该更容易学到准确的预测位置。YOLOv2中利用K-means聚类方法,通过对数据集中的ground truth box做聚类,找到ground truth box的统计规律。以聚类个数k为anchor boxes个数,以k个聚类中心box的宽和高为anchor box的宽和高。
如果按照标准k-means使用欧式距离函数,(在计算距离时)大boxes比小boxes产生更多error。但是,我们真正想要的是产生/好的IOU得分的boxes(与box的大小无关,关键是anchor box跟真实标注框的IOU要大)。因此采用了如下距离度量:
指的是真实标注框和预测框anchor之间的IoU,IoU越大,(距离)值就越小
假设有两个框(默认它们的中心点在同一位置),一个框是
3
∗
5
3*5
3∗5,一个框是
5
∗
5
5*5
5∗5
欧式距离的计算
(
5
−
3
)
2
+
(
5
−
5
)
2
=
2
\sqrt{(5-3)^2+(5-5)^2}=2
(5−3)2+(5−5)2=2
IOU的计算
(
3
∗
5
)
/
(
5
∗
5
)
=
0.6
(3*5)/(5*5)=0.6
(3∗5)/(5∗5)=0.6
下图是作者论文中的试验,设置了多组k值,随着k的增大,IOU也在增大(高召回率),但是复杂度也在增加。所以平衡复杂度和IOU之后,最终得到k值为5(最后的特征图中每个格子会生成5个anchor)。5聚类的中心与手动精选的boxes是完全不同的,扁长的框较少瘦高的框较多。
每个格子都会生成5个anchor,这是用K-means算法得到的。
这比Faster-RCNN手动9个anchor的方式更好,可以得到更加好的结果
作者也做了对比实验,5种boxes的Avg IOU(61.0)就和Faster R-CNN的9种Avg IOU(60.9)相当。
说明K-means方法的生成的boxes更具有代表性,使得检测任务更好学习(更加容易得到好的结果)。
4.Direct location prediction(直接位置预测)
使用anchor boxes的另一个问题是模型不稳定,尤其是在早期迭代的时候。大部分的不稳定现象出现在预测box的(x,y)坐标时,YOLO-v2没有用Faster-RCNN的预测方式(因为该方式在训练的早期会不稳定,会影响到模型收敛的速度)。
YOLO-v2位置预测值
t
x
t_x
tx,
t
y
t_y
ty就是预测边界框中心点相对于对应cell左上角位置的相对偏移值,为了将边界框中心点约束在当前cell中,使用sigmoid函数处理偏移值,这样预测的偏移值在(0,1)范围内(每个cell的尺度看做1)。这样做的好处是anchor不会发生特别大的移动(只会负责匹配跟anchor接近的真实标注框,然后在不断在训练迭代中调整位置,更好的重合该真实标注框)
作者通过使用维度聚类和直接位置预测这两项Anchor Boxes改进方法,将mAP提高了5%。
网络在特征图(
13
∗
13
13*13
13∗13)的每个cell上预测5个anchor,每一个anchor预测5个值:
t
x
t_x
tx,
t
y
t_y
ty,
t
w
t_w
tw,
t
h
t_h
th,
t
o
t_o
to(前4个跟位置相关的,
t
o
t_o
to跟置信度相关) 如果这个cell距离图像左上角的边距为(
c
x
c_x
cx,
c
y
c_y
cy),cell对应图中黑色虚线的先验框(anchor)的长和宽分别为(
p
w
p_w
pw,
p
h
p_h
ph),那么网络预测框的为下图蓝框,蓝色框的值是根据图中右侧的公式得到的
5.Fine-Grained Features(细粒度特征)
SSD通过不同尺寸的Feature Map来预测Box来实现多尺度,而YOLOv2则采用了另一种思路:
添加一个passthrough layer,来获取之前的26x26x512的特征图特征,对于26x26x512的特征图,经passthrough层处理之后就变成了13×13x2048的新特征图(特征图大小降低4倍,而channles增加4倍),这样就可以与后面的13×13×1024特征图连接在一起形成13×13×3072大小的特征图,然后在此特征图基础上卷积做预测。可以更精细的识别一些小的物体。
YOLOv2的检测器使用的就是经过扩展后的的特征图,它可以使用细粒度特征,使得模型的性能获得了1%的提升。
26×26x512->13×13×2048+13×13×1024->13×13×3072
26x26x512的特征图,经passthrough层处理之后就变成了13×13x2048的新特征图。可以用下面相似的例子说明:
6.Multi-Scale Training(多尺度输入的训练)
原始YOLO网络使用固定的448x448的图片作为输入,加入anchor boxes后输入变成416x416,由于网络只用到了卷积层和池化层,就可以进行动态调整(检测任意大小图片)。为了让YOLOv2对不同尺寸图片的具有鲁棒性,在训练的时候也考虑了这一点。
不同于固定网络输入图片尺寸的方法,每经过10批训练(10 batches)就会随机选择新的图片尺寸。网络使用的降采样参数为32,于是使用32的倍数{320,352,…,608},最小的尺寸为320x320,最大的尺寸为608x608。调整网络到相应维度然后继续进行训练(除了最后1层卷积层,其他的权值都是可以共享的)。
这种机制使得网络可以更好地预测不同尺寸的图片,同一个网络可以进行不同分辨率的检测任务,在小尺寸图片上YOLOv2运行更快,在速度和精度上达到了平衡。
如果使用
320
∗
320
320*320
320∗320,最终输出的特征图是
10
∗
10
10*10
10∗10;
如果使用
352
∗
352
352*352
352∗352,最终输出的特征图是
11
∗
11
11*11
11∗11;
如果使用
608
∗
608
608*608
608∗608,最终输出的特征图是
19
∗
19
19*19
19∗19;
YOLO-V2结果