为更好理解YOLOv2模型,请先移步,了解YOLOv1后才能更好的理解YOLOv2所做的改进。
前情回顾:【目标检测系列】YOLOV1解读_怀逸%的博客-CSDN博客
背景
通用的目标检测应该具备快速、准确且能过识别各种各样的目标的特点。自从引入神经网络以来,检测框架已经变得越来越块和准确,但是受限于数据集规模的大小,检测方法仍被限制在小部分目标中。
目标检测数据集标注难度远大于分类任务,常见数据集的规模包含几千到数十万张图象,有几十到几百个标签,和分类任务数以百万计的图像及数十万的类别相比,远远不足。我们是希望检测能够达到目标分类的水平。
因此本文的主要工作就是在YOLOV1的基础上进行改进提出了YOLOv2。并提出了一种联合训练方法,在ImageNet的9000多个类别以及COCO的检测数据集上训练一个能够检测9000种类别的模型YOLO9000。
下面是具体的改进措施,从更好、更块、更强三个方向进行改进
更好
Batch Normalization——批量归一化
通过在YOLO的所有卷积层上添加BatchNorm,我们在mAP上的到了2%的改善。BatchNorm也有助于规范化模型,可以在舍弃dropout优化后依然不会过拟合。
High Resolution Classifier——高分辨率分类器
16年的时候分类任务的发展速度远超于目标检测任务,因此在当时的背景下,所有最先进的目标检测方法都是使用在ImageNet上预训练的分类器作为预训练模型,然后迁移到目标检测任务中,使用目标检测数据集进行微调。但是,在最初的时候,像是AlexNet这样的分类器,都是在分辨率小于256*256的输入图像上进行运行的。
因此,在YOLOV1版本中,是先使用分辨率为224*224的分类器作为预训练模型,然后迁移到目标检测领域,使用448*448的完整分辨率进行微调。
YOLOv2对此的改进是,是先在ImageNet数据集中,以448*448的分辨率对分类网络进行微调,微调后的网络能够完成448*448分辨率图像的分类任务,最后将微调好的分类器迁移到目标检测任务中。
概括就是:YOLOv1使用224*224的分类器直接迁移到448*448的目标检测任务中。YOLOv2是先将分类器微调成448*448,然后再迁移到目标检测任务中。
最终效果mAP增加4%
Convolutional With Anchor Boxes——带有Anchor Boxes的卷积
Anchor: Anchor(先验框)就是一组预设的边界框,可以由横纵比和边框面积来定义,代表了开发人员凭借先验知识认为的待检测物体的形状大小。相当于,开发人员凭借先验知识,设计若干的Anchor,在可能的位置先将目标框出来,然后再在这些Anchor的基础上进行调整。
一个Anchor Box可以由边框的横纵比和边框的面积来定义,至于位置一般不需要定义,目标可能出现在图像的任意位置,因此Anchor Box通常是以CNN提取到的Feature Map的点为中心位置,按照预设大小生成边框。
下面来说一下YOLOv1中存在的问题,YOLOv1中每个cell存在B个框,只能预测一个类别,因此对小尺度的图像效果不佳;同时YOLOv1在训练过程中学习适应同一物体的不同形状是比较困难的,这也导致了YOLOv1在精确定位方面表现较差。之所以这样,是因为YOLOv1直接使用全连接层来预测边界框,要知道全连接层需要固定大小的输入,这也就导致了YOLOv1难以泛化到不同的尺度。
作者发现通过预测偏移量而不是坐标值能够简化问题,让网络学起来更容易,借鉴Faster R-CNN的做法,YOLOv2删掉了全连接层和最后一个Pooling层,使用卷积核来预测边界框,通过在每个cell预先设定一组不同大小和宽高比的Anchor boxes,来覆盖整个图像的不同位置和多种尺度。同时将网络的输入分辨率降为416*416
使用416*416而不是448*448的原因是因为YOLOv2下采样步长为32,对于416*416的图片,特征图为13*13,奇数给位置,确保在特征图正中间会存在一个中心单元格(大多数图像中,目标往往会占据图像中间位置)
同时YOLOv2的输出含义也发生变化
YOLOv1输出:S*S*(B*5+C)
YOLOv2输出:S*S*(B*(5+C)) 不再是每个cell只能预测一个类别,而是每个box能单独预测一个类别
Dimension Clusters——维度聚类(K-means聚类确定Anchor初始值)
如果想要在YOLO中使用锚框,需要解决两个问题:第一个问题,锚框的尺寸应该如何选择,总不能每次都要开发人员去手动设计吧,这与YOLO的设计初衷不符。针对这个问题具体的结局方案就是使用K-means聚类方法,自动找到较好的训练参数。
具体来说,就是针对训练集中的真实框做K-means聚类算法,自动找到符合该训练集的锚框尺寸。同时针对K-means算法做了一点改进,使其更加符合目标检测算法的需求。具体来说,如果像标准K-means算法中一样,使用欧氏距离的话,大的锚框会比小的锚框产生更多的误差,因此,希望关于距离的度量与框的大小无关,所以采用交并比替换欧氏距离,距离度量公式改为d(box, centroid) = 1 - IOU(box, centroid)
Direct location prediction——直接的位置预测
需要解决的第二个问题:模型的不稳定。基于Anchor的方法再回归锚框时,并非直接得到最终坐标,实际上真正需要学习的是目标与预设Anchor的坐标偏移量,下面是公式 预测框中心坐标= 输出的偏移量×Anchor宽高+Anchor中心坐标,偏移量才是要学习的内容。这也就导致了一个问题,因为目标可能会出现在图像中的任意位置,在随机初始化的条件下,模型需要很长时间才能稳定的预测到合理的便宜量。
解决这个问题的办法就是,将预测边界框的偏移量由全图偏移量改成对象cell的左上角的相对偏移量,将预测框的偏移范围控制在每个cell中,做到每个Anchor只负责检测周围正负一个单位内的cell。这样可以使模型训练更加稳定。
Fine-Grained Features——细粒度的特征
YOLOv2使用13*13的特征图进行检测,虽然检测大的目标够用了,但是对于较小的对象来说,更细粒度的特性可能会使得检测效果更好。
与Faster R-CNN等使用多尺度的特征图不同,YOLOv2简单的增加了一个直通层,获得前层26*26分辨率特征。
具体操作:前层26*26分辨率特征图拆分成4块,沿通道拼接到13*13的特征图中
Multi-Scale Training——多尺度训练
YOLOv1固定448*448的分辨率作为输入,上面加入锚框操作后,我们将分辨率改成了416*416操作。在实际的应用中,我们需要先将图片放缩到416*416的固定大小,才可以保证网络正确检测到目标。但是,我们希望YOLOv2能够鲁棒的运行在不同尺寸的图像中,不要对数据进行放缩处理。
解决方案是利用YOLOv2只使用了卷积和池化层的特点,这意味着输入图像的大小并不会影响模型的正常运行。因此具体做法就是:网络训练过程中每隔10个epoch就随机一个新的尺寸的图像作为输入训练,这样整个训练流程下来,模型见到过各种尺寸的输入,自然能在不同尺寸在正常执行检测任务。由于模型的下采样采用了32倍,那么训练模型所用的图像分辨率就从{320,352,。。。,608}等中选择。
更快
除了检测更加准确之外,我们还希望能够以更快的速度运行,具体方法在本文中新提出了一个Darknet-19的网络
在YOLOv1中用的是GooLeNet(4个卷积层和2个全连接层),YOLOv2改用Darknet-19(19个卷积层和5个maxpooling层)
在YOLOv1中最后使用全连接层将7*7*1024的特征图变成7*7*30的特征图,但是这种变化完全可以通过卷积实现,从而大幅度减少参数量。
更强
作者提出了一种对分类和检测数据进行联合训练的机制。在此之前,先介绍下YOLOv2和YOLO9000的区别
YOLOv2:是在YOLOv1的基础上进行改进,特点是“更好、更快、更强”
YOLO9000:主要检测网络也是YOLOv2,同时使用联合优化技术进行训练,最终使得YOLO9000的网络结构允许实时的检测超过9000种物体分类,进一步缩小了检测数据集和分类数据集之间的大小代沟。
具体方法:
- 输入的图片若为目标检测标签的,则在模型中反向传播目标检测的损失函数
- 输入的图片若为分类标签的,则反向传播分类的损失函数
这样做的原理是因为虽然目标检测的数据集规模相对较小,但其实已经能够覆盖大多数物体的形状,例如:猫科动物中,狮子、老虎、豹子等体型类似,检测模型能够检测出这些物体所在的位置,缺乏的只是进一步分类的能力。而分类数据集要丰富得多,关于类别的标准要远远超过检测数据集。
综上,检测数据集可以为绝大多数物体提供位置信息,但缺少细分类的能力;分类数据集为更多物体提供最准确的类别信息,但缺少位置信息,二者结合则得到了YOLO9000
论文链接:https://arxiv.org/abs/1612.08242