目标检测——文献阅读之R-CNN

论文:Rich feature hierarchies for accurate object detection and semantic segmentation
论文作者主页:http://www.rossgirshick.info/
源码:https://github.com/rbgirshick/fast-rcnn
参考:https://www.cnblogs.com/kingstrong/p/4969472.html

R-CNN是目标检测领域中十分经典的方法,相比于传统的手工特征,R-CNN将卷积神经网络引入,用于提取深度特征,后接一个分类器判决搜索区域是否包含目标及其置信度,取得了较为准确的检测结果。

1、引文

  作者通过在recongnition using regions操作的方法来解决CNN的定位问题,这个方法在目标检测和语义分割中都取得了成功。测试阶段,这个方法对每一个输入的图片产生近2000个不分种类的“region proposals,使用CNNs从每个region proposals”中提取一个固定长度的特征向量,然后对每个region proposal提取的特征向量使用特定种类的线性SVM进行分类。作者使用了仿射图像变形的方法来对每个不同形状的region proposals产生一个固定长度的CNN输出的特征向量。具体的流程图如下:
在这里插入图片描述
  在检测中面临的第二个挑战时目前可用的有标签的数据是远远不够来训练一个大的CNN网络的。对于这个问题,比较方便的解决办法是先使用无监督的方式进行预训练,再使用试用有标签的数据进行fine-tuning。这篇文章贡献的第二个原则是表明在一个大的数据集上(ILSVRC)进行有监督的预训练,然后再在一个小的数据集(PASCAL)上进行特定场合的 fine-tunring是在数据比较小的时候训练high-capacity CNNs的有效方法。在作者的实验中,使用fine-tuning可以将准确率提高8个百分点。在提取完特征后使用SVM分类器对每个regin属于某一类的可能性进行打分,再使用贪婪的非极大值抑制的方法去除多余的框框。
  

2、使用RCNN进行目标检测

整个系统分为三个部分:

  1. 产生不依赖与特定类别的region proposals,这些region proposals定义整个检测器可以获得的候选目标。
  2. 一个大的卷积神经网络,对每个region产生一个固定长度的特征向量。
  3. 一系列特定类别的线性SVM分类器。

2.1、模块设计

  1. region proposals :先了解一下Selective Search[原文链接]的操作流程,其主要功能就是根据一些小的原则,在原图像上快速自动的生成一些与类别无关的图像区域。遵循如下规则:
  2. 图片中目标的尺寸不一,边缘清晰程度也不一样,选择性搜索应该能够将所有的情况都考虑进去,如下图,最好的办法就是使用分层算法来实现
  3. 区域合并的算法应该多元化。初始的小的图像区域(Graph-Based Image Segmentation得到)可能是根据颜色、纹理、部分封闭等原因得到的,一个单一的策略很难能适应所有的情况将小区域合并在一起,因此需要有一个多元化的策略集,能够在不同场合都有效。
  4. 能够快速计算。
  5. Feature extraction:对于region proposals的特征提取,作者使用的是caffe框架,所使用的模型是在Imagenet数据集上的Alexnet模型。因为卷积神经网络要求输入的图片都是一样尺寸的,所以在计算每个region proposals的特征前会对每个region都归到一样大227×227,最终每个region都会产生一个4096维的特征向量。关于图像的缩放,作者使用的最直接的方法,首先将原始的框向周围增加16的padding,在直接缩放。在附加文件中,作者还指出了其他两种缩放方式,1、是将包围盒的短边扩展为和长边一样大,使之成为正方形再缩放,这样做的好处是能保证目标的比例不会变化,2、是将包围盒两边加上图像均值的padding,再缩放,同样保证了目标的比例不会变化。

2.2、测试阶段的检测

  测试阶段,使用selective search的方法在测试图片上提取2000个region propasals ,将每个region proposals归一化到227x227,然后再CNN中正向传播,将最后一层得到的特征提取出来。然后对于每一个类别,使用为这一类训练的SVM分类器对提取的特征向量进行打分,得到测试图片中对于所有region proposals的对于这一类的分数,再使用贪心的非极大值抑制去除相交的多余的框。非极大值抑制(NMS)先计算出每一个bounding box的面积,然后根据score进行排序,把score最大的bounding box作为选定的框,计算其余bounding box与当前最大score与box的IoU,去除IoU大于设定的阈值的bounding box。然后重复上面的过程,直至候选bounding box为空,然后再将score小于一定阈值的选定框删除得到一类的结果。作者提到花费在region propasals和提取特征的时间是13s/张-GPU和53s/张-CPU,可以看出时间还是很长的,达不到实时性。

2.3、训练阶段

  1. 有监督预训练:作者使用caffe框架利用ILSVRC 2012的数据集(imagenet)对网络模型进行了训练,使网络模型中的参数都是经过训练过的参数,而不是刚开始那样随机初始化的参数
  2. 特定领域的fine-tuning:为了适应不同场合的识别需要,如VOC,对网络继续使用从VOC图片集上对region proposals归一化后的图片进行训练。网络只需要将最后的1000类的分类层换成21类的分类层(20个VOC中的类别和1个背景类),其他都不需要变。为了保证训练只是对网络的微调而不是大幅度的变化,网络的学习率只设置成了0.001。计算每个region proposal与人工标注的框的IoU,IoU重叠阈值设为0.5,大于这个阈值的作为正样本,其他的作为负样本,然后在训练的每一次迭代中都使用32个正样本(包括所有类别)和96个背景样本组成的128张图片的batch进行训练(这么做的主要原因还是正样本图片太少了)
  3. 特定类别的分类器:对每个类都训练一个线性的SVM分类器,训练SVM需要正负样本文件,这里的正样本就是ground-truth框中的图像作为正样本,完全不包含的region proposal应该是负样本,但是对于部分包含某一类物体的region proposal该如何训练呢,作者同样是使用IoU阈值的方法,这次的阈值为0.3,计算每一个region proposal与标准框的IoU,小于0.3的作为负样本,其他的全都丢弃。由于训练样本比较大,作者使用了standard hard negative mining method(具体怎么弄的不清楚)来训练分类器。作者在补充材料中讨论了为什么fine-tuning和训练SVM时所用的正负样本标准不一样,以及为什么不直接用卷积神经网络的输出来分类而要单独训练SVM来分类,作者提到,刚开始时只是用了ImageNet预训练了CNN,并用提取的特征训练了SVMs,此时用正负样本标记方法就是前面所述的0.3,后来刚开始使用fine-tuning时,也使用了这个方法,但是发现结果很差,于是通过调试选择了0.5这个方法,作者认为这样可以加大样本的数量,从而避免过拟合。然而,IoU大于0.5就作为正样本会导致网络定位准确度的下降,故使用了SVM来做检测,全部使用ground-truth样本作为正样本,且使用非正样本的,且IoU大于0.3的“hard negatives”,提高了定位的准确度。

3、BoundingBox回归

在这里插入图片描述
  为了进一步提高定位的准确度,作者在对各个region proposal打分后,利用回归的方法重新预测了一个新的矩形框。如上图所示,通过selective search得到的region proposal可能与ground truth相差较大,尽管这个region proposal可能有很高的分类评分,但对于检测来说,它依然是不合格的.

boundingbox的工作方式借鉴博客的描述
在这里插入图片描述
在这里插入图片描述
注意:只有当Proposal和Ground Truth比较接近时(线性问题),我们才能将其作为训练样本训练我们的线性回归模型,否则会导致训练的回归模型不work(当Proposal跟Ground Truth离得较远,就是复杂的非线性问题了,此时用线性回归建模显然不合理)。这个也是G-CNN: an Iterative Grid Based Object Detector多次迭代实现目标准确定位的关键。

线性回归就是给定输入的特征向量X,学习一组参数W,使得经过线性回归后的值跟真实值Y(Ground Truth)非常接近。即。那么Bounding-box中我们的输入以及输出分别是什么呢?

输入 r e g i o n p r o p o s a l > P = ( P x , P y , P w , P h ) region proposal -> P=(P_x,P_y,P_w,P_h) 这个是什么?输入就是这四个数值吗?其实真正的输入是这个窗口对应的CNN特征,也就是R-CNN中的Pool5feature(特征向量)。(注:训练阶段输入还包括 Ground Truth,也就是下边提到的 t = ( t x , t y , t w , t h ) t_*= (t_x,t_y,t_w,t_h)
输出:需要进行的平移变换和尺度缩放 d x ( P ) , d y ( P ) , d w ( P ) , d h ( P ) d_x(P),d_y(P),d_w(P),d_h(P) ,或者说 Δ x , Δ y , S w , S h \Delta x,\Delta y,S_w,S_h 。我们的最终输出不应该是Ground Truth吗?是的,但是有了这四个变换我们就可以直接得到Ground Truth,这里还有个问题,根据上面4个公式我们可以知道,P经过 d x ( P ) , d y ( P ) , d w ( P ) , d h ( P ) d_x(P),d_y(P),d_w(P),d_h(P) ,得到的并不是真实值G,而是预测值G。
的确,这四个值应该是经过 Ground Truth 和Proposal计算得到的真正需要的平移量 ( t x , t y ) (t_x,t_y) 和尺度缩放 ( t w , t h ) (t_w,t_h)
这也是R-CNN中的:

t x = ( G x P x ) / P w t_x=(G_x-P_x)/P_w
t y = ( G y P y ) / P h t_y=(G_y-P_y)/P_h
t x = l o g ( G w / P w ) t_x=log(G_w/P_w)
t x = l o g ( G h / P h ) t_x=log(G_h/P_h)

那么目标函数可以表示为 d = w T Φ 5 ( P ) , Φ 5 ( P ) d_*=w_*^T\Phi_5(P),\Phi_5(P) 是输入Proposal的特征向量, w w_* 是要学习的参数(*表示x,y,w,h,也就是每一个变换对应的目标函数), d ( P ) d_*(P) 是得到的预测值。我们要让预测值和真实值 t = ( t x , t y , t w , t h ) t_*=(t_x,t_y,t_w,t_h) 差距最小,得到损失函数为:
在这里插入图片描述
函数优化目标:
在这里插入图片描述
利用梯度下降法或者最小二乘法就可以得到 w w_*

猜你喜欢

转载自blog.csdn.net/qq_18644873/article/details/84974721
今日推荐