Abstract
本文提出了一种基于快速区域的卷积网络方法(Fast R-CNN)用于目标检测。 快速R-CNN建立在先前的工作基础上,以使用深度卷积网络有效地对对象提议进行分类。与之前的工作相比,Fast R-CNN采用了多项创新来提高训练和测试速度,同时提高了检测精度。 快速R-CNN训练深VGG16网络比R-CNN快9倍,在测试时间快213倍,并在PASCAL VOC 2012上实现更高的mAP。与SPPnet相比,快速R-CNN训练VGG16快3倍,测试 10倍更快,更准确。 快速R-CNN在Python和C++中实现(使用Caffe),可在开源MIT License下获得https://github.com/rbgirshick/fast-rcnn.
1. Introduction
最近,深度ConvNets [14,16]显着改善了图像分类[14]和物体检测[9,19]的准确性。 与图像分类相比,对象检测是一项更具挑战性的任务,需要更复杂的方法来解决。 由于这种复杂性,当前的方法(例如,[9,11,19,25])训练缓慢且不优雅的多级管道中的模型。
复杂性的产生是因为检测需要对象的准确定位,从而产生两个主要挑战。 首先,必须处理许多候选对象位置(通常称为“提议”)。 其次,这些候选者仅提供粗略的本地化,必须对其进行细化以实现精确定位。 解决这些问题往往会影响速度,准确性或简单性。
在本文中,我们简化了最先进的基于卷积网络的目标检测器的训练过程。我们提出一个单阶段训练算法,共同学习分类候选框和改进他们的空间位置。
所得到的方法用来训练非常深的检测网络(例如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架构。输入图像和多个感兴趣区域(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网络时,其经历三个变换。
- 首先,最后的最大池化层由RoI池层代替,其通过将H和W设置为与网络的第一完全连接层兼容来配置(例如,对于VGG16,H = W = 7)。
- 其次,网络的最后完全连接层和softmax(其被训练用于1000类ImageNet分类)被替换为前面描述的两个同级层(完全连接的层和softmax在K + 1类别和类别特定的边界回归)。
- 网络被修改为采用两个数据输入:图像的列表和这些图像中的RoI的列表。
2.3、检测微调
利用反向传播训练所有网络权值是快速r-cnn的一项重要能力。首先,让我们阐明为什么sppnet无法更新空间金字塔池层以下的权重。
其根本原因是当每个训练样本(即ROI)来自不同的图像时,通过spp层的反向传播效率很低,这正是r-cnn和sppnet网络被训练的方式。低效率源于这样一个事实:每个ROI可能有一个非常大的接受场,通常跨越整个输入图像。由于前传必须处理整个接收场,训练输入量很大(通常是整个图像)。
提出了一种在训练过程中利用特征共享的高效训练方法。在快速rcnn训练中,随机梯度下降(SGD)小批被分层采样,首先对n个图像进行采样,然后从每幅图像中采样r/n ROI。关键的是,来自同一图像的ROIS在向前和向后传递中共享计算和内存。使n小了,减少了小批量计算.例如,当使用n=2和r=128时,所提出的训练方案比从128幅不同图像(即R-CNN和sppnet策略)中采样一次ROI快约64倍。
对这种策略的一个关注是,它可能会导致缓慢的训练收敛,因为来自同一图像的ROI是相关的。这似乎不是一个实际的问题,我们取得了较好的结果,n=2和r=128使用较少的SGD迭代比r-CNN。
除了分层抽样之外,FAST r-cnn还使用了一个简化的训练过程,通过一个微调阶段联合优化Softmax分类器和bounding-box回归器,而不是将Softmax分类器、svms和回归器训练在三个不同的阶段[9,11]。此过程的组成部分(损失、小批量抽样策略、通过ROI池层的反向传播和SGD超参数)如下所述。
多任务损失:一个Fastr-cnn网络有两个兄弟输出层。第一个输出离散概率分布(每roi), ,k+1以上类别。和往常一样,p是由全连接层的k1输出上的Softmax计算的。第二兄弟层输出bounding-box回归偏移量
。对于每个k对象类,按k索引。我们使用了[9]中给出的 参数化,其中 指定了相对于对象方案的尺度不变平移和对数空间高度/宽度移动。
每个训练指标都有一个ground-trut类u和一个ground-truth bounding-box回归目标v。我们使用多任务损失L对每个标记的roi进行分类和bounding-box回归的联合训练:
其中 是u的log损失。
对于u而言, 和预测元组
,定义了第二个任务损失Lloc 。相反,当u≥1和0时,指示函数[u≥1]计算为1。按照惯例,捕获所有背景类标记为u=0。对于背景ROI,不存在ground-truth bounding-box的概念,因此Lloc 被忽略。对于bounding-box回归,我们使用损失:
这个
是一种鲁棒的L1损失,它对离群值的敏感性不如r-cnn和sppnet中使用的L2损失。当回归目标是无界的,L2损失的训练可能需要仔细调整学习率,以防止梯度暴涨。Eq3消除了这种敏感性 。
方程中的超参数λ1控制两项任务损失之间的平衡。我们将ground-truth回归指标vi规范化为零均值和单位方差.所有实验都使用λ=1。
我们注意到,[6]使用相关的损失来训练一个与类无关的对象提取网络。与我们的AP-proach不同,[6]主张采用两种网络系统,即SEPA对本地化和分类进行分级。Overfeat[19]、r-cnn[9]和sppnet[11]也训练分类器和 bounding-box定位器,但是这些方法都是分阶段训练的,我们发现对于快速r-cnn来说,这些方法是次优的(5.1节)。
小批量抽样 :在微调过程中,每个SGD小批由n=2幅图像组成,随机一致地选择(通常的做法是,我们实际上迭代了数据集的排列)。我们使用r=128的小批次,从每幅图像中抽取64 rois.与[9]一样,我们从与联合(IOU)交叉的对象提案中获取25%的ROI,与至少0.5的ground-truth bounding-box重叠。这些ROI包括标记为前台对象类(即u≥1)的示例。其余的ROI是从目标提案中取样的,这些提案在[11]之后的[0.1,0.5]间隔内有maximum Iou。这些是背景示例,标记为u=0。较低的阈值0.1似乎作为一个启发式的硬例子挖掘[8]。在训练期间,图像水平翻转,概率为0.5。不使用其他数据增强。
通过roi池化层的反向传播:反向传播将衍生物通过ROI池化层传播。为了清晰起见,我们假设每个小批只有一个图像(n=1),但是对n>1的扩展很简单,因为向前传递处理所有图像都是独立的。
设是ROI池化层的第一个激活输入,而yrj 是该层从ROI输出的第j个激活输入。ROI池化层计算
,其中
。 R(r,j)是输出单元y(rj) 的最大池化所经过的子窗口中输入的索引集。可以将单个xi分配给几个不同的输出 yrj。
ROI池化层的后向函数计算损失函数相对于每个输入变量xi的偏导数,方法是按照argmax转换:
也就是说,对于每个小型批处理ROI,r和每个池输出单元yrj ,如果我是通过最大池化为yrj 选择的argmax,则会累积偏导数 。在反向传播中,偏导数
已经由ROI池化层上的层的后向函数来计算。
SGD超参数 :利用标准差分别为0.01和0.001的零均值高斯分布,对用于softmax(软最大值分类)和bounding-box回归的全连接层进行了初始化。偏差被初始化为0。所有层都使用1的每层学习速率作为权重,2用于偏置,全局学习速率为0.001。在VOC07或VOC12的训练中,我们运行SGD进行30k的小批量迭代,然后将学习率降低到0.0001,再训练10K的迭代。当我们对较大的数据集进行训练时,我们运行SGD进行更多的迭代,如后面所述。动量为0.9,参数衰减为0.0005(关于权重和偏置)。
2.4.尺度不变性
我们探讨了两种实现尺度不变目标检测的方法:(1)通过“brute force”学习和(2)利用图像金字塔。这些战略遵循[11]中的两种方法。在“brute force”法中,在训练和测试过程中,每幅图像都以预先定义的像素大小进行处理。网络必须从训练数据中直接学习尺度不变的目标检测.。
相比之下,多尺度方法通过图像金字塔为网络提供了近似的尺度不变性.在测试时,图像金字塔被用来对每一个目标方案进行近似规模的规范化。在多尺度训练中,我们随机抽样一个金字塔尺度,每次一幅图像被采样,如下[11],作为数据增强的一种形式。由于GPU内存的限制,我们只对较小的网络进行多尺度训练。SPP中也尝试了上面这两种方法,不过spp采用的是第二种,本文实验用的是第一种,速度要加快不少。
3、Fast R-CNN检测
一旦对Fast R-CNN网络进行微调,检测就会比前向传递快更多(假设区域建议是预先计算的)。网络将图像(或图像金字塔,编码为图像列表)和R区域建议列表作为输入。在测试时,R通常在2000左右,尽管我们会考虑它更大的情况(≈45k)。当使用图像金字塔时,每个RoI被调整,使得最接近224*224像素。
对于每个测试RoI r,前向传递输出概率分布p和一组相对于r的预测边界框偏移量(每个K类获得其自己的边界框预测)。我们使用后验概率p为每个r估计每K类的检测置信度。然后,我们使用R-CNN的算法和设置,为每个类独立地执行非最大抑制。
3.1 SVD加快检测速度
对于整个图像分类,与conv层相比,计算全连接层所花费的时间较少。相反,检测时要处理的RoI的数量很大,并且将近一半的时间用于计算完全连接的层(参见图2)。
通过SVD压缩它们可以很容易地节省时间。
使用SVD,由u×v权重矩阵W参数化的层近似地分解为 。该方法可以将参数的计算量从uv变为t(u+v)。如果t比min(u,v)还要小很多,加速就很有意义。实验中说map降了0.3%,但是速度提升了30%。