Fast R-CNN学习笔记
一、 R-CNN的问题
R-CNN的横空出世将深度卷积神经网络带进了目标检测领域。虽然R-CNN在此方面取得了不错的成绩,但也有些问题亟需解决。
- 训练和测试速度慢:由于R-CNN采取的建议算法提议了2K个候选框,每个候选框都要送入CNN中进行卷积计算,从而产生大量的计算重叠。
- 层级结构复杂,训练起来步骤较多。训练一个R-CNN网络包括:训练CNN,微调CNN,训练SVM,训练bbox regression。
- 训练空间开销较大。在训练SVM和bbox regression的过程中要保存大量的特征向量作为训练样本,空间开销较大。
二、 解决方案
针对上述问题,Fast-RCNN的作者创造性的提出一些解决方案,在大大加快训练和测试的速度之外,准确性也得到了提升。
-
针对问题1,R-CNN是先提议候选框,将候选框裁剪后送至CNN提取特征。Fast-RCNN充分利用卷积操作的共享性,将图片先送至CNN提取特征,在这个特征上加入位置信息。
-
针对问题2和问题3,R-CNN将用于分类的SVM和用于定位的bbox regression二者合并在一个网络之中,将特征送至两个并行的全连接层(multi-task),其中一个后接SoftMax用来预测类别,另一个后接bbox regression来定位边界框。同时作者提出了ROI-pooling的操作,使得从卷积层提取出来特征建议框的尺寸得以统一,以便传入后序的全连接层。这个操作使得整个Fast-RCNN的网络结构均可导,SGD可以肆无忌惮的用来训练和测试,从而做到真正的“端对端”识别。这可以说是对R-CNN最大的改进了。
三、网络结构
以VGG16作为建议网络架构,将卷积层的最后一层的池化层替换为ROI池化层。将第二个全连接层替换为两个并行的全连接层和分类SoftMax以及bbox regression。
四、实现细节
-
ROI-pooling的前项传播和反向传播
我们知道全连接层的输入尺寸必须是固定的,而建议框的尺寸却又是不固定的,为了统一建议框的尺寸,ROI-pooling孕育而生。● 前向传播:将建议框分成M*N的网格,对每块网格进行max-pooling最后得到的特征向量的大小统一为M*N(图示为3*3)。
● 反向传播:参考前项传播的过程。每个网格中只有像素值最大单元的有梯度,其余单元的梯度均为0。值得注意的是,有的单元可能是多个建议框的网格中的最大值,这里我们只需将梯度求和即可。
2. 关于multi-task的目标函数
针对任意一个建议框,cls_score层用来完成分类任务,输出为(k+1)维的向量,k为类别数,加上背景为一个类别,每一维表示其分为该类的得分;bbox_predict用来定位任务,输出为4*k的矩阵,表示分为每一类所对应的定位框,背景不输出定位框。
● 分类问题的目标函数:Lcls(p,u) = −logP(u),其中p(u)表示被分为u类目标对应的得分。
● 定位问题的目标函数:
其中tui-vi表示真实款和目标框之间的差距。Smooth L1是一个漂亮的损失函数:在x较小时,对x的也梯度较小,而x较大时,对x的梯度上限为1,不会太大,在训练时不会破坏网络参数。
● 总目标函数:L(p,u,tu,v)=Lcls(p,u)+λ[u≥1]Lloc(tu,v)。 可以看到总目标函数为两个目标函数的加权平均,λ为调节两个损失函数之间的平衡,论文中λ=1。[u≥1]表示当u=0时,即负样本时,就自动忽略定位框的损失函数,因为对背景来说定位框无意义。
3. 使用SVD算法加速全连接层
由于一张图片只需要进行一次卷积操作,但产生的2k个候选框都要送入全连接层,这导致了全连接层的计算量达到了整个计算量的一半,为了减少全连接层的计算量,作者使用SVD(奇异值分解)的算法来加速全连接层的计算。
算法原理:全连接层数矩阵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.1到0.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