yolo进化史之yolov2
yolov1和当时最好的目标检测系统相比,有很多缺点.比如和Fast R-CNN相比,定位错误更多.和基于区域选择的目标检测方法相比,recall也比较低.yolov2的目标即在保证分类准确度的情况下,尽可能地去提高recall和定位精度.
上图是yolo尝试了的方法.
可以看到使得检测精度得到大幅提升的主要就是hi-res classifier和dimension priors && location prediction
Batch Normalization
bn使得mAP提高了2%.并且可以去掉dropout而不带来过拟合.
High Resolution Classifier
yolo可以看成2部分组成,一个是特征提取部分,这部分就是分类网络的全连接层之前的部分. 一个是yolo做预测的部分.
YOLO训练分为两个阶段。首先,我们训练一个像VGG16这样的分类器网络。然后用卷积层替换全连接层,并对其进行端到端的再训练,用于目标检测。yolov1用224 * 224的图片训练分类器,然后用448 * 448的图片做目标检测。 yolov2在用224*224的图片读分类网络做训练以后,再用10个迭代,用448*448的图片去对网络做微调.这样的话,卷积核的参数就可以更好地适应高分辨率的输入,然后用448*448的图片去做检测网络的训练. 此举提高了mAP 4%.
Convolutional With Anchor Boxes
yolov1用全连接层做box的坐标预测. 这个会造成在训练的初始,梯度不够稳定,因为一开始预测的尺寸对某一物体有效,可能对另一物体无效.但是现实世界里,目标的尺寸并不是随机的,所以我们事先聚类好一些anchor box(锚或者叫先验框),依次为基础,去做box坐标预测.
anchor的采用让mAP从69.5掉到了69.2,但是recall从81%上升到了88%.
Using anchor boxes we get a small decrease in accuracy.
YOLO only predicts 98 boxes per image but with anchor
boxes our model predicts more than a thousand. Without
anchor boxes our intermediate model gets 69:5 mAP with a
recall of 81%. With anchor boxes our model gets 69:2 mAP
with a recall of 88%. Even though the mAP decreases, the
increase in recall means that our model has more room to
improve.
论文里,这里让人有点迷惑,其实这里说的anchor box是作者手工选择的box,而不是k-means聚类出来的,采用了k-means聚类的box作为anchor box,把mAP提高了接近5%. 对应于文章开头的图里的dimension priors. 聚类先验框可以参考https://www.cnblogs.com/sdu20112013/p/10937717.html
-
去除全连接层
-
把对class的预测从cell级别调整到针对box.
yolov1每个cell预测出2个box,class个prob. yolov2有5个anchor box.依据每个anchor box预测出(1+4+20)个参数,所以每个cell预测出
5*(1+4+20)=125个参数.
- 图像输入尺寸由448调整到416,同时去掉一个池化层
这样最终得到的feature map的13*13的.
作者认为通常目标位于图片中央,尤其是大目标,所以希望特征图是奇数的,这样就有某一个确定的cell去预测目标而不是用临近的4个cell.
We do this because we want an odd number of
locations in our feature map so there is a single center cell.
Objects, especially large objects, tend to occupy the center
of the image so it’s good to have a single location right at
the center to predict these objects instead of four locations
that are all nearby
- 去掉一个池化层使得最终输出是 13×13 (instead of 7×7).
Direct location prediction
我们怎么计算预测的box坐标值呢?
σ(tx)函数将预测值限定到了0-1之间.这样就保证了我们预测出来的box仍然是围绕着当前cell的.这一点也使得网络更稳定.
Since we constrain the location prediction the
parametrization is easier to learn, making the network
more stable. Using dimension clusters along with directly
predicting the bounding box center location improves
YOLO by almost 5% over the version with anchor boxes
Fine-Grained Features
随着卷积不断进行,我们最终得到一个13*13的特征图.对大目标来说,基于这个特征图做预测是ok的,但是对小目标来说就没那么好了.Faster R-CNN或者SSD在不同的layer生成的特征图上去做位置的预测,相当于不同分辨率的特征图负责不同尺寸的目标. yolo采取了一个不同的思路,把两个layer的feature map连成一个.称之为passthrough,在此基础去做预测.如下图:
Multi-Scale Training
由于去掉了全连接层,模型的输入可以使任意size.为了让yolov2有更好的鲁棒性,在训练的时候,我们每10个batch就随机改变input的size.由于模型是进行32倍下采样的,所以我们把input size改变成320,352...608这些尺寸.
以上是yolov2提升准确率所做的改造.现在我们来看下为了更快的推理速度,yolov2都做了什么.
Googlenet
大部分检测网络是以VGG-16做为特征提取器的.以一个224*224的图片为例,一次前向传播,VGG-16有30.69 billion次浮点数运算.yolo用了一个基于googlenet的定制化的网络,一次前向传播只有8.52 billion次运算.相应的,代价是准确率的稍微下降.
Darknet-19
作者继续去简化特征提取层的网络结构.如上图. 注意上图份两部分. 最后三层(conv,avgpool,softmax)是做分类的.前面的n层是做特征提取的.
对这个分类网络,先在ImageNet做分类的训练,把特征提取的网络的参数训练出来,先用224*224的做训练,再用448*448的做微调.之后保持特征提取部分的网络不变,把最后几层替换掉,去做检测网络的训练.如下图