Fast R-CNN学习笔记

在学习了R-CNN之后,我又迫不及待的学习了它的改良版Fast R-CNN,现在拿出来和大家进行分享~

一、 R-CNN的问题

   R-CNN的横空出世将深度卷积神经网络带进了目标检测领域。虽然R-CNN在此方面取得了不错的成绩,但也有些问题亟需解决。

  1. 训练测试速度:由于R-CNN采取的建议算法提议了2K个候选框,每个候选框都要送入CNN中进行卷积计算,从而产生大量的计算重叠
  2. 层级结构复杂,训练起来步骤较多。训练一个R-CNN网络包括:训练CNN,微调CNN,训练SVM,训练bbox regression。
  3. 训练空间开销较。在训练SVM和bbox regression的过程中要保存大量的特征向量作为训练样本,空间开销较大。

二、 解决方案

   针对上述问题,Fast-RCNN的作者创造性的提出一些解决方案,在大大加快训练和测试的速度之外,准确性也得到了提升。

  1. 针对问题1,R-CNN是先提议候选框,将候选框裁剪后送至CNN提取特征。Fast-RCNN充分利用卷积操作的共享性,将图片送至CNN提取特征,在这个特征上加入位置信息。

  2. 针对问题2和问题3,R-CNN将用于分类的SVM和用于定位的bbox regression二者合并在一个网络之中,将特征送至两个并行的全连接层(multi-task),其中一个后接SoftMax用来预测类别,另一个后接bbox regression来定位边界框。同时作者提出了ROI-pooling的操作,使得从卷积层提取出来特征建议框的尺寸得以统一,以便传入后序的全连接层。这个操作使得整个Fast-RCNN的网络结构均可导,SGD可以肆无忌惮的用来训练和测试,从而做到真正的“端对端”识别。这可以说是对R-CNN最大的改进了。
    Fast R-CNN学习笔记

三、网络结构

    以VGG16作为建议网络架构,将卷积层的最后一层的池化层替换为ROI池化层。将第二个全连接层替换为两个并行的全连接层和分类SoftMax以及bbox regression。
Fast R-CNN学习笔记

四、实现细节


  1. ROI-pooling的前项传播和反向传播


       我们知道全连接层的输入尺寸必须是固定的,而建议框的尺寸却又是不固定的,为了统一建议框的尺寸,ROI-pooling孕育而生。

       ● 前向传播:将建议框分成M*N的网格,对每块网格进行max-pooling最后得到的特征向量的大小统一为M*N(图示为3*3)。
    Fast R-CNN学习笔记
       ● 反向传播:参考前项传播的过程。每个网格中只有像素值最大单元的有梯度,其余单元的梯度均为0。值得注意的是,有的单元可能是多个建议框的网格中的最大值,这里我们只需将梯度求和即可。
    Fast R-CNN学习笔记

2. 关于multi-task的目标函数


  针对任意一个建议框,cls_score层用来完成分类任务,输出为(k+1)维的向量,k为类别数,加上背景为一个类别,每一维表示其分为该类的得分;bbox_predict用来定位任务,输出为4*k的矩阵,表示分为每一类所对应的定位框,背景不输出定位框。

● 分类问题的目标函数:Lcls(p,u) = −logP(u),其中p(u)表示被分为u类目标对应的得分。

● 定位问题的目标函数:
Fast R-CNN学习笔记
  其中tui-vi表示真实款和目标框之间的差距。Smooth L1是一个漂亮的损失函数:在x较小时,对x的也梯度较小,而x较大时,对x的梯度上限为1,不会太大,在训练时不会破坏网络参数。
Fast R-CNN学习笔记
  ● 总目标函数:L(p,u,tu,v)=Lcls(p,u)+λ[u≥1]Lloc(tu,v)。 可以看到总目标函数为两个目标函数的加权平均,λ为调节两个损失函数之间的平衡,论文中λ=1。[u≥1]表示当u=0时,即负样本时,就自动忽略定位框的损失函数,因为对背景来说定位框无意义。

3. 使用SVD算法加速全连接层


  由于一张图片只需要进行一次卷积操作,但产生的2k个候选框都要送入全连接层,这导致了全连接层的计算量达到了整个计算量的一半,为了减少全连接层的计算量,作者使用SVD(奇异值分解)的算法来加速全连接层的计算。
Fast R-CNN学习笔记
  算法原理:全连接层数矩阵W为u*v维的矩阵,分解为U∑VT≈U(u,1:t)⋅∑(1:t,1:t)⋅V(v,1:t)T。计算量从原来u*v变为(u+v)*t。在实现时,相当于把一个全连接层拆分成两个,中间以一个低维数据相连。详细的数学推导见参考文献。

五、训练网络

1. 用VGG原始网络在ImageNet数据集上监督训练。

2. 将训练好的VGG用ROI-pooling替换最后一层的卷积层的池化层,用multi-task并行分类器替换最后一层全连接层,进行微调

  ● Mini-batch:选取M张图片,每张图片提议N个建议框。将整张图片放入CNN,提议的建议框经过坐标变化对应到特征向量上。每个特征向量经过ROI-pooling后变化为统一尺寸送入后序的全连接层。论文中的M=2,N=64。
  ● 训练数据:ground truth与建议框的IOU>0.5的为正样本,在0.10.5之间的为负样本。其中正样本大约占25%。之所以不用<0.1的样本是为了给网络的训练带来一定的难度。

六、 启发和感想

1. 文中作者在微调的时候发现如果仅对全连接层进行微调的话,mAP会下降8个点,这与R-CNN论文中的结论大相径庭。为什么会出现这种情况呢?可能是R-CNN用的网络是Alexnet,层级较浅。而Fast R-CNN用的是VGG16,层级较深导致的。在实际工程中,我们可以权衡mAP、训练速度和训练内层三者的关系来找到合适的微调层级。

2. Fast R-CNN虽然较原本的R-CNN相比,识别速度和准确性都有提升,但是其selective search建议框产生算法仍然耗时严重,这将是后续网络优化和改进的重点。

七、 参考文献

1. 论文地址:

https://www.semanticscholar.org/paper/Fast-R-CNN-Girshick/7ffdbc358b63378f07311e883dddacc9faeeaf4b

2. 源代码地址:

https://github.com/rbgirshick/fast-rcnn

3. ROI pooling反向传播解读:

https://blog.****.net/xunan003/article/details/86597954

4. 论文解读:

https://www.jianshu.com/p/fbbb21e1e390
https://blog.****.net/shenxiaolu1984/article/details/51036677
https://blog.****.net/WoPawn/article/details/52463853

5. SVD算法推导:

https://www.cnblogs.com/endlesscoding/p/10033527.html

6. Smooth L1损失函数:

https://www.jianshu.com/p/19483787fa24