参考文献:Redmon J , Farhadi A . [IEEE 2017 IEEE Conference on Computer Vision and Pattern Recognition (CVPR) - Honolulu, HI (2017.7.21-2017.7.26)] 2017 IEEE Conference on Computer Vision and Pattern Recognition (CVPR) - YOLO9000: Better, Faster, Stronger[J]. 2017:6517-6525.
项目主页:https://pjreddie.com/darknet/yolo/
Caffe实现:https://github.com/choasUp/caffe-yolo9000
YOLOV2:You Only Look Once
1 Introduction
略
2 Better(YOLOV2改进)
YOLOV2比YOLO多用的改进之处及其效果如表2所示,以下将介绍每种改进。
(1)Batch Normalization(Batch 归一化)
CNN在训练过程中网络每层输入的分布一直在改变, 会使训练过程难度加大,但可以通过normalize每层的输入解决这个问题。新的YOLO网络在每一个卷积层后添加batch normalization,通过这一方法,mAP获得了2%的提升。batch normalization 也有助于规范化模型,可以在舍弃dropout(随机失活)优化后依然不会过拟合。
(2)High Resolution Classifier(高分辨率分类器,高分辨率就是提高输入图像的尺寸)
目前的目标检测方法中,基本上都会使用ImageNet预训练过的模型(classifier)来提取特征,如果用的是AlexNet网络,那么输入图片会被resize到不足256 * 256,导致分辨率不够高,给检测带来困难。为此,新的YOLO网络把分辨率直接提升到了448 * 448,这也意味着原有的网络模型必须进行某种调整以适应新的分辨率输入。
对于YOLOv2,本文首先对分类网络(自定义的darknet-19)进行了微调,分辨率改成448 * 448,在ImageNet数据集上训练10轮(10 epochs),训练后的网络就可以适应高分辨率的输入了。然后,本文对检测网络部分(也就是后半部分)也进行微调。这样通过提升输入的分辨率,mAP获得了4%的提升。
(3)Convolutional With Anchor Boxes
YOLO利用全连接层预测bounding box的边框,导致丢失较多的空间信息,定位不准。针对于此,本文采用Faster R-CNN中的anchor box思想,faster R-CNN为了不让算法漫无目的的去猜测那些目标的边框大小,于是就自己预先在每个位置上产生一定长宽比例的方框,以减少搜索量,这个方框就叫做anchor boxes,anchor的意思是“锚”,“固定”的意思,大多数人是把这个解释为“锚”,不过我觉得解释成“固定”比较好,其实也有锚的意思,因为这个是相对于中心点来说的,就是在中心点的周围产生几个固定比例的边框,所以这个“中心点”就把这几个框给锚住了,他们共用一个中心点,(当然在YOLOv2中这个中心点是一个格子的大小,所以会在格子里微小移动)。
为了引入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%,说明可以通过进一步的工作来加强准确率,的确有改进空间。
(4)Dimension Clusters(维度聚类)
本文在使用anchor boxes时遇到两个问题,第一个是anchor boxes的宽高度往往是精选的先验框(Faster R-CNN中9个框),虽然在训练过程中网络也会学习调整anchor boxes的宽高度,最终得到准确的bounding boxes,但是如果一开始就选择了更好的、更有代表性的先验anchor boxes维度,那么网络就更容易学到准确的预测位置。
与Faster R-CNN中不同,本文使用了K-means聚类方法类训练anchor boxes,可以自动找到更好的boxes宽高度。传统的K-means聚类方法使用的是欧氏距离函数,也就意味着较大的boxes会比较小的boxes产生更多的error,聚类结果可能会偏离。为此,本文采用的评判标准是平均IOU得分(也就是boxes之间的交集除以并集),这样的话,error就和box的尺度无关了,最终的距离函数为:
聚类结果为:
从图2可以看到,平衡复杂度和IOU之后,最终得到k值为5,意味着选择了5种大小的anchor box维度来进行定位预测,这与手动精选的anchor box维度不同。结果中扁长的框较少,而瘦高的框更多(这符合行人的特征),这种结论不通过聚类实验恐怕是发现不了的。
当然,本文也做了实验来对比两种策略的优劣,如表1所示,使用聚类方法,仅仅5种anchor boxes的召回率就和Faster R-CNN的9种相当。说明K-means方法的引入使得生成的boxes更具有代表性,为后面的检测任务提供了便利。
(5)Direct location prediction(直接位置预测)
使用anchor boxes时发现的第二个问题是模型不稳定,尤其是在早期迭代的时候。大部分的不稳定现象出现在预测box的(x,y)坐标上了。在区域建议网络中,预测tx和ty,(x,y)中心坐标的公式使用如下公式:
每个anchor boxes中有stx、sty、tw、th 4个参数,根据下图右边的公式计算边框的位置和大小。
注意!上图右边里面的σ(tx)可以理解为stx,σ(ty)可以理解为sty。每一个输出的bbox是针对于一个特定的anchor,anchor其实是bbox的width及height的一个参考。pw和ph是某个anchor box的宽和高,一个格子的Cx和Cy单位都是1,σ(tx),σ(ty)是相对于某个格子左上角的偏移量。
这个地方不是很好理解,我举个例子,比如说我预测出了stx、sty、tw、th四个参数分别是0.2,0.1,0.2,0.32,row:1,col:1假如anchor比例取:w:3.19275,h:4.00944,这其中row和col就是锚点相对于整个网格的偏移的格子数,在这个偏移量的基础上计算格子中心位置,计算出:
bx=0.2+1=1.2
by=0.1+1=1.1
bw=3.19275 * exp(0.2)=3.89963
bh=4.00944 * exp(0.32)=5.52151
然后分别将这些归一化(同除以13),得:bx=0.09,by=0.08,bw=0.30,bh=0.42.具体是否要输出当前的边框,它的概率,还有生成的物体的类别,这个取决于后面的probability和confidence。
(6)Fine-Grained Features(细粒度特征,没看明白?)
YOLOV2最终在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的特征图,将其拼接到后面的层,相当于做了一次特征融合,有利于检测小目标。
(7)Multi-Scale Training(多尺度训练)
YOLO网络使用固定的448 * 448的图片作为输入,YOLOV2加入anchor boxes后,输入变成了416 * 416。YOLOV2网络只用到了卷积层和池化层,那么就可以进行动态调整(意思是可检测任意大小图片),本文希望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和其他网络的成绩对比:
3 网络结构
YOLOV2采用基础模型Darknet-19提取特征,其包含19个卷积层、5个最大值池化层(maxpooling layers ),下图展示网络具体结构。Darknet-19运算次数为55.8亿次,imagenet图片分类top-1准确率72.9%,top-5准确率91.2%。
再详细看一下在Darknet-19的基础上的YOLOv2网络结构:
YOLOV2采用神经网络结构,有32层。结构比较常规,包含一些卷积和最大池化,其中有一些1 * 1卷积,采用GoogLeNet一些微观的结构。其中要留意的是,第25层和28层有一个route。例如第28层的route是27和24,即把27层和24层合并到一起输出到下一层,route层的作用是进行层的合并。30层输出的大小是13 * 13,是指把图片通过卷积或池化,最后缩小到一个13 * 13大小的格。每一个格子的output参数是125,所以最后输出的参数一共是13 * 13 * 125。
可以看到,YOLOV2以416 * 416 * 3为输入(输入不固定),输出的 Tensor 为13 * 13 * 125, 分成了 13 * 13个格子,每个格子有5个anchor boxes,每个anchor boxes包含25个预测值,其中4个参数计算边框的位置和大小,1个置信度,20个类别概率,所以最后的输出大小为13 * 13*[5*(5+20)]。
通过将confidence和最大可能输出的类的probability相乘之后得score,如果score大于阈值0.24,就会输出当前计算出的bbox的大小和位置,同时会输出是哪一个类,probability大小是多少。
4 优缺点
优点:
a. 使用了一系列方法对原来的YOLO多目标检测框架进行了改进,在保持原有速度的优势之下,精度上得以提升。VOC 2007数据集测试,67FPS下mAP(平均精度)达到76.8%,40FPS下mAP达到78.6%,基本上可以与Faster R-CNN和SSD一战。这一部分是本文主要关心的地方。
b. 提出了一种目标分类与检测的联合训练方法,通过这种方法,YOLO9000可以同时在COCO和ImageNet数据集中进行训练,训练后的模型可以实现多达9000种物体的实时检测。这一方面本文暂时不涉及,待后面有时间再补充。
缺点:
a. 较小密集物体检测不好。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:目标检测YOLOV2:You Only Look Once - Python技术站