YOLOv1——One-stage开山之作 (目标检测)(one-stage)(深度学习)(CVPR 2016)

论文名称: 《 You Only Look Once: Unified, Real-Time Object Detection 》

论文连接:https://github.com/pjreddie/darknet 

代码连接:http://arxiv.org/abs/1506.02640


YOLOv1——One-stage开山之作 (目标检测)(one-stage)(深度学习)(CVPR 2016)_第1张图片

一、目标检测概述:

近几年来,目标检测算法取得了很大的突破。

早期的目标检测方法通常是通过提取图像的一些鲁棒性好的、的特征(如Haar、SIFT、HOG 等),使用 DPM(Deformable Parts Model)模型,用滑动窗口(Silding Window)的方式来预测具有较高得分(Score)的边界框(Bounding Box)。

后来出现了候选区域(Region Proposal)方法(其中选择性搜索(Selective Search)为这类方法的典型代表),相比于滑动窗口这种穷举的方式,减少了大量的计算,同时在性能上也有很大的提高。利用选择性搜索的结果,结合卷积神经网络的R-CNN出现后,目标检测的性能有了一个质的飞越。基于R-CNN发展出来的SPPnet、Fast R-CNN、Faster R-CNN 等方法,证明了“候选区域+分类” 的方法在目标检测上的有效性。

YOLOv1——One-stage开山之作 (目标检测)(one-stage)(深度学习)(CVPR 2016)_第2张图片 图1-1 经典目标检测算法的特点题

大体来说,目前比较流行的算法可以分为两类:

一类是基于候选区域的R-CNN系算法(R-CNN,Fast R-CNN, Faster R-CNN),它们是两阶段(Two-Stage)的,需要先使用启发式方法(如选择性搜索)或者CNN网络(RPN)产生候选区域,然后再在候选区域上做分类与回归。

另一类是YOlO,SSD这类一阶段(One-Stage)算法,其仅仅使用一个CNN网络直接预测不同目标的类别与位置。第一类方法是准确度高一些,但是速度慢,但是第二类算法是速度快,但是准确性要低一些。这可以在图2中看到。

YOlO算法,其全称是You Only Look Once: Unified, Real-Time Object Detection,Once指的是只需要一次CNN运算,Unified指的是这是一个统一的框架,提供end-to-end的预测,而实时性(Real-Time)的体现是YOlO算法速度快。

YOLO算法将目标检测的问题转化成一个回归(Regression)问题。给定输入图像,直接在图像的多个位置上回归出目标的边界框以及其分类类别。

YOLOv1——One-stage开山之作 (目标检测)(one-stage)(深度学习)(CVPR 2016)_第3张图片 图1-2 经典目标检测算法的检测性能对比

二、YOLOv1算法原理:

YOLO是一个可以一次性预测多个边界框位置和类别的卷积神经网络,能够实现端到端的目标检测和识别,其最大的优势就是速度快。事实上,目标检测的本质就是回归,因此一个实现回归功能的CNN并不需要复杂的设计过程。YOLO没有选择滑动窗口(Silding Window)或提取候选框的方式训练网络,而是直接选用整图训练模型。这样做的好处在于可以更好的区分目标和背景区域,相比之下,采用候选区域训练方式的Fast-R-CNN常常把背景区域误检为特定目标。

下图所示是YOLOv1检测系统流程:

YOLOv1——One-stage开山之作 (目标检测)(one-stage)(深度学习)(CVPR 2016)_第4张图片 图2-1 YOLOv1检测流程

检测流程大体分为三步:

1、将图像Resize到448*448,输入网络;

2、运行CNN,提取图像特征,输出特征张量;

3、对特征张量进行非极大抑制优化(NMS),得到检测结果。

YOLO是基于Pascal VOC2012数据集的目标检测系统,能够检测到20种Pascal的目标类别,包括1+6+6+7:人,鸟、猫、牛、狗、马、羊,飞机、自行车、船、巴士、汽车、摩托车、火车,瓶子、椅子、桌子、盆栽植物、沙发、电视/显示器。

检测方面:

YOLO的设计理念遵循端到端训练和实时检测,它将输入图像划分为S*S个网格,若一个目标的中心落在某单元格(Cell)内,则此单元格负责检测该目标。如图2-2所示,狗这个目标(GroundTruth)的中心落在左下角一个单元格内,那么该单元格负责预测这个狗。

YOLOv1——One-stage开山之作 (目标检测)(one-stage)(深度学习)(CVPR 2016)_第5张图片 图2-2 单元格负责预测中心落在本格内的目标

边界框的大小与位置可以用4个值来表征:(x,y,w,h),其中(x,y)是边界框的中心坐标,而w和h是边界框的宽与高。要注意的是,中心坐标的预测值(x,y)是相对于每个单元格左上角坐标点的偏移值,并且单位是相对于单元格大小的,单元格的坐标定义如图2-2所示。而边界框的w和h预测值是相对于整个图片的宽与高的比例,这样理论上4个元素的大小应该在[0,1]范围。这样,每个边界框的预测值实际上包含5个元素(x,y,w,h,c),其中前4个表征边界框的大小与位置,而最后一个值是该边界框的边界框置信度。

在训练和测试时,每个单元格预测B个边界框,每个边界框对应5个预测参数:边界框的中心点相对坐标(x,y),边界框相对宽高w,h)边界框置信度Confidence:

                                         

式( 2-1

边界框的置信度(Confidence)综合反映了:

1、当前边界框中含有目标的置信度Pr(Object)

2、当前边界框预测目标位置的准确性IOU(pred|truth) ,其计算原理如图2-3

3、如果边界框内不存在物体,则Pr(Object)=0。如果存在物体,则Pr(Object)=1,接着根据预测的边界框和GroundTruth计算交并比(IOU)。

YOLOv1——One-stage开山之作 (目标检测)(one-stage)(深度学习)(CVPR 2016)_第6张图片 图2-3 交并比的计算原理

 分类方面:

对于每一个单元格,网络模型预测出C个概率值,其表征的是由该单元格预测的边界框中的目标属于各个类别的概率,这些概率值其实是在各个边界框置信度下的条件类别概率(conditional class probabilities),即Pr(class_i|object) i=1,2,...,C;

值得注意的是,不管一个单元格预测多少个边界框,其只预测一组条件类别概率值,即每一个单元格预测的B个边界框共享所属单元格的一套条件类概率。这是YOlO算法的一个缺点,在后来的改进版本中,YOLO算法是把类别概率预测值与边界框是绑定在一起的,一个边界框框对应一组类别概率值。  

YOLOv1——One-stage开山之作 (目标检测)(one-stage)(深度学习)(CVPR 2016)_第7张图片 图2-4 YOLOv1预测结果数据结构

此时可计算出每个框的20个边界框类别置信度(Class-Specific Confidence Scores):

式( 2-2

 

边界框类别置信度表征的是该边界框中目标属于各个类别的可能性大小以及边界框匹配目标的好坏,一般会根据边界框类别置信度来过滤网络的预测框。

总之,每个单元格需要预测(B∗5+C)个值,如图2-4所示,网格划分为S×S时,最终预测值为S×S×(B∗5+C)大小的张量。对于PASCAL VOC数据(有20个类,即C=20),当S=7,B=2时,预测结果就是7×7×30的张量。

三、YOLOv1检测原理:

先介绍一下非极大值抑制算法(Non Maximum Suppression, NMS),这个算法不单单是针对YOlO算法的,而是所有的检测算法中都会用到。NMS算法主要解决的是一个目标被多次检测的问题,如图3-1中的人脸检测,可以看到人脸被多次检测,但是其实我们希望最后仅仅输出其中一个最好的预测框,对于美女,只想要红色那个检测结果。那么可以采用NMS算法来实现这样的效果:首先从所有的检测框中找到置信度最大的那个框,然后挨个计算其与剩余框的IOU,如果其值大于一定阈值(重合度过高),那么就将该框剔除(YOLO中为将要剔除的边界框置信度置0);然后对剩余的检测框重复上述过程,直到处理完所有的检测框。

YOlO预测过程也需要用到NMS算法。

YOLOv1——One-stage开山之作 (目标检测)(one-stage)(深度学习)(CVPR 2016)_第8张图片 图3-1 NMS示意图(一)

将图片通过训练好的网络,输出得到特征图(7×7×30大小的张量),而后如下处理:

1、求边界框类别置信度(Score)矩阵(为所有边界框和20个类别分别建立联系):

每个边界框的边界框置信度(Confidence)和所属单元格的条件类别概率向量(1×20)相乘,得到每个边界框属于哪一类的边界框类别置信度(1×20)。也就是说最后会得到20×(7×7×2)=20×98的Score矩阵(20×98),98是边界框的数量,20代表类别。

2、对每类中边界框进行“阈值筛选”和“NMS筛选”(本步操作对20个类别轮流进行):

在某个类别中(即矩阵的某一行),将Score小于阈值(0.2)的设置为0,然后再按得分从高到低排序。

然再用NMS算法将重复率较大的边界框的Score置0(针对某一类别,选择Score最大的边界框,然后计算它和其它边界框的IOU值,如果IOU大于0.5,说明重复率较大,后者Score设为0,否则不改)。NMS的作用见图3-2。

YOLOv1——One-stage开山之作 (目标检测)(one-stage)(深度学习)(CVPR 2016)_第9张图片 图3-2 NMS示意图(二)

3、对每一个边界框做“Score筛选”,只留一个Score(针对本框的Score向量(1×20)):

对一个边界框,在它的20个Score(其中有些是0)中取最大的Score,其余置0,如果这个最大的Score大于0,那么这个边界框就是这个Score对应的类别,即检测出目标,否则说明这个边界框里面没有目标,跳过此框即可。

四、YOLOv1网络结构:

网络结构参考GooLeNet模型,包含24个卷积层和2个全连接层,卷积层主要用来提取特征,全连接层主要用来预测类别概率和坐标。大体结构如图4-1所示。

YOLOv1——One-stage开山之作 (目标检测)(one-stage)(深度学习)(CVPR 2016)_第10张图片 图4-1 YOLOv1模型概览(一)(中间有所省略)

对于卷积层,主要使用1×1卷积来做通道缩减(channle reduction),然后紧跟3×3卷积。对于卷积层和全连接层,采用Leaky ReLU激活函数:max(x,0.1x)(即当x<0时,激活值是0.1×x,而不是传统的0),最后一层采用线性激活函数。

注意网络的输出是7×7×30大小的张量(对于每个单元格,前20个元素是类别概率值,然后2个元素是边界框置信度,最后8个元素是边界框的(x,y,w,h)),中间实现的细节可能不同工程师有所不同,比如对GoogLeNET网络的Inception结构的改动以及最后几层的全连接层(FC)的改动等等,但是重点在于最后一层的输出的数据结构是不变的,参考图4-2。(PS: Inception结构是提出于GoogLeNet的一种高效表达特征的稀疏性网络结构。)

YOLOv1——One-stage开山之作 (目标检测)(one-stage)(深度学习)(CVPR 2016)_第11张图片 图4-2 YOLOv1模型(二)

除了这个结构,文章还提出了一个轻量级(Tiny)版本Fast Yolo,其仅使用9个卷积层,并且卷积层中使用更少的卷积核。

五、YOLOv1网络训练:

在训练之前,先在ImageNet上进行预训练,输入是224×224大小的图像,预训练分类模型采用图4-1中前20个卷积层,然后添加一个平均池化(Average-Pool)层和全连接(FC)层。预训练之后,在预训练得到的20层卷积层之上加上随机初始化的4个卷积层和2个全连接层,进行fine-tuning来训练检测模型。由于检测任务一般需要高清的图片,所以将网络的输入从224×224增加到了448×448。整个网络的训练流程如图5-1所示:       

YOLOv1——One-stage开山之作 (目标检测)(one-stage)(深度学习)(CVPR 2016)_第12张图片 图5-1 YOLOv1网络训练流程

1、训练的实现流程如下:

(1):通过网络得到过渡特征图:

输入N个图像,每个训练图像包含M个目标(以GroundTruth框的形式表示),每个目标(GroundTruth框)包含标注好的4个坐标(x,y,w,h)和1个标签(label)。输入训练样本后,网络就知道对于这张图,每个单元格是否负责目标,负责哪个目标以及对应目标的坐标信息,然后通过网络得到7×7×30大小的张量。每个1×30的向量前5个元素表示第一个边界框的4个坐标和1个边界框置信度,第6到10元素表示第二个边界框的4个坐标和1个边界框置信度。最后20个元素表示这个单元格的条件类别概率。这30个元素都是预测出的结果。

(2):计算损失函数(Loss)值并反馈回网络进行迭代:

根据公式计算损失函数的第一、二 、五行。至于第二、三行,边界框的Confidence按照定义可以根据GroundTruth和边界框坐标计算出的IOU和框内含有目标的置信度Pr(Object)(取值0或1)相乘得到。

(3),用测试集进行测试:

输入一张测试图像,跑到网络的末端得到7×7×30的张量,训练好的权重已经计算出了边界框的Confidence,然后再跟预测的所属单元格的条件类别概率(1×20)相乘就得到每个边界框属于哪一类(共20类)的概率。

2、损失函数Loss计算组成如下:

采用平方和(Sum-Squared Error)把边界框的坐标误差(Localization Error)和单元格的分类误差(Classificaton Error)整合在一起。若如果二者的权值一致,容易导致模型不稳定,训练发散。因为很多单元格是不包含物体的,这样的话很多单元格的Confidence为0。所以采用设置不同权重方式来解决,一方面提高坐标误差的权重,另一方面降低没有目标的边界框的置信度误差项权值,二者损失函数(Loss)对应项权重分别是5和0.5。而对于包含目标的边界框的置信度误差项权值还是原来的1。(带小帽子的参量的是训练样本的标注值)。

YOLOv1——One-stage开山之作 (目标检测)(one-stage)(深度学习)(CVPR 2016)_第13张图片 图5-2 YOLOv1网络损失函数结构

详细分析(输入训练样本图片,遍历每个单元格及其各边界框,得到一个Loss值):(1)第一、二行(分成单元格包含与不包含目标两种情况):

此项表示坐标误差,第一行是边界框中心坐标(x,y)的预测,第二行为边界框宽高(w,h)的预测。本单元格无目标时,忽略此项,否则根据 IOU值大小确定负责本单元格所包含目标的那个边界框,用其数据计算此项。这里用w和h的开根号代替原来的w和h,这样做是因为相同的宽和高误差对于小的目标精度影响比大的目标要大。(举个例子,原来w=10,h=20,预测出来w=8,h=22,跟原来w=3,h=5,预测出来w1,h=7相比,其实前者的误差要比后者小,但是如果不加开根号,那么损失都是一样:4+4=8,但是加上根号后,变成0.15和0.7。)

(2)第三、四行(分成单元格包含与不包含目标两种情况):

此项表示边界框的置信度损失,当本单元格包含目标时,根据 IOU值大小确定负责本单元格的目标的那个边界框,对此IOU更大的边界框计算第三行,另一框计算第四行;当本单元格不包含目标时,两框均计算第四行。

(3)第五行(分成单元格包含与不包含目标两种情况):

此项表示预测类别的误差,本单元格无目标时,忽略此项,否则按照公式计算此项。

六、算法性能分析:

以YOlO算法在PASCAL VOC 2007数据集上的性能为例,将YOLO与其它检测算法做一对比,包括DPM,R-CNN,Fast R-CNN以及Faster R-CNN。其对比结果如表6-1所示。

与实时性检测方法DPM对比,可以看到YOLO算法可以在较高的mAP上达到较快的检测速度,其中Fast YOlO算法比快速DPM还快,而且mAP是远高于DPM。但是相比Faster R-CNN,YOLO的mAP稍低,但是速度更快。

所以YOLO算法算是在速度与准确度上做了折中。

YOLOv1——One-stage开山之作 (目标检测)(one-stage)(深度学习)(CVPR 2016)_第14张图片 表6-1 Yolo在PASCAL VOC 2007上与其他算法的对比

文章进一步还做了误差分析,将预测结果按照分类与定位准确性分成以下5类:

1、Correct:类别正确,IOU>0.5;(定位准确)

2、Localization:类别正确,0.1 < IOU<0.5(定位不准)

3、Similar:类别相似,IOU>0.1;

4、Other:类别错误,IOU>0.1;

5、Background:对任何目标其IOU<0.1。(误把背景当物体)

YOLO与Fast R-CNN的误差对比分析如下图所示:

YOLOv1——One-stage开山之作 (目标检测)(one-stage)(深度学习)(CVPR 2016)_第15张图片 表6-1 Yolo在PASCAL VOC 2007上与其他算法的对比

可以看到,YOLO的Correct的是低于Fast R-CNN。另外YOLO的Localization误差偏高,即定位不是很准确。但是YOLO的Background误差很低,说明其对背景的误判率较低。

现在来总结一下YOLO的优缺点。首先是优点,YOLO采用一个CNN网络来实现检测,其训练与预测都是端到端(End-to-End),所以YOLO算法比较简洁且速度快。第二点由于YOLO是对整张图片做卷积,所以其在检测目标有更大的视野,它不容易对背景误判。另外,Yolo的泛化能力强,在做迁移时,模型鲁棒性高。

最后分析YOLO算法的缺点:

  1. YOLO仅仅预测两个边界框,而且属于一个类别,导致定位精确性差,对于小目标物体以及物体比较密集的检测效果不好;
  2. YOLO对于在物体的宽高比方面泛化率低,就是无法定位不寻常比例的物体;
  3.  YOLO虽然可以降低将背景检测为物体的概率,但同时导致召回率(Recall)较低。

 

 

你可能感兴趣的:(目标检测,目标检测:经典论文解读)