前面我们已经讲解过了YOLOV1,因此在这里我会接着前几天的讲解,进一步写一下YOLOV2的基本思想和改进。
YOLOv2的论文全名为YOLO9000: Better, Faster, Stronger,它斩获了CVPR 2017 Best Paper Honorable Mention。在这篇文章中,作者首先在YOLOv1的基础上提出了改进的YOLOv2,然后提出了一种检测与分类联合训练方法,使用这种联合训练方法在COCO检测数据集和ImageNet分类数据集上训练出了YOLO9000模型,其可以检测超过9000多类物体。所以,这篇文章其实包含两个模型:YOLOv2和YOLO9000,不过后者是在前者基础上提出的,两者模型主体结构是一致的。YOLOv2相比YOLOv1做了很多方面的改进,这也使得YOLOv2的mAP有显著的提升,并且YOLOv2的速度依然很快,保持着自己作为one-stage方法的优势,YOLOv2和Faster R-CNN, SSD等模型的对比如下图所示。下面将首先介绍YOLOv2针对YOLOv1改进策略。
YOLOV2 相对于YOLOV1 的改进主要可以分为以下三点:
1、网络结构的改进
2、Anchor的设计
3、训练策略的改进
接下来我就从这三点进行展开阐述。
在每个卷积层和激活函数层之间加入了BN层。Batch Normalization有助于解决反向传播过程中的梯度消失和梯度爆炸问题,降低对一些超参数(比如学习率、网络参数的大小范围、激活函数的选择)的敏感性,可以提升模型收敛速度,而且可以起到一定正则化效果,降低模型的过拟合。在YOLOv2中,每个卷积层后面都添加了Batch Normalization层,并且不再使用droput,关于这一点改进也是现在很多模型用的一点。使用Batch Normalization后。YOLOv2的mAP提升了2.4%。
加入BN层之后,为了能够更好地对小目标的物体进行检测,YOLOV2 还提出了一个passthrough层来检测细粒度特征。与SSD使用多尺度特征图不同,passthrough层与ResNet网络的shortcut类似,以前面更高分辨率的特征图为输入,然后将其连接到后面的低分辨率特征图上。具体来说,将倒数第二次下采样之前的特征图(26×26×512)抽取成为2 × 2 的局部区域并将其在channel维度上面进行拼接。对于26×26×512的特征图,经passthrough层处理之后就变成了13×13×2048的新特征图(特征图大小降低4倍,而channles增加4倍,这样就可以与后面的13×13×1024特征图连接在一起形成13×13×3072的特征图,然后在此特征图基础上卷积做预测。具体实现方式如下图所示。(注意此处的连接使用的是concatenate连接方式,即通道拼接)。
至于为什么 passthrough 好用吗,具体来说浅层特征图包含的更多是位置。细节信息,在检测上面可以更好地用于检测框的回归。而更深层次的特征图包含的就是语义信息,分类需要的是语义信息,而检测更多的是需要物体的物理信息。因此融合浅层特征可以提升检测的效果。
YOLOV2关于Anchor的部分还是有很大改变的。首先体现在 在YOLOv1中,输入图片最终被划分为7×7网格,每个单元格预测2个边界框。YOLOv1中包含全连接层,从而能直接预测bounding boxes的坐标值,其中边界框的宽与高是相对整张图片大小的。由于各个图片中存在不同尺度和长宽比的物体,YOLOv1在训练过程中学习适应不同物体的形状是比较困难的,这也导致YOLOv1在精确定位方面表现较差。作者发现通过预测偏移量而不是坐标值能够简化问题,让网络学习起来更容易。
借鉴Faster R-CNN的做法,YOLOv2移除了YOLOv1中的全连接层而采用了卷积核anchor boxes来预测边界框。通过在每个cell预先设定一组不同大小和宽高比的边框,来覆盖整个图像的不同位置和多种尺度。同时为了使检测实用的特征图分辨率更高,去掉了网络中的一个pooling层。并且网络输入图像尺寸变为416×416,而不是原来的448×448。YOLO的卷积层采用32这个值来下采样图像,所以网络输入为416×416,输出为13×13的feature map。使用Anchor Box会让精确度稍微下降,但用了它能使YOLO能预测出13×13×9=1521个框。因此相对于YOLOv1 81%的召回率, YOLOv2的召回率大幅度提升到88%。
在Faster R-CNN和SSD中,先验框的维度(长和宽)都是手动设定的,带有一定的主观性。如果选取的先验框维度比较合适,那么模型更容易学习,从而做出更好的预测。因此,YOLOv2采用k-means聚类方法对训练集中的边界框做了聚类分析,以寻找尽可能匹配样本的边框尺寸。
聚类算法最重要的是选择如何计算两个边框之间的“距离”,对于常用的欧式距离,大边框会产生更大的误差。而且设置先验框的主要目的是为了使得预测框与ground truth的IOU更好,所以聚类分析时选用box与聚类中心box之间的IOU值作为距离指标:
centroid是聚类时被选作中心的边框,box就是其它边框,d就是两者间的“距离”。IOU越大,“距离”越近。YOLO2给出的聚类分析结果如下图所示:
上图左边是选择不同的聚类k值情况下,得到的k个centroid边框,计算样本中标注的边框与各centroid的Avg IOU。显然,边框数k越多,Avg IOU越大。YOLO2选择k=5作为边框数量与IOU的折中。对比手工选择的先验框,使用5个聚类框即可达到 0.61 Avg IOU,相当于9个手工设置的先验框0.609 Avg IOU。
所以综合以上三点,在YOLOV2的输出为7*7*(5*5+s),其中s是分类的数量。
图像分类的训练样本很多,而标注了边框的用于训练对象检测的样本相比而言就比较少了,因为标注边框的人工成本比较高。所以对象检测模型通常都先用图像分类样本训练卷积层,提取图像特征。但这引出的另一个问题是,图像分类样本的分辨率不是很高。所以YOLO v1使用ImageNet的图像分类样本采用 224*224 作为输入,来训练CNN卷积层。然后在训练对象检测时,检测用的图像样本采用更高分辨率的 448×448 的图像作为输入。但这样切换对模型性能有一定影响。所以YOLO2在采用 224×224 图像进行分类模型预训练后,再采用 448×448 的高分辨率样本对分类模型进行微调(10个epoch),使网络特征逐渐适应 448×448 的分辨率。然后再使用 448×448 的检测样本进行训练,缓解了分辨率突然切换造成的影响。
由于YOLOv2模型中只有卷积层和池化层,所以YOLOv2的输入可以不限于416×416大小的图片。为了增强模型的鲁棒性,YOLOv2采用了多尺度输入训练策略,具体来说就是在训练过程中每间隔一定的iterations之后改变模型的输入图片大小。由于YOLOv2的下采样总步长为32,输入图片大小选择一系列为32倍数的值:{320,352,…,608},输入图片最小为320×320,此时对应的特征图大小为10×10,而输入图片最大为608*608,对应的特征图大小为19×19。在训练过程,每隔10个iterations随机选择一种输入图片大小,然后只需要修改对最后检测层的处理就可以重新训练。 这样训练出来的模型可以预测多个尺度的物体。并且,输入图片的尺度越大则精度越高,尺度越小则速度越快,因此YOLOv2多尺度训练出的模型可以适应多种不同场景的要求。
采用Multi-Scale Training策略,YOLOv2可以适应不同大小的图片,并且预测出很好的结果。在测试时,YOLOv2可以采用不同大小的图片作为输入,在VOC 2007数据集上的效果如下图所示。可以看到采用较小分辨率时,YOLOv2的mAP值略低,但是速度更快,而采用高分辨输入时,mAP值更高,但是速度略有下降,对于544*544,mAP高达78.6%。注意,这只是测试时输入图片大小不同,而实际上用的是同一个模型(采用Multi-Scale Training训练)。
这里的东西前面基本都讲过了,需要说的一点就是由于YOLOv2在每一个区域预5个边框,每个边框有25个预测值,因此最后输出的特征图通道数为125。其中,一个边框的25个预测值分别是20个类别预测,4个位置预测及1个置信度预测值。这里和v1有很大区别,v1是一个区域内的边框共享类别预测,而这里则是相互独立的类别预测值(即解决YOLOv1中每个cell只能预测一个物体的缺点)。
至于正负样本以及损失函数,和YOLOV1一样,并没有做出改变。
总结来看,虽然YOLOv2做了很多改进,但是大部分都是借鉴其它论文的一些技巧,如Faster R-CNN的anchor boxes,YOLOv2采用anchor boxes和卷积做预测,这基本上与SSD模型(单尺度特征图的SSD)非常类似了,而且SSD也是借鉴了Faster R-CNN的RPN网络。从某种意义上来说,YOLOv2和SSD这两个one-stage模型与RPN网络本质上无异,只不过RPN不做类别的预测,只是简单地区分物体与背景。在two-stage方法中,RPN起到的作用是给出region proposals,其实就是作出粗糙的检测,所以另外增加了一个stage,即采用R-CNN网络来进一步提升检测的准确度(包括给出类别预测)。而对于one-stage方法,它们想要一步到位,直接采用“RPN”网络作出精确的预测,要因此要在网络设计上做很多的tricks。YOLOv2的一大创新是采用Multi-Scale Training策略,这样同一个模型其实就可以适应多种大小的图片了。
YOLOv2相较于之前的版本有了质的飞跃,主要体现在吸收了其他算法的优点,使用了先验框、特征融合等方法,同时利用了多种训练技巧,使得模型在保持极快速度的同时大幅度提升了检测的精度。YOLOv2已经达到了较高的检测水平,但如果要分析其不足的话,大体有一下3点:
● 单层特征图:虽然采用了Passthought层来融合浅层特征,增强多尺度检测性能,但仅仅采用一层特征图做预测,细粒度仍然不够,对小物体等检测提升有限,并且没有使用残差这种较为简单、有效的结构。
● 受限于其整体网络架构,仍然没有很好地解决小物体的预测问题。
参考:【目标检测】单阶段算法--YOLOv2详解