天天看点

目标检测方法总结

论文网页:[https://handong1587.github.io/deep_learning/2015/10/09/object-detection.html]

R-CNN——SPPNet——Fast R-CNN——Faster R-CNN——YOLO——SSD

1. R-CNN

R-CNN流程:

目标检测方法总结

第一阶段(生成候选区域):

采用选择性搜索算法在所输入的图片上提取出2000个左右最有可能是目标的候选区域。

第二阶段(特征提取):

将候选框尺寸调整到227*227后输入到预先训练好的卷积神经网络中进行特征提取。

注:CNN只充当特征提取器。

第三阶段(分类):

将CNN提取到的特征输入到预先训练好的SVM分类器中,得到各类别的评分,将一些分数较低的候选区域直接去掉,剩下的候选框会出现相交的情况,采用非极大值抑制技术去除冗余的框。

说明:R-CNN论文中使用的CNN网络是AlexNet,数据集时ImageNet。训练CNN网络时,先在数据集上训练,再在目标检测数据集上对训练好的CNN做微调。

AlexNet:

目标检测方法总结

ImageNet: ImageNet数据集是为了促进计算机图像识别技术的发展而设立的一个大型图像数据集。2016年ImageNet数据集中已经有超过千万张图片,每一张图片都被手工标定好类别,其类别达上千个。

R-CNN的优点是利用了CNN优异的特征提取能力;缺点是计算量太大,通过Selective Search得到的有效区域往往在1000个以上,这就意味着CNN要进行1000多次的特征提取计算,另外,在训练阶段,还需要把所有特征保存起来,再通过SVM进行训练,这也是非常耗时且麻烦的。

2.SPPNet(spatial pyramid pooling convolutional networks)

SPPNet流程:

目标检测方法总结

SPPNet主要做了一件事情:将CNN的输入从固定尺寸改进为任意尺寸。SPPNet在普通的CNN结构中加入了ROI池化层(ROI Pooling),使得网络的输入图像可以是人以尺寸的,输出则不变,同样是一个固定维数的向量。

ROI池化一般跟在卷积层后面,它的输入是任意大小的卷积,输出是固定维数的向量。

ROI池化层

目标检测方法总结

为了说清楚为什么ROI池化层能够把任意大小的卷积特征转换成固定长度的向量,不妨设卷积层输出的宽度为w,高度为h,通道数为c。不管输入的图像尺寸是多少,卷积层的通道数都不会变,也就是说c是一个常数。而w,h会随着输入图像尺寸的变化而变化,可以看作是两个变量。以上图中的ROI池化为例,它首先把卷积层划分为4x4的网格,每个网格的宽度为w/4,高是h/4,通道数为c。当不能整除时,需要取整。接着,对每个网格中的每个通道,都取出其最大值,就是对每个网格中的特征做最大值池化。这个4x4的网格最终形成16c维的特征。接着,再把网络划分为2x2的网格,用同样的方法提取特征,提取的特征的长度为4c。再把网络划分为1x1的网格,提取的特征长度为c,最后的1x1的划分实际是取出卷积中每个通道的最大值。最后将得到的特征拼接起来,得到的特征是16c+4c+c=21c维的特征。很显然,这个输出特征的长度与w、h两个值无关,因此ROI池化层可以把任意宽度、高度的卷积特征转换为固定长度的向量。

应该怎么把ROI池化层用到目标检测中来呢?其实,可以这样考虑问题:网络的输入是一张图像,中间经过若干卷积形成了卷积特征,这个卷积特征实际上和原始图像在位置上是有一对对应关系的。因此,原始图像中的候选框,实际上也可以对应到卷积特征中相同位置的框。由于候选框的大小千变万化,对应到卷积特征的区域形状也各有不同,但是利用ROI池化层可以把卷积特征中的不同形状的区域对应到同样长度的向量特征。

SSPNet与R-CNN的不同点在于,R-CNN要对每个区域计算卷积,而SPPNet只需要计算一次,因此SPPNet的效率比R-CNN高得多。它们的相同点在于,它们都遵循着提取候选区域,提取特征,分类三个步骤。在提取特征后,它们都使用了SVM进行分类。

3.Fast R-CNN

Fast R-CNN流程:

目标检测方法总结

在SPPNet中,实际上特征提取和区域分类两个步骤还是分离的。只是使用ROI池化层提取了每个区域的特征,在对这些区域分类时,还是使用传统的SVM作为分类器。Fast R-CNN相比SPPNet更进一步,不再使用SVM作为分类器,而是使用神经网络进行分类,这样就可以同时训练特征提取网络和分类网络,从而取得比SPPNet更高的准确度。

对于原始图片中的候选框区域,和SPPNet中的做法一样,都是将它映射到卷积特征的对应区域,然后使用ROI池化层对该区域提取特征。在这之后,SPPNet是使用SVM对特征进行分类,而Fast R-CNN则是直接使用全连接层。全连接层有两个输出,一个输出负责分类,另一个输出负责框回归。

先说分类,假设要在图像中检测K类物体,那么最终的输出应该是K+1(包含背景)个数,每个数都代表该区域为某个类别的概率。再说框回归,框回归实际上要做的是对原始的检测框进行某种程度的“校准”。因为使用Selective Search获得的框有时存在一定偏差。设通过Selective Search得到的框的四个参数为(x,y,w,h),其中(x,y)表示框左上角的坐标位置,(w,h)表示框的宽度和高度。而真正的框的位置用(x’,y’,w’,h’)表示,框回归就是要学习参数((x’-x)/w,(y’-y)/h,ln(w’/w),ln(h’/h)),前两个参数表示与尺度无关的平移量,后两个参数表示与尺度无关的缩放量。也就是说,Fast R-CNN使用一个网络同时完成了提取特征,判断类别,框回归三项工作。

4.Faster R-CNN

Faster R-CNN流程:

目标检测方法总结

Faster R-CNN中用RPN(Region Proposal Network)取代了Selective Search,不仅速度得到大大提高,而且还获得了更加精确的结果。

RPN网络结构

目标检测方法总结

RPN还是需要先使用一个CNN网络对原始图片提取特征,设这个前置的CNN提取的特征为51x39x256,即高位51,宽为39,通道数为256.对这个卷积特征再进行一次卷积计算,保持宽,高,通道数不变,再次得到一个51x39x256的特征。为了方便叙述,先来定义一个“位置”的概念:对于一个51x39x256的卷积特征,称它一共有51x39个“位置”。让新的卷积特征的每一个“位置”都“负责”原图中对应位置9中尺寸的框的检测,检测的目标是判断框中是否存在一个物体,因此共有51x39x9个“框”。在Faster R-CNN的原论文中,将这些框都统一称为“anchor”。

anchor的9种尺寸如下图所示,它们的面积分别为128²,256²,512²。每种面积又分为3种长宽比,分别为2:1,1:2,1:1。anchor的尺寸实际是属于可调的参数,不同任务可以选择不同的尺寸。

Faster R-CNN中的anchor

目标检测方法总结

对于51x39个位置和51x39x9个anchor,下图展示了接下来每个位置的计算步骤。设k为单个位置对应的anchor的个数,此时k=9.首先使用一个3x3的滑动窗口,将每个位置转换为一个统一的256维的特征,这个特征对应了两部分的输出。一部分表示该位置的anchor为物体的概率,这部分的总输出长度为2xk(一个anchor对应两个输出:是物体的概率+不是物体的概率)。另一部分为框回归,框回归的含义与Fast R-CNN中一样,一个anchor对应4个框回归参数,因此框回归部分的总输出的长度为4xk。

anchor与网络输出的对应关系

目标检测方法总结

Faster R-CNN使用RPN生成候选框后,剩下的网络结构和Fast R-CNN中的结构一模一样。在训练过程中,需要训练两个网络,一个是RPN网络,一个是在得到框之后使用的分类网络。通常的做法是交替训练,即在一个batch内,先训练RPN网络一次,再训练分类网络一次。

R-CNN,Fast R-CNN,Faster R-CNN的对比

目标检测方法总结

5.YOLO

YOLO流程:

目标检测方法总结
目标检测方法总结

将一帧图像分解为7x7个网格单元,物体落入到哪个格子就由哪个格子负责检测,判断物体是否落入某个格子的标准是:该物体的中心落入到了格子里。每个网格单元预测出两个候选区域,即7x7x2=98个可能的目标,网络预测回归出目标的位置信息(x,y),尺寸信息(w,h),置信度以及对应的每个类别的概率信息。

6.SSD

SSD流程:

目标检测方法总结

SSD预测目标的位置使用的是目标位置周围局部的特征。SSD网络结构利用了Faster R-CNN模型中的anchor机制和YOLO模型中单个神经网络检测思路,所以它既保留了Faster R-CNN的准确率又有YOLO的检测速度,可以实现高准确率的实时检测。

SSD的基本思想是基于卷积神经网络,产生固定大小的边界框位置偏移量,以及每个框中包含物体的概率得分后,使用非极大值抑制方法得到最终的检测结果。

继续阅读