BN(批量归一化)层简单讲就是对网络的每一层的输入都做了归一化,这样网络就不需要每层都去学数据的分布,收敛会快点。作者在YOLOv2中为每个卷积层都添加了BN层,由于BN可以规范模型,所以加入BN后就把dropout去掉了,实验证明添加了BN层可以提高2%的mAP。
高分辨率分类器。目前的目标检测方法中,基本上都会使用ImageNet预训练过的模型(classifier)来提取特征,如果用的是AlexNet网络,那么输入图片会被resize到不足256 * 256,导致分辨率不够高,给检测带来困难。
YOLOv1
这会导致从分类模型切换到检测模型的时候,模型还要适应图像分辨率的改变。
YOLOv2:
YOLOv1是利用全连接层直接预测bounding box的坐标,导致丢失较多的空间信息,定位不准。将输入图像分成7*7的网格,每个网格预测2个bounding box,一共只有7*7*2=98个box。
YOLOv2则借鉴了Faster R-CNN的思想,引入anchor。输出feature map大小为13*13,每个cell有5个anchor box预测得到5个bounding box,一共有13*13*5=845个box。增加box数量是为了提高目标的定位准确率。
做法:
YOLOv2中,不再让类别的预测与每个cell(空间位置)绑定一起,而是让全部放到anchor box中。
维度聚类。
Faster R-CNN中anchor box的大小和比例是按经验设定的,然后网络会在训练过程中调整anchor box的尺寸。如果一开始就能选择到合适尺寸的anchor box,那肯定可以帮助网络更好地预测。
所以作者采用k-means的方式对训练集的bounding boxes(就是groundTruth)做聚类,试图找到合适的anchor box。
传统的K-means聚类方法使用的是欧氏距离函数,也就意味着较大的boxes会比较小的boxes产生更多的error,聚类结果可能会偏离。为此,作者采用的评判标准是IOU得分(也就是boxes之间的交集除以并集),这样的话,error就和box的尺度无关了,最终的距离函数为:
在VOC和COCO数据集上的聚类分析结果,随着聚类中心数目的增加,平均IOU值(各个边界框与聚类中心的IOU的平均值)是增加的,但是综合考虑模型复杂度和召回率,作者最终选取5个聚类中心作为先验框。
COCO: (0.57273, 0.677385), (1.87446, 2.06253), (3.33843, 5.47434), (7.88282, 3.52778), (9.77052, 9.16828)
VOC : (1.3221, 1.73145), (3.19275, 4.00944), (5.05587, 8.09892), (9.47112, 4.84053), (11.2364, 10.0071)
实验结果:
作者在引入anchor box的时候遇到的第二个问题:模型不稳定,尤其是在训练刚开始的时候。
作者认为这种不稳定主要来自预测box的中心坐标(x,y)
值。
在基于region proposal的目标检测算法中,是通过预测tx
和ty
来得到(x,y)
值,也就是预测的是offsets。
Faster R-CNN中的公式:
x 是坐标预测值
xa 是anchor坐标(预设固定值)
x∗ 是坐标真实值(标注信息)
t 是偏移量
所以bbox的中心坐标为:
这个公式是无约束的,预测的边界框很容易向任何方向偏移。
当tx=1时,box将向右偏移一个anchor box的宽度;
当tx=-1时,box将向左偏移一个anchor box的宽度;
因此,每个位置预测的边界框可以落在图片任何位置,这导致模型的不稳定性,在训练时需要很长时间来预测出正确的offsets。
YOLOv2沿用了YOLOv1的方法,就是预测边界框中心点相对于对应cell左上角位置的相对偏移值。
为了将bounding box的中心点约束在当前cell中,使用sigmoid函数将tx、ty
归一化处理,将值约束在0~1
,也就是下图的:σ(tx),σ(ty)这使得模型训练更稳定。
网络在最后一个卷积层输出13*13的feature map,有13*13个cell,每个cell有5个anchor box来预测5个bounding box,每个bounding box预测得到5个值。分别为:tx、ty、tw、th和to(类似YOLOv1的confidence)。
这里添加了一个直通层(passthrough layer),即就是源码中的reorg layer,将前面一层的26*26的特征图和本层13*13的特征图进行连接,与ResNet网络的shortcut类似,以前面更高分辨率的特征图为输入,然后将其连接到后面的低分辨率特征图上。
在13*13的特征图上做预测,虽然对于大目标已经足够了,但对小目标不一定足够好,这里合并前面大一点的特征图可以有效的检测小目标。
具体操作:对于26*26*512的特征图,经passthrough层处理之后就变成了13*13*2048的新特征图(特征图大小变为1/4,而通道数变为以前的4倍),然后与后面的13*13*1024特征图连接在一起形成13*13*3072的特征图,最后在该特征图上卷积做预测。
注:passthrough layer,具体来说就是特征重排(不涉及到参数学习),前面26 * 26 * 512的特征图使用按行和按列隔行采样的方法,就可以得到4个新的特征图,维度都是13 * 13 * 512,然后做concat操作,得到13 * 13 * 2048的特征图。
YOLOv2中只有卷积层和池化层(无全连接),因此不需要固定的输入图片的大小。
为了让模型更有鲁棒性,作者引入了多尺度训练。就是在训练过程中,每迭代一定的次数,改变模型的输入图片大小。
注:这一步是在检测数据集上fine-tuning时候采用的,不要跟前面在Imagenet数据集上的两步预训练分类模型混淆。
具体操作:在训练时,每10epoch?网络就会随机选择另一种size的输入。
网络输入是416*416,经过5次max pooling之后会输出13*13的feature map,也就是下采样32倍,因此作者采用32的倍数作为输入的size,具体采用320、352、384、416、448、480、512、544、576、608共10种size。
输入图片大小为320*320时,特征图大小为10*10,输入图片大小为608*608时,特征图大小为19*19。每次改变输入图片大小还需要对最后检测层进行处理,然后开始训练。
这种网络训练方式使得相同网络可以对不同分辨率的图像做检测。
在输入size较大时,训练速度较慢,在输入size较小时,训练速度较快,而multi-scale training又可以提高准确率,因此算是准确率和速度都取得一个不错的平衡。
网络包含19个卷积层和5个max pooling层,而在YOLOv1中采用的GooleNet,包含24个卷积层和2个全连接层,因此Darknet-19整体上卷积卷积操作比YOLOv1中用的GoogleNet要少,这是计算量减少的关键。最后用average pooling层代替全连接层进行预测。