核心思想
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 H × W 个section(原文中是 7×7 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) p = ( p 0 , . . . , p k ) ,对于 k+1 k + 1 类物体每个的可能性大小, p p 由softmax层计算得出
- 第二个输出:,即对于所有K种物体来说,他们的边框位置
文中使用联合了分类损失和边框回归损失作为多任务损失函数:
其中每个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=∂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
梯度的累加:
[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,有如下关系:
其中W是权重矩阵,其维度为
矩阵U的维度为