目标检测方法——从RCNN、Fast-RCNN到Faster-RCNN

Contents

  1. 1. 1.R-CNN (CVPR2014, TPAMI2015)
  2. 2. SPP-NET (ECCV2014, TPAMI2015)
  3. 3. Fast R-CNN(ICCV2015)
  4. 4. Faster R-CNN(NIPS2015)

什么是目标检测?目标检测主要是明确从图中看到了什么物体?他们在什么位置。传统的目标检测方法一般分为三个阶段:首先在给定的图像上选择一些候选的区域,然后对这些区域提取特征,最后使用训练的分类器进行分类。
1. 区域选择
这一步是为了对目标进行定位。传统方法是采用穷举策略。由于目标可能在图片上的任意位置,而且大小不定,因此使用滑动窗口的策略对整幅图像进行遍历,而且需要设置不同的长宽。这种策略虽然可以检测到所有可能出现的位置,但是时间复杂度太高,产生的冗余窗口太多,严重影响后续特征的提取和分类速度的性能。
2. 特征提取
提取特征的好坏会直接影响到分类的准确性,但又由于目标的形态多样性,提取一个鲁棒的特征并不是一个简单的事。这个阶段常用的特征有SIFT(尺度不变特征变换 ,Scale-invariant feature transform)和HOG( 方向梯度直方图特征,Histogram of Oriented Gradient)等。
3. 分类器
主要有SVM,Adaboost等
综上所述,传统目标检测存在两个主要问题:一个是基于滑动窗口的区域选择策略没有针对性,时间复杂度高,窗口冗余;而是手工设计的特征对于多样性没有很好的鲁棒性。

针对滑动窗口问题,region proposal(候选区域)是预先找出图中目标可能出现的位置,这可以保证在选取较少窗口(几千个甚至几百个)的情况下保持较高的召回率。并且获取的候选窗口要比滑动窗口的质量更高(滑动窗口固定长宽比)。比较常用的region proposal算法有selective search和edge boxes。针对特征选取,卷积神经网络(convolution neural network: CNN) 的特征比传统手工特征效果更好。因此在2014年,RBG(Ross B. Girshick )大神使用Region proposal+CNN(RCNN)代替传统目标检测使用的滑动窗口+手工设计特征,设计了RCNN框架,使得目标检测取得巨大突破,并开启了基于深度学习的目标检测热潮。

1.R-CNN (CVPR2014, TPAMI2015)

文章:Region-based Convolution Networks for Accurate Object detection and Segmentation

  1. 输入测试图像
  2. 利用selective search算法在图像中提取2000个左右的region proposal。
  3. 将每个region proposal缩放(warp)成227x227的大小并输入到CNN,将CNN的fc7层的输出作为特征。
  4. 将每个region proposal提取到的CNN特征输入到SVM进行分类。
  5. 边框回归(bounding-box regression),边框回归是对region proposal进行纠正的线性回归算法,为了让region proposal提取到的窗口跟目标真实窗口更吻合。

小结:R-CNN在PASCAL VOC2007上的检测结果从DPM HSC的34.3%直接提升到了66%(mAP)。如此大的提升使我们看到了region proposal+CNN的巨大优势。 但是R-CNN框架也存在着很多问题:

  1. 训练分为多个阶段,步骤繁琐: 微调网络+训练SVM+训练边框回归器
  2. 训练耗时,占用磁盘空间大:5000张图像产生几百G的特征文件
    3.速度慢: 使用GPU, VGG16模型处理一张图像需要47s。

针对速度慢的这个问题,SPP-NET给出了很好的解决方案。

SPP-NET (ECCV2014, TPAMI2015)

(Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition)
R-CNN:检测速度慢,对图像提完region proposal(2000个左右)之后将每个proposal当成一张图像进行后续处理(CNN提特征+SVM分类),实际上对一张图像进行了2000次提特征和分类的过程!
对图像提一次卷积层特征,然后将region proposal在原图的位置映射到卷积层特征图上,这样对于一张图像我们只需要提一次卷积层特征,然后将每个region proposal的卷积层特征输入到全连接层做后续操作。
小结:使用SPP-NET相比于R-CNN可以大大加快目标检测的速度,但是依然存在着很多问题:

  1. 训练分为多个阶段,步骤繁琐: 微调网络+训练SVM+训练训练边框回归器
  2. SPP-NET在微调网络的时候固定了卷积层,只对全连接层进行微调,而对于一个新的任务,有必要对卷积层也进行微调。(分类的模型提取的特征更注重高层语义,而目标检测任务除了语义信息还需要目标的位置信息)
    针对这两个问题,RBG又提出Fast R-CNN, 一个精简而快速的目标检测框架。

Fast R-CNN(ICCV2015)


与R-CNN框架图对比,可以发现主要有两处不同:
是最后一个卷积层后加了一个ROI pooling layer,ROI pooling layer实际上是SPP-NET的一个精简版
是损失函数使用了多任务损失函数(multi-task loss),将边框回归直接加入到CNN网络中训练。
R-CNN训练过程分为了三个阶段,而Fast R-CNN直接使用softmax替代SVM分类,同时利用多任务损失函数边框回归也加入到了网络中,这样整个的训练过程是端到端的(除去region proposal提取阶段)。Fast R-CNN在网络微调的过程中,将部分卷积层也进行了微调,取得了更好的检测效果。
小结:Fast R-CNN融合了R-CNN和SPP-NET的精髓,并且引入多任务损失函数,使整个网络的训练和测试变得十分方便。
缺点:region proposal的提取使用selective search,目标检测时间大多消耗在这上面(提region proposal 2~3s,而提特征分类只需0.32s),无法满足实时应用,而且并没有实现真正意义上的端到端训练测试(region proposal使用selective search先提取处来)。

Faster R-CNN(NIPS2015)

NIPS2015版本的Faster R-CNN使用的检测框架是RPN网络+Fast R-CNN网络分离进行的目标检测,整体流程跟Fast R-CNN一样,只是region proposal现在是用RPN网络提取的(代替原来的selective search)。RPN的核心思想是使用卷积神经网络直接产生region proposal,使用的方法本质上就是滑动窗口。RPN的设计比较巧妙,RPN只需在最后的卷积层上滑动一遍,因为anchor机制和边框回归可以得到多尺度多长宽比的region proposal。 作者为了让RPN的网络和Fast R-CNN网络实现卷积层的权值共享,训练RPN和Fast R-CNN的时候用了4阶段的训练方法:

  1. 使用在ImageNet上预训练的模型初始化网络参数,微调RPN网络;
  2. 使用(1)中RPN网络提取region proposal训练Fast R-CNN网络;
  3. 使用(2)的Fast R-CNN网络重新初始化RPN, 固定卷积层进行微调;
  4. 固定(2)中Fast R-CNN的卷积层,使用(3)中RPN提取的region proposal微调网络。

权值共享后的RPN和Fast R-CNN用于目标检测精度会提高一些。
小结:Faster R-CNN将一直以来分离的region proposal和CNN分类融合到了一起,使用端到端的网络进行目标检测,无论在速度上还是精度上都得到了不错的提高。然而Faster R-CNN还是达不到实时的目标检测,预先获取region proposal,然后在对每个proposal分类计算量还是比较大。比较幸运的是YOLO这类目标检测方法的出现让实时性也变的成为可能。
总结:
总的来说,从R-CNN, SPP-NET, Fast R-CNN, Faster R-CNN一路走来,基于深度学习目标检测的流程变得越来越精简,精度越来越高,速度也越来越快。可以说基于region proposal的R-CNN系列目标检测方法是当前目标最主要的一个分支。