【论文笔记】Fast R-CNN

在R-CNN的基础上,本文提出了一种更快的方法进行目标检测,在VGG16上 Fast R-CNN训练比R-CNN快9倍,在测试阶段快213倍。相比较SPPnet,Fast R-CNN训练快3倍,测试快10倍,并且更精确。开源代码地址为: https: //github.com/rbgirshick/fast-rcnn

相比较图片分类,目标检测更有挑战,需要更多的方法来解决,因此目前的方法基本通过多阶段流程来训练模型,比较慢并且不优雅。用深度神经网络做检测的挑战主要有两个:1.大量的候选区域需要处理 2.这些候选区域只是提供了一个粗略的定位,还需要提炼出更精确的定位。
本文提出了一个单阶段的训练算法同时学习分类并且精炼定位。
本文提出的方法可以在很深的检测网络训练(在VGG16上比R-CNN快9倍,比SPPnet快3倍)。运行阶段,检测网络处理图片需要0.3s,包括提出候选区域的时间。并且在 PASCAL VOC 2012取得了最高的精确度 66%的mAP,R-CNN为62%。

【R-CNN & SPPnet】
R-CNN的缺点为:

  1. 多阶段训练: 先在卷积网络上fine-tune候选目标;然后将卷积网络的特征用SVM拟合;最后再训练bbox回归器。
  2. 训练在空间和时间上代价昂贵:SVM和bbox回归阶段,特征是从每个图片的每个区域候选提出的,并且都要写进磁盘里。对于VGG16这样深的网络来说,这个阶段5kVOC07训练集的图片一天需要2.5 GPU来训练。
  3. 目标检测缓慢:测试阶段,特征需要从每张图片的每个候选区域提取,使用VGG16网络做检测在一个GPU上一张图片需要47s

R-CNN慢因为实在每个候选区域上做卷积,而不是分享计算。SPPnets的提出是为了通过共享计算来加速R-CNN。SPPnet先计算整个图片得到一个特征图,然后使用共享特征图的向量分类每个候选区域。通过最大池化特征图候选区域的一部分到一个固定的输出(比如6*6)提取特征,池化得到多尺度的输出,然后在后面的空间金字塔汇合池化。SPPnet的缺点是和R-CNN一样都是通过多阶段训练的,但是不像R-CNN,微调算法无法更新空间金字塔池化之前的卷积层。所以这一点限制了比较深的网络的精确度。

总之,Fast R-CNN的好处是:
1.训练是单阶段的
2.训练可以更新全部的网络层
3.无需磁盘容量存储特征缓存
4.比R-CNN,SPPnet更高的mAP

网络细节

【网络结构】


image.png

网络将输入的图片经过几层卷积和最大池化层来生成卷积特征图。然后,从特征图中对每个候选区域经过RoI层提出固定长度的特征向量。每个特征向量会喂给一系列fc层,最终分成两个输出层:一个在K+1(背景)类中预测softmax概率,一个每个类别输出4个值表达这个类别的精炼的bbox坐标。

【RoI pooling】
RoI层使用最大池化来连接有效候选区域的特征到一个固定的H * W的特征图里,H,W都是超参。在本文里,一个RoI就是一个矩形窗口转化为特征图。每个RoI由4个参数定义:r,c为top、left坐标 / h,w为宽高。
RoI最大池化是通过将h * w的RoI窗口转化成H * W大小,每个子窗口大小为 (h /H) * (w/W),然后最大池化每个子窗口。池化单独应用在特征图的每个通道。RoI pooling实际是SPPnet中空间金字塔池化只有一层金字塔的特殊例子。

【预训练网络初始化】
本文使用3个用ImageNet预训练的网络做了实验。初始化Fast R-CNN网络需要对预训练网络做3个变形:

  1. 网络的最后一个最大池化层被替换成RoI池化层,H,W需要适配网络的第一个全连接层的输入大小。
  2. 网络的最后一个全连接层和softmax替换成两条分支,一条分支输出K+1类的softmax概率,一条分支为特定类别的bbox回归框。
  3. 网络支持两种数据输入:一组图片及一组对应的RoI框。

【检测任务的微调】
训练时能够对全部的网络权重通过后馈调整是Fast R-CNN一个很重要的能力。首先,我们先阐述为什么SPPnet为什么空间金字塔池化层之前的网络层无法更新权重。
根本原因是当每个训练样本(即 RoI)来自不同的图像时,通过 SPP 层的反向传播效率非常低,效率低是因为RoI的区域可能来自一个很大的区域,比如整张图片输入,因为前向传播需要处理整个区域,训练输入是很大的(通常是整个图片)。
我们提出了一个更有效的训练方法,能够在训练时有效利用特征的分享。在Fast R-CNN训练时,SGD的mini batch分层抽取,首先抽取N张图片,然后从每张图片抽取R/N个RoI。(R应该是一个mini batch中RoI的总数)从一张图片抽取的RoI在前向和后向传播中共享计算和内存。N取的较小时能够减少mini-batch的计算量,比如使用N = 2, R = 128时,即从2张图片提取128个RoI,要比从128张图片提取128个RoI速度快64倍。这样有一点值得担心的是,训练可能会变慢因为一张图的RoI是相关的,但是这个担心没有变成一个很严重的问题,我们使用这个参数取得了比较好的结果。
并且,Fast R-CNN的微调阶段融合了优化softmax分类器和bbox框回归,而不是把softmax分类器,SVM,bbox回归分到不同的阶段。下面讲下Fast R-CNN的流程:包括loss,mini-batch抽样策略,RoI层的反向传播,SGD超参数。

1.multi-task loss
一个Fast R-CNN拥有两个相邻的输出层,一个分支输出每个RoI在K+1类上的softmax概率,一个输出第k个类别对应的bbox框(x,y,w,h)。
每一个训练的RoI都标记了ground-truth:类别u和u对应的bbox坐标v。我们使用multi-task loss L同时训练分类和bbox回归:


image.png

其中Lcls(p,u)是个预测分类概率p和真实分类u的交叉熵loss。背景的分类标记为0,RoI为背景时没有对应的bbox ground truth,此时Lloc loss直接忽略。Lloc loss公式为:


image.png

当回归目标无界时,使用 L2 损失进行训练可能需要仔细调整学习率,以防止梯度爆炸。 使用smooth(L1)限制了这种情况。
multi-task loss 中的 λ是一个超参数,在所有实验中我们设置为1.检测框的ground truth使用前均归一化为0均值1方差。

2.mini-batch 采样
我们使用N=2, R=128进行采样,即从2张图片中提取128个RoI。25%的RoI从与 ground truth IoU大于0.5的RoI中提取,这些RoI构成了前景类别 u >=1的样本,剩下的RoI取与ground truth最大IoU为[0.1, 0.5)的样本,这些作为背景样本,u = 0。

3.通过RoI的反向传播
为了更清晰,我们假设采样时N = 1。
令Xi为RoI层输入前第i个特征,yrj表示池化后第r个候选区域的j的点,i*(r,j)代表点yrj像素值的来源(最大池化的时候选出的最大像素值所在点的坐标集合)。


image.png

【Fast R-CNN检测】
因为存在RoI数量较多,几乎一半的前向传播事件都花在全连接层上。通过 truncated SVD压缩可以轻松达到加速。

【越多的候选区域越好吗】
常用的主要有两种目标检测器:稀疏的selective search 和 密集的DPM,稀疏的候选区域提议是一种首先拒绝大量候选者,留下一小部分待评估的分类器的提议机制的级联,这种级联可以提高Fast R-CNN的准确度。使用selectiive search quality模式,每张图片从1k到10k提取候选区域,每次都重新训练和测试模型。如果候选区域仅仅扮演一个计算的角色,增加候选区域的数量不会损失mAP。


image.png

实验发现ss对应的mAP最高。在使用ss+rand dense实验时,候选区域的增加降低了mAP。
此外,论文还实验证明了multi-task loss联合训练分类和回归的损失是否比分开计算效果不好,softmax分类效果是否比SVM效果好,感兴趣可以在论文里看下。

【结论】
本文提出的Fast R-CNN模型,相对于之前的R-CNN 和 SPPnet来说,最大的不同是单阶段训练,训练更快,更精确。此外,稀疏的候选目标提议似乎能够提高检测器的质量,证明这个问题时间成本过高,但是在Fast R-CNN的实际使用中,可以看到稀疏候选区域提议是实用的。目前当然还存在一些未探索的技巧使密集候选提议效果变得和稀疏候选区域一样好,这些方法如果发现后,能后加速未来的目标检测。

你可能感兴趣的:(【论文笔记】Fast R-CNN)