YOLOv1_YOLOv2

参考博客:

https://blog.csdn.net/hrsstudy/article/details/70305791,此博客的gif动图非常形象的展示了训练过程。

https://blog.csdn.net/lilai619/article/details/79695109

https://pjreddie.com/darknet/yolo/,YOLO主页。

You Only Look Once,是2016年CVPR的paper,这是RBG继RCNN,Fast-RCNN,Faster-RCNN以后又一神作。针对目标检测无法实现实时性检测的问题,RBG另辟蹊径开创了目标检测的新思路。RCNN中,作者将目标检测的问题转化到分类上来,提出了region proposal+cnn feature+ svm的思路,在以后的sppnet,fast-rcnn,faster-rcnn都沿袭了这个思路,并对每个过程进行优化,检测精度也不断提升,但是这样做有一个很大的缺陷,就是计算量大无法达到实时性检测,最快的faster-rcnn ZF网络也就能达到18fps的速度。所以,作者又提出了一种新的思路,直接将目标检测转化到回归上,基于一个单独的end-to-end网络,完成从原始图像的输入到物体位置和类别的输出。目前YOLO有很多版本,经典的有YOLOv1、YOLOv2、YOLOv3。

YOLOv1

流程: 

1、将图像resize到448 * 448作为神经网络的输入;

2、运行神经网络,得到一些bounding box坐标、box中包含物体的置信度和class probabilities;

3、进行非极大值抑制,筛选Boxes。

网络结构

YOLOv1 网络架构通过修改GoogleNet,共24层,前22层用来提取特征,最后两个全连接层用来预测概率和坐标。不同的是,YOLO未使用inception module,而是使用1x1卷积层(此处1x1卷积层的存在是为了跨通道信息整合)+3x3卷积层简单替代。网络结构如下:

Unified Detection

统一检测。作者将目标检测的流程统一为单个神经网络。该神经网络采用整个图像信息来预测目标的bounding box的同时识别目标的类别,实现端到端实时目标检测任务。

如上图,YOLO首先将图像分为S×S的格子(grid cell)。如果一个目标的中心落入格子,该格子就负责检测该目标。每一个格子预测bounding boxes和该boxes的置信值(confidence score)。然后,定义置信值为。如果没有目标,置信值为零。另外,我们希望预测的置信值和ground truth的intersection over union (IOU)相同。

每一个bounding box包含5个值:x,y,w,h和confidence。(x,y)代表与格子相关的box的中心。(w,h)为与全图信息相关的box的宽和高。confidence代表预测boxes的IOU和gound truth。每个格子(grid cell)预测条件概率值C。概率值C代表了格子包含一个目标的概率,每一格子只预测一类概率。在测试时,每个box通过类别概率和box置信度相乘来得到特定类别置信分数:

这个分数代表该类别出现在box中的概率和box和目标的合适度。论文中图像划分为7*7的网格,每个cell的bbox数为2,种类为20(该数据集包含20个类别),最终预测结果为7×7×(2x5+20)=1470个tensor。

优点

1.速度很快,标准版本的YOLO在Titan X 的上能达到45 FPS,网络较小的版本Fast YOLO在保持mAP是之前的其他实时物体检测器的两倍的同时,检测速度可以达到155 FPS,可以实现实时检测。

2.YOLO采用全图信息来进行预测,与滑动窗口法和region proposal方法不同,其在训练和预测过程中可以利用全图信息,而Fast R-CNN检测方法会错误的将背景中的斑块检测为目标,原因在于Fast R-CNN在检测中无法看到全局图像,相对于Fast R-CNN,YOLO背景预测错误率低一半,其在物体定位时更容易出错(特别是小目标)。

3.YOLO可学习到目标的概括信息,具有一定普适性,比DPM、R-CNN等物体检测系统能够学到更加抽象物体的特征,这使YOLO可从真实图像领域迁移到其他领域,如艺术。

缺点

1、物体检测精度低于其他state-of-the-art的物体检测系统;

2、容易产生物体的定位错误;

3、一张图片只能预测98(7*7*2)个Bounding Box和所述类的可能性,所以YOLO的速度很快。但是YOLO的局限性也相当明显,首先一个cell只能预测两个Bounding Box,预测一类物体,所以当有一群小物体密集的时候很难得到正确的Bounding Box,此外小物体在卷积和pooling的过程中,损失的信息越来越多,得到的有用信息已经很少,所以YOLO在检测小目标效果不尽人意;

4.输入尺寸固定:由于输出层为全连接层,因此在检测时,YOLO训练模型只支持与训练图像相同的输入分辨率。其它分辨率需要缩放成改分辨率。

YOLO v2

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

1.使用一系列的方法对原来的YOLO多目标检测框架进行了改进,在保持原有速度的优势之下,精度上得以提升。VOC2007数据集测试,67 FPS下mAP 76.8%,40 FPS下mAP 78.6%,基本上可以与Faster R-CNN和SSD一战。

2.提出一种目标分类与检测的联合训练方法,YOLO9000可以同时在COCO和ImageNet数据集中训练,训练后的模型可以实现多达9000种物体的实时检测。

正如其名,YOLOv2在三个方面对v1做了改进,“YOLO9000: Better, Faster, Stronger”,主要的改进如下:

Better---精度更高

Batch Normalization

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

High Resolution Classifier

目前的目标检测方法中,基本上都会使用ImageNet预训练过的模型(classifier)来提取特征,如果用的是AlexNet网络,那么输入图片会被resize到不足256 * 256,导致分辨率不够高,给检测带来困难。为此,新的YOLO网络把分辨率直接提升到了448 * 448,这也意味之原有的网络模型必须进行某种调整以适应新的分辨率输入。

对于YOLOv2,作者首先对分类网络(自定义的darknet)进行了fine tune,分辨率改成448 * 448,在ImageNet数据集上训练10轮(10 epochs),训练后的网络就可以适应高分辨率的输入了。然后作者对检测网络部分(也就是后半部分)也进行fine tune。这样通过提升输入的分辨率,mAP获得了4%的提升。

Convolutional With Anchor Boxes

之前的YOLO利用全连接层的数据完成边框的预测,导致丢失较多的空间信息,定位不准。作者在这一版本中借鉴了Faster R-CNN中的anchor思想,anchor是RNP网络中的一个关键步骤,其中心思想是在卷积特征图上进行滑窗操作,每一个中心可以预测9种不同大小的建议框。v1的bbox数量为7×7×2=98,而v2的数量为13×13×9=1521。

Dimension Clusters

维度聚类,作者在使用anchor的时候遇到了两个问题,一个是anchor boxes的宽高维度往往是精选的先验框(hand-picked priors),虽说在训练过程中网络也会学习调整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

直接位置预测,作者在使用anchor boxes时发现的第二个问题是模型不稳定,尤其是在早期迭代的时候。大部分的不稳定现象出现在预测box的坐标上了。该公式没有任何约束,中心点可能会出现在图像任何位置,这就有可能导致回归过程震荡,甚至无法收敛:

 针对这个问题,作者在预测位置参数时采用了强约束方法:

1.对应 Cell 距离左上角的边距为(Cx,Cy),σ定义为sigmoid激活函数,将函数值约束到[0,1],用来预测相对于该Cell 中心的偏移(不会偏离cell);

2.预定Anchor(文中描述为bounding box prior)对应的宽高为(Pw,Ph),预测 Location 是相对于Anchor的宽高 乘以系数得到。如下图所示:

Fine-Grained Features

细粒度特征,上述网络上的修改使YOLO最终在13*13的特征图上进行预测,虽然这足以胜任大尺度物体的检测,但是用上细粒度特征的话,这可能对小尺度的物体检测有帮助。Faser R-CNN和SSD都在不同层次的特征图上产生区域建议(SSD直接就可看得出来这一点),获得了多尺度的适应性。这里使用了一种不同的方法,简单添加了一个转移层( passthrough layer),这一层要把浅层特征图(分辨率为26 * 26,是底层分辨率4倍)连接到深层特征图。

这个转移层也就是把高低两种分辨率的特征图做了一次连结,连接方式是叠加特征到不同的通道而不是空间位置,类似于Resnet中的identity mappings。这个方法把26*26*512的特征图连接到了13*13*2048的特征图,这个特征图与原来的特征相连接。YOLO的检测器使用的就是经过扩张的特征图,它可以拥有更好的细粒度特征,使得模型的性能获得了1%的提升。

补充:关于passthrough layer,具体来说就是特征重排,前面26*26*512的特征图使用按行和按列隔行采样的方法,就可以得到4个新的特征图,维度都是13*13*512,然后做concat操作,得到13*13*2048的特征图,将其拼接到后面的层,相当于做了一次特征融合,有利于检测小目标。

Multi-Scale Training

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

不同于固定输入网络的图片尺寸的方法,作者在几次迭代后就会微调网络。没经过10次训练(10 epoch),就会随机选择新的图片尺寸。YOLO网络使用的降采样参数为32,那么就使用32的倍数进行尺度池化{320,352,…,608}。最终最小的尺寸为320 * 320,最大的尺寸为608 * 608。接着按照输入尺寸调整网络进行训练。

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

在小尺寸图片检测中,YOLOv2成绩很好,输入为228 * 228的时候,帧率达到90FPS,mAP几乎和Faster R-CNN的水准相同。使得其在低性能GPU、高帧率视频、多路视频场景中更加适用。

在大尺寸图片检测中,YOLOv2达到了先进水平,VOC2007 上mAP为78.6%,仍然高于平均水准,下图是YOLOv2和其他网络的成绩对比:

Further Experiments

作者在VOC2012上对YOLOv2进行训练,下图是和其他方法的对比。YOLOv2精度达到了73.4%,并且速度更快。同时YOLOV2也在COCO上做了测试(IOU=0.5),也和Faster R-CNN、SSD作了成绩对比。总的来说,比上不足,比下有余。

Faster

YOLO一向是速度和精度并重,作者为了改善检测速度,也作了一些相关工作。大多数检测网络有赖于VGG-16作为特征提取部分,VGG-16的确是一个强大而准确的分类网络,但是复杂度有些冗余。224 * 224的图片进行一次前向传播,其卷积层就需要多达306.9亿次浮点数运算。

YOLOv2使用的是基于Googlenet的定制网络,比VGG-16更快,一次前向传播仅需85.2亿次运算。可是它的精度要略低于VGG-16,单张224 * 224取前五个预测概率的对比成绩为88%和90%。

Darknet-19

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%。

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框架,和caffe相同)

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

Training for detection

分类网络训练完后,就该训练检测网络了,作者去掉了原网络最后一个卷积层,转而增加了三个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 策略。

Stronger

这一部分,作者使用联合训练方法,结合wordtree等方法,使YOLOv2的检测种类扩充到了上千种。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值