前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >YOLO V2的10个改进技巧(上篇)

YOLO V2的10个改进技巧(上篇)

作者头像
小草AI
发布2019-05-30 18:46:56
发布2019-05-30 18:46:56
2.6K0
举报

一、YOLO V2概览

YOLO V2的原始论文是,《YOLO9000: Better, Faster, Stronger 》,新的YOLO版本论文全名叫“YOLO9000: Better, Faster, Stronger”,主要有两个大方面的改进:

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

第二,作者提出了一种目标分类与检测的联合训练方法,通过这种方法,YOLO9000可以同时在COCO和ImageNet数据集中进行训练,训练后的模型可以实现多达9000种物体的实时检测。这是非常不容易的,一下子看可以检测9000种物体类别,是一个大的飞跃。

那为什么论文的名字不叫yolo v2,而是yolo9000呢?

其实yolo9000是在YOLO V2的基础之上提出的,可以产生9418个类别的目标检测,至于为什么是这个名字,我想是因为它可以一次性检测9000多种物体吧。

二、YOLO V2相比于YOLO V1的改进点

可以看出,YOLO V2相比于前一个版本YOLO V1,一共有10个点的改进措施,而且每一个措施都带来了性能上的提升,总的mAP从63.4%提升到了78.6%,基本上跟faster-RCNN和SSD在伯仲之间。

既然论文的标题为 Better、Faster、Stronger,下面也将从这三个大的方面来看

三、YOLO V2的10大改进点剖析(Better)

3.1 Batch Normalization

CNN在训练过程中网络每层输入的分布一直在改变, 会使训练过程难度加大,但可以通过normalize每层的输入解决这个问题。新的YOLO网络在每一个卷积层后添加batch normalization,通过这一方法,mAP获得了2%的提升。batch normalization 也有助于规范化模型,可以在舍弃dropout优化后依然不会过拟合。

现在BN已经是任何网络架构的基本组件了

3.2 High Resolution Classifier

现在基本跑个分类或目标检测模型都不会从随机初始化所有参数开始,所以一般都是用预训练的网络来fine-tuning自己的网络,而且预训练的网络基本上都是在ImageNet数据集上跑的,一方面数据量大,另一方面训练时间久,而且也比较容易得到。

YOLOv1在预训练的时候用的是224*224的输入,一般预训练的分类模型都是在ImageNet数据集上进行的,然后在检测的时候采用448*448的输入。这会导致从分类模型切换到检测模型的时候,模型还要适应图像分辨率的改变。

YOLOv2中将预训练分成两步:先用224*224的输入从头开始训练网络,大概160个epoch,然后再将输入调整到448*448,再训练10个epoch。

注意:这两步都是在ImageNet数据集上操作。最后再在检测的数据集上fine-tuning,也就是检测的时候用448*448的图像作为输入就可以顺利过渡了。

3.3 Convolutional With Anchor Boxes

之前的YOLO利用全连接层的数据完成边框的预测,导致丢失较多的空间信息,定位不准。作者在这一版本中借鉴了Faster R-CNN中的anchor思想,

什么是anchor呢?

我在上一篇文章中已经非常清晰的说明了anchor到底是什么,参考:

https://blog.csdn.net/qq_27825451/article/details/88843333

为了引入anchor boxes来预测bounding boxes,作者使用了一下几个技术手段:

(1)在网络中果断去掉了全连接层。因为全连接层丢失了空进信息和位置信息;

(2)去掉卷积网络部分的最后一个池化层。这是为了确保输出的卷积特征图有更高的分辨率;

(3)缩减网络输入。让图片输入分辨率从448*448降为416 * 416,这一步的目的是为了让后面产生的卷积特征图宽、高都为奇数,这样就可以产生一个center cell。

加入了anchor boxes后,可以预料到的结果是召回率上升,准确率下降。我们来计算一下,假设每个cell预测9个建议框,那么总共会预测13 * 13 * 9 = 1521个boxes,而之前的网络仅仅预测7 * 7 * 2 = 98个boxes。具体数据为:没有anchor boxes,模型recall为81%,mAP为69.5%;加入anchor boxes,模型recall为88%,mAP为69.2%。这样看来,准确率只有小幅度的下降,而召回率则提升了7%,说明可以通过进一步的工作来加强准确率,的确有改进空间。

思想总结:

Faster-RCNN的 Anchor 机制又一次得到印证,与SSD一样,Anchor建立了和原始坐标的对应关系:

定义了不同的Scale和宽高比,一个中心对应K个不同尺度和宽高比的Boxes。

YOLO v1: S*S* (B*5 + C) => 7*7(2*5+20)

其中B对应Box数量,5对应 Rect 定位+置信度。

每个Grid只能预测对应两个Box,这两个Box共用一个分类结果(20 classes),

这是很不合理的临时方案,看来作者为第二篇论文预留了改进,没想被 SSD 抢了风头。

YOLO v2: S*S*K* (5 + C) => 13*13*9(5+20)

分辨率改成了13*13,更细的格子划分对小目标适应更好,再加上与Faster一样的K=9,计算量增加了不少。

通过Anchor Box改进,mAP由69.5下降到69.2,Recall由81%提升到了88%。

SSD(-): S*S*K*(4 + C) => 7*7*6*( 4+21 )

对应C=21,代表20种分类类别和一种 背景类。

可见,faster-RCNN、yolo v2、SSD都是使用了anchor机制

3.4 Dimension Clusters (维度聚类)

我们知道在Faster R-CNN中anchor box的大小和比例是按经验设定的,即所谓的精选的先验框(hand-picked priors),然后网络会在训练过程中调整anchor box的尺寸。但是如果一开始就能选择到合适尺寸的anchor box,那肯定可以帮助网络越好地预测detection。所以作者采用k-means的方式对训练集的bounding boxes做聚类,试图找到合适的anchor box。 (这是一种非常重要是思想,现寻找到比较合适的比盲目的尝试更好)

和以前的精选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维度不同。结果中扁长的框较少,而瘦高的框更多(这符合行人的特征),这种结论如不通过聚类实验恐怕是发现不了的。

那我们现在不是使用经验法的9种标准候选框,而是使用聚类选择的5种,到底效果差不差呢?通过实验证明,效果并不会差,如下图:

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

3.5 Direct location prediction(直接位置预测)

作者在引入anchor box的时候遇到的第二个问题:模型不稳定,尤其是在训练刚开始的时候,有可能导致回归过程震荡,甚至无法收敛。回顾前面的文章,在进行边框回归的时候,我们预测的值是什么?如下:

那么我们得到的(x,y,w,h)就是如下:

上面这两个式子看似没什么问题,但是实际上隐含着一个问题那就是x,y的位置,可能刚开始x,y的位置是任意,离真实标签的x,y很远,这就导致的结果是要想x,y收敛,可能需要迭代很长的时间,甚至是无法收敛。

假如tx=1,就会把box向右移动anchor box的宽度;假如tx=-1,就会把box向左移动anchor box的宽度。

这个公式有个问题,假如对tx和ty取值范围没有限制,那么在任意cell,预测出的box可以在整张图片的任意位置,导致模型需要很长时间才能收敛。

因此没有采用这个公式,而是预测box相对于cell的偏移,即把ground truth限制到0,1之间。我们使用logistic激活函数(取值范围在0,1之间)来限制输出在这个区间内。

网络在feature map每个cell预测5个bboxes。每个bbox预测5个坐标,tx,ty,tw,th和to。假设一个cell左上角的坐标是(cx,cy),bbox的先验宽度和高度是pw,ph,则预测结果为:

如下图所示:

结论:

这几个公式参考上面Faster-RCNN和YOLOv1的公式以及下图就比较容易理解。 经sigmod函数处理过,取值限定在了0~1,实际意义就是使anchor只负责周围的box,有利于提升效率和网络收敛。 函数的意义没有给,但估计是把归一化值转化为图中真实值,使用 的幂函数是因为前面做了 计算,因此,是bounding box的中心相对栅格左上角的横坐标,是纵坐标,是bounding box的confidence score。

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-05-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 机器学习与python集中营 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档