[Object Detection] R-cnn 目标检测的开山之作详解

原文地址:Rich feature hierarchies for accurate object detection and semantic segmentation

Introdcution

这里写图片描述

  从图片中可以看出Rcnn过程主要经历4个阶段
  1. 输入图片
  2. 选取预选区域(Region proposal)

值得注意的是,这里预选区域时用 Selective Search方法
方法原文如下:Selective Search
解析如下:SS解析
Selective Search遵循如下的原则:
1 图片中目标的尺寸不一,边缘清晰程度也不一样,选择性搜索应该能够将所有的情况都考虑进去,如下图,最好的办法就是使用分层算法来实现
2 区域合并的算法应该多元化。初始的小的图像区域(Graph-Based ImageSegmentation得到)可能是根据颜色、纹理、部分封闭等原因得到的,一个单一的策略很难能适应所有的情况将小区域合并在一起,因此需要有一个多元化的策略集,能够在不同场合都有效。
3 能够快速计算。

 3.将预选区域Resize成一致规模的图片后通过CNN网络得到特征(文中使用227,为了与当时的Alexnet相对应)
 4.将得到的特征训练为二分SVM分类器,一次只能判断一类。同时产生Bounding-box Regression 得到BBox

以下是文章所使用方法与可选择方法对比:
![这里写图片描述](https://img-blog.csdn.net/20180609222104847?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzIyNzQ5Njk5/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/

在文章Introduction中,可以看到作者也想到利用sliding windows方法,这一方法正是one-stage常用的方法,但是最终因为经历的conv与pooling操作过多,导致感受野过大,放弃使用这一方法,在one-stage方法中使用multi-scale解决

详细过程(训练与识别)

1 预处理阶段

1.1 region proposal

文章指出选择预选区域的方法有很多,Rcnn主要使用以下两篇文章中提到的方法:
Selective Search for Object Recognition
Regionlets for Generic Object Detection

1.2 feature extraction

 文章直接将经过Region proposal的2000个左右的候选区域进行padding=16的扩充(即将预选区域周围的16像素都加入进预选区域),然后将图片直接缩放至 227×227 227 × 227 规格的图片输入CNN结构中得到4096维特征,也就是说每个预选区域都会有4096维的特征输出。

文章使用的网络结构如下图所示:

这里写图片描述

2 测试阶段检测

 测试阶段,使用selective search的方法在测试图片上提取2000个region propasals ,将每个region proposals归一化到227x227,然后再CNN中正向传播,将最后一层得到的特征提取出来。然后对于每一个类别,使用为这一类训练的SVM分类器对提取的特征向量进行打分,得到测试图片中对于所有region proposals的对于这一类的分数,再使用贪心的非极大值抑制去除相交的多余的框。另外还会对经过CNN的pool5之后的特征进行Bbox回归预测,使得预测到的Bbox更加准确(下文会提到Bbox回归)。

非极大值抑制(NMS):先计算出每一个bounding box的面积,然后根据score进行排序,把score最大的bounding box作为选定的框,计算其余bounding box与当前最大score与box的IoU,去除IoU大于设定的阈值的bounding
box。然后重复上面的过程,直至候选bounding box为空,然后再将score小于一定阈值的选定框删除得到一类的结果。

 作者提到花费在region propasals和提取特征的时间是13s/张-GPU和53s/张-CPU,可以看出时间还是很长的,不能够达到及时性。

3 训练阶段

3.1 有监督预训练

 作者使用caffe框架利用ILSVRC 2012的数据集(应该就是imagenet吧)对网络模型进行了训练,使网络模型中的参数都是经过训练过的参数,而不是刚开始那样随机初始化的参数

3.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.3 特定类别的分类器

 对每个类都训练一个线性的SVM分类器,训练SVM需要正负样本文件,可以想象得到,刚好包含某一类物体的region proposal应该是正样本,完全不包含的region proposal应该是负样本,但是对于部分包含某一类物体的region proposal该如何训练呢,作者同样是使用IoU阈值的方法,这次的阈值为0.3,计算每一个region proposal与标准框的IoU,大于这个阈值的作为正样本,小于的作为负样本。由于训练样本比较大,作者使用了standard hard negative mining method(具体reference to hard negative mining of my blog)来训练分类器。作者表示在补充材料中讨论了为什么fine-tuning和训练SVM时所用的正负样本标准不一样(0.5和0.3),以及为什么不直接用卷积神经网络的输出来分类而要单独训练SVM来分类。rbg大神主页,补充材料

单独训练SVM的原因
1).cnn在训练的时候,对训练数据做了比较宽松的标注,比如一个 bounding box可能只包含物体的一部分,那么我也把它标注为正样本,用于训练cnn;
2).采用这个方法的主要原因在于因为CNN容易过拟合,所以需要大量的训练数据,所以在CNN训练阶段我们是对Boundingbox的位置限制条件限制的比较松(IOU只要大于0.5都被标注为正样本了);
3).然而svm训练的时候,因为svm适用于少样本训练,所以对于训练样本数据的IOU要求比较严格,我们只有当boundingbox把整个物体都包含进去了,我们才把它标注为物体类别,然后训练svm分类器
SVM的训练
这是一个二分类问题,我么假设我们要检测车辆。我们知道只有当bounding box把整量车都包含在内,那才叫正样本;如果bounding box 没有包含到车辆,那么我们就可以把它当做负样本。但问题是当我们的检测窗口只有部分包好物体,那该怎么定义正负样本呢?作者测试了IOU阈值各种方案数值0,0.1,0.2,0.3,0.4,0.5。最后我们通过训练发现,如果选择IOU阈值为0.3效果最好(选择为0精度下降了4个百分点,选择0.5精度下降了5个百分点),即当重叠度小于0.3的时候,我们就把它标注为负样本。
一旦CNN f7层特征被提取出来,那么我们将为每个物体类训练一个svm分类器。当我们用CNN提取2000个候选框,可以得到2000*4096这样的特征向量矩阵,然后我们只需要把这样的一个矩阵与svm权值矩阵4096*N点(Therefore,the pool5 need to be set as)乘(N为分类类别数目,因为我们训练的N个svm,每个svm包含4096个W),就可以得到结果了。
因此也可以得知,RCNN方法只能预测出一个BoundingBox,所以不能预测多目标,这个问题在后续论文中也会有所改进

总结:首先进行fine-tune,这时IoU设置为0.5,得到网络权重。其次将fc7得到的4096维特征当做输入训练N个(N为数据集类别数)二分类SVM得到最终的分类器。然后在上面利用SVM进行二分类判断当前的region有没有包含我们需要的物体(对结果进行排序,取前面的IOU最大的那几个(nms)),在对这些进行canny边缘检测,才可以得到bounding-box(then B-BoxRegression)。

Bounding Box regression

 但是还有一个问题,此时得到的Bounding-box是不合格的,所以还要对每个类别的B-box做一个回归才能得到最后的预测,对于Bbox回归的解释如下图所示:
这里写图片描述

 那么具体怎么才能做好这个转换呢?
这里写图片描述
值得注意的是:这里既然被看做是一个回归问题则必须RP与GT相离比较接近,具体而言当输入的 Proposal 与 Ground Truth 相差较小时(RCNN
设置的是 IoU>0.6),可以认为这种变换是一种线性变换,那么我们就可以用线性回归来建模对窗口进行微调。 但是通过后续的研究可以通过end to end的训练方式训练回归而不必非要线性回归。

 那么这个回归的输入与输出分别是什么呢?

  • 输入
    这里写图片描述

  • 输出:可以看到所要得到的输出实际是需要的位移量以及放缩的尺度
    这里写图片描述
     因此目标函数可以表示为
    这里写图片描述
      直到进行框体预测时:
    这里写图片描述

总结

 文章的一些实验结果以及可视化过程还有训练参数可以在文中查看。Rcnn实际过程可以用下图来展示:
这里写图片描述

 该方法实际是比较麻烦的,需要RP两次输入进CNN模型,第一次得到classification的结果,第二次才能得到(NMS+regression)bounding-box。这篇文章主要贡献还是在于第一次直接使用CNN模型直接提取

 另外基于这篇文章后面提出ROI pooling也是开启two-stage目标检测方法的大门。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值