浅谈RCNN、SPP-net、Fast-Rcnn、Faster-Rcnn

浅谈RCNN、SPP-net、Fast-Rcnn、Faster-Rcnn

一、简介

RCNN、SPP-net、Fast-Rcnn、Faster-Rcnn,一连串的经典模型,目标检测的开山之作,传奇模型。RCNN和Fast-RCNN简直是引领了最近两年目标检测的潮流!

欢迎各位评论讨论,博主才疏学浅,有疏忽和错误,如存在错误和纰漏,请各位及时指出,共同交流,共同进步。

二、RCNN

Region CNN(RCNN)可以说是利用深度学习进行目标检测的开山之作。R-CNN有两个关键点:一是使用建议窗口,并用CNN对其进行卷积特征提取;二是样本缺乏时,使用大量辅助样本进行预先训练,再用自己的样本进行微调。也就是fine-tuning,我觉得迁移学习和fine-tuning差不多…

经典的目标检测算法使用滑动窗口法来判断所有可能为目标的区域,取不同大小的滑动窗口,然后分别计算得分,还需要对框内的物体进行分类。显然运算量过于庞大。

那么RCNN的做法是先为图像生成region proposal(候选区域),然后用CNN进行特征提取。

RCNN的整体框架流程为:

  • 采用Selective Search生成Region proposal(建议窗口),一张图片大约生成2000个建议窗口,由于建议窗口尺寸大小不一,warp(拉伸)到227*227.
  • 运用CNN来提取特征,把每个候选区域送入CNN,提取特征。
  • 将提取后的特征送入SVM分类器,用SVM对CNN输出的特征进行分类。
  • Bounding Box回归,用Bounding Box回归校正原来的region proposal,生成预测窗口的坐标。

image

网络结构,借鉴Hinton 2012年在Image Net上的分类网络。

image

Selective Search方法从一种图片生成约2000个候选区域,采用一种过分割的手段,将图像分割成小区域,然后bottom-up,合并可能性最高的两个区域,重复合并,直到整张图像上合并成一个区域为止。

输出所有曾经存在过的区域,就是候选区域。

SVM

对每一类目标,使用一个线性SVM二类分类器进行判别。考察每一个候选框,如果和本类所有标定框的重叠面积都小于0.3,认定其为负样本。

Bounding Box回归

做位置精修,因为候选框不够准确,重叠面积很小。输入为深度网络pool5层的4096维特征,输出为xy方向的缩放和平移。

对于bounding box的定位精度,有一个很重要的概念,因为我们算法不可能百分百跟人工标注的数据完全匹配,因此就存在一个定位精度评价公式:IOU。

IOU定义了两个bounding box的重叠度,如下图所示:

image

就是矩形框A、B的重叠面积占A、B并集的面积比例:

IOU=SI/(SA+SB-SI)

Others

R-CNN相比于当前的前沿算法,精确度不够高,速度不够快,无法满足实时系统的需要,但R-CNN是深度学习在目标检测上迈出的重要一步。

三、SPP-Net

CNN网络需要固定尺寸的图像输入,SPPNet将任意大小的图像池化生成固定长度的图像表示,提升R-CNN检测的速度24-102倍。

事实上,CNN的卷积层不需要固定尺寸的图像,全连接层是需要固定大小输入的,因此提出了SPP层,放到卷积层的后面。

image

SPP的优点:1)任意尺寸输入,固定大小输出,2)层多,3)可对任意尺度提取的特征进行池化。

image

SPP的结构如上图所示,将最后一个卷积层后紧跟SPP层,作为全连接层的输入。至此,网络不仅可对任意长宽比的图像进行处理,而且可对任意尺度的图像进行处理。图像就不需要reshape了。(如果固定网络输入的话,要么选择crop策略,要么选择warp策略,crop就是从一个大图扣出网络输入大小的patch(比如227×227),而warp则是把一个bounding box的内容resize成227×227。这两种方法都存在着丢失或者扭曲原始图像信息的缺陷。这样CNN获取的特征也就受到了限制,从而导致后续分类/预测的泛化能力不够。)

原理很简单,滑动窗池化的过程中,随着不同卷积后输入的图像大小不同,滑动窗口的大小也是变化的。直观上可以理解为此时的池化窗口改成了自适应窗口大小,保证了经过pooling后出来的feature的长度是一致的,实际是空间金字塔特征提取,运用不同大小的pooling窗口。

SPP中可以看到,它的pooling层是分层的,正如SPP自身的含义——金字塔式池化一样,它每层pooling 窗口的大小是可变的,它的大小是和输入图像的大小成比例的;同时pooling bins的个数是确定的,这就相当于多尺度的pooling,相较于传统CNN中单尺度的pooling,肯定存在更多的优势。这里需要理解的是,对图像的分割操作仍然是需要的,只是SPP中并不是立即对每个region直接特征抽取,而是将“对每个region的操作”放在了SPP这一过程中,即RCNN是多个regions+多次CNN+单个pooling,而SPP则是单个图像+单次CNN+多个region+多个pooling。

Others

SPP已有一定的速度提升,它在ConvNet的最后一个卷积层才提取proposal,但是依然有不足之处。和R-CNN一样,它的训练要经过多个阶段,特征也要存在磁盘中,另外,SPP中的微调只更新spp层后面的全连接层,对很深的网络这样肯定是不行的。

四、Fast-Rcnn

Fast-Rcnn在继承R-CNN的同时,吸收了SPPnet的特点。Fast-Rcnn方法解决了R-CNN方法的三个问题

  • 1)测试时速度慢:R-CNN把一张图片分解成大量的region proposal,每个region proposal用CNN提取特征。实际上,这样region proposal大量重叠,特征值之间完全可以共享,造成了运算能力的浪费。

    Fast-RCNN解决了这个问题,它将整张图片归一化后直接送入CNN,在最后的卷积层输出的feature map上,再提取region proposal,使得在此之前的CNN运算得以共享。

  • 2)R-CNN在训练时,在采用SVM分类之前,把通过CNN提取的特征存储到硬盘上,这种方法造成了训练性能低下,因为在硬盘上大量的读写数据会造成训练数据缓慢。

    Fast-Rcnn在训练时,只需要将一张图片送入网络,每张图片一次性地提取CNN特征和region proposal,训练数据在GPU内存里直接进入loss层,这样候选区域的前几层特征不需要再重复计算且不再需要把大量数据存储到硬盘上。

  • 3)R-CNN中独立的SVM分类器和回归器需要大量特征作为训练样本,需要大量的硬盘空间。Fast-RCNN把类别判断和位置回归统一用深度神经网络实现,不再需要额外存储。

Fast-RCNN是深度学习在目标检测任务上的应用,Fast是相对于R-CNN模型而言,是R-CNN的加速版本。

整体框架大致为:

  • 生成region proposal(通过selective search),每张图片大约2000个建议窗口;
  • Fast-RCNN把整张图片送入CNN,进行特征提取;
  • Fast-RCNN把region proposal映射到CNN的最后一层卷积feature map上;
  • 通过RoI pooling层(其实是单层的SPP layer)使得每个建议窗口生成固定大小的feature map;
  • 继续经过两个全连接层(FC)得到特征向量。特征向量经由各自的FC层,得到两个输出向量,
    第一个是分类,使用softmax,第二个是每一类的bounding box回归。利用SoftMax Loss和Smooth L1 Loss对分类概率和边框回归(Bounding Box Regression)联合训练。

image

RoI pooling layer:RoI(Region of Interest) Pooling就是实现从原图区域映射到conv5区域最后pooling到固定大小的功能。

这是SPP pooling层的一个简化版,只有一级“金字塔”。

Rol pooling layer的作用主要有两个:
- 1.是将image中的rol定位到feature map中对应patch
- 2.是用一个单层的SPP layer将这个feature map patch下采样为大小固定的feature再传入全连接层。

第五阶段的特征输入到两个并行的全连层中(称为multi-task)。

image

  • cls_score层用于分类,输出K+1维数组p,表示属于K类和背景的概率。

  • bbox_prdict层用于调整候选区域位置,输出4*K维数组t,表示分别属于K类时,应该平移缩放的参数。

注意本张图的最后,总代价为两者加权和。Fast-RCNN把两个回归的loss进行联合训练。

Fast-RCNN也采用的是在预训练网络上微调的方法。

五、Faster-RCNN

虽然Fast-Rcnn基于R-CNN有了很大的改进,但是Fast-Rcnn仍然是基于Selective Search方法进行提取region proposal,而Selective Search方法提取region proposal的计算是无法用GPU进行的,无法借助GPU的高度并行运算能力,所以效率极低。而且选取2000个候选区域,也加重了后面深度学习的处理压力。那Faster-RCNN在吸取了Fast-RCNN的特点的前提下,采用共享的卷积网组成RPN网络(Region Proposal Network),用RPN直接预测出候选区域建议框,数据限定在300个,RPN的预测绝大部分在GPU中完成,而且卷积网和Fast-RCNN部分共享,因此大幅度提升了目标检测的速度。

可以看成:Faster-RCNN = RPN(区域生成网络)+ Fast-RCNN,用RPN网络代替Fast-RCNN中的Selective Search是Faster-RCNN的核心思想。

  • Faster-RCNN有两个关键点:一是使用RPN网络来产生region proposal;二是产生建议窗口的CNN和目标检测的CNN共享。

整体框架大致为:

  • Faster-RCNN把整张图片送入CNN,进行特征提取;
  • 在最后一层卷积feature map上生成region proposal(通过RPN),每张图片大约300个建议窗口;
  • 通过RoI pooling层(其实是单层的SPP layer)使得每个建议窗口生成固定大小的feature map;
  • 继续经过两个全连接层(FC)得到特征向量。特征向量经由各自的FC层,得到两个输出向量,
    第一个是分类,使用softmax,第二个是每一类的bounding box回归。利用SoftMax Loss和Smooth L1 Loss对分类概率和边框回归(Bounding Box Regression)联合训练。

测试时,用边框回归值校正原来的候选窗口,生成预测窗口坐标。

那么就剩三个问题:

1. 如何设计区域生成网络

2. 如何训练区域生成网络

3. 如何让区域生成网络和fast RCNN网络共享特征提取网络

image

如上图所示,在生成region proposal的RPN设计中,Faster-RCNN在feature map上运用滑动窗口(和介绍RCNN之前提出的traditional method很像,==就是给它大小不同(但设计固定)的region图,然后根据与ground truth的覆盖率给它正负标签,让它学习里面是否有object即可。==)。为了能够应对不同尺寸的物体,Faster-RCNN采用了3中不同类型的滑动窗口(Anchor),长宽比分别为1:1,1:2,2:1,并用三个尺度缩放滑动窗口,一共采用了9种类型的滑动窗口(固定尺度变化,固定scale ratio变化,固定采样方式。)。这些窗口经过卷积形成256维向量,最终通过分类挑选选出300个得分最高的窗口作为最终的建议窗口。

这样,图片通过一次卷积,既可以提取出特征,又可以生成region proposal,可以共享卷积计算结果。

区域生成网络:训练。

样本

考察训练集中的每张图像:

a. 对每个标定的真值候选区域,与其重叠比例最大的region proposal记为前景样本。

b. 对a)剩余的region proposal,如果其与某个标定重叠比例大于0.7,记为前景样本;如果其与任意一个标定的重叠比例都小于0.3,记为背景样本。

c. 对a),b)剩余的region proposal,弃去不用。

d. 跨越图像边界的region proposal弃去不用。

代价函数

同时最小化两种代价:

a. 分类误差

b. 前景样本的窗口位置偏差

速度对比

欢迎各位评论讨论,博主才疏学浅,有疏忽和错误,如存在错误和纰漏,请各位及时指出,共同交流,共同进步。

Reference:

1.http://blog.csdn.net/u011534057/article/details/51240387

2.《深度学习-Caffe之经典模型详解与实战》第12、13、14章

3.http://blog.sina.com.cn/s/blog_9ae57c020102vopp.html

4.http://blog.csdn.net/xyy19920105/article/details/50420779

5.http://blog.csdn.net/shenxiaolu1984/article/details/51036677

6.http://blog.csdn.net/u011534057/article/details/51247371

你可能感兴趣的:(深度学习)