简介
新的YOLO版本全名叫“YOLO9000:Better, Faster, Stronger”,对比YOLOV1的改进主要有两方面:
第一,作者使用了一系列的方法对原来的YOLO多目标检测框进行了改进,在保持原有速度的优势下精度得以提升。VOC 2007数据集测试,67FPS下mAP达到76.8%,40FPS下mAP达到78.6%,基本上可以与Faster R-CNN和SSD一战。
第二,作者提出了一种目标分类与检测的联合训练方法,通过这种方法,YOLO9000可以同时在COCO和ImageNet数据集中进行训练,训练后的模型可以实现多达9000种物体的实时检测。
下面根据论文提到的Better、Faster、Stronger三个方面来阐述YoloV2的细节:
Better
Batch Normalization
神经网络学习过程本质就是学习数据分布,一旦训练数据和测试数据的分布不同,那么网络的泛化能力也大大降低;另一方面,一旦每批训练数据的分布各不相同(batch梯度下降),那么网络就要在每次迭代都去学习适应不同的分布,这样将会大大降低网络的训练速度。
解决办法之一就是对数据都做一个归一化预处理。YoloV2网络通过在每一个卷积层之后添加batch normalization,极大地改善了收敛速度同时减少了对其他regularization方法的依赖(舍弃了dropout优化后依然没有过拟合),使得mAP获得了2%的提升。
High Resolution Classifier
预训练分类模型采用了更高分辨率的图片
YoloV1现在ImageNet(224*224)分类数据集上预训练模型的主体部分,获得较好的分类效果,然后再训练网络的时候将网络的输入从224*224增加为448*448。但是直接切换分辨率,检测模型可能很难快速适应高分辨率。
对于YoloV2,作者首先对分类网络(自定义的darknet)进行了finetune,分辨率改为448*448,在ImageNet数据集上训练10轮(10epochs),训练后的网络就可以适应高分辨率输入了。然后作者对检测网络部分也进行finetune,这样通过提升输入的分辨率,mAP获得了4%的提升。
Convolutional With Anchor Boxes
YoloV1是利用全连接层直接预测bounding box的坐标,导致丢失较多的空间信息,定位不准。YoloV2则借鉴了Faster R-CNN的思想引入了anchor,anchor是RNP网络中一个关键步骤,说的是在卷积特征图上进行滑窗操作,每一个中心可以预测9种大小不同的建议框。YoloV2移除了YoloV1中的全连接层而采用了卷积和anchor boxes来预测边界框。为了使检测所用的特征图分辨率更高,移除其中一个pool层,在检测模型中,YoloV2不是采用418*418的图片作为输入,而是采用416*416大小,因为YoloV2模型下采样的总步长为32,对于416*416大小的图片,最终得到的特征图大小为13*13,维度是奇数。这样特征图恰好只有一个中心位置,对于一些大物体,他们中心点往往落在图片中心位置,此时使用特征图的一个中心点去预测这些物体的边界框相对容易些。所以YoLoV2设计中要保证最终的特征图有奇数个位置。
Dimension Clusters(维度聚类)
作者在使用anchor的时候遇到两个问题,第一个是anchor boxes的宽高维度往往是精选的先验框,虽然说在训练过程中也会学习调整boxes的宽高维度,最终得到准确的bounding boxes。作者采用了K-means聚类方法训练bounding boxes,传统的K-means聚类方法使用的是欧氏距离函数,为了更贴近找到更合适的boxes的宽高维度,作者采取了IOU得分为评判标准,最终的距离函数为d(box,centroid)=1-IOU(box,centroid)
Direct Location prediction
作者在引入anchor box的时候遇到第二个问题:模型不稳定,尤其是在训练刚开始的时候。作者认为主要来自于预测box的中心坐标(x, y)值。基于region proposal的目标检测算法中,是通过tx和ty来得到(x, y)值,也就是预测的是offsets。这种方式是无约束的,预测的边界框很容易向任何方向偏移。因此每个位置预测的边界框可以落在图片任何位置,这导致模型的不稳定性,在训练时需要很长时间来预测出正确的offsets。
Fine-Grained Features
YoloV2的输入图片大小为416*416,经过5次maxpooling之后得到13*13大小的特征图,并以此特征图采用卷积做预测,13*13大小的特征图对于检测大物体是足够的,但是对于小物体还需要更精细的特征图(Fine-Grained Features)。因此SSD使用了多尺度的特征图来分别检测不同大小的物体,前面更精细的特征图可以用来预测小物体。
YoloV2提出了一种passthrough层来利用更精细的特征图,所利用的Fine-Grained Features是26*26大小的特征图(最后一个maxpooling层的输入),对于Darknet-19模型来说就是大小为26*26*512的特征图。passthrough层与Resnet网络的shortcut类似,以前面更高分辨率的特征图作为输入,然后将其连接到后面的低分辨率特征图上。前面的特征图维度是后面的特征图的2倍,passthrough层抽取前面层的每个2*2的局部区域,然后将其转换成channel维度,对于26*26*512的特征图,经过passthrough层处理之后就变成了13*13*2048的新特征图(特征大小降低4倍,而channels增加4倍),这样就可以与后面的13*13*1024特征图连接在一起行成13*13*3072的特征图,然后在此特征图基础上卷积做预测。
Multi-Scale Training
原来的Yolo网络使用固定的448*448的图片作为输入,现在加入anchor boxes之后输入变成了416*416,目前的网络只用到了卷积层和池化层,那么就可以进行动态调整(意思是可以检测任意大小图片)
不同于固定输入网络的图片尺寸的方法,YoloV2在迭代后就会微调网络,每经过10次训练(10epoch),就会随机选择新的图片尺寸。网络使用的降采样参数是32,所以就是用32的倍数进行尺度池化,具体采用320、352、384、416、448、480、512、544、576、608共10种size。
这种机制使得网络可以更好地预测不同尺寸的图片,意味着同一个网络可以进行不同分辨率的检测任务,在小尺寸图片上YoloV2运行更快,在速度和精度上达到了平衡。
Faster
Darknet-19
网络包含19个卷积层和5个max pooling层,而在YoloV1中采用的GoogleNet,包含24个卷积层和2个全连接层,因此DarkNet-19整体上卷积操作比YoloV1中用的GoogleNet要少,这是计算量减少的关键。最后用average pooling层代替全连接层进行预测。
YoloV2的训练
YoloV2的训练分三个阶段:
第一阶段就是先在ImageNet分类数据集上预训练DarkNet-19,此时模型输入为224*224,共训练160个epochs。
第二阶段将网络的输入调整为448*448,继续在ImageNet数据集上finetune分类模型,训练10个epochs,此时分类模型top-1准确率为76.5%,而top-5准确率为93.3%。
第三个阶段就是修改DarkNet-19分类模型为检测模型,并在检测数据集上继续finetune网络。
Stronger
带标注的检测数据集量比较少,而带标注的分类数据集量比较大,因此Yolo9000主要通过结合分类和检测数据集使得训练得到的检测模型可以检测约9000类物体。
一方面要构造数据集(采用WordTree解决),另一方面要解决模型训练问题(采用Joint classfication and detection)
参考: