Abstract

本文提出了一种快速的基于区域的卷积网络方法(fast R-CNN)用于目标检测。Fast R-CNN建立在以前使用的深卷积网络有效地分类目标的成果上。相比于之前的成果,Fast R-CNN采用了多项创新提高训练和测试速度来提高检测精度。Fast R-CNN训练非常深的VGG16网络比R-CNN快9倍,测试时间快213倍,并在PASCAL VOC上得到更高的精度。与SPPnet相比,fast R-CNN训练VGG16网络比他快3倍,测试速度快10倍,并且更准确。Fast R-CNN的Python和C ++(使用Caffe)实现以MIT开源许可证发布在:https://github.com/rbgirshick/fast-rcnn

Introduction

最近,深度卷积网络已经显著提高了图像分类和目标检测的准确率。与图像分类相比,目标检测是一个更具挑战性的任务,需要更复杂的方法来解决。由于这种复杂性,当前的方法在多层网络中训练模型,这些模型是很慢和精度不高的。
复杂性的产生是因为检测需要目标的精确定位,这就导致两个主要的难点。首先,必须处理大量候选目标位置(通常称为“建议”)。 第二,这些候选框仅提供粗略定位,其必须被精细化以实现精确定位。 这些问题的解决方案经常会影响速度,准确性或简单性。
在本文中,我们简化了最先进的基于卷积网络的目标检测器的训练过程。我们提出一个单阶段训练算法,共同学习分类候选框和改进他们的空间位置。
所得到的方法用来训练非常深的检测网络(例如VGG16) 比R-CNN快9倍,比SPPnet快3倍。在运行时,检测网络在PASCAL VOC 2012数据集上实现最高准确度,其中mAP为66%(R-CNN为62%),每张图像处理时间为0.3秒,不包括候选框的生成。

1.1 R-CNN and SPPnet

基于区域的卷积网络方法(RCNN)通过使用深度卷积网络来分类目标候选框,获得了很高的目标检测精度。然而,R-CNN具有显着的缺点:
1.训练的模型是多阶段管道(pipeline)。R-CNN首先使用目标候选框对卷积神经网络进行微调。然后,它将卷积神经网络得到的特征送入SVM。 这些SVM作为目标检测器,替代通过微调学习的softmax分类器。 在第三个训练阶段,学习bbox(边界)回归。
2.训练在时间和空间上是很大代价的。对于SVM和bbox回归训练,从每个图像中的每个目标候选框提取特征,并写入磁盘。对于非常深的网络,如VGG16,这个过程需要2.5 GPU-天在VOC07训练集上的5k图像。这些特征需要数百GB的存储空间。
3.目标检测速度很慢。在测试时,从每个测试图像中的每个目标候选框提取特征。用VGG16网络检测目标需要47s /图像(在GPU上)。
R-CNN很慢是因为它为每个目标候选框进行卷积神经网络正向传递,而不共享计算。SPP网络通过共享计算加速R-CNN。SPP网络计算整个输入图像的卷积特征映射,然后使用从共享特征映射提取的特征向量来对每个候选框(object proposals)进行分类。通过将候选框内的特征图的一部分最大化为固定大小的输出(例如,6X6)来提取针对候选框的特征。多个输出被池化,然后连接成空间金字塔池。SPPnet在测试时将R-CNN加速10到100倍。由于更快的候选框特征提取训练时间也减少3倍。
SPP网络也有显著的缺点。像R-CNN一样训练网络是一个多阶段的涉及提取特征的网络,和对网络进行微调有损失,训练SVM分类器,最后拟合边界回归(bbox)。特征也写入磁盘。但与R-CNN不同,在[11]中提出的微调算法不能更新在空间金字塔池之前的卷积层。不出所料,这种限制(固定的卷积层)限制了深度很深的网络的精度。

1.2 Contributions

我们提出一种新的训练算法,修正R-CNN和SPPnet的缺点,同时提高其速度和准确性。我们称之为fast R-CNN,因为它能比较快地进行训练和测试。Fast RCNN方法有几个优点:
1.比R-CNN和SPP网络具有更高精度(mAP)的目标检测;
2.训练是使用多任务损失(loss)的单阶段训练;
3.训练可以更新所有网络层参数;
4.特征缓存不需要磁盘空间
Fast R-CNN使用Python和C++语言编写,在
https://github.com/rbgirshick/fast-rcnn网站下能够获得开源代码。

fast R-CNN 结构和训练

图1给出了Fast R-CNN架构。Fast R-CNN网络将整个图像和一组候选框作为输入。网络首先使用几个卷积层(conv)和最大池层来处理整个图像,以产生转换特征图。然后,对于每个候选框,感兴趣区域(RoI)池化层从特征图中提取固定长度的特征向量。每个特征向量被送到完全连接(fc)层的中,其最终分支成两个同级输出层 :对K个对象类产生softmax概率估计加上全部捕获的“背景”类的一层以及为K个对象类中的每一个类别输出四个实数值的另一层。每组4个值编码重新修正K个类中的一个的精确边界位置。


图1.Fast R-CNN架构。输入图像和多个感兴趣区域(RoI)被输入到完全卷积网络中。每个RoI被合并到固定大小的特征图中,然后通过完全连接的层(FC)映射到特征向量。网络对于每个RoI具有两个输出向量:softmax概率和每类边界回归偏移。该架构是端到端训练的,带有多任务损失。

2.1 ROI pooling layer

RoI池化层使用最大池化将任何有效的感兴趣区域内的特征转换成具有H × W(例如,7×7)的固定空间范围的小特征图,其中H和W是层超参数,独立于任何特定的RoI层。在本文中,RoI是一个矩形窗口,成为一个特征映射。 每个RoI由指定其左上角(r; c)及其高度和宽度(h; w)的四元组(r; c; h; w)定义。
RoI最大池化工作通过除以h × w RoI窗口变成H × W网格,子窗口大小约为h/H ×w/ W,然后将每个子窗口中的最大值合并到相应的输出网格单元中。池化操作独立应用于每个特征图通道,比如在标准最大池中。RoI层只是SPPnets [11]中使用的空间金字塔池层的特殊情况,其中只有一个金字塔层。 我们使用[11]中给出的池化子窗口计算方法。

2.2 Initializing from pre-trained networks

我们实验了三个预训练的ImageNet网络,每个网络有五个最大池化层和五到十三个卷积层(网络详细信息,请参见第4.1节)。当预训练网络初始化fast R-CNN网络时,其经历三个变换。
我们实验了三个预训练的ImageNet [4]网络,每个网络有五个最大池层和五到十三个卷积层(网络详细信息,请参见第4.1节)。当预训练网络初始化fast R-CNN网络时,其经历三个变换。
1. 首先,最后的最大池化层由RoI池层代替,其通过将H和W设置为与网络的第一完全连接层兼容来配置(例如,对于VGG16,H = W = 7)。
2. 其次,网络的最后完全连接层和softmax(其被训练用于1000类ImageNet分类)被替换为前面描述的两个同级层(完全连接的层和softmax在K + 1类别和类别特定的边界回归)。
3. 网络被修改为采用两个数据输入:图像的列表和这些图像中的RoI的列表。

2.3. Fine-tuning for detection

用反向传播训练所有网络权重是fast R-CNN的重要能力。首先,让我们阐明为什么SPPnet无法更新低于空间金字塔池化层的权重。
根本原因是当每个训练样本(即RoI)来自不同的图像时,通过SPP层的反向传播是非常低效的,这正是如何训练R-CNN和SPPnet网络的方法。低效的部分是因为每个RoI可能具有非常大的接受场,通常跨越整个输入图像。由于正向传递必须处理整个接受场,训练输入是大的(通常是整个图像)。(这段话不是很懂)。
我们提出了一种更有效的训练方法,利用训练期间的特征共享。在fast RCNN网络训练中,随机梯度下降(SGD)minibatches被分级采样,首先通过采样N个图像,然后通过从每个图像采样R/N个 RoIs。关键的是,来自同一图像的RoI在向前和向后传播***享计算和存储器。减小N,减少了minibatches计算。例如,当N = 2和R = 128时,得到的训练方案比从128幅不同的图采样一个RoI快64倍。
这个策略的一个关注是它可能导致训练收敛慢,因为来自相同图像的RoI 是相关的。这个问题似乎不是一个实际问题,我们使用比R-CNN更少的SGD迭代,获得N = 2和R = 128的良好结果。
除了分层采样,Fast R-CNN使用一个精细的训练过程,一个微调阶段联合优化softmax分类器和边界框回归,而不是在三个独立的阶段训练softmax分类器,SVM和回归因子。 下面描述该过程的组件(loss,小批量采样策略,通过RoI池层的反向传播和SGD超参数)。
多任务损失: Fast R-CNN网络具有两个同级输出层。 第一个输出在K + 1个类别上的离散概率分布(每个RoI), p = p 0 . . . p K 。 通常,通过完全连接层的 K + 1 个输出上的softmax来计算p。第二个输出层输出边界框回归偏移, t k = ( t k x , t k y , t k w t k h ) ,对于由k索引的K个对象类中的每一个。 我们使用[9]中给出的 t k 的参数化,其中 t k 指定相对于候选框的尺度不变转换和对数空间高度/宽度移位。
每个训练的RoI用ground truth类u和ground truth边界框回归目标v标记。我们对每个标记的RoI使用多任务损失L以联合训练分类和边界框回归:
L ( p , u , t u , v ) = L c l s ( p , u ) + λ [ u 1 ] L l o c ( t u , v ) ,
其中, L c l s ( p , u ) = l o g p u 是u的真实值得损失值。
第二个损失值, L l o c 是在 u v = v x ; v y ; v w ; v h ) 和预测元组 t u = t x u ; t y u ; t w u ; t h u 的真正边界框回归目标的元组。Iverson括号指示函数[u≥1]当u≥1的时候为值1,否则为0。按照惯例,catch-all背景类标记为u = 0。对于背景RoI,没有ground truth边界框的概念,因此 L l o c 被忽略。对于边界框回归,我们使用这个损失函数。

其中,smooth是鲁棒的L1损失,对于异常值比在R-CNN和SPPnet中使用的L2损失更不敏感。当回归目标无界时,具有L2损失的训练可能需要仔细调整学习速率,以防止爆炸梯度。等式 3消除了这种灵敏度。
公式1中的超参数λ控制两个任务损失之间的平衡。我们将groundtruth回归目标 v i 归一化为具有零均值和单位方差。所有实验都使用λ = 1。
我们注意到[6]使用相关损失来训练一个诊断候选框网络。 与我们的方法不同的是[6]倡导一个分离本地化和分类的双网络系统。 OverFeat ,R-CNN和SPPnet 也训练分类器和边界定位器,但是这些方法使用逐级训练,这对于fast RCNN来说是次优的。
小批量采样。作者从对象建议框(object proposal)中选择25%的RoI,这些RoI与ground-truth bbox边界框至少有0.5的部分交叉重叠,也就是正样本,即 u >= 1。其余的RoI选那些IoU重叠区间在[0.1,0.5)的,作为负样本,即 u = 0,大约为75%。之所以选择负样本需要大于0.1的阈值是因为使用启发式的hard example mining(低于0.1的IoU作为难例挖掘的启发式)。在训练期间,图像有0.5的概率水平翻转。
类别 比例 方式
前景 25% 与ground-truth bbox边界框重叠区间在[0.5,1]
背景 75% 与ground-truth bbox边界框重叠区间在[0.1,0.5)
通过RoI池化层的反向传播。这部分我完全不懂说了什么。。。https://blog.csdn.net/wonder233/article/details/53671018这篇文章有详细介绍,可以认真推导一下。
SGD超参数。除了修改增加的层,原有的层参数已经通过预训练方式初始化:
用于分类的全连接层以均值为0、标准差为0.01的高斯分布初始化;
用于回归的全连接层以均值为0、标准差为0.001的高斯分布初始化,偏置都初始化为0;针对PASCAL VOC 2007和2012训练集,前30k次迭代全局学习率为0.001,每层权重学习率为1倍,偏置学习率为2倍,后10k次迭代全局学习率更新为0.0001;
动量设置为0.9,权重衰减设置为0.0005。

Scale invariance 尺度不变性

作者提出了使用两种方式对规模不变的对象进行检测: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。

3 Fast R-CNN detection

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

3.1 Truncated SVD for faster detection 截断SVD ——>减少检测时间

图像分类任务中,用于卷积层计算的时间比用于全连接层计算的时间多

而在目标检测任务中,要处理的RoI数量比较多,几乎有一半的前向计算时间被用于全连接层(Fig . 2)。就Fast R-CNN而言,RoI池化层后的全连接层需要进行约2k次【每个RoI都要计算】,因此在Fast R-CNN中可以采用SVD分解加速全连接层计算;
具体如何实现的呢?
①物体分类和bbox回归都是通过全连接层实现的,假设全连接层输入数据为X,输出数据为Y,全连接层权值矩阵为W,尺寸为 u × v ,那么该层全连接计算为:
Y = W × X
②若将W进行SVD分解(奇异值分解),并用前t个特征值近似代替,即:
W U Σ t V T
U是 u × t 的左奇异矩阵,Σt 是 t × t 的对角矩阵 ,V是 v × t 的右奇异矩阵。

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

4 主要结果

三个主要结果支持本文的贡献:
1. VOC07,2010和2012年的最高的mAP;
2.相比于R-CNN,SPPnet的 快速训练和测试。
3. 在VGG16中微调卷积层改善了mAP。
我们的实验使用了三个经过预训练的ImageNet网络模型,这些模型可以在线获得(https://github.com/BVLC/caffe/wiki/Model-Zoo)。第一个是来自R-CNN3的CaffeNet(实质上是AlexNet)。 我们将这个CaffeNet称为模型S,即小模型。第二网络是来自14的VGG_CNN_M_1024,其具有与S相同的深度,但是更宽。 我们把这个网络模型称为M,即中等模型。最后一个网络是来自15的非常深的VGG16模型。由于这个模型是最大的,我们称之为L。在本节中,所有实验都使用单尺度训练和测试。

接下来还有一些实验配置和在各种数据集的测试结果以及一些优化的过程,就没翻译了。
参考文章:https://alvinzhu.xyz/2017/10/10/fast-r-cnn/#%E5%B0%BA%E5%BA%A6%E4%B8%8D%E5%8F%98%E6%80%A7%EF%BC%9A%E6%9A%B4%E5%8A%9B%E6%88%96%E7%B2%BE%E7%BB%86%EF%BC%9F
https://blog.csdn.net/wonder233/article/details/53671018#commentsedit
https://blog.csdn.net/WoPawn/article/details/52463853?locationNum=5