物体检测及分类方法总结

当下比较流行的检测方法:Faster R-CNN,ION, HyperNet, SDP-CRC, YOLO,G-CNN,SSD。

下图是各种目标检测模型的检测精度对比

物体检测及分类方法总结

物体检测及分类方法总结

DPM

Deformable Part Model,可变形的组件模型,是一种基于组件的检测算法,08年提出。DPM可以看做是HOG的扩展,大体思路与HOG一致。先计算梯度方向直方图,然后用SVM训练得到物体的梯度模型。有了这样的模板就可以直接用来分类了,简单理解就是模型和目标匹配,DPM只是在模型上做了多改进工作。

算法思想:

1)Root filter+ Part filter:

如下图,是一个检测人的model,该模型包含了一个8*8分辨率的根滤波器(Root filter)(左)和4*4分辨率的组件滤波器(Part filter)(中)。其中,中图的分辨率为左图的2倍,并且Part filter的大小是Root filter的2倍,因此看的梯度会更加精细。右图为其高斯滤波后的2倍空间模型。

物体检测及分类方法总结

(左)Rootfilter                  (中) Part filter            (右)高斯滤波后模型

(2)响应值(score)的计算:

root模型响应值得分公式如下:

物体检测及分类方法总结

其中,x0、y0、l0分别为锚点的横坐标、纵坐标、尺度;

R0、l0 (x0, y0)为根模型的响应分数,或者说是匹配程度,本质就是模板β和feature map的卷积,后面的part filter也是如此;

Di,l0−λ(2(x0, y0)+vi)为部件模型的响应分数;

b为不同模型组件之间的偏移系数,加上这个偏移量使其与跟模型进行对齐;

(x0, y0)为rootfilter的left-top位置在root feature map中的坐标,2(x0, y0)是因为part feature map的分辨率是root feature map的两倍,2(x0, y0)+vi为第i个part filter映射到part feature map中的坐标;

vi为锚点和理想检测点之间的偏移系数,即相对于rootfilter left-top 的偏移。

 

part模型响应值得分公式如下:

 

物体检测及分类方法总结

其中x,y为训练的理想模型的位置;

Ri,l(x + dx, y + dy)为组件模型的匹配得分;

di · φd(dx, dy))为组件的偏移损失得分;

di为偏移损失系数;

 

 

φd(dx, dy))为组件模型的锚点和组件模型的检测点之间的距离;

 

 

此公式表明,组件模型响应越高,各个组件和其相应的锚点距离越小,则响应分数越高,越有可能是待检测物体。

(3)DPM特征定义:

物体检测及分类方法总结

DPM首先采用的是HOG进行特征的提取,但又有别于HOG,DPM只保留了HOG中的Cell。如上图所示,假设一个8*8的Cell,将该细胞单元与其对角线临域的4个细胞单元做归一化操作。提取有符号的HOG梯度,0-360度将产生18个梯度向量,提取无符号的HOG梯度,0-180度将产生9个梯度向量。因此,一个8*8的细胞单元将会产生,(18+9)*4=108,维度有点高。作者的优化思想是,首先只提取无符号的HOG梯度,将会产生4*9=36维特征,将其看成一个4*9的矩阵,分别将行和列分别相加,最终将生成4+9=13个特征向量,为了进一步提高精度,将提取的18维有符号的梯度特征也加进来,这样一共产生13+18=31维梯度特征。实现了很好的目标检测。

(4)DPM检测流程:

物体检测及分类方法总结

如上图所示,对于任意一张输入图像,提取其DPM特征图,然后将原始图像进行高斯金字塔上采样,然后提取其DPM特征图。对于原始图像的DPM特征图和训练好的Root filter做卷积操作,从而得到Root filter的响应图。对于2倍图像的DPM特征图,和训练好的Part filter做卷积操作,从而得到Part filter的响应图。然后对其精细高斯金字塔的下采样操作。这样Root filter的响应图和Part filter的响应图就具有相同的分辨率了。然后将其进行加权平均,得到最终的响应图。亮度越大表示响应值越大。

(5)Latent SVM:

物体检测及分类方法总结

 

传统的Hog+SVM和DPM+LatentSVM的区别如上面公式所示。

由于训练样本中,负样本集肯定是100%的准确的,而正样本集中就可能有噪声。因为正样本标注是人工进行的,人是会犯错的,标注的也肯定会有不精确的。因此需要首先去除里面的噪声数据。而对于剩下的数据,里面由于各种角度,姿势的不一样,导致训练的模型的梯度图也比较发散,无规则。因此需要选择其中的具有相同的姿势的数据,即离正负样本的分界线最近的那些样本,将离分界线很近的样本称为Hard-examples,相反,那些距离较远的称为Easy-examples。

缺点:

模型太死板了,不能适应物体的运动,特别是非刚性物体的运动。

使用传统的slider window的方法,给出的窗口太多,10^5, 10^6甚至更多,计算量非常大。

OverFeat

OverFeat: Integrated Recognition, Localization and Detection using Convolutional Networks,14发表。OverFeat其实就是一种特征提取算子,就相当于SIFT,HOG等这些算子一样。

这篇文献牛逼的地方,在于充分利用了卷积神经网络的特征提取功能,它把分类过程中,提取到的特征,同时又用于定位检测等各种任务。只需要改变网络的最后几层,就可以实现不同的任务,而不需要从头开始训练整个网络的参数。其主要是把网络的第一层到第五层看做是特征提取层,然后不同的任务共享这个特征提取层。基本用了同一个网络架构模型(特征提取层相同,分类回归层根据不同任务稍作修改、训练),同时共享基础特征。

OverFeat的网络架构方面与Alexnet基本相同,Alexnet的训练和测试过程为,①训练阶段:每张训练图片256*256,然后随机裁剪出224*224大小的图片,作为CNN的输入进行训练;②测试阶段:输入256*256大小的图片,我们从图片的5个指定的方位(上下左右+中间)进行裁剪出5张224*224大小的图片,然后水平镜像一下再裁剪5张,这样总共有10张;然后把这10张裁剪图片分别送入已经训练好的CNN中,分别预测结果,最后用这10个结果的平均作为最后的输出。

overfeat 在训练阶段采用与Alexnet相同的训练方式,在测试阶段差别很大,这就是OverFeat最大的创新点,它不是裁剪出10张224*224的图片进行结果预测平均。

overfeat 中用到了两个基础算法:FCN 和 offset max-pooling

FCN 

Fully Convolutional Networks for Semantic Segmentation,全卷积神经网络,此算法多用于语义分割领域。

对于一个各层参数结构都设计好的网络模型来说,输入的图片大小是固定的,比如Alexnet设计完毕后,网络输入图片大小就是227*227。FCN的精髓就是网络可以一直前向传导,让一个已经设计完毕的网络,也可以输入任意大小的图片。FCN算法灵魂:

1、把卷积层--->全连接层,看成是对一整张图片的卷积层运算;

2、把全连接层--->全连接层,看成是采用1*1大小的卷积核,进行卷积层运算。

下面用一个例子,讲解怎么让一个已经设计好的CNN模型,可以输入任意大小的图片:

物体检测及分类方法总结

如上图所示,上面图中绿色部分表示卷积核大小。假设我们设计了一个CNN模型,输入图片大小是14*14,通过第一层卷积后我们得到10*10大小的图片,然后接着通过池化得到了5*5大小的图片,接着要从5*5大小的图片变为1*1大小的图片:

(1)传统的CNN:此过程为全连接层,把这个5*5大小的图片,展平成为一个一维向量,进行计算(cnn源码中的flatten函数,就是为了展平成一维向量)。

(2)FCN:FCN并不是把5*5的图片展平成一维向量,再进行计算,而是直接采用5*5的卷积核,对一整张图片进行卷积运算。

其实这两个本质上是相同的,只是角度不同,FCN把这个过程当成了对一整张特征图进行卷积,同样,后面的全连接层也是把它当做是以1*1大小的卷积核进行卷积运算。

上例中,输入的是一张14*14的图片,现在试输入16*16的图片,过程如下:

物体检测及分类方法总结

网络最后的输出是一张2*2大小的图片,也就是说现在输出图片大小与输入图片大小是息息相关的了。

现将其应用到实际情况,如Alexnet+FCN,把全连接层看成是卷积层运算,如果Alexnet输入一张500*500图片,那么将得到1000张10*10大小的预测分类图,然后我们可以简单采用对着每一张10*10大小的图片求取平均值,作为图片属于各个类别的概率值。

其实Alexnet在测试阶段的时候,采用了对输入图片的四个角落进行裁剪,进行预测,分别得到结果,最后的结果就是类似对应于上面2*2的预测图。这个2*2的每个像素点,就类似于对应于一个角落裁剪下来的图片预测分类结果。只不过Alexnet把这4个像素点,相加在一起,求取平均值,作为该类别的概率值。overfeat就是把采用FCN的思想把全连接层看成了卷积层,让我们在网络测试阶段可以输入任意大小的图片。

offset max-pooling

offset 池化。为了简单起见,我们暂时不用二维的图像作为例子,而是采用一维作为示例,来讲解池化:

物体检测及分类方法总结

如上图,在x轴上有20个神经元,如果选择size=3的非重叠池化,那么根据之前所学的方法应该是:对上面的20个,从1位置开始进行分组,每3个连续的神经元为一组,然后计算每组的最大值(最大池化),19、20号神经元将被丢弃,如下图所示:

物体检测及分类方法总结

也可以在20号神经元后面,人为的添加一个数值为0的神经元编号21,与19、20成为一组,这样可以分成7组:[1,2,3],[4,5,6]……,[16,17,18],[19,20,21],最后计算每组的最大值,这就是以前所学CNN中池化层的源码实现方法了。

上面说到,如果只分6组的话,除了以1作为初始位置进行连续组合之外,也可以从位置2或者3开始进行组合。也就是说我们其实有3种池化组合方法:

 

A、△=0分组:[1,2,3],[4,5,6]……,[16,17,18];

B、△=1分组:[2,3,4],[5,6,7]……,[17,18,19];

C、△=2分组:[3,4,5],[6,7,8]……,[18,19,20];

对应图片如下:

 

物体检测及分类方法总结

以往的CNN中,一般我们只用了△=0的情况,得到池化结果后,就送入了下一层。而此论文中把上面的△=0、△=1、△=2的三种组合方式的池化结果,分别送入网络的下一层。这样的话,我们网络在最后输出的时候,就会出现3种预测结果了。

我们前面说的是一维的情况,如果是2维图片的话,那么(△x,△y)就会有9种取值情况(3*3);如果在做图片分类的时候,在网络的某一个池化层加入了这种offset池化方法,然后把这9种池化结果,分别送入后面的网络层,最后我们的图片分类输出结果就可以得到9个预测结果(每个类别都可以得到9种概率值,然后我们对每个类别的9种概率,取其最大值,做为此类别的预测概率值)。

OK,学完了上面两种招式之后,文献的算法,就是把这两种招式结合起来,形成了文献最后测试阶段的算法,接着我们就来讲讲怎么结合。

overfeat图片分类

(1)网络架构

对于网络的结构,文献给出了两个版本,快速版和精确版,一个精度比较高但速度慢;另外一个精度虽然低但是速度快。下面是高精度版本的网络结构表相关参数:

物体检测及分类方法总结

表格参数说明:

网络输入:从上面的表格,我们知道网络输入图片大小为221*221;

网络结构方面基本上和AlexNet是一样的,也是使用了ReLU**,最大池化。

不同之处在于:(a)作者没有使用局部响应归一化层;(b)然后也没有采用重叠池化的方法;(c)在第一层卷积层,stride作者是选择了2,这个与AlexNet不同(AlexNet选择的步长是4,在网络中,如果stride选择比较大得话,虽然可以减少网络层数,提高速度,但是却会降低精度)。f7层看成是卷积核大小为5*5的卷积层,总之就是需要把网络看成我们前面所学的FCN模型,没有了全连接层的概念,因为在测试阶段我们可不是仅仅输入221*221这样大小的图片,我们在测试阶段要输入各种大小的图片,具体请看后面测试阶段的讲解。

(2)网络训练

训练输入:对于每张原图片为256*256,进行随机裁剪为221*221的大小作为CNN输入,进行训练。优化求解参数设置:训练的min-batch选择128,权重初始化选择高斯分布的随机初始化:

物体检测及分类方法总结

采用随机梯度下降法进行优化更新,动量项参数大小为0.6,L2权重衰减系数大小为10-5次方。学习率一开始选择0.05,然后根据迭代次数的增加,每隔几十次的迭代后,就把学习率的大小减小一半。然后就是DropOut,这个只有在最后的两个全连接层,才采用dropout,dropout比率选择0.5,也就是网络的第6、7层。
 

2、网络测试阶段

网络结构在训练完后,参数的个数、结构是固定的,这一步的算法没有改变网络的结构和网络参数。

Alexnet的文献中,他们预测的方法是输入一张图片256*256,然后进行multi-view裁剪,也就是从图片的四个角进行裁剪,还有就是一图片的中心进行裁剪,这样可以裁剪到5张224*224的图片。然后把原图片水平翻转一下,再用同样的方式进行裁剪,又可以裁剪到5张图片。把这10张图片作为输入,分别进行预测分类,最后在softmax的最后一层,求取个各类的总概率,求取平均值。然而Alexnet这种预测方法存在两个问题:首先这样的裁剪方式,把图片的很多区域都给忽略了,说不定你这样的裁剪,刚好把图片物体的一部分给裁剪掉了;另外一方面,裁剪窗口重叠存在很多冗余的计算,像上面我们要分别把10张图片送入网络,可见测试阶段的计算量还是蛮大的。

Overfeat算法:训练完上面所说的网络之后,在测试阶段,我们不再是用一张221*221大小的图片了作为网络的输入,而是用了6张大小都不相同的图片,也就是所谓的多尺度输入预测,如下表格所示:

物体检测及分类方法总结

测试阶段网络输入图片大小分别是245*245,281*317……461*569。

然后当网络前向传导到layer 5的时候,就使出了前面我们所讲的FCN、offset pooling这两招相结合的招式。在这里我们以输入一张图片为例(6张图片的计算方法都相同),讲解layer 5后面的整体过程,具体流程示意图如下:

物体检测及分类方法总结

从layer-5 pre-pool到 layer-5 post-pool:这一步的实现是通过池化大小为( 3,3 )进行池化,然后△x=0、1、2,△y=0、1、2,这样我们可以得到对于每一张特征图,我们都可以得到9幅池化结果图。以上面表格中的sacle1为例,layer-5 pre-pool大小是17*17,经过池化后,大小就是5*5,然后有3*3张结果图(不同offset得到的结果)。

从layer-5 post-pool到classifier map(pre-reshape):我们知道在训练的时候,从卷积层到全连接层,输入的大小是4096*(5*5),然后进行全连接,得到4096*(1*1)。但是我们现在输入的是各种不同大小的图片,因此接着就采用FCN的招式,让网络继续前向传导。我们从layer-5 post-pool到第六层的时候,如果把全连接看成是卷积,那么其实这个时候卷积核的大小为5*5,因为训练的时候,layer-5 post-pool得到的结果是5*5。因此在预测分类的时候,假设layer-5 post-pool 得到的是7*9(上面表格中的scale 3),经过5*5的卷积核进行卷积后,那么它将得到(7-5+1)*(9-5+1)=3*5的输出。

然后我们就只需要在后面把它们拉成一维向量摆放就ok了,这样在一个尺度上,可得到一个C*N个预测值矩阵,每一列就表示图片属于某一类别的概率值,然后我们求取每一列的最大值,作为本尺度的每个类别的概率值。最后我们一共用了6种不同尺度(文献好像用了12张,另外6张是水平翻转的图片),做了预测,然后把这六种尺度结果再做一个平均,作为最最后的结果。OK,至此overfeat图片分类的任务就结束了,从上面过程,我们可以看到整个网络分成两部分:layer 1~5这五层我们把它称之为特征提取层;layer 6~output我们把它们称之为分类层。

定位任务

后面我们用于定位任务的时候,就把分类层(上面的layer 6~output)给重新设计一下,把分类改成回归问题,然后在各种不同尺度上训练预测物体的bounding box。

我们把用图片分类学习的特征提取层的参数固定下来,然后继续训练后面的回归层的参数,网络包含了4个输出,对应于bounding box的上左上角点和右下角点,然后损失函数采用欧式距离L2损失函数。

目标检测=识别+定位

1.图像识别(classification):

输入:图片
输出:物体的类别

评估方法:准确率

物体检测及分类方法总结

2.定位(localization):

输入:图片

 

输出:方框在图片中的位置(x,y,w,h)

 

评估方法:检测评价函数 intersection-over-union ( IOU ) 

物体检测及分类方法总结

CNN已经帮我们完成了图像识别(判定是猫还是狗)的任务了,我们只需要添加一些额外的功能来完成定位任务即可。

定位

 

思路一:看做回归问题
看做回归问题,我们需要预测出(x,y,w,h)四个参数的值,从而得出方框的位置。

 

物体检测及分类方法总结

步骤1:先解决简单问题, 搭一个识别图像的神经网络,如在AlexNet/VGG/GoogleLenet上fine-tuning一下

物体检测及分类方法总结

步骤2:在上述神经网络的尾部展开(CNN前面的层保持不变,对末尾层作出改进,加了两个头---分类头和回归头,成为classification + regression模式。

物体检测及分类方法总结

步骤3:Regression那个部分用欧氏距离损失,使用SGD(随机梯度下降)训练。

步骤4:预测阶段把2个头部拼上,完成不同的功能

这里需要进行两次fine-tuning,第一次在ALexNet上做,第二次将头部改成regression head,前面不变,做一次fine-tuning

Regression的放置位置,加在最后一个卷积层后面(如VGG),或者加在最后一个全连接层后面(如R-CNN)。regression太难做了,应想方设法转换为classification问题。regression的训练参数收敛的时间要长得多,所以上面的网络采取了用classification的网络来计算出网络共同部分的连接权值。

思路二:取图像窗口

 

还是刚才的classification + regression思路
取不同大小的“框”
让框出现在不同的位置,得出这个框的判定得分

 

取得分最高的那个框

即对一张图片,用各种大小的框(遍历整张图片)将图片截取出来,输入到CNN,然后CNN会输出这个框的得分(classification)以及这个框图片对应的x,y,h,w(regression)。

物体检测及分类方法总结

这方法实在太耗时间了,做个优化。
原来网络是这样的:

物体检测及分类方法总结

优化成这样:把全连接层改为卷积层,这样可以提提速。

物体检测及分类方法总结

物体检测(Object Detection)

当图像有很多物体怎么办的?难度可是一下暴增啊。

那任务就变成了:多物体识别+定位多个物体

那把这个任务看做分类问题?

不好,框太多,有人想到一个好方法,找出可能含有物体的框(也就是候选框,比如选1000个候选框),这些框之间是可以互相重叠互相包含的,这样我们就可以避免暴力枚举所有框了。

大牛们发明好多选定候选框的方法,比如EdgeBoxes和Selective Search。

以下是各种选定候选框的方法的性能对比

物体检测及分类方法总结

基于Region Proposal的方法

基本思想:先得到候选区域再对候选区域进行分类和边框回归。 

1.R-CNN 

Region CNN,是较早地将DCNN用到目标检测中的方法。

CNN特征提取

网络架构有两个可选方案:Alexnet或VGG16。经过测试Alexnet精度为58.5%,VGG16精度为66%。VGG这个模型的特点卷积核小、跨步,精度高,不过计算量是Alexnet的7倍。RBG大神说过,通过他们的实验得出,一般的CNN网络(alexnet),前5层是用于特征提取的,卷积层所学到的特征其实就是基础的共享特征提取层,就类似于SIFT算法一样,可以用于提取各种图片的特征,而f6、f7所学习到的特征是用于针对特定任务的特征。所以这里可以将后面的层修改用于对象检测。

测试阶段的检测

首先通过selective search选择2000个候选区域,将候选区域wrap到固定的大小的scale(AlexNet为227*227),经cnn特征提取得到feature map,这些特征用固定长度的特征集合feature vector(特征向量)来表示,然后把这些特征向量直接放到svm分类器去判断打分,用非极大值抑制计算出每一个bounding box的面积,然后根据score进行排序,把score最大的bounding box作为选定的框,计算其余bounding box与当前最大score与box的IoU,去除IoU大于设定的阈值的bounding box。然后重复上面的过程,直至候选bounding box为空,然后再将score小于一定阈值的选定框删除得到另一类的结果。作者论文中提到花费在region propasals和提取特征的时间是13s/张-GPU和53s/张-CPU,可以看出时间还是很长的,不能够达到及时性。

训练阶段的检测

1.fine-tuning是为了适应不同场合的识别需要,网络只需要将最后的1000类的分类层换成21类的分类层(20个类和1个背景),其他都不需要变。为了保证训练只是对网络的微调而不是大幅度的变化,网络的学习率只设置成了0.001。计算每个region proposal与人工标注的框的IoU,IoU重叠阈值设为0.5,大于这个阈值的作为正样本,其他的作为负样本,然后在训练的每一次迭代中都使用32个正样本(包括所有类别)和96个背景样本组成的128张图片的batch进行训练(这么做的主要原因还是正样本图片太少了)。

2.特定类别的分类器,对每一类都训练一个线性SVM分类器,IoU阈值0.3,计算每一个region proposal与标准框的IoU,大于这个阈值的为正样本,小于为负样本。由于训练样本比较大,作者用了standard hard negative mining method来训练分类器。

作者在补充材料中讨论了为什么fine-tuning和训练SVM时所用的正负样本标准不一样(0.5和0.3),以及为什么不直接用卷积神经网络的输出来分类而要单独训练SVM来分类。

这个是因为svm训练和cnn训练过程的正负样本定义方式各有不同,导致最后采用CNN softmax输出比采用svm精度还低。cnn在训练的时候,对训练数据做了比较宽松的标注,比如一个bounding box可能只包含物体的一部分,那么我也把它标注为正样本用于训练cnn,cnn容易过拟合,所以需要大量的训练数据,所以在CNN训练阶段我们是对Bounding box的位置限制条件限制的比较松(IOU只要大于0.5都被标注为正样本了);然而svm训练的时候,因为svm适用于少样本训练,所以对于训练样本数据的IOU要求比较严格,我们只有当bounding box把整个物体都包含进去了,我们才把它标注为物体类别,然后训练svm。总的来说,就是加上一个SVM分类器,识别精度更高了。

                               物体检测及分类方法总结

物体检测及分类方法总结

详细步骤:

步骤一:训练或下载一个分类模型(AlexNet/VGG...)

物体检测及分类方法总结

步骤二:对该模型做fine-tuning,将分类数从1000改为21,去掉最后一个全连接层

物体检测及分类方法总结

步骤三:特征提取,提取图像的所有候选框(选择性搜索),对于每一个区域:修正区域大小以适合CNN的输入,做一次前向运算,将第五个池化层的输出(就是对候选框提取到的特征)存到硬盘。

物体检测及分类方法总结

步骤四:从特征提取步骤中,生成一个4096维特征,将这个向量分别放入每一个SVM分类器中进行二值分类,并输出对每一个region proposal的4096维特征的得分(详细过程为:CNN提取2000个候选框,可得2000*4096这样的特征向量矩阵,然后把此矩阵与svm权值矩阵4096*N矩阵乘,得到2000*N的矩阵,就是每一个类对2000个候选框的打分,N为分类类别数目,就可以得到结果了),最后将得到所有region proposals的对于每一类的分数,用非极大值抑制方法对每一个SVM分类器类去除相交的多余的框。SVM分类器的每一类,会从一张图片中找出n多个可能是物体的矩形框,然后为每个矩形框打分,就像上面的图片一样,定位一个猫,最后算法就找出了一堆的方框,我们需要判别哪些矩形框是没用的。非极大值抑制:先假设有6个矩形框,根据分类器类别分类概率做排序,从小到大分别属于车辆的概率分别为A、B、C、D、E、F。
(1)从最大概率矩形框F开始,分别判断A~E与F的重叠度IOU是否大于某个设定的阈值;
(2)假设B、D与F的重叠度超过阈值,那么就扔掉B、D;并标记第一个矩形框F,是我们保留下来的。
(3)从剩下的矩形框A、C、E中,选择概率最大的E,然后判断E与A、C的重叠度,重叠度大于一定的阈值,那么就扔掉;并标记E是我们保留下来的第二个矩形框。
就这样一直重复,找到所有被保留下来的矩形框。判断是不是属于这个类别,是就是positive,反之nagative,如下图,就是狗分类的SVM。

物体检测及分类方法总结

步骤五:使用回归器精细修正候选框位置:对于每一个类,训练一个线性回归模型去判定这个框是否框得完美。

物体检测及分类方法总结

总结

r-cnn需要两次进行跑cnn model,第一次得到classification的结果,第二次才能得到(nms+b-box regression)bounding-box。训练和测试过程分为好几个阶段:得到候选区域,DCNN 特征提取, SVM分类、SVM边界框回归,训练过程非常耗时,不能实时;训练过程中需要保存DCNN得到的特征,很占内存空间;测试过程中,每一个候选区域都要提取一遍特征,而这些区域有一定重叠度,各个区域的特征提取独立计算,效率不高,使测试一幅图像非常慢。

RCNN的进化中SPP Net的思想对其贡献很大,这里也简单介绍一下SPP Net。

SPP Net

SPP:Spatial Pyramid Pooling(空间金字塔池化)。R-CNN是在image阶段是根据bounding boxes对原来的image进行 crop,然后对crop image进行classification。 这样做遵Object Detection两部曲,BBox Detect & Object Classification。但这种方法有一个缺点:Conv层大量的重复计算。对于传统的CNN, 输入都需要固定大小的image size, 但由于CNN的网络特点,在Conv层是不需要考虑image size的,只有后面的FC层才需要考虑。所以可将conv 层提前,那么经过改进的算法就是 SPP_net。

物体检测及分类方法总结

1.结合空间金字塔方法实现CNNs的对尺度输入

一般CNN后接全连接层或者分类器,他们都需要固定的输入尺寸,因此不得不对输入数据进行crop(裁剪)或者warp(伸缩),这些预处理会造成数据的丢失或几何失真。SPP Net的第一个贡献就是将金字塔思想加入到CNN,实现了数据的多尺度输入。如下图所示,在卷积层和全连接层之间加入了SPP layer。此时网络的输入可以是任意尺度的,在SPP layer中每一个pooling的filter会根据输入调整大小,而SPP的输出尺度始终是固定的。

物体检测及分类方法总结

如上图所示:SPP_net 新加入的一种layer: spatial pyramid pooling layer,对 Conv5 层的feature maps 进行spatial pyramid pooling, 对于任意size的feature maps(width, height, channel=256),使用三层的金字塔池化层pooling,分别设置图片切分成多少块,论文中设置的分别是(1,4,16),然后按照层次对这个特征图feature A进行分别处理(用代码实现就是for(1,2,3层)),也就是在第一层对这个特征图feature A整个特征图进行池化,论文中使用的是最大池化,得到1个特征。第二层先将这个特征图feature A切分为4个(20,30)的小的特征图,然后使用对应的大小的池化核对其进行池化得到4个特征,第三层先将这个特征图feature A切分为16个(10,15)的小的特征图,然后使用对应大小的池化核对其进行池化得到16个特征。然后将这1+4+16=21个特征输入到全连接层,进行权重计算.。这些层数是可以随意设定的,以及这个图片划分也是可以随意的,只要效果好同时最后能组合成我们需要的特征个数即可。

这就是sppnet的核心思想,在这个模型中,何大神还对RCNN进行了优化,上面介绍的金字塔池化代替warp最重要的一个,但是这个也很重要,是什么呢?何大神觉得,如果对ss提供的2000多个候选区域都逐一进行卷积处理,势必会耗费大量的时间,所以他觉得,能不能我们先对一整张图进行卷积得到特征图,然后再将ss算法提供的2000多个候选区域的位置记录下来,通过比例映射到整张图的feature map上提取出候选区域的特征图B,然后将B送入到金字塔池化层中,进行权重计算。然后经过尝试,这种方法是可行的,于是在RCNN基础上,进行了这两个优化得到了这个新的网络sppnet。值得一提的是,sppnet提出的这种金字塔池化来实现任意图片大小进行CNN处理的这种思路,得到了大家的广泛认可,以后的许多模型,或多或少在这方面都是参考了这种思路,就连rg大神,在后来提出的fast-rcnn上也是收益于这种思想的启发。

2.只对原图提取一次卷积特征

在R-CNN中,每个候选框先resize到统一大小,然后分别作为CNN的输入,这样是很低效的。所以SPP Net根据这个缺点做了优化:只对原图进行一次卷积得到整张图的feature map,然后找到每个候选框在feature map上的映射patch,将此patch作为每个候选框的卷积特征输入到SPP layer和之后的层。这样节省了大量的计算时间,比R-CNN有一百倍左右的提速。

物体检测及分类方法总结

2.Fast R-CNN

在R-CNN的基础上,为了使训练和测试过程更快,Ross Girshick 2015年提出了Fast R-CNN,使用VGG19网络结构比R-CNN在训练和测试时分别快了9倍和213倍。

其主要想法是: 

1, 对整个图像进行卷积得到特征图像而不是对每个候选区域分别算卷积;

2,把候选区域分类和边框拟合的两个步骤结合起来而不是分开做。

                                 物体检测及分类方法总结

 

该文章中使用ROI Pooling Layer 将不同大小的候选区域的特征转化为固定大小的特征图像,其做法是:假设候选区域ROI的大小为物体检测及分类方法总结, 要输出的大小为物体检测及分类方法总结,那么就将该ROI分成物体检测及分类方法总结 个格子,每一个格子的大小为物体检测及分类方法总结, 然后对每一格子使用max-pooling得到目标大小的特征图像。

候选区域的分类和边框拟合的结合是通过一个双任务的网络结构:使用两个全连接的输出层分别进行类别预测和边框预测(如上图所示),将这两个任务进行同时训练,利用一个联合代价函数:

物体检测及分类方法总结

公式中的两项分别是classification loss 和regression loss。该方法相比于R-CNN快了不少。特别是在测试一幅新图像时,如果不考虑生成候选区域的时间,可以达到实时检测。生成候选区域的selective search算法处理一张图像大概需要2s的时间,因此成为该方法的一个瓶颈。

3.Faster R-CNN

上面两种方法都依赖于selective search生成候选区域,十分耗时,那么可不可以直接利用卷积神经网络得到候选区域呢?这样的话就几乎可以不花额外的时间代价就能得到候选区域。

Shaoqing Ren提出了Faster R-CNN来实现这种想法:假设有两个卷积神经网络,一个是区域生成网络,得到图像中的各个候选区域,另一个是候选区域的分类和边框回归网路。这两个网络的前几层都要计算卷积,如果让它们在这几层共享参数,只是在末尾的几层分别实现各自的特定的目标任务,那么对一幅图像只需用这几个共享的卷积层进行一次前向卷积计算,就能同时得到候选区域和各候选区域的类别及边框。

                  物体检测及分类方法总结

候选区域生成网络(Region Proposal Network, RPN)方法的原理图如上,先通过对输入图像的数层卷积得到一个特征图像,然后在特征图像上生成候选区域,做法是使用一个物体检测及分类方法总结物体检测及分类方法总结3)的滑动窗口,将局部的特征图像转换成一个低维特征, 预测物体检测及分类方法总结个的区域(cls层,物体检测及分类方法总结个输出)是否为候选区域和对应的物体检测及分类方法总结个边框(reg层,物体检测及分类方法总结个输出)。这里的物体检测及分类方法总结个区域被称为锚(anchor), 对应着与滑动窗口具有相同的中心的不同大小和不同长宽比的矩形框。假设卷积后的特征图像大小为物体检测及分类方法总结,那么一共有物体检测及分类方法总结个锚(anchor)。这种特征提取和候选区域生成的方法具有位移不变性。

使用RPN得到候选区域后,对候选区域的分类和边框回归仍然使用Fast R-CNN。这两个网络使用共同的卷积层。 由于Fast R-CNN的训练过程中需要使用固定的候选区域生成方法,不能同时对RPN和Fast R-CNN使用反向传播算法进行训练。

该文章使用了四个步骤完成训练过程:

1,单独训练RPN;

2,使用步骤中1得到的区域生成方法单独训练Fast R-CNN;

3, 使用步骤2得到的网络作为初始网络训练RPN。

4, 再次训练Fast R-CNN, 微调参数。

Faster R-CNN的精度和Fast R-CNN差不多,但是训练时间和测试时间都缩短了10倍。

4.ION: Inside-Outside Net

ION也是基于Region Proposal的,在得到候选区域的基础上,为了进一步提高在每一个候选感兴趣区域ROI的预测精度,ION考虑了结合ROI内部的信息和ROI以外的信息,有两个创新点:一是使用空间递归神经网络(spatial recurrent neural network)把上下文(context)特征结合,而不是只使用ROI内的局部特征 ,二是将不同卷积层得到的特征连接起来,作为一个多尺度特征用来预测。

物体检测及分类方法总结

ION在上、下、左、右四个方向独立地使用RNN,并把它们的输出连接起来组合成一个特征输出,经过两次这样的过程得到的特征作为上下文特征,再与之前的几个卷积层的输出特征连接起来,得到既包括上下文信息,又包括多尺度信息的特征。

物体检测及分类方法总结

 

5.HyperNet

HyperNet在Faster R-CNN的基础上,在得到更好的候选区域方面比Faster R-CNN中使用的RPN有了进一步的提高。其想法也是把不同卷积层得到的特征图像结合起来,产生更好的region proposal和检测准确率。

物体检测及分类方法总结

该文章把不同卷积层的输出结合起来得到的特征成为Hyper Feature。由于不同卷积层的输出大小不一样,较浅层的特征图像分辨率较高,对提高边界框的精确性有益,但是容易对边界框内的物体错误分类;较深层得到的特征图像分辨率很低,对小一些的物体的边界框定位容易不准确,但这些特征更加抽象,可以让对物体的分类的准确性更高。因此二者的结合,对目标检测的正确率和定位精度都有帮助。

6.SDP-CRC

SDP-CRC在处理不同尺度的目标和提高对候选区域的计算效率上提出了两个策略。第一个策略是基于候选区域尺度的池化,即Scale Department Pooling (SDP)。在CNN的框架中,由于输入图像要经过多次卷积,那些尺寸小的物体在最后一层的卷积输出上的特征不能很好的描述该物体。如果用前面某一层的特征,则能够更好的描述小物体,用靠后的层的特征,则能更好地描述较大的物体。

物体检测及分类方法总结

 

因此SDP的想法是根据物体大小选择合适的卷积层上的特征来描述该物体。例如一个候选区域的高度在0-64个像素之间,则使用第三个卷积层上(例如VGG中的Conv3)的特征进行pooling作为分类器和边框回归器的输入特征,如果候选区域高度在128个像素以上,则使用最后一个卷积层(例如VGG中的Conv5)的特征进行分类和回归。

第二个策略是使用舍弃负样本的级联分类器,即Cascaded Rejection Classifer, CRC。Fast RCNN的一个瓶颈是有很多的候选区域,对成千上万个候选区域都进行完整的分类和回归计算十分耗时。CRC可以用来快速地排除一些明显不包含某个物体的候选区域,只将完整的计算集中在那些极有可能包含某个物体的候选区域。该文章中使用了AdaBoost的方法,按顺序使用每一个卷积层的特征,由一些级联的弱分类器来排除负样本。在最后一层卷积的特征图像上,留下来的那些候选区域再进行分类和回归。

物体检测及分类方法总结

SDP-CRC的准确率比Fast RNN提高了不少,检测时间缩短到了471ms每帧。

不采用Region Propsal,直接预测边界框的方法

7.YOLO

You Only Look Once:Unified, Real-Time Object Detection,2016年发表。其思想是摒弃生成候选区域的中间步骤,通过单个卷积神经网络直接对各个边界框进行回归并且预测相应的类别的概率。

物体检测及分类方法总结

该方法将输入图像分成物体检测及分类方法总结大小的网格。每一个网格单元预测B个边界框和这些边界框的可信度,有五个预测值:边界框的中心相对于网格单元中心的坐标,边界框相对于整个图像的宽和高,还有该边界框的可信度(基于和ground truth之间的IoU)。每一个单元格还预测该单元格属于物体检测及分类方法总结个类别的概率,因此整个网络的输出是一个大小为物体检测及分类方法总结的张量。在实验中,物体检测及分类方法总结,因此输出的大小是物体检测及分类方法总结

在测试阶段,单元格的类别概率与该单元格的B个边界框的可信度相乘,得到各个边界框分别包含各个类别的物体的可信度。

YOLO的优点是速度快,该文章中使用的24层卷积网络在测试图像上可达到45帧每秒,而使用另一个简化的网络结构,可达到155帧每秒。该方法的缺点有:1, 边界框的预测有很大的空间限制,例如每一个单元格只预测两个边界框,并且只有一个类别。2,该方法不能很好地检测到成群出现的一些小的目标,比如一群鸟。3,如果检测目标的长宽比在训练数据中没有出现过或者不常见,该模型的泛化能力较弱。

8.G-CNN

G-CNN将目标检测问题看作是把检测框从一些固定的网格逐渐变化到物体的真实边框的问题。 这是一个经过几次迭代,不断更新的过程。

物体检测及分类方法总结

其原理图如上所示,初始检测框是对整个图像进行不同尺度的网格划分得到的,在经过卷积后得到物体的特征图像,将初始边框对应的特征图像通过Fast R-CNN 中的方法转化为一个固定大小的特征图像,通过回归得到更加准确的边框,再次将这个新边框作为初始边框,做新的一次迭代。经过若干次迭代后的边框作为输出。

G-CNN中使用约180个初始边框,经过5次迭代, 检测帧率在3fps左右,准确率比Fast R-CNN要好一些。

9.SSD

SSD也是使用单个的卷积神经网络对图像进行卷积后,在特征图像的每一个位置处预测一系列不同尺寸和长宽比的边界框。在测试阶段,该网络对每一个边界框中分别包含各个类别的物体的可能性进行预测,并且对边界框进行调整以适应目标物体的形状。

物体检测及分类方法总结

SSD在训练时只需要一幅输入图像和该图像中出现的物体的边界框。在不同的卷积层输出是不同尺度的特征图像(如上图中的物体检测及分类方法总结物体检测及分类方法总结),在若干层的特征图像上的每一个位置处, 计算若干个(如4个)默认边界框内出现各个目标物体的置信度和目标物体的真实边界框相对于默认边界框的偏差。因此对于大小为物体检测及分类方法总结的特征图像,共产生物体检测及分类方法总结个输出。这有点类似于Faster R-CNN 中的锚的概念,但是将这个概念用到了不同分辨率的特征图像上。SSD和YOLO的对比如下图:

物体检测及分类方法总结

 

在VOC 2007测试图像上,对于300物体检测及分类方法总结300大小的输入图像,SSD可达到72.1% mAP的准确率,速度为58帧每秒,且能预测7k以上个边界框,而YOLO只能预测98个。下图是上述几个算法在性能上的对比:

物体检测及分类方法总结