Yolo_V2算法详解及说明

一 yolo_v1缺点回顾

yolo_v2是在yolo_v1的基础上改进而来,针对yolo的缺点:1.框坐标定位不准;2 与基于region proposal的方法相比召回率较低;3.对小目标/比较密集的目标检测效果不好,因为设计网络时,一个grid cell仅仅预测两个bounding box,且仅仅属于一个类别(classification score是两个bounding box共享的);4.对同一物体出现不常见的宽高比时,泛化能力偏弱。

而yolo_v2通过优化网络提高检测效果;大概看一下Yolo_v2的表现:YOLOv2算法在VOC 2007数据集上的表现为67 FPS时,MAP为76.8,在40FPS时,MAP为78.6.  为什么会在不同的fps下,会有不同的MAP值。

二 yolo_v2 网络优化策略---性能改进 ---better

1 high resolution classifier---训练预处理模型

   现在训练classification/object detection的模型,都不会随机初始化所有参数,因为预训练模型都跑在ImageNet数据集上,一方面数据量大,另一方面训练时间久,如果自己训练,负担太大;所以现在跑classification/object detection模型,都需要fine-tuning预训练好的model,而这些预训练好的model都可以在github。

YOLO_v1直接用训练好的model来fine tuning:原来的YOLO网络在预训练的时候采用的是224*224的输入(这是因为一般预训练的分类模型都是在ImageNet数据集上进行的),然后在detection的时候采用448*448的输入,这会导致从分类模型切换到检测模型的时候,模型还要适应图像分辨率的改变;YOLOv2则将预训练分成两步:先用224*224的输入从头开始训练网络,大概160个epoch(表示将所有训练数据循环跑160次),然后再将输入调整到448*448,再训练10个epoch。注意这两步都是在ImageNet数据集上操作。最后再在检测的数据集上fine-tuning,也就是detection的时候用448*448的图像作为输入就可以顺利过渡了。作者的实验表明这样可以提高几乎4%的MAP

2 Batch Normailization

      BN(Batch Normalization)层对网络的每一层的输入做归一化,加速模型收敛,降低模型过拟合,同时还能起到一定正则化效果。原来的YOLO算法(采用的是GoogleNet网络提取特征)是没有BN层的,因此在YOLOv2中作者为每个卷积层都添加了BN层,并且不再使用droput,实验证明添加了BN层后,yolo_v2的mAP提升了2%。

3 convolution with anchor boxesYOLO

原来的YOLO是利用全连接层直接预测bounding box的坐标,而YOLOv2借鉴了Faster R-CNN的思想,引入anchor。v1使用全连接层数据进行bounding box预测(将全连接层转换为S*S*(B*5+20)维的特征),这一操作丢失较多的空间信息,导致定位不准。Faster R-CNN的方法只用卷积层与Region Proposal Network来预测Anchor Box的偏移值与置信度,而不是直接预测坐标值。作者发现通过预测偏移量而不是坐标值能够简化问题,让神经网络学习起来更容易。

       为了引入anchor boxes来预测bounding boxes,首先,作者在网络中去掉全连接层/和最后一个池化层(确保输出的卷积特征图有更高的分辨率)。然后,让图片输入分辨率为416 * 416,这一步的目的是为了让后面产生的卷积特征图宽高都为奇数,这样就可以产生一个center cell。作者观察到,大物体通常占据了图像的中间位置, 就可以只用中心的一个cell来预测这些物体的位置,否则就要用中间的4个cell来进行预测,这个技巧可稍稍提升效率。最后,YOLOv2使用了卷积层降采样(factor为32),使得输入卷积网络的416 * 416图片最终得到13 * 13的卷积特征图(416/32=13)。 加入了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%,说明可以通过进一步的工作来加强准确率,的确有改进空间。

Yolo_V2算法详解及说明_第1张图片

特别说明:一个grid cell 能预测5个bounding box ,每个 bounding box会有25维 = 20/classification score + 4/框坐标 + 1/confidence score, 一个grid cell 对应125维vectors,每个bounding box 对应一个 classification score + 一个框坐标 + 一个confidence (区别:yolo_v1  一个bounding box对应一个 框坐标 + 一个confidence score  而一个grid cell 对应一个classification score) 

4  Dimension Clusters---维度聚类

维度聚类,在使用anchor时,faster-rcnn中的anchor boxes的个数和宽高比往往都是手动精选的先验框(hand-picked priors), 虽说在训练过程中网络也会学习调整boxes的宽高维度,最终得到准确的bounding boxes。但是如果能够一开始就选择了更好的、更有代表性的先验boxes维度,那么网络就应该更容易学到准确的预测位置。

YOLOv2中利用K-means聚类方法,通过对数据集中的ground truth box做聚类,找到ground truth box的统计规律,从而可以自动找到更好的boxes宽高维度。以聚类个数k为anchor boxes个数,以k个聚类中心box的宽高维度为anchor box的维度。

传统的K-means聚类使用的是欧氏距离函数,也就意味着较大的boxes会比较小的boxes产生更多的error,聚类结果可能会偏离。为此,作者采用的评判标准是IOU得分(也就是boxes之间的交集除以并集),这样的话,error就和box的尺度无关了,聚类的距离度量采用:

                                 d(box, centroid) = 1 - IOU(box, centroid)

Yolo_V2算法详解及说明_第2张图片

可以看到,平衡复杂度和IOU之后,最终得到k值为5,意味着作者选择了5种大小的box维度来进行定位预测,这与手动精选的box维度不同。结果中扁长的框较少,而瘦高的框更多(这符合行人的特征),这种结论如不通过聚类实验恐怕是发现不了的。

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

Yolo_V2算法详解及说明_第3张图片

如何能对比 yolo_v2 在k=5/k=9时的检测效果,这个选择会更具有说明意义!

5 Direct Location prediction

引入了anchor boxes后发现第二个问题:模型不稳定,尤其是在早期迭代时大部分不稳定现象出现在预测box的(x,y)坐标上,在区域建议网络中,预测(x,y)以及tx,ty使用如下公式:

                                           x = (t_{x} * w_{a}) + x_{a}; y = (t_{y} * h_{a}) + y_{a}

faster-rcnn 公式及意义:

                                     Yolo_V2算法详解及说明_第4张图片

x 是坐标预测值,xa 是anchor坐标(预设固定值),x∗是坐标真实值(标注信息),其他变量 y,w,h 以此类推,t 变量是偏移量。

当预测 tx=1,就会把box向右边移动一定距离(具体为anchor box的宽度),预测 tx=−1,就会把box向左边移动相同的距离。

这个公式的理解为:当预测 tx=1,就会把box向右边移动一定距离(具体为anchor box的宽度),预测 tx=−1,就会把box向左边移动相同的距离。 这个公式没有任何限制,使得无论在什么位置进行预测,任何anchor boxes可以在图像中任意一点结束(我的理解是,tx 没有数值限定,可能会出现anchor检测很远的目标box的情况,效率比较低。正确做法应该是每一个anchor只负责检测周围正负一个单位以内的目标box)。模型随机初始化后,需要花很长一段时间才能稳定预测敏感的物体位置。

YOLO_V2 作者没有借鉴faster-rcnn没有采用预测直接的offset的方法,而借鉴YOLO_V1使用预测相对于grid cell的坐标位置的办法,作者又把ground truth限制在了0到1之间,利用logistic回归函数来进行这一限制。

                                             

神经网络在特征图(13 *13 )的每个grid cell上预测5个bounding boxes(聚类得出的值),同时每一个bounding box预测5个坐值,分别为 tx,ty,tw,th,to ,其中前四个是坐标,to是置信度。如果这个cell距离图像左上角的边距为 (cx,cy) 以及该cell对应box(bounding box prior)的长和宽分别为 (pw,ph),那么预测值可以表示为:

tx,ty 经sigmod函数处理过,取值限定在了0~1,实际意义就是使anchor只负责周围的box,有利于提升效率和网络收敛。σ 函数的意义没有给,但估计是把归一化值转化为图中真实值,使用 e 的幂函数是因为前面做了 ln 计算,因此,σ(tx)是bounding box的中心相对栅格左上角的横坐标,σ(ty)是纵坐标,σ(to)是bounding box的confidence score。

Yolo_V2算法详解及说明_第5张图片

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

6 Fine-Grained features

细粒度特征。添加一层:pass throught layer,这个层的作用就是将前面一层的26*26的feature map和本层的13*13的feature map进行连接,有点像ResNet,这样做的原因:13*13的feature map对于预测大的object以及足够了,但是对于预测小的object就不一定有效。越小的object,经过层层卷积和pooling,可能到最后都不见了;所以通过合并前一层的26*26的feature map,可以有效检测小的object。

YOLOv2的输入图片大小为  ,经过5次maxpooling之后得到  大小的特征图,并以此特征图采用卷积做预测。  13*13尺寸的feature map对检测大物体是足够了,但是对于小物体还需要更精细的特征图(Fine-Grained Features)。因此SSD使用了多尺度的特征图来分别检测不同大小的物体,前面更精细的特征图可以用来预测小物体。YOLOv2提出了一种passthrough层来利用更精细的特征图。YOLOv2所利用的Fine-Grained Features是26*26尺寸的特征图(最后一个maxpooling层的输入),对于Darknet-19模型来说是26*26*512的特征图。passthrough层与ResNet网络的shortcut类似,以前面更高分辨率的特征图为输入,然后将其连接到后面的低分辨率特征图上。前面的特征图维度是后面的特征图的2倍;26*26的feature map如何融合到13*13的feature map中,具体细节如下:passthrough层抽取前面层的每个2*2的局部区域,然后将其转化为channel维度,对于26*26*512的feature map,经passthrough层处理之后就变成了13*13*2048的新特征图(特征图大小降低4倍,而channles增加4倍,图6为一个实例),这样就可以与后面的13*13*1024特征图连接在一起形成13*13*3072大小的特征图,然后在此特征图基础上卷积做预测。

Yolo_V2算法详解及说明_第6张图片

另外,作者在后期的实现中借鉴了ResNet网络,不是直接对高分辨特征图处理,而是增加了一个中间卷积层,先采用64个  卷积核进行卷积,然后再进行passthrough处理,这样  的特征图得到  的特征图。这算是实现上的一个小细节。使用Fine-Grained Features之后YOLOv2的性能有1%的提升。

7 Multi-Scale Training

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

       区别于之前的补全图片的尺寸的方法,YOLO v2每迭代10次都会随机选择新的图片尺寸。由于使用了下采样参数是32,所以不同的尺寸大小也选择为32的倍数{320,352…..608},最小320*320,最大608*608,网络会自动改变尺寸,并继续训练的过程。 这一政策让网络在不同的输入尺寸上都能达到一个很好的预测效果,同一网络能在不同分辨率上进行检测。当输入图片尺寸比较小的时候跑的比较快,输入图片尺寸比较大的时候精度高,所以你可以在YOLO v2的速度和精度上进行权衡。 

在低分辨率图片检测中,YOLOv2是检测速度快(计算消耗低),精度较高的检测器。输入为228*228的时候,帧率达到90FPS,mAP几乎和Faster R-CNN的水准相同。使得其更加适用于低性能GPU、高帧率视频和多路视频场景。   在高分辨率图片检测中,YOLOv2达到了先进水平(state-of-the-art)。

总结:High Resolution Classifier的提升非常明显(近4%),另外通过结合dimension prior + fine-grained features+localtion prediction这两种方式引入anchor也能带来近5%mAP的提升。

二 YOLO_V2  faster 

在YOLO v1中,作者采用的训练网络是基于GooleNet,这里作者将GooleNet和VGG16做了简单的对比,GooleNet在计算复杂度上要优于VGG16(8.25 billion operation VS 30.69 billion operation),但是前者在ImageNet上的top-5准确率要稍低于后者(88% VS 90%);

而在YOLO v2中,作者采用了新的分类模型作为基础网络,那就是Darknet-19。

1 Darknet-19

       有19个卷积层conv + 5个max pooling层,最后一层用global average pooling 代替全连接层进行预测,网络在ImageNet上取得top-5的91.2%的准确率,执行操作5.58 billion operation;YOLO_V1采用googleNet,包含24个卷积层conv和2个FC,执行操作8.25 billion operation;darknet卷积层比Googlenet要少,同时最后用global average pooling层代替全连接层  所以计算量和参数减少;

Yolo_V2算法详解及说明_第7张图片

2、Training for Classification 

就是训练处理的小tricks,这里的training for classification都是在ImageNet上进行预训练,主要分两步:1、从头开始训练Darknet-19,数据集是ImageNet,训练160个epoch,输入图像的大小是224*224,初始学习率为0.1。另外在训练的时候采用了标准的数据增加方式比如随机裁剪,旋转以及色度,亮度的调整等;2、再fine-tuning 网络,这时候采用448*448的输入,参数的除了epoch和learning rate改变外,其他都没变,这里learning rate改为0.001,并训练10个epoch。结果表明fine-tuning后的top-1准确率为76.5%,top-5准确率为93.3%,而如果按照原来的训练方式,Darknet-19的top-1准确率是72.9%,top-5准确率为91.2%。因此可以看出第1,2两步分别从网络结构和训练方式两方面入手提高了主网络的分类准确率。

3 training for detection

在前面第2步之后,就开始把网络移植到detection,并开始基于检测的数据再进行fine-tuning。首先把最后一个卷积层去掉,然后添加3个3*3的卷积层,每个卷积层有1024个filter,而且每个后面都连接一个1*1的卷积层,1*1卷积的filter个数根据需要检测的类来定。比如对于VOC数据,由于每个grid cell我们需要预测5个box,每个box有5个坐标值和20个类别值,所以每个grid cell有125个filter,(与YOLOv1不同,在YOLOv1中每个grid cell有30个filter,还记得那个7*7*30的矩阵吗,而且在YOLOv1中,类别概率是由grid cell来预测的,也就是说一个grid cell对应的两个box的类别概率是一样的,但是在YOLOv2中,类别概率是属于box的,每个box对应一个类别概率,而不是由grid cell决定,因此这边每个box对应25个预测值(5个坐标加20个类别值),而在YOLOv1中一个grid cell的两个box的20个类别值是一样的)。另外作者还提到将最后一个3*3*512的卷积层和倒数第二个卷积层相连。最后作者在检测数据集上fine tune这个预训练模型160个epoch,学习率采用0.001,并且在第60和90epoch的时候将学习率除以10,weight decay采用0.0005。

总结:faster:yolo_v2基于一个新的分类模型,类似于VGG,YOLO_V2采用darknet-19采用3*3的filter,每次池化后都增加一倍channels的数量,最后用global average pooling,使用Batch normalization来训练网络,更加稳定,加速收敛。Darknet19 采用19个卷积层 + 5个maxpooling层,处理一张图片需要 55.8亿次运算,在ImageNet上达到top-1 的精度72.9%,top-5的精度为91.2%

reference:

全面   https://blog.csdn.net/u014380165/article/details/77961414

全面且passthrough https://zhuanlan.zhihu.com/p/35325884

anchor box https://blog.csdn.net/Vin1282023650/article/details/79364521

简介/适合概述:https://blog.csdn.net/guleileo/article/details/80581858

你可能感兴趣的:(目标检测)