目录
(2)高分辨率分类器High resolution classifier
(5)位置预测Direct location prediction
(7)多尺度图形训练Multi-Scale Training
YOLOv1拙见https://blog.youkuaiyun.com/xue_csdn/article/details/105949984
YOLOv2相比YOLOv1,预测更准确(Better),速度更快(Faster),识别对象更多(Stronger)
1、Better
(1)批归一化BN
BN(Batch Normalization)这里就不详细介绍了。
BN其实在YOLOv1中就出现过了,但是YOLOv1还伴随着dropout的使用。在YOLOv2中取消了dropout,全部使用BN,降低过拟合。
(2)高分辨率分类器High resolution classifier
同YOLOv1一样,在训练模型时先在ImageNet上进行了预训练,输入图片的尺度为224×224,同样在检测时需要将输入从224×224变为448×448,但是直接切换会对模型性能造成影响。
所以在YOLOv2中,作者提出首先对分类网络(自定义darknet)进行微调fine tune,以448×448在ImageNet数据集上训练10个epoch,使网络有充足的时间适应,然后对检测网络部分同样进行微调(变为416×416,下一步会介绍到)。
(3)用Anchor Boxes卷积
借鉴了Faster RCNN的RPN。
首先是去掉了FC,以及最后的max pooling层(确保得到的feature map有更高的分辨率),将分辨率变为416×416(使feature map的宽高均为奇数),而且由于有5个max pooling作下采样,缩小比值为32,所以最终由416×416得到13×13的feature map(416/32=13),也就是13×13个grid.
每个grid预先设定一组(9个)不同大小和宽高比的先验框。相比于YOLOv1的7×7×2=98个框,YOLOv2可检测13×13×9=1521个框。
(4)维度聚类Dimension clusters
Faster R-CNN和SSD的先验框的大小是手动设定的,有一定的主观性,YOLOv2采用k-means聚类方法对训练集中标注的边界框做了聚类分析。作者发现如果采用标准的 k-means(即用欧式距离来衡量差异),在 box 的尺寸比较大的时候其误差也更大,而我们希望的是误差和 box 的尺寸没有太大关系。所以通过 IOU 定义了如下的距离函数,使得误差和 box 的大小无关。
centroid是聚类时被选作中心的边框,box就是其它边框,d就是两者间的“距离”。IOU越大,“距离”越近。
图的左边代表随着k的增加,average IOU也在逐渐增加,当k=5时,recall值和模型复杂度会有一个较好的权衡,右边就是选出的5个聚类中心。
(5)位置预测Direct location prediction
在早期阶段,模型训练容易不稳定,是由于预测 Box 的(x,y)位置。预测公式为:
论文中都是减号,其实应该是加号(可以去参考Faster RCNN的推导公式)
意味着当tx=1时,右移的长度(
是先验框的宽),tx=-1时,左移
的长度
但是tx和ty没有约束限制,容易导致不稳定。YOLOv2调整了预测公式,采用了预测相对于grid cell的坐标位置的方法,利用logistic激活把ground truth限制在0到1之间。
输出的feature map中,每个cell(网格)预测5个bbox,每个bbox有5个参数,,
,
,
,
,
cx和cy是当前cell左上角到图像左上角的距离(网格宽高归一化为1),pw和ph是当前cell对应bbox的宽和高
将,
约束在(0,1)范围内,蓝色点被约束在当前cell内,使得训练更加稳定。
(6)细粒度特征Fine-Grained Features
增加passthrough层,对小目标的检测精度有帮助。把高分辨率的特征和低分辨率的特征连接起来,连接方式是叠加特征到不同的通道,而不是空间位置,类似于ResNet

具体过程是:将26×26×512特征图变为13×13×2048,后者可直接与原始特征(original feature)相连接。
一个知乎博主是这么解释的:(见图片水印)
passthrough不涉及参数的计算,26×26×512使用按行和按列隔行采样的方法,得到4个13×13×512的特征图,然后concat,得到13×13×2048,最后拼接到后面的层,相当于做了一次特征融合。这样就对于小目标的检测起到很好的作用。
(7)多尺度图形训练Multi-Scale Training
YOLOv2去掉了FC,所以YOLOv2的输入可以不限于416*416大小的图片。
因为整个网络下采样倍数是32,作者采用了{320,352,...,608}等10种输入图像的尺寸,这些尺寸的输入图像对应输出的特征图宽和高是{10,11,...19}。训练时每10个batch就随机更换一种尺寸,使网络能够适应各种大小的对象检测。
2、Faster
一张224×224的图片通过VGG16要经过306.9亿浮点运算,为了更快,网络没必要像VGG16这么复杂。
YOLOv2用基于GoogleNet的自定义的网络,一次前向传播只要85.2亿次浮点运算,虽然准确率较VGG16有所下降,在ImageNet上从90%下降到了88%。
(1)darknet-19
最后的 1x1 卷积层的存在是为了跨通道信息整合
- 大量使用3×3卷积
- pooling之后,通道数翻倍
- 用global average pooling预测结果
- 3×3之间采用1×1来压缩特征
- BN
- 运算次数:55.8亿次
(2)训练分类模型
第一阶段:
- 输入224×224
- ImageNet 1000 数据集
- 160epoch
- SGD
- 初始learning rate = 0.1
- polynomial rate decay = 4
- weight decay = 0.0005
- momentum = 0.9
第二阶段:
- 微调至448×448
- 其他参数一样,learning rate = 0.001
(3)训练检测模型
第三阶段:
- 移除最后一个conv层,及后边的池化、softmax
- 增加3个3×3×1024的conv层,后边加1×1,输出维度(最后一个1×1的个数)就是检测的数量(例如,对于VOC数据集,每个grid预测5个框,每个框有5个坐标点和20个类别,因此需要5×25=125个filter)
- 增加pass through层,从最后的3×3×512到倒数第二个conv层
- 训练160 epoch
- 开始 learning rate = 0.001,到60和90 epoch时,减为上一次的0.1倍
- weight decay = 0.0005
- momentum = 0.9
还是前边提到的那个知乎博主:
看一下passthrough层。图中第25层route 16,意思是来自16层的output,即26*26*512,这是passthrough层的来源(细粒度特征)。第26层1*1卷积降低通道数,从512降低到64(这一点论文在讨论passthrough的时候没有提到),输出26*26*64。第27层进行拆分(passthrough层)操作,1拆4分成13*13*256。第28层叠加27层和24层的输出,得到13*13*1280。后面再经过3*3卷积和1*1卷积,最后输出13*13*125。
附上一张更直观的图(输入是608×608,但是总的层数不影响)
对于训练图片的ground truth,由该ground truth中心点所在的网格cell进行预测,5个中与ground truth有最大IOU的那个anchor负责预测,剩余4个不与该ground truth匹配。
匹配原则:对于某个ground truth,首先要确定其中心点要落在哪个cell上,然后计算这个cell的5个先验框与ground truth的IOU值(YOLOv2中bias_match=1),计算IOU值时不考虑坐标,只考虑形状,所以先将先验框与ground truth的中心点都偏移到同一位置(原点),然后计算出对应的IOU值,IOU值最大的那个先验框与ground truth匹配,对应的预测框用来预测这个ground truth。
stronger部分(YOLO 9000)在下一篇介绍。