Fast R-CNN

前言

论文地址

2015年Ross Girshick基于R-CNN的工作提出来Fast R-CNN,使用很深的VGG16网络,训练速度是R-CNN的9倍,检测速度是其的213倍,而且在PASCAL VOC2012上达到了更高的准确度。与SPPnet相比,fast R-CNN训练VGG16网络比他快3倍,测试速度快10倍,并且更准确。

R-CNN具有显著的缺点:

  1. 训练过程是多级流水线。R-CNN首先使用目标候选框对卷积神经网络使用log损失进行微调。然后,它将卷积神经网络得到的特征送入SVM。 这些SVM作为目标 测器,替代通过微调学习的softmax分类器。 在第三个训练阶段,学习检测框回归。
  2. 训练在时间和空间上是的开销很大。对于SVM和检测框回归训练,从每个图像中的每个目标候选框提取特征,并写入磁盘。对于非常深的网络,如VGG16,这个过 程在单个GPU上需要2.5天(VOC07 trainval上的5k个图像)。这些特征需要数百GB的存储空间。
  3. 目标检测速度很慢。在测试时,从每个测试图像中的每个目标候选框提取特征。用VGG16网络检测目标每个图像需要47秒(在GPU上)。这一是因为Selective search比较慢,其二是因为对每个区域提案都需要将其送入卷积网络计算特征向量。

Fast R-CNN的改变如下:

  1. 卷积不再是对每个region proposal进行,而是直接对整张图像,这样减少了很多重复计算。原来RCNN是对每个region proposal分别做卷积,因为一张图像中有2000左右的region proposal,肯定相互之间的重叠率很高,因此产生重复计算。
  2. 用ROI pooling进行特征的将regressor放进网络一起训练,每个类别对应一个regressor,同时用softmax代替原来的SVM分类器。
  3. 使用Softmax 代替SVMs
  4. 在全连接层使用截断SVD加快检测速度

贡献如下:

  1. 比R-CNN和SPPnet具有更高的目标检测精度(mAP)。
  2. 训练是使用多任务损失的单阶段训练。
  3. 训练可以更新所有网络层参数。(SPPnet提出的微调算法不能更新在空间金字塔池之前的卷积层)
  4. 不需要磁盘空间缓存特征。

Fast R-CNN架构和训练

alt text

基本流程

  1. 输入整张图片和一组候选框(依然使用Selective search)。
  2. 最先使用几层卷积层和最大池化层处理整张图片来产生一个卷积特征图。
  3. 然后,对于每个候选框,RoI池化层从特征图中提取固定长度的特征向量。
  4. 最后每个特征向量被送入一系列全连接(fc)层中,其最终分支成两个同级输出层 :一个输出K个类别加上1个背景类别的Softmax概率估计,另一个为K个类别的每一个类别输出四个实数值。每组4个值表示K个类别的一个类别的检测框位置的修正。

alt text

Roi 池化层

RoI池化层使用最大池化将任何有效的RoI内的特征转换成具有H×W(例如,7×7)的固定空间范围的小特征图,其中HW是层的超参数,独立于任何特定的RoI。在该论文中,RoI是卷积特征图中的一个矩形窗口。 每个RoI由指定其左上角(r,c)及其高度和宽度(h,w)的四元组(r,c,h,w)定义。

RoI最大池化通过将大小为h×w的RoI窗口分割成H×W个网格,子窗口大小约为$h/H×w/W$,然后对每个子窗口执行最大池化,并将输出合并到相应的输出网格单元中。同标准的最大池化一样,池化操作独立应用于每个特征图通道。

从预训练网络初始化

论文中试验了三种预训练的ImageNet网络,每一种网络都有五层最大池化层和五到十三层卷积层。当其初始化一个Fast R-CNN时都需要经过如下三个变换:

  1. 首先,最后的最大池化层由RoI池化层代替,其将H和W设置为与网络的第一个全连接层兼容的配置(例如,对于VGG16,H=W=7)。
  2. 然后,网络的最后一格全连接层和Softmax(其被训练用于1000类ImageNet分类)被替换为前面描述的两个同级层(全连接层和K+1个类别的Softmax以及类别特定的检测框回归)。
  3. 最后,网络被修改为采用两个数据输入:图像的列表和这些图像中的RoI的列表。

微调

用反向传播训练所有网络权重是Fast R-CNN的重要能力。而SPPnet无法更新低于空间金字塔池化层的权重。==根本原因是当每个训练样本(即RoI)来自不同的图像时,通过SPP层的反向传播是非常低效的,这正是训练R-CNN和SPPnet网络的方法。低效的部分是因为每个RoI可能具有非常大的感受野,通常跨越整个输入图像。由于正向传播必须处理整个感受野,训练输入很大(通常是整个图像)。==

作者提出了一种更有效的训练方法,利用训练期间的特征共享。在Fast RCNN训练中,随机梯度下降(SGD)小批量计算被分级采样,首先随机取样N张图片,然后每张图片取样 R / N 个RoIs 。关键的是,来自相同图像的RoI在向前和向后传播中共享计算和内存。
除了分层采样,Fast R-CNN使用一个精简的训练过程,一次微调中联合优化softmax分类器和bbox回归,而不是在三个独立的阶段训练softmax分类器,SVM和回归因子。

多任务损失

Fast R-CNN有两个输出。一个是对每个Roi的离散概率分布,$p = (p_0,p_1,…p_k)$,对K+1类。另一个是对K个类别都有的边界框回归的偏移量,$t^k = (t_x^k,t_y^k,t_w^k,t_h^k)$,k表示类别的索引,前两个参数是指相对于object proposal尺度不变的平移,后两个参数是指对数空间中相对于object proposal的高与宽。

每个训练的RoI都被标记了ground-truth类别 u 以及ground-truth边界框回归 v 。在每个标记好的RoI上用multi-task loss 函数来级联的训练分类和bbox边界框回归:

u = 0为背景类不需要参与边界回归。

第一项是对于 u 类的分类损失(log loss for true class u)。

第二项是回归损失,是在 u 类的真正边界框回归目标的元组 v 上定义的,是一个 4xN 路输出的regressor,也就是说对于每个类别都会训练一个单独的regressor,评估回归损失代价就是比较真实分类 u 对应的预测平移缩放参数和真实平移缩放参数的差距:

超参数 $\lambda$是用来控制两个损失函数的平衡的。作者对回归目标进行归一化使其具有零均值及单位权方差。所有的函数都设置超参数$\lambda$= 1。

小批量取样

每个SGD的批量大小是128,由两张图片各自的64个Roi组成。

类别 比列 方式
前景 25% 与真值重叠区间在[0.5,1]
背景 75% 与真值重叠区间在[0.1,0.5]

之所以选择负样本需要大于0.1的阈值是因为使用启发式的hard example mining(低于0.1的IoU作为难例挖掘的启发式)。在训练期间,图像有0.5的概率水平翻转。

通过RoI池化层的反向传播

对于最大池化层来说,响应输出的点,即窗口中最大值位置的输入点,才有反向传播,其他输入点反向传播的倒数都为0,如果一个输入点响应多个输出(因为不同的候选区域有重叠),则反向传播的导数累加。可以看看这深度学习笔记5:池化层的实现Fast R-CNN 学习笔记
我应该去补一补卷积层的反向传播过程。CNN中的梯度的求法和反向传播过程

SGD超参数选择

除了修改增加的层,原有的层参数已经通过预训练方式初始化:
用于分类的全连接层以均值为0、标准差为0.01的高斯分布初始化;
用于回归的全连接层以均值为0、标准差为0.001的高斯分布初始化,偏置都初始化为0;

针对PASCAL VOC 2007和2012训练集,前30k次迭代全局学习率为0.001,每层权重学习率为1倍,偏置学习率为2倍,后10k次迭代全局学习率更新为0.0001;
动量设置为0.9,权重衰减设置为0.0005

尺度不变性

作者提出了使用两种方式对规模不变的对象进行检测:brute-force(单一尺度)和image pyramids(多尺度,图像金字塔)。
单一尺度直接在训练和测试阶段将image预先固定好像素大小,直接输入网络训练就好,然后期望在训练过程中网络自己能够学习到尺度不变性scale-invariance;
多尺度在训练阶段随机从图像金字塔【缩放图片的scale得到,得到多尺度图片,相当于扩充数据集】中采样训练,通过一个图像金字塔向网络提供一个近似的尺度不变,在测试阶段图像金字塔用来对每个object proposal近似尺度归一化,训练阶段每次采样一个图像就随机采样一个金字塔尺度。

作者在5.2节对单一尺度和多尺度分别进行了实验,不管哪种方式下都定义图像短边像素为s,单一尺度下s=600【维持长宽比进行缩放】,长边限制为1000像素;多尺度s={480,576,688,864,1200}【维持长宽比进行缩放】,长边限制为2000像素,生成图像金字塔进行训练测试;实验结果表明AlexNet【S for small】、VGG_CNN_M_1024【M for medium】下单一尺度比多尺度mAP差1.2%~1.5%,但测试时间上却快不少,VGG-16【L for large】下仅单一尺度就达到了66.9%的mAP【由于GPU显存限制多尺度无法实现】,该实验证明了深度神经网络善于直接学习尺度不变形,对目标的scale不敏感。

第2中方法的表现确实比1好,但是好的不算太多,大概是1个mAP左右,但是时间要慢不少,所以作者实际采用的是第一个策略,也就是single scale。

Fast R-CNN检测

alt text

一旦Fast R-CNN网络被微调,检测相当于运行正向传播(假设对象建议框object proposal是预先计算的)
网络将图像(或图像金字塔,编码为图像列表)和待给得分的 R 对象建议框(object proposal)列表作为输入。
在测试阶段,R 大约为2K个,当使用图像金字塔的时候,每个RoI被指定尺度使得接近224*224。对于每个测试RoI r ,网络输出关于 r 的一个后验概率分布 p 和一系列预测bbox偏移(每个类 [共k个类] 获得自己的精确bbox预测)。然后使用估计概率$ Pr(class = k|r)≜ p_k $来给r赋予关于k个对象的检测置信度。最后,对每一个类都使用一个非极大值抑制。

截断SVD

在图片分类中,花在卷积上的时间比花在全连接上的时间多。然而在目标检测任务中,因为要处理的Roi数量很多,几乎有一半的计算时间用在全连接层。
就Fast R-CNN而言,RoI池化层后的全连接层需要进行约2k次【每个RoI都要计算】,因此在Fast R-CNN中可以采用SVD分解加速全连接层计算;

具体如何实现的呢?
①物体分类和bbox回归都是通过全连接层实现的,假设全连接层输入数据为X,输出数据为Y,全连接层权值矩阵为W,尺寸为 u × v ,那么该层全连接计算为:
Y = W × X
②若将W进行SVD分解(奇异值分解),并用前t个特征值近似代替,即:

U是 u × t 的左奇异矩阵,$\Sigma_t$ 是 t × t 的对角矩阵 ,V是 v × t 的右奇异矩阵。
截断SVD将参数量由原来的 u × v 减少到 t × (u + v) ,当 t 远小于 min(u,v) 的时候降低了很大的计算量。
在实现时,相当于把一个全连接层拆分为两个全连接层,第一个全连接层使用权值矩阵$\Sigma_tV^T$(不含偏置),第二个全连接层使用矩阵U(含偏置);
当RoI的数量大时,这种简单的压缩方法有很好的加速。
实验表明(Fig . 2),SVD分解全连接层能使mAP只下降0.3%的情况下提升30%的速度,同时该方法也不必再执行额外的微调操作。

参考文献:

Fast R-CNN 学习笔记
Fast R-CNN 论文翻译
Fast RCNN算法详解