论文地址:https://arxiv.org/abs/1504.08083
自制PPT与讲解视频链接:https://github.com/DHUB721/Object-Detection (注:仅个人理解,如有错误请多多指正,轻喷,谢谢!)
在讲解Fast RCNN之前,先回顾一下RCNN与SPPnet,并思考一下各自的不足!
1. 论文背景
(1)RCNN drawbacks:I.Training is a multi-stage pipeline. II.Training is expensive in space and time. III.Object detection is slow. R-CNN is slow because it performs a ConvNet forward pass for each object proposal, without sharing computation.
(2)SPPnet利用共享计算加速了RCNN,但仍存在改进之处:I. training is a multi-stage pipeline. II. the fine-tuning algorithm proposed in SPPnet cannot update the convolutional layers that precede the spatial pyramid pooling. (作者后面又解释为只是SPP层的反向传播效率非常低,我认为并不是无法更新!)
SPPnet原文:
Fast RCNN原文:
2. 论文亮点
(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
3. 论文细节
(1)The RoI layer is simply the special-case of the spatial pyramid pooling layer used in SPPnets [11] in which there is only one pyramid level.
Back-propagation through RoI pooling layers:
I. 普通的池化层反向传播
无论max pooling还是mean pooling,都没有需要学习的参数。因此,在卷积神经网络的训练中,Pooling层需要做的仅仅是将误差项传递到上一层,而没有梯度的计算。(注:在反向传播过程中要保证loss或梯度总和不变)
max pooling层:对于max pooling,下一层的误差项的值会原封不动的传递到上一层对应区块中的最大值所对应的神经元,而其他神经元的误差项的值都是0。
mean pooling层:对于mean pooling,下一层的误差项的值会平均分配到上一层对应区块中的所有神经元,注意不是原封不动地复制分配到所有神经元。
II. RoI Pooling layer正向传播
论文中采用最大池化方法,但与普通池化不一样的是,RoI Pooling layer是生成一个固定大小的Feature Map(与SPPnet思想一致,是SPP的一个特例),池化窗口是由ROI大小与Feature Map反推计算出来的。
III. RoI Pooling layer反向传播
先看普通最大池化的反向传播过程:
可以看出就是将梯度传递到上一层对应块中最大值所对应的神经元,即
其中判决函数 δ(i, j) 表示 i 节点是否被 j 节点选为最大值输出。不被选中有两种可能:xi不在 yj 范围内,或者 xi 不是最大值。
但是对于roi max pooling layer,一个输入节点可能和多个输出节点相连。设 xi 为输入层的节点, yrj 为第 r 个候选区域的第 j 个输出节点。
判决函数表示 i 节点是否被候选区域 r的第 j 个节点选为最大值输出,即代价对于 xi 的梯度等于所有相关的后一层梯度之和。
这里有个疑问,RoI层 Image-centric Sampling 能解决反向传播的低效问题,那么 ROI-centric Sampling 结构是不是就一定不行?
(2)Mini-batch sampling: stochastic gradient descent (SGD) mini-batches are sampled hierarchically, first by sampling N images and then by sampling R/N RoIs from each image. Critically, RoIs from the same image share computation and memory in the forward and backward passes.
在Fast RCNN中,采用N张(尽量小)图片作为样本,RoI来自这N张图片,而SPPnet中以RoI为中心,采用非常多(即论文中R)的图片作为样本,每个RoI来个不同的图片,显然Fast RCNN能加速计算,同时作者也强调这样做会导致收敛速度慢,但不会影响实际使用。
(3) Fast R-CNN detection过程概率的计算方式不明白!
(4) Truncated SVD for faster detection
将W进行SVD分解,并用前 t 个特征值近似:
原来的前向传播分解成两步:
计算复杂度由 u × v 变为 u × t + v × t。
在实现时,相当于把一个全连接层拆分成两个,中间以一个低维数据相连。
补充说明:
- hard negative mining:训练一个网络需要正负样本,那么如何选取正负样本呢?论文中选择0.1<= IoU < 0.5 的样本作为负样本(占75%),IoU >= 0.5 的样本作为正样本(占25%)。你可能会问 IoU < 0.1 的不是更容易确定为背景吗?为什么不用这些样本作为负例?是的!正因为太容易区分导致对网络的训练没有任何益处。但是,即使 IoU < 0.1 仍然可能会将负样本预测为正例,这些样本就是 hard negitive examples,所以我们需要对其做 hard negitive mining,找到其中的 hard negitive examples 用于训练网络。
在 bootstrapping 方法中, 我们先用初始的正负样本训练分类器,然后再用训练出的分类器对样本进行分类, 把其中负样本中错误分类的那些样本(hard negative)放入负样本集合,再继续训练分类器, 如此反复, 直到达到停止条件(比如分类器性能不再提升)。 - RoI: a region of interest (RoI),即感兴趣区域,用一个四维向量(r, c, h, w)表示, that specifies its top-left corner (r,c) and its height and width (h,w),是对Proposal的描述。