yolo-v2

tech2024-06-27  62

背景

新的YOLO版本论文全名叫“YOLO9000: Better, Faster, Stronger”,是作者rbg(Ross Girshick)于2016年发表。主要有两个大方面的改进:

第一,作者使用了一系列的方法对原来的YOLO多目标检测框架进行了改进,在保持原有速度的优势之下,精度上得以提升。VOC 2007数据集测试,67FPS下mAP达到76.8%,40FPS下mAP达到78.6%,基本上可以与Faster R-CNN和SSD一战。这一部分是本文主要关心的地方。

第二,作者提出了一种目标分类与检测的联合训练方法,通过这种方法,在YOLO V2的基础上得到YOLO9000可以同时在COCO和ImageNet数据集中进行训练,训练后的模型可以实现多达9000种物体的实时检测(这里不赘述)。

新版本的改进点

先给出论文中关于改进点的原图:

加BN。CNN在训练过程中网络每层输入的分布一直在改变, 会使训练过程难度加大,但可以通过normalize每层的输入解决这个问题。在每一个卷积层后添加BN,去掉dropout层。mAP提高2%。

在微调网络权重时,首先用224224的分类数据预训练,然后再用448448的分类训练数据在训练10个epoch,然后才用检测数据进行微调。提高4%。

添加anchor思想。V1版本采用FC直接生成候选框,v2版本借鉴RPN中的anchor思想。做如下改变:果断去掉全连接层,并且为了得到高的特征图分辨率,去掉最后的pooling层(这样通过缩减网络,输入图片尺寸变为416416,得到的特征图为奇数1313)。加入了anchor boxes后,可以预料到的结果是召回率上升,准确率下降。具体数据为:没有anchor boxes,模型recall为81%,mAP为69.5%;加入anchor boxes,模型recall为88%,mAP为69.2%。这样看来,准确率只有小幅度的下降,而召回率则提升了7%,说明可以通过进一步的工作来加强准确率,的确有改进空间。

维度聚类(Dimension Clusters)。使用K-means cluster选取anchor box的个数(就是看看一个网格给出几个先验框,使得这些先验框和真实框更接近,评价指标为avg iou)。 作者在使用anchor的时候遇到了两个问题,第一个是anchor boxes的宽高维度往往是精选的先验框(hand-picked priors)(也就是比如RPN中每个网格给出9种anchor),虽说在训练过程中网络也会学习调整boxes的宽高维度,最终得到准确的bounding boxes。但是,如果一开始就选择了更好的、更有代表性的先验boxes维度,那么网络就更容易学到准确的预测位置。和以前的精选boxes维度不同,作者使用了K-means聚类方法类训练bounding boxes,可以自动找到更好的boxes宽高维度。传统的K-means聚类方法使用的是欧氏距离函数,也就意味着较大的boxes会比较小的boxes产生更多的error,聚类结果可能会偏离。为此,作者采用的评判标准是IOU得分(也就是boxes之间的交集除以并集),这样的话,error就和box的尺度无关了,最终的距离函数为:

作者通过改进的K-means对训练集中的boxes进行了聚类,判别标准是平均IOU得分,聚类结果如下图:

可以看到,平衡复杂度和IOU之后,最终得到k值为5,意味着作者选择了5种大小的box维度来进行定位预测,这与手动精选的box维度不同。

当然,作者也做了实验来对比两种策略的优劣,如下图,使用聚类方法,仅仅5种boxes的召回率就和Faster R-CNN的9种相当。说明K-means方法的引入使得生成的boxes更具有代表性,为后面的检测任务提供了便利。

直接预测目标框的位置信息(Direct location prediction)。主要是对x,y进行改正;w,h仍然为偏移量。由于RPN中预测的位置信息是偏移量,然后再由公式转变为真正的位置信息。作者在使用anchor boxes时发现的第二个问题就是:模型不稳定,尤其是在早期迭代的时候。大部分的不稳定现象出现在预测box的(x,y)坐标上。例如RPN在回归位置时,用的是:

定位预测值被归一化后,参数就更容易得到学习,模型就更稳定。作者使用Dimension Clusters和Direct location prediction这两项anchor boxes改进方法,mAP获得了5%的提升。

细粒度特征的使用(主要对于小物体)。像SSD那样利用多层的特征图,可以获得多尺度的适应性。只不过v2添加一个route层。先将不同尺度的特征图resize到相同的size,从而可以在channel上进行合并。具体来说就是特征重排(不涉及到参数学习)。举个简单例子:假设要将2626512特征图和13132048特征图进行融合,则前面26 * 26 * 512的特征图使用按行和按列隔行采样的方法,就可以得到4个新的特征图,维度都是13 * 13 * 512,然后做concat操作,得到13 * 13 * 2048的特征图,将其拼接到后面的层,相当于做了一次特征融合,有利于检测小目标。

多尺度训练。V1输入为448448,v2这里添加了anchor思想,输入变为416416。由于网络结构中只存在卷积和池化,则不再固定输入图片的尺寸。 不同于固定输入网络的图片尺寸的方法,作者在几次迭代后就会微调网络。没经过10次训练(10 epoch),就会随机选择新的图片尺寸。YOLO网络使用的降采样参数为32,那么就使用32的倍数进行尺度池化{320,352,…,608}。最终最小的尺寸为320 * 320,最大的尺寸为608 * 608。接着按照输入尺寸调整网络进行训练。 这种机制使得网络可以更好地预测不同尺寸的图片,意味着同一个网络可以进行不同分辨率的检测任务,在小尺寸图片上YOLOv2运行更快,在速度和精度上达到了平衡。

采用darknet 19用作特征提取,并且引入BN,用于加速网络训练和防止过拟合。YOLOv2使用了一个新的分类网络作为特征提取部分,参考了前人的先进经验,比如类似于VGG,作者使用了较多的3 * 3卷积核,在每一次池化操作后把通道数翻倍。借鉴了network in network的思想,网络使用了全局平均池化(global average pooling),把1 * 1的卷积核置于3* 3的卷积核之间,用来压缩特征。也用了batch normalization(前面介绍过)稳定模型训练。最终得出的基础模型就是Darknet-19,如下图,其包含19个卷积层、5个最大值池化层(maxpooling layers ),下图展示网络具体结构。Darknet-19运算次数为55.8亿次,imagenet图片分类top-1准确率72.9%,top-5准确率91.2%。

原来v1是两个先验框共用一个c维的类别概率,也就是说对于一个网格对应的是(5+5+c)维向量。但是现在我们对每一个先验框都预测一个类别概率,那么一个网格对应5*(5+c)维向量。

网络结构

其中要留意的是,第25层和28层有一个route。例如第28层的route是27和24,即把27层和24层合并到一起输出到下一层,route层的作用是进行层的合并。30层输出的大小是1313,是指把图片通过卷积或池化,最后缩小到一个1313大小的格。每一个格的output数量是125(525),5是指对每一个1313的小格配有5个边框,25则是指每一个边框输出了25个浮点数。25个是YOLO 2对VOC的结构。VOC一共有20个class,在25个数中,有20个是class的probability,剩下的5个中,有四个表示stx、sty、tw、th,这4个来识别边框的位置和大小,还有一个数是confidence,表示边框预测里有真正的对象的概率。所以一共是1313125个数。

训练

分类

作者使用Darknet-19在标准1000类的ImageNet上训练了160次,用的随机梯度下降法,starting learning rate 为0.1,polynomial rate decay 为4,weight decay为0.0005 ,momentum 为0.9。训练的时候仍然使用了很多常见的数据扩充方法(data augmentation),包括random crops, rotations, and hue, saturation, and exposure shifts。 (这些训练参数是基于darknet框架,和caffe不尽相同)

初始的224 * 224训练后,作者把分辨率上调到了448 * 448,然后又训练了10次,学习率调整到了0.001。高分辨率下训练的分类网络在top-1准确率76.5%,top-5准确率93.3%。

检测

分类网络训练完后,就该训练检测网络了,作者去掉了原网络最后一个卷积层,转而增加了三个3 * 3 * 1024的卷积层(可参考darknet中cfg文件),并且在每一个上述卷积层后面跟一个1 * 1的卷积层,输出维度是检测所需的数量。对于VOC数据集,预测5种boxes大小,每个box包含5个坐标值和20个类别,所以总共是5 * (5+20)= 125个输出维度。同时也添加了转移层(passthrough layer ),从最后那个3 * 3 * 512的卷积层连到倒数第二层,使模型有了细粒度特征。

作者的检测模型以0.001的初始学习率训练了160次,在60次和90次的时候,学习率减为原来的十分之一。其他的方面,weight decay为0.0005,momentum为0.9,依然使用了类似于Faster-RCNN和SSD的数据扩充(data augmentation)策略。

最新回复(0)