核心思想
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:
- Higher detection quality (mAP) than R-CNN, SPPnet
- Training is single-stage, using a multi-task loss
- Training can update all network layers
- 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
模型结构如下:
其中roi pooling层的引入对与速度的提升起到了至关重要的作用,作者对ROI pooling层进行了详解。roi pooling layer会通过max pooling的方式一个region proposal对应的feature map变为一个小型的feature map(在原文中是7x7的feature map)。根据原文可得具体操作如下:
- 根据输入的image得到对应的feature map,找到roi在feature map上对应的区域位置。
- 将roi在feature map上对应的区域位置划分成大小相同的H×W 个section(原文中是7×7 )
- 对每一块section采用max pooling得到该roi最终的feature map
具体例子如下,来源于deepsense:
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层的反向传播示意图如下
通过反向传播求出梯度,对于输入层节点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的反向传播,作者则是采用如下方法:
对于不同候选区域,节点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)奇异值分解主要用于数据压缩,其表明任意矩阵均存在满秩分解,如下:
具体解释和证明过程
那么截断SVD在这里有什么用处呢?对于单纯的图像分类,卷积层花费的时间比全连接层计算的时间多得多。但对于检测,由于RoI数量众多,基本上一般的前向传播时间用于对这些RoI在全连接层进行计算:
列如对于全连接层的输出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
)
时,计算效率将得到显著提升,此时单个全连接层被两个全连接层替代: