核心思想

RCNN的缺点

R-CNN is slow because it performs a ConvNet forward pass for each object proposal, without sharing computation.

SPPnet的缺点

SPPnet also has notable drawbacks. Like R-CNN, training is a multi-stage pipeline that involves extracting features, fine-tuning a network with log loss, training SVMs, and finally fitting bounding-box regressors. Features are also written to disk

FAST RCNN贡献

The Fast R-CNN method has several advantages:

  1. Higher detection quality (mAP) than R-CNN, SPPnet
  2. Training is single-stage, using a multi-task loss
  3. Training can update all network layers
  4. No disk storage is required for feature caching

引言部分

深度卷积网络在图像识别和目标检测领域取得了很大的成功。目前的方法:RCNN、SPPnet、overfeat、segDeepM都有一定的局限性,他们都是多阶段的pipline,速度慢,结果不精确。

模型与网络越来越复杂是因为对物体定位的准确性要求越来越高,由此带来的两大挑战:

  • 要产生大量的候选框
  • 候选框只是一个粗略的定位,还需要进一步调整才能达到精确定位

由此作者提出了Fast RCNN,采用的是VGG16网络架构,并在当时取得了state-of-the-art的效果。

之后作者详细解释了下RCNN与sppnet的缺点,对于RCNN来说,主要有:

  • Training is a multi-stage pipeline.首先对卷积网络进行fine-tune,之后训练SVM分类器来代替采用softmax激活函数的全连接层,在之后训练一个边框回归器
  • Training is expensive in space and time.训练时间空间的复杂度都很高
  • Object detection is slow.检测速度慢

作者一针见血的指出,RCNN比较慢的原因在于:它对每一个proposal都过了一遍卷积网络,而SPPnet就没有采用这种策略,作者总结了下SPPnet的优点与缺点:

  • 优点在于:SPPnet计算出整个图像的feature map,然后为每个候选区域从feature map中提取出相应的feature vector(通过max pooling得到)
  • 缺点在于:SPPnet也是一个multi-stage pipeline,并且无法更新卷积层的参数

FAST RCNN

模型结构如下:

rcnn训练_computer vision

其中roi pooling层的引入对与速度的提升起到了至关重要的作用,作者对ROI pooling层进行了详解。roi pooling layer会通过max pooling的方式一个region proposal对应的feature map变为一个小型的feature map(在原文中是7x7的feature map)。根据原文可得具体操作如下:

  1. 根据输入的image得到对应的feature map,找到roi在feature map上对应的区域位置。
  2. 将roi在feature map上对应的区域位置划分成大小相同的H×W 个section(原文中是7×7 )
  3. 对每一块section采用max pooling得到该roi最终的feature map

具体例子如下,来源于deepsense

rcnn训练_object detection_02

FAST RCNN论文细节

rcnn,sppnet与FRCN在fine-tune上的差异

首先sppnet不能够通过 spatial pyramid pooling layer更新权值,而FRCN则可以通过反向传播更新权值。因为与RCNN一样,SPPnet每个ROI都来自不同的图片。并且每个ROI都有着非常大的感受野,而前向传导处理的是整个感受野,故训练的输入非常大。而对于FRCN,SGD minibatch是通过先随机采样N张图片,再从每张图片随机采样R/N个ROI作为一个minibatch的。(原文中N=2,R=128 N = 2 , R = 128 )

除了以上的hierarchical sampling策略,FRCN并没有分阶段训练,而是采用streamlined training process直接对 softmax classifier and bounding-box regressors进行fine-tune和优化。

loss函数的设计

FAST RCNN有两个输出层:

  • 第一个输出:p=(p0,...,pk) ,对于k+1 类物体每个的可能性大小,p 由softmax层计算得出
  • 第二个输出:tk=(tkx,tky,tkw,tkh)tk=(txk,tyk,twk,thk),即对于所有K种物体来说,他们的边框位置

文中使用联合了分类损失和边框回归损失作为多任务损失函数:


L(p,u,tu,v)=Lcls(p,u)+λ[u≥1]Lloc(tu,v)Lcls=−logpuLloc(tu,v)=∑i∈(x,y,w,h)smoothL1(tui−vi)smoothL1(x)={0.5x2|x|−0.5if|x|<1otherwise(1) (1) L ( p , u , t u , v ) = L c l s ( p , u ) + λ [ u ≥ 1 ] L l o c ( t u , v ) L c l s = − l o g p u L l o c ( t u , v ) = ∑ i ∈ ( x , y , w , h ) s m o o t h L 1 ( t i u − v i ) s m o o t h L 1 ( x ) = { 0.5 x 2 i f | x | < 1 | x | − 0.5 o t h e r w i s e


其中每个RoI区域都有 ground-truth class u和ground-truth bounding-box regression target v。即

v=(vx,vy,vw,vh) v = ( v x , v y , v w , v h ) ,当 u≥1 u ≥ 1 时 [u≥1] [ u ≥ 1 ] 取值为1,否则为0(即为背景)。超参数 λ λ 是用来调整两个任务的损失权重的,在文中设置为 λ=1 λ = 1 .

通过RoI池化层的反向传播

普通的max pooling层的反向传播示意图如下

rcnn训练_Fast RCNN_03

通过反向传播求出梯度,对于输入层节点xi x i 和输出层节点yj y j :


∂L∂xi={0,∂L∂yj,δ(i,j)=0δ(i,j)=1 ∂ L ∂ x i = { 0 , δ ( i , j ) = 0 ∂ L ∂ y j , δ ( i , j ) = 1


因为由链式法则有

∂L∂xi=∂L∂yj∂yj∂xi ∂ L ∂ x i = ∂ L ∂ y j ∂ y j ∂ x i ,而 ∂yj∂xi=1 ∂ y j ∂ x i = 1 , δ(i,j) δ ( i , j ) 的含义表示为 xi x i 不在 yj y j 范围内,或者 xi x i 不是最大值

而对于roi pooling layer的反向传播,作者则是采用如下方法:

rcnn训练_computer vision_04

对于不同候选区域,节点8都存在梯度,所以反向传播中损失函数 L 对输入层节点 xi x i 的梯度为损失函数 L 对各个有可能的候选区域 r( 被候选区域r的第j个输出节点选为最大值 )输出 yrj y r j 梯度的累加:


∂L∂xi=∑r∑j[i=i∗(r,j)]∂L∂yrj ∂ L ∂ x i = ∑ r ∑ j [ i = i ∗ ( r , j ) ] ∂ L ∂ y r j



[i=i∗(r,j)] [ i = i ∗ ( r , j ) ] 表示输入层第

i 节点是否被候选区域

r 的第

j 个输出点选为最大值输出.

尺度不变性

有两种实现尺度不变性的方式:

  • “brute force” learning(蛮力学习法)
  • image pyramids(图像金字塔)

对于蛮力学习法,每个图像在训练和测试阶段被预先处理成特定的大小,期望网络能够学习到尺度不变性。

对于多尺度方法,主要通过图像金字塔提供尺度不变性。在测试阶段,使用图像金字塔将每个object proposal归一化。再训练阶段,则在每次对图像采样时对金字塔的尺度进行随机采样,以此作为数据增强。

作者说到采用小网络时才进行多尺度训练,因为后面的实验证明类似于vgg16的深层网络可以很好的从单一尺度学习尺度不变性。

截断奇异值分解进行FRCN检测

SVD(Singularly Valuable Decomposition)奇异值分解主要用于数据压缩,其表明任意矩阵均存在满秩分解,如下:

rcnn训练_rcnn训练_05

具体解释和证明过程

那么截断SVD在这里有什么用处呢?对于单纯的图像分类,卷积层花费的时间比全连接层计算的时间多得多。但对于检测,由于RoI数量众多,基本上一般的前向传播时间用于对这些RoI在全连接层进行计算:

rcnn训练_rcnn训练_06

列如对于全连接层的输出Y与输入X,有如下关系:


Y=W×X Y = W × X


其中W是权重矩阵,其维度为


u×v u × v

,而使用SVD,我们可以讲权重矩阵W近似表示为:



W=UDVT W = U D V T


矩阵U的维度为


u×t u × t

,矩阵D是一个

t×t t × t

的对角矩阵(包含矩阵W的前t个奇异值),矩阵V的维度为

v×t v × t

(包含矩阵W的前t个右奇异值)。通过截断SVD,可以将计算的维度从 uv u v 降到 t(u+v) t ( u + v ) ,并且当 t<<min(u,v) t << m i n ( u , v ) 时,计算效率将得到显著提升,此时单个全连接层被两个全连接层替代:

rcnn训练_卷积网络_07