YOLOv2——学习笔记

YOLOv2主要在一些经验和tip上对yolov1进行改进,在保持速度不变的前提下提升检测精度,主要体现在三个方面:

1.Better 更精确

1)batch normalization

神经网络学习过程本质就是为了学习数据分布,一旦训练数据与测试数据的分布不同,那么网络的泛化能力也大大降低;另外一方面,一旦每批训练数据的分布各不相同(batch 梯度下降),那么网络就要在每次迭代都去学习适应不同的分布,这样将会大大降低网络的训练速度。batch normalization 就是为解决数据分布变化加进来的,强制将数据分布拉回到敏感区域。解决办法之一是对数据都要做一个归一化预处理。YOLOv2网络通过在每一个卷积层后添加batch normalization,极大的改善了收敛速度同时减少了对其它regularization方法的依赖(舍弃了dropout优化后依然没有过拟合),使得mAP获得了2%的提升。Implementation of Batch Normalization LayerBatch Normalization导读(参考)

2)High Resolution Classifier

YOLO(v1)先以分辨率224*224训练分类网络,然后需要增加分辨率到448*448,这样做不仅切换为检测算法也改变了分辨率。YOLOv2首先修改预训练分类网络的分辨率为448*448,在ImageNet数据集上训练10轮(10 epochs)。这个过程让网络有足够的时间调整filter去适应高分辨率的输入。然后fine tune为检测网络。mAP获得了4%的提升。

3)Convolutional With Anchor Boxes.

YOLO(v1)使用全连接层数据进行bounding box预测(要把1470*1的全链接层reshape为7*7*30的最终特征),这会丢失较多的空间信息定位不准。YOLOv2借鉴了Faster R-CNN中的anchor思想: 简单理解为卷积特征图上进行滑窗采样,每个中心预测9种不同大小和比例的建议框。由于都是卷积不需要reshape,很好的保留的空间信息,最终特征图的每个特征点和原图的每个cell一一对应。而且用预测相对偏移(offset)取代直接预测坐标简化了问题,方便网络学习。



总的来说就是移除全连接层(以获得更多空间信息)使用 anchor boxes 取预测 bounding boxes。具体做法如下:

. 去掉最后的池化层,保证输出有更高的分辨率

. 缩减网络,让图片输入为416×416。目的是让后面产生的卷积特征图宽高都为奇数,这样就可以产生一个center cell。

. 使用卷积层降采样(factor 为32),使得输入卷积网络的416 * 416图片最终得到13 * 13的卷积特征图(416/32=13)。

. 把预测类别的机制从空间位置(cell)中解耦,由anchor box同时预测类别和坐标。因为YOLO是由每个cell来负责预测类别,每个cell对应的2个bounding box 负责预测坐标(回想YOLO中 最后输出7*7*30的特征,每个cell对应1*1*30,前10个主要是2个bounding box用来预测坐标,后20个表示该cell在假设包含物体的条件下属于20个类别的概率,具体请参考 图解YOLO 的图示) 。YOLOv2中,不再让类别的预测与每个cell(空间位置)绑定一起,而是让全部放到anchor box中。下面是特征维度示意图(仅作示意并非完全正确)


4) Dimension Clusters(维度聚类)

统计学习中的K-means聚类方法,通过对数据集中的ground true box做聚类,找到ground true box的统计规律。以聚类个数k为anchor boxs个数,以k个聚类中心box的宽高维度为anchor box的维度。

.5)Direct location prediction

当YOLO使用锚盒时,我们会遇到第二个问题:模型不稳定,特别是在早期的迭代过程中。大部分的不稳定来自预测边界框的$(x,y)$位置。RPN的锚盒都可以在图像任一点结束,而不管在哪个位置预测该边界框。随机初始化模型需要很长时间才能稳定以预测合理的偏移量。因此作者没有采用这种方法,而是预测相对于grid cell的坐标位置,同时把ground truth限制在0到1之间(利用logistic激活函数约束网络的预测值来达到此限制)。约束了位置预测的范围,参数就更容易学习,模型就更稳定。使用Dimension Clusters和Direct location prediction这两项anchor boxes改进方法,mAP获得了5%的提升。

最终,网络在特征图(13 *13 )的每个cell上预测5个bounding boxes,每一个bounding box预测5个坐标值:tx,ty,tw,th,to。如果这个cell距离图像左上角的边距为(cx,cy)以及该cell对应的box维度(bounding box prior)的长和宽分别为(pw,ph),那么对应的box为:


6)Fine-Grained Features(细粒度特征)

修改后的网络最终在13 * 13的特征图上进行预测,虽然这足以胜任大尺度物体的检测,如果用上细粒度特征的话可能对小尺度的物体检测有帮助。Faser R-CNN和SSD都在不同层次的特征图上产生区域建议以获得多尺度的适应性。YOLOv2使用了一种不同的方法,简单添加一个 passthrough layer,把浅层特征图(分辨率为26 * 26)连接到深层特征图。这个方法把26 * 26 * 512的特征图叠加成13 * 13 * 2048的特征图,与原生的深层特征图相连接。YOLOv2的检测器使用的就是经过扩展后的的特征图,它可以使用细粒度特征,使得模型的性能获得了1%的提升。

7)Multi-ScaleTraining

原始YOLO网络使用固定的448 * 448的图片作为输入,加入anchor boxes后输入变成416 * 416,由于网络只用到了卷积层和池化层,就可以进行动态调整(检测任意大小图片)。为了让YOLOv2对不同尺寸图片的具有鲁棒性,在训练的时候也考虑了这一点。

不同于固定网络输入图片尺寸的方法,每经过10批训练(10 batches)就会随机选择新的图片尺寸。网络使用的降采样参数为32,于是使用32的倍数{320,352,…,608},最小的尺寸为320 * 320,最大的尺寸为608 * 608。 调整网络到相应维度然后继续进行训练。

这种机制使得网络可以更好地预测不同尺寸的图片,同一个网络可以进行不同分辨率的检测任务,在小尺寸图片上YOLOv2运行更快,在速度和精度上达到了平衡。

2.更快速(Faster)

1)YOLO使用的是基于Googlenet的自定制网络,比VGG-16更快,一次前向传播仅需85.2亿次运算,不过它的精度要略低于VGG-16。224 * 224图片取 single-crop, top-5 accuracy,YOLO的定制网络得到88%(VGG-16得到90%)。

2)Darknet-19

把1 * 1的卷积核置于3 * 3的卷积核之间,用来压缩特征。使用batch normalization稳定模型训练,加速收敛,正则化模型。

最终得出的基础模型就是Darknet-19,包含19个卷积层、5个最大值池化层(max pooling layers )。Darknet-19处理一张照片需要55.8亿次运算,imagenet的top-1准确率为72.9%,top-5准确率为91.2%。

3)Training for classification

作者使用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框架)

初始的224 * 224训练后把分辨率上调到了448 * 448,使用同样的参数又训练了10次,学习率调整到了10^{-3}。高分辨率下训练的分类网络top-1准确率76.5%,top-5准确率93.3%。

4)Training for detection

去掉原网络最后一个卷积层,增加了三个 3 * 3 (1024 filters)的卷积层,并且在每一个卷积层后面跟一个1 * 1的卷积层,输出维度是检测所需数量。

对于VOC数据集,预测5种boxes,每个box包含5个坐标值和20个类别,所以总共是5 * (5+20)= 125个输出维度。

也添加了passthrough layer,从最后3 * 3 * 512的卷积层连到倒数第二层,使模型有了细粒度特征。

学习策略是:先以10^{-3}的初始学习率训练了160次,在第60次和第90次的时候学习率减为原来的十分之一。weight decay为0.0005,momentum为0.9,以及类似于Faster-RCNN和SSD的数据扩充(data augmentation)策略: random crops, color shifting, etc。使用相同的策略在 COCO 和VOC上训练。

3.更强大(Stronger)

训练过程中把监测数据和分类数据混合在一起。当网络遇到一张属于检测数据集的图片就基于YOLOv2的全部损失函数(包含分类部分和检测部分)做反向传播。当网络遇到一张属于分类数据集的图片就仅基于分类部分的损失函数做反向传播。作者最后采用一种不要求互不包含的多标签模型(multi-label model)来整合数据集。这种方法忽略了数据集的结构。

1)Hierarchical classification(层次式分类)

最终结果是一颗 WordTree (视觉名词组成的层次结构模型)。用WordTree执行分类时,预测每个节点的条件概率。为了创建WordTree1k作者天添加了很多中间节点,把标签由1000扩展到1369。训练过程中ground truth标签要顺着向根节点的路径传播:例如 如果一张图片被标记为“Norfolk terrier”它也被标记为“dog” 和“mammal”等。为了计算条件概率,模型预测了一个包含1369个元素的向量,而且基于所有“同义词集”计算softmax,其中“同义词集”是同一概念的下位词。

2)Dataset combination with WordTree

可以使用WordTree把多个数据集整合在一起。只需要把数据集中的类别映射到树结构中的同义词集合(synsets)。

3)joint classification and detection(联合训练分类和检测)

当网络遇到一张检测图片就正常反向传播。其中对于分类损失只在当前及其路径以上对应的节点类别上进行反向传播。

当网络遇到一张分类图片仅反向传播分类损失。在该类别对应的所有bounding box中找到一个置信度最高的(作为预测坐标),同样只反向传播该类及其路径以上对应节点的类别损失。反向传播objectness损失基于如下假设:预测box与ground truth box的重叠度至少0.31IOU。

采用这种联合训练,YOLO9000从COCO检测数据集中学习如何在图片中寻找物体,从ImageNet数据集中学习更广泛的物体分类。


猜你喜欢

转载自blog.csdn.net/baobei0112/article/details/80118189
今日推荐