YOLO v2论文地址: YOLO9000: Better, Faster, Stronger
v2版本的优化目标:改善召回率,提升定位精度,保证分类准确度。
YOLOv2相比YOLOv1的改进:
v2在每一个卷积之后增加了BN层,提高了网络训练的速度,加快了收敛,消除了对其他正则化的依赖,且正则化效果更好,使调参更简单,即使去掉Dropout层也不会产生过拟合。
v1先使用224×224的分辨率在ImageNet上Fine Tune,而后为了提高定位精度,更改分辨率为448×448后,在VOC2007上继续训练,这在一定程度上干扰了Fine Tune的网络,需要重新调整参数适应新的分辨率。
v2直接使用448×448的分辨率在ImageNet上Fine Tune 10个epoch,一开始就使用了更高的分辨率。
anchor boxes其实就是有可能存在物体的候选区域,这里的anchor boxes其实是YOLOv2从Fast-RCNN系列检测算法借鉴来的。在Fast-RCNN中,先通过区域建议网络(RPN,仅含卷积层,不含全连接层)预测出潜在含物体的anchor boxes(候选区域)的偏移(注意是偏移而不是坐标)和置信度,再从这些挑出的anchor boxes中去检测物体。
作者在v2中发现自己在v1中吐槽过的RPN步骤效果还是蛮不错的,并且通过预测boxes的偏移量而不是坐标值可以简化问题,使网络更容易训练。
v2中去掉了全连接层,使用卷积来预测Anchor Boxes,并且去掉了v1网络中的一个池化层,以提高卷积输出的分辨率。
v2网络的输入分辨率更改为416×416而不是448×448,这样做是为了下采样32倍之后最终的得到的特征图大小是奇数×奇数(416下采样32是13,448下采样32是14),这样13×13的特征图有中心单元格,这个技巧一定程度上提升了检测效率。这13×13的特征图类似于v1中的7×7的分割区域,13×13中的每个像素点负责预测9个Anchor Boxes(候选区域),这样在v2中每张图片上最多可以有13×13×9=1521个候选boxes,在v1中这个值是7×7×2=98个boxes。
采用Anchor Box让YOLO的精确度稍微下降,但是增加了在单张图片上目标的检测数量(可超过一千个),也提高了召回率(由81%提升到88%)。
Dimension clusters(维度聚类),YOLO v2中的这个改进是关于初始Anchor Boxes的大小和数量的。之前使用Anchor Box的系统都是手动设定初始Box的大小的,V2中作者使用k-means聚类的方法在训练集的物体边框数据集(注意不是图像本身,而是边框的数据)上得到了不同数量个Box,并作了对比实验,聚类的Box多了,会导致模型的计算量增大,错误率升高,Box少了会导致召回率降低。
经过实验,作者确定在他的训练数据集上聚类数量是5的时候是一个准确率和召回率的平衡值。
总之,作者在维度聚类这个点上优化了Anchor Boxes的赋值方式,包括数量和Box大小,通过在训练数据上的物体的边框数据集上经过5个分类的k-means的聚类,得到5个初始Anchor Boxes的大小。
所以咱们训练的时候,最好也根据自己的训练集的特点,生成自己的Anchor Boxes数据,作者的数据是 anchors = 1.08,1.19, 3.42,4.41, 6.63,11.38, 9.42,5.11, 16.62,10.52。
经典的Fast-RCNN算法中对Anchor Boxes位置的预测是通过偏移量定义的,作者认为这种计算方式是不受约束的,需要训练很长时间才能稳定预测到可感知的偏移,并且最大的弊端是导致模型的不稳定,特别是在前几轮迭代过程中。
YOLOv2不去预测Boxes的偏移,而是采用跟YOLOv1中类似的方式,预测Boxes相对于网格单元位置的坐标,并通过逻辑激活函数将坐标值约束在[0,1]。
通过这个“相对坐标”到“绝对坐标”的优化,YOLOv2训练更容易,参数更容易学习,网络更稳定。
YOLO v2在最终的13×13的特征图上进行预测,对大尺度的物体预测没有问题,但是对于小体积的物体的预测还是不够的。对于Anchor Box的产生,Fast—RCNN和SSD都是在不同层次的特征图上进行的,从而获得了多尺度的候选框,满足对大小不等物体的检测需求。
YOLOv2改进了这一流程,在13×13特征图的上一层特征图(大小26×26)上,添加了一个转移层(passthrough layer),把这一层特征跟下一层的13×13的特征图相融合,这一操作类似于Resnet中的identity mappings。融合后的特征拥有了更多的细粒度特征,对小物体的检测定位效果有提升约1%。
具体来说就是特征重排(不涉及到参数学习),前面26 * 26 * 512的特征图使用按行和按列隔行采样的方法,就可以得到4个新的特征图,维度都是13 * 13 * 512,然后做concat操作,得到13 * 13 * 2048的特征图,将其拼接到后面的层(维度是13*13*1024),相当于做了一次特征融合,有利于检测小目标。
v1的输入是448×448,v2中加入了anchor Boxes,输入尺寸变成了416×416(为了获得奇数×奇数特征图),YOLO v2作者同时希望v2版本在不同尺寸输入图片上都可以稳健检测,所以作者在训练过程上进行了优化。
不同于固定输入网络的图片尺寸的方法,作者在训练过程中每经过10个epoch之后就会随机选择新的图片尺寸。YOLO网络图片尺寸更改使用的参数为32,每次把图像扩大或缩小32的倍数大小,最小的尺寸为320 * 320,最大的尺寸为608 * 608。接着按照输入尺寸调整网络进行训练。
这种机制使得网络可以更好地预测不同尺寸的图片,意味着同一个网络可以进行不同分辨率的检测任务,在小尺寸图片上YOLOv2运行更快,在速度和精度上达到了平衡。
以往的网络框架多是以VGG网络为基础提取特征的,VGG网络的复杂度有些冗余,运算量很大,224 * 224的图片进行一次前向传播,其卷积层就需要多达306.9亿次浮点数运算。
YOLO v2使用了新的分类网络,是在GoogleNet网络基础上改进的,比VGG-16更快,一次前向传播仅需85.2亿次运算,精度略低于VGG,使用了较多的3×3卷积,在每一次Maxpool层之后都把特征通道数扩充至两倍,网络最后使用的是平均池化,最终的网络结构包含了19个卷积层,5个最大池化层,一个平均池化层,特征提取网络(命名为Darknet-19)具体结构如下:
作者在Darknet-19网络上训练了224×224和448×448分辨率的ImageNet数据,达到分类top-1准确率76.5%,top-5准确率93.3%。
v2的训练网络去掉了Darknet-19的最后一个卷积层,增加了3个卷积核大小是3×3的卷积层,特征维度是1024,并且在每一个上述卷积层后面跟一个1 * 1的卷积层,输出维度是预先定义的检测的物体的类别数量。
对于VOC数据集,从预测出的每个网格单元(13×13,共169个网格)中预测5个boxes,每个box包含5个坐标值和20个类别,所以每个网格总共是5 * (5+20)= 125个输出维度,对于整个图片的输出是13×13×125维的Tensor。同时也添加了转移层(passthrough layer ),从最后那个3 * 3 * 512的卷积层连到倒数第二层,使模型有了细粒度特征。