论文笔记-RCNN

CAFFE玩了也有段时间了,现在开始准备研究一下物体检测,现在知道的有RCNN、spp-net、Fast-RCNN和Faster-RCNN,作为菜鸟我还是从头学习,决定先看RCNN,因为有项目要做还要上课,可能得用一段时间才能看完,慢慢写,开始以翻译为主,以后有自己的想法了再慢慢更新,如果有理解错误的地方还希望各位博客园的大神指教--这也是我第一次用博客园,纪念一下,顺便熟悉一下怎么用

论文全称《Rich feature hierarchies for accurate object detection and semantic segmentation》

链接:http://www.cs.berkeley.edu/~rbg/papers/r-cnn-cvpr.pdf

源码的地址:http://www.cs.berkeley.edu/˜rbg/rcnn

摘要:这个方法结合了两个关键的见解,1:使用一个高容量的卷积神经网络将region proposals自底而上的传播,用来定位和分割目标,2:如果有标签的训练数据比较少,可以使用训练好的参数作为辅助,进行fine-tuning,能够得到非常好的识别效果提升。因为该方法是将region proposals和CNN相结合的,所以叫做RCNN。

引文:

不同于图像分类,检测需要在图片中定位物体。一个方法是将帧定位视作一个回归问题(Szegedy的工作表明这个方法不太好);另一个可替代的方法是使用滑动窗口探测器,通过这种方法使用CNNs至少已经有20年的时间了,通常用于一些特定的种类如人脸,行人等,为了保证较高的空间分辨率,这些CNNs通常只有两个卷积层和池化层。作者也考虑过使用一个滑动窗口的方法,然而由于更深的网络,更大的输入图片和滑动步长,使得使用滑动窗口来定位的方法充满了挑战。

 作者通过在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 作者指出近几年有很多的产生region proposals的方法,而RCNN中使用的是【J. Uijlings, K. van de Sande, T. Gevers, and A. Smeulders. Selectivesearch for object recognition. IJCV, 2013.】和【X. Wang, M. Yang, S. Zhu, and Y. Lin. Regionlets for generic objectdetection. In ICCV, 2013.】中的方法。

    因为研究RCNN的需要,在这里看一下Selective Search的操作流程,其主要功能就是根据一些小的原则,在原图像上快速自动的生成一些与类别无关的图像区域

    原文链接:http://koen.me/research/pub/uijlings-ijcv2013-draft.pdf

    选择性搜索遵循如下的原则:

    1. 图片中目标的尺寸不一,边缘清晰程度也不一样,选择性搜索应该能够将所有的情况都考虑进去,如下图,最好的办法就是使用分层算法来实现
    2. 区域合并的算法应该多元化。初始的小的图像区域(Graph-Based Image Segmentation得到)可能是根据颜色、纹理、部分封闭等原因得到的,一个单一的策略很难能适应所有的情况将小区域合并在一起,因此需要有一个多元化的策略集,能够在不同场合都有效。
    3. 能够快速计算。
  2. Feature extraction 对于region proposals的特征提取,作者使用的是caffe框架,所使用的模型是在Imagenet数据集上的Alexnet模型。因为卷积神经网络要求输入的图片都是一样尺寸的,所以在计算每个region proposals的特征前会对每个region都归到一样大227×227,最终每个region都会产生一个4096维的特征向量。关于图像的缩放,作者使用的最直接的方法,首先将原始的框向周围增加16的padding,在直接缩放。在附加文件中,作者还指出了其他2中缩放方式,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”,提高了定位的准确度。

3BoundingBox回归

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

boundingbox的工作方式借鉴博客http://blog.csdn.net/bixiwen_liu/article/details/53840913的描述


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

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

输入:这个是什么?输入就是这四个数值吗?其实真正的输入是这个窗口对应的CNN特征,也就是R-CNN中的Pool5feature(特征向量)。(注:训练阶段输入还包括 Ground Truth,也就是下边提到的)

输出:需要进行的平移变换和尺度缩放,或者说是。我们的最终输出不应该是Ground Truth吗?是的,但是有了这四个变换我们就可以直接得到Ground Truth,这里还有个问题,根据上面4个公式我们可以知道,P经过,得到的并不是真实值G,而是预测值

的确,这四个值应该是经过 Ground Truth 和Proposal计算得到的真正需要的平移量和尺度缩放

这也就是R-CNN中的:



那么目标函数可以表示为是输入Proposal的特征向量,是要学习的参数(*表示,也就是每一个变换对应一个目标函数),是得到的预测值。我们要让预测值跟真实值差距最小,得到损失函数为:

函数优化目标为:

利用梯度下降法或者最小二乘法就可以得到

posted @ 2015-11-16 17:13  小ks强  阅读(12230)  评论(4编辑  收藏  举报