提出了一种基于区域卷积网络的快速目标检测方法(Fast R-CNN)。Fast R-CNN建立在以前工作的基础上,使用深度卷积网络有效地分类object proposals。与之前的工作相比,Fast R-CNN在提高训练和测试速度的同时,也提高了检测精度。Fast R-CNN比R-CNN快了9倍,并且训练了非常深的VGG16网络,在测试时比R-CNN快213,并在PASCAL VOC 2012上实现了更高的mAP。与SPPnet相比,Fast R-CNN训练VGG16 快了3倍,测试10更快,更准确。Fast R-CNN是用Python和c++(使用Caffe)实现的,MIT的开源许可: fast r-cnn。
近年来,deep ConvNets[14,16]显著提高了图像分类[14]和目标检测的精度[9,19]。与图像分类相比,目标检测是一项更具挑战性的任务,需要更复杂的方法来解决。由于这种复杂性,目前的方法(如[9,11,19,25])在多级管道中训练模型速度慢且不优雅。
复杂性的出现是因为检测需要精确定位对象,这带来了两个主要的挑战。首先,必须处理许多候选对象位置(通常称为proposals)。其次,这些候选项只提供了必须进行细化才能实现精确本地化的粗略本地化。这些问题的解决方案常常会牺牲速度、准确性或简单性。
在本文中,我们简化了基于最先进的convnet的对象检测器的训练过程[9,11]。我们提出了一种单阶段训练算法,该算法可以联合学习对object proposals进行分类,并对其空间位置进行细化。
该方法可以训练出比R-CNN[9]快9倍、比SPPnet[11]快3倍的超深探测网络(VGG16[20])。在运行时,检测网络处理图像的时间为0.3秒(不包括object proposals时间),而在PASCAL VOC 2012[7]上实现了66%的最高精度(R-CNN为62%)。
基于区域卷积网络(RCNN)的[9]方法利用深度卷积网络对目标proposals进行分类,获得了良好的目标检测精度。然而,R-CNN有明显的缺点:
R-CNN速度很慢,因为它对每个object proposals执行ConvNet转发,而不共享计算。为了提高R-CNN的计算速度,提出了空间金字塔汇聚网络(SPPnets)[11]。SPPnet方法为整个输入图像计算卷积特征图,然后使用从共享特征图中提取的特征向量对每个object proposals进行分类。通过将proposals内的feature map的部分最大池化为固定大小的输出(例如,6 6),为proposals提取特征。多个输出大小被池化,然后像空间金字塔池[15]那样连接起来。SPPnet在测试时将R-CNN加速10到100。训练时间也减少了3由于更快的proposals特征提取。
SPPnet也有明显的缺点。与R-CNN一样,训练是一个多阶段的管道,包括提取特征、对具有日志丢失的网络进行微调、训练支持向量机,最后再拟合边界盒回归器。特性也被写入磁盘。但与R-CNN不同,[11]中提出的微调算法不能更新空间金字塔池之前的卷积层。不足为奇的是,这种限制(固定卷积层)限制了非常深的网络的准确性。
针对R-CNN和SPPnet的缺点,提出了一种新的训练算法,提高了它们的速度和精度。我们称这种方法为Fast R-CNN,因为它训练和测试相对较快。Fast RCNN方法有以下几个优点:
Fast R-CNN是用Python和c++ (Caffe)编写的),并在麻省理工学院(MIT)的开源许可下可访问/fast -rcnn
图1展示了Fast R-CNN架构。
一个Fast R-CNN网络将整个图像和一组object proposals作为输入。网络首先使用几个卷积(conv)和最大池化层处理整个图像,生成一个conv特征图。然后,对于每个object proposals,一个感兴趣区域(RoI)池层从特征映射中提取一个固定长度的特征向量。每个特征向量送入一个序列的完全连接(fc)层,最后分支成两个兄弟输出层:一个生产softmax概率估计/ K对象类+全方位背景类和一层输出四个实值编号为K的每个对象类。每组4个值为K类中的一个类编码改进的边界框位置。
RoI池层使用max池将任何有效感兴趣区域内的特征转化为一个固定空间范围H×W的小feature map(如7×7),其中H和W是独立于任何特定RoI的层超参数。在本文中,RoI是一个矩形窗口到一个conv特征映射。每个RoI由一个四元组(r;c;h;w)指定其左上角(r;c)高度和宽度(h;w)。
RoI max pooling的工作原理是将h×w RoI窗口划分为一个h×w的子窗口网格,每个子窗口的大小近似为h= h×w= w,然后将每个子窗口的值max-pooling到相应的输出网格单元中。池独立应用于每个feature map通道,就像标准的max池一样。RoI层只是空间金字塔池层的特殊情况。SPPnets[11]中只有一个金字塔级。我们使用在[11]中给出的池化子窗口计算。
我们使用三个预先训练过的ImageNet[4]网络进行实验,每个网络都有5个最大池层和5到13个conv层(网络详细信息见4.1节)。当一个预先训练好的网络初始化一个Fast R-CNN网络时,它会经历三个转换。
首先,将最后一个最大池层替换为RoI池层,通过将H和W设置为与net s的第一个完全连接的层(例如,对于VGG16, H = W = 7)兼容来配置RoI池层。
其次,将网络的最后一个全连接层和softmax(为1000路ImageNet分类而训练)替换为前面描述的两个同级层(一个全连接层和softmax / K + 1类别和特定于类别的边界盒回归器)。
第三,将网络修改为接受两个数据输入:图像列表和这些图像中的roi列表。
利用反向传播训练所有网络权值是Fast R-CNN的重要能力。首先,让我们说明为什么SPPnet无法更新空间金字塔池层以下的权重。
其根本原因是,当每个训练样本(即RoI)来自不同的图像时,SPP层的反向传播效率非常低,这正是R-CNN和SPPnet网络训练的方式。效率低下的原因在于,每个RoI可能有一个非常大的接受域,通常覆盖整个输入图像。由于前传必须处理整个接受域,所以训练输入很大(通常是整个图像)。
提出了一种利用训练过程中特征共享的高效训练方法。在Fast RCNN训练中,对随机梯度下降(SGD)小批量进行分层采样,首先对N幅图像进行采样,然后对每幅图像进行R=N roi采样。关键是,RoIs从相同的图像共享计算和内存在前进和后退通过。使N小减少了小批量计算。例如,当使用N = 2和R = 128时,所提出的训练方案比从128幅不同的图像(即, R-CNN和SPPnet战略)。
这种策略的一个问题是,由于来自同一图像的roi是相关的,因此可能会导致训练收敛较慢。这种关注似乎不是一个实际的问题,我们使用比R- cnn更少的SGD迭代来实现N = 2和R = 128的良好结果。
除了分层采样外,Fast R-CNN采用精简的训练过程,一个微调阶段,联合优化一个softmax分类器和边界盒回归器,而不是在三个独立的阶段训练一个softmax分类器、svm和回归器[9,11]。这个过程的组成部分(损失、小批量抽样策略、通过RoI池层的反向传播和SGD超参数)描述如下
Multi-task loss.
一个Fast R-CNN网络有两个兄弟姐妹输出层。
每个训练RoI都有一个ground-truth class u和一个ground-truth bounting -box regression target v标记。我们在每个标记的RoI上使用一个多任务损失L,共同训练分类和bounting -box regression:
对于真实的类别u的对数损失。
第二个任务损失,Lloc,是在一个u类的真边界盒回归目标元组上定义的,和一个预测的元组;当时,Iverson括号指示函数的值为1,否则为0。按照惯例,将catch-all后台类标记为u = 0。对于背景roi,没有ground-truth边界框的概念,因此忽略了Lloc。对于边界盒回归,我们使用损失
与R-CNN和SPPnet中使用的L2损失相比,L1损失对异常值的敏感性较低。当回归目标是无界的,使用L2损失的训练可能需要仔细调整学习率,以防止梯度爆炸。Eq. 3消除了这种敏感性。
在超参数 在公式1,控制两个任务损失之间的平衡。我们将基本真实回归目标vi标准化,使其均值和单位方差为零。所有的实验都使用λ= 1。
我们注意到[6]使用相关的损失来训练一个类无关的object proposals网络。与我们的方法不同的是,[6]提倡使用双网络系统来区分本地化和分类。OverFeat[19]、R-CNN[9]和SPPnet[11]也可以训练分类器和边界框定位器,但是这些方法使用的是分段训练,我们在5.1节中展示了这种方法对于Fast R-CNN是次优的。
Mini-batch sampling.
在微调过程中,每个SGD小批都由N = 2张图像组成,它们是随机一致选择的(通常情况下,我们实际上遍历数据集的排列)。我们使用大小为R = 128的小批,从每个图像中抽取64个roi。就像在[9]中一样,我们从object proposals中获取25%的roi,这些object proposals的交集超过union (IoU),并且与groundtruth边界框至少0:5重叠。这些roi包括使用前台对象类(即u1)标记的示例。余下的roi是从object proposals中取样的,这些proposals的最大借据与地面真实值之间的间隔为[0:1;0:5)[11]。这些是背景示例,并且标记为u = 0。较低的阈值0:1似乎是挖掘[8]的一个启发式实例。在训练过程中,图像水平翻转的概率为0:5。没有使用其他数据增强。
Back-propagation through RoI pooling layers.
反向传播通过RoI池层路由导数。为了清晰起见,我们假设每个小批处理只有一个图像(N = 1),尽管扩展到N > 1很简单,因为正向传递独立处理所有图像。
设为RoI池层的第i个激活输入,为rth RoI的第s层第j个输出。RoI池层计算,其中。是子窗口中输入的索引集,输出单元 max存储在子窗口上。一个可以分配给几个不同的输出。RoI池层的向后函数通过argmax开关计算损失函数对每个输入变量的偏导数
换句话说,对于每个小批量RoI r和每个池化输出单元,如果i是max池化为选择的argmax,则对其偏导数进行累加。在反向传播中,偏导数已经由RoI池层上的层的反向函数计算出来了:
SGD hyper-parameters.
软最大值分类和边界盒回归所用的全连通层分别由0:01和0:001标准偏差的零均值高斯分布初始化。偏差初始化为0。所有层都使用每层1的学习率来表示权重,2表示偏差,全局学习率为0:001。在VOC07或VOC12训练中,我们运行SGD进行30k的小批量迭代,然后将学习率降低到0:0001,再进行10k的迭代训练。当我们对较大的数据集进行培训时,我们将运行SGD进行更多的迭代,如后面所述。使用0:9的动量和0:0005的参数衰减(关于权重和偏差)。
我们探讨了两种实现尺度不变目标检测的方法:(1)通过蛮力学习和(2)使用图像金字塔。这些策略遵循[11]中的两种方法。在蛮力方法中,每个图像在训练和测试期间都按照预先定义的像素大小进行处理。网络必须直接从训练数据中学习尺度不变的目标检测。相比之下,多尺度方法通过图像金字塔为网络提供近似的尺度不变性。在测试时,使用图像金字塔对每个object proposals进行近似尺度标准化。在多尺度训练中,每次采样图像时,我们都随机抽取一个金字塔尺度,跟随[11],作为数据增强的一种形式。由于GPU内存的限制,我们只对较小的网络进行多尺度训练实验。
一旦一个Fast R-CNN网络被微调,检测就相当于运行一个正向传递(假设object proposals是预先计算好的)。网络将图像(或图像金字塔,编码为图像列表)和R个object proposals列表作为输入进行评分。在测试时,R通常在2000左右,不过我们将考虑它更大的情况(45k)。当使用图像金字塔时,每个RoI都被分配到比例,使比例的RoI在[11]区域内最接近2242像素。
对于每个测试RoI r,正向传递输出一个类后验概率分布p和一组相对于r的预测的边界盒偏移量(K个类中的每个类都有自己的精炼的边界盒预测)。我们使用估计概率,为每个对象类k分配一个检测置信度r,然后使用r - cnn[9]中的算法和设置分别对每个类执行非最大抑制。
对于全图像分类,与conv层相比,计算全连通层所花费的时间较小。相反,对于检测,待处理的roi数量较大,计算全连通层花费了近一半的前向通时间(见图2),采用截断SVD对大的全连通层进行压缩,容易加速大的全连通层[5,23]。在该技术中,一个由uv权矩阵W参数化的层近似分解为
使用SVD分解,U是t矩阵组成第一个左奇异向量W,是一种含有顶部t x t对角矩阵奇异值的W,V是v x t矩阵组成的第t right-singular向量W。截断SVD将参数从uv减少到t(u + v),当t远远小于min(u;v)。为了压缩网络,将与W对应的单一全连通层替换为两个全连通层,它们之间不存在非线性。第一层使用重量矩阵(和没有偏见),第二个使用U(与原来的偏见与W)。当roi的数量较大时,这种简单的压缩方法可以很好地加速。
三个主要结果支持了本文的贡献:
我们的实验使用了三个预先训练的ImageNet模型,这些模型可以在网上找到。第一个是来自R-CNN[9]的CaffeNet(本质上是AlexNet[14])。我们或者参考以这款咖啡为S型,为小号。第二个网络是来自[3]的VGG CNN m1024,它和S一样深,但是更宽。我们称这个网络模型为M,代表媒体。最后的网络是来自[20]的非常深的VGG16模型。由于这个模型是最大的,我们称之为模型l。在本节中,所有的实验都采用单尺度训练和测试(s = 600;详见5.2节)。
在这些数据集中,我们将Fast R-CNN(简称FRCN)与来自公共排行榜的comp4(外部数据)轨道上的顶级方法进行比较(表2、表3)。
对于NUS NIN c2000和BabyLearning methods,目前还没有相关的发表,我们无法找到使用的ConvNet架构的确切信息;它们是网络中的网络设计[17]的变体。所有其他方法都是从相同的预先训练的VGG16网络初始化的。Fast R-CNN在VOC12上以65.7%的mAP(和68.4%的额外数据)获得了最好的结果。它也比其他基于慢速R-CNN管道的方法快两个数量级。在VOC10SegDeepM[25]实现了比Fast R-CNN更高的mAP (67.2% vs. 66.1%)。SegDeepM基于VOC12 trainval和分割注释进行训练;为了提高R-CNN的精度,采用马尔可夫随机场对O2P[1]语义分割方法中的R-CNN检测和分割进行推理。Fast R-CNN可以替换成SegDeepM代替R-CNN,这可能会带来更好的结果。当使用放大的07++12训练集(见表2说明)时,Fast R-CNN s mAP增加到68.8%,超过SegDeepM。
在VOC07中,我们将Fast R-CNN与R-CNN和SPPnet进行了比较。所有的方法都是从同一个预先训练好的VGG16网络开始,并使用边界盒回归。VGG16 SPPnet结果由[11]的作者计算。SPPnet在培训和测试中使用五种量表。Fast R-CNN相对于SPPnet的改进表明,即使Fast R-CNN使用单尺度的训练和测试,微调conv层在mAP上也有很大的改进(从63.1%到66.9%)。R-CNN实现了66.0%的地图。作为次要的一点,SPPnet在训练时没有使用PASCAL标记为困难的示例。删除这些例子将Fast R-CNN mAP提高到68.1%。其他所有的实验都使用困难的例子。
快速的训练和测试时间是我们的第二个主要结果。表4比较了Fast RCNN、R-CNN和SPPnet之间的训练时间(小时)、测试速度(每张图像的秒数)和VOC07上的mAP。对于VGG16,Fast R-CNN处理图像的速度比不截短SVD的R-CNN快146,处理速度比不截短SVD的R-CNN快213。培训时间减少了9个小时,从84小时减少到9.5小时。与SPPnet相比,Fast RCNN训练VGG16 2.7更快(在9.5小时vs. 25.5小时),在没有截断SVD的情况下测试7个更快,或者使用它测试10个更快。Fast R-CNN还消除了数百gb的磁盘存储,因为它不缓存功能。
Truncated SVD. 截断的SVD可以减少30%以上的检测时间,mAP只下降了0.3个百分点,无需在模型压缩后进行额外的微调。图2展示了如何在VGG16 s fc6层中使用25088 4096矩阵的前1024个奇异值,以及在mAP中使用4096 4096 fc7层的前256个奇异值来减少运行时,且损失很小。如果在压缩后再次进行微调,mAP中较小的下降可以进一步加速 。
对于SPPnet论文[11]中考虑的深度较低的网络,只有对完全连接的层进行微调,才能获得较好的精度。我们假设这一结果不适用于非常深的网络。为了验证微调conv层对VGG16是重要的,我们使用Fast R-CNN进行微调,但是冻结了13个conv层,这样只有完全连接的层才能学习。该消融模拟单尺度SPPnet训练,mAP由66.9%降至61.4%(表5)。本实验验证了我们的假设:对于非常深的网,通过RoI池层进行训练是非常重要的。
这是否意味着所有conv层都应该进行微调?简而言之,没有。在较小的网络(S和M)中,我们发现conv1是通用的,并且与任务无关(一个众所周知的事实[14])。不管是否允许conv1学习,对mAP都没有任何有意义的影响。对于VGG16,我们发现只需要从conv3 1和更高级别(13个conv层中的9个)更新层。这个观察结果是实用的:(1)与从conv3 1学习相比,从conv2 1更新将训练速度降低1.3 (12.5 vs. 9.5小时);(2)从conv11更新会超出GPU内存。从conv2 1 up学习时,mAP的差异仅为+0:3点(表5,最后一列)。所有Fast R-CNN的结果在本文中使用VGG16微调层conv3 1和以上;所有的实验与模型S和M微调层凸2和以上。
我们进行了实验来了解RCNN与R-CNN和SPPnet的比较速度,以及评估设计决策。按照最佳实践,我们在PASCAL VOC07数据集上执行了这些实验。
多任务训练很方便,因为它避免了管理一系列连续训练的任务。但它也有可能改进结果,因为任务通过共享表示(ConvNet)[2]相互影响。多任务训练能否提高Fast R-CNN的目标检测精度?
为了检验这个问题,我们训练基线网络,在式(1)中只使用分类损失Lcls。,设置λ= 0)。这些基线打印模型S, M, L在每一组的第一列在表6所示。注意,这些模型没有边界盒回归器。(每组第二列),我们把网络与多任务都是经过训练的损失(Eq。1λ= 1),但我们在测试时间回归边界框(禁用大小)。这隔离了网络的分类精度,并允许与基线网络进行一对一的比较。
在所有三个网络中,我们观察到多任务训练相对于单独的分类训练提高了纯分类精度。
最后,我们将基线模型(仅使用分类损失进行训练)添加到边界盒回归层,并使用Lloc对它们进行训练,同时保持所有其他网络参数不变。每组的第三列显示了这个阶段训练方案的结果:mAP比第一列有所改进,但是阶段训练不如多任务训练(每组第四列)。
我们比较了两种实现尺度不变目标检测的策略:蛮力学习(单尺度)和图像金字塔(多尺度)。在这两种情况下,我们将图像的比例尺s定义为其最短边的长度。
所有单尺度实验均使用s = 600像素;对于某些图像,s可能小于600,因为我们将最长的图像边设置为1000像素,并保持图像的s高宽比。选择这些值是为了让VGG16在调优过程中适合GPU内存。较小的模型不受内存限制,可以从较大的s值中获益;然而,优化每个模型并不是我们的主要关注点。我们注意到PASCAL图像平均为384 473像素,因此单尺度设置通常将图像的上采样率提高1.6倍。因此,RoI池层的平均有效步长为10个像素。
在多尺度设置中,我们使用与[11]中指定的相同的五个尺度(s2f480;576;688;864;1200g),以便与SPPnet进行比较。然而,我们将最长的边限制在2000像素,以避免超过GPU内存。
表7显示了模型S和模型M在使用一个或五个量表进行训练和测试时的情况。也许[11]中最令人惊讶的结果是单尺度检测的性能几乎和多尺度检测一样好。我们的结果表明:深卷积神经网络善于直接学习尺度不变性。多比例尺方法只在mAP上增加了一小部分,但在计算时间上却花费了大量的时间(表7)。尽管R-CNN使用的是无限尺度,即每个proposals都被扭曲成一个标准尺寸,但它还是获得了66.9%的地图,略高于R-CNN[10]报道的66.0%。
由于单尺度处理提供了速度和精度之间的最佳权衡,特别是对于非常深的模型,本小节之外的所有实验都使用s = 600像素的单尺度训练和测试。
一个好的目标检测器应该在提供更多的训练数据时得到改进。Zhu等人[24]发现,DPM [8] mAP在经过几十万个训练样本后就饱和了。在这里,我们用VOC12 trainval集合来扩充VOC07 trainval集合,大约将图像数量增加三倍,达到16.5k,来评估Fast R-CNN。扩大训练集将VOC07测试mAP从66.9%提高到70.0%(表1)。我们对VOC10和2012年进行了类似的实验,构建了VOC07 trainval、test和VOC12 trainval联合的21.5k图像数据集。在此数据集上进行培训时,我们使用100k SGD迭代,并在每次40k迭代中(而不是每次30k)将学习率降低0:1。VOC10和2012年mAP分别从66.1%提高到68.8%和65.7%提高到68.4%。
Fast R-CNN使用在微调过程中学习的softmax分类器,而不是像在R-CNN和SPPnet中那样,训练一个vs-rest线性svmspot -hoc。为了了解这种选择的影响,我们在Fast R-CNN中实现了带有硬负挖掘的SVM后自适应训练。我们使用与R-CNN相同的训练算法和超参数。
表8显示,softmax在所有三个网络上的性能都略优于SVM,其映射点的性能为+0:1到+0:8。这种效果很小,但它表明,与以前的多阶段训练方法相比,“一次”微调就足够了。我们注意到softmax不同于one-vs-rest SVMs,它在获得RoI时引入了类之间的竞争。
(广泛地)有两种类型的对象检测器:一种使用稀疏的object proposals集(例如,选择性搜索[21]),另一种使用密集的object proposals集(例如,DPM[8])。稀疏proposals分类是级联[22]的一种类型,在这种类型中,proposals机制首先拒绝大量候选项,留给分类器一小组待评估的候选项。当应用于DPM检测[21]时,该级联提高了检测精度。我们发现,该分类器级联也提高了Fast R-CNN的准确性。
使用选择性搜索的质量模式,我们将每张图片从1k扫描到10k,每次都对模型m进行再培训和再测试。如果每幅图片只提供纯粹的计算功能,那么增加每张图片的proposals数量应该不会对mAP造成损害
我们发现,随着proposals数量的增加,mAP先上升后下降(图3,实蓝色线)。实验表明,在深度分类器中加入更多的proposals不仅没有帮助,甚至会对精度造成轻微的伤害。没有实际的实验,
这个结果很难预测。衡量object proposals质量的最新技术是平均召回率(AR)[12]。当使用固定数量的每幅图像时,AR与使用R-CNN的几种proposals方法mAP有很好的相关性。从图3可以看出,AR(实心红线)与mAP没有很好的相关性,因为每张图像的proposals数量是不同的。AR必须谨慎使用;更高的AR由于更多的提议并不意味着地图将增加。幸运的是,使用model M进行培训和测试的时间不到2.5小时。因此,Fast R-CNN能够高效、直接地评估object proposals映射,这优于代理度量。
我们还研究了Fast R-CNN时,使用密集生成的框(超过规模,位置,纵横比),以约45k框/图像的速度。这个密集集足够丰富,当每个选择搜索框被其最近的(在IoU中)密集框替换时,mAP只下降1点(图3中蓝色三角形为57.7%)。
密集框的统计与选择性搜索框的统计不同。从2k选择搜索框开始,随机添加1000 f2的样本进行mAP测试;4;6;8;10;32;45 g密集的盒子。对于每一个实验,我们都对模型m进行了再训练和再测试。当这些密集的框被添加时,mAP的下降幅度比添加更多的选择性搜索框时更大,最终达到53.0%。
我们也训练和测试Fast R-CNN只使用密集的盒子(45k /图像)。此设置生成52.9%的地图(蓝色菱形)。最后,我们检验了是否需要硬负向开采的支持向量机来处理密集的箱形分布。支持向量机的情况更糟:49.3%(蓝色圆圈)。
我们应用Fast R-CNN(与VGG16)的MS COCO数据集[18]建立初步基线。我们在240k迭代的80k图像训练集上进行训练,并使用评估服务器在“test-dev”集上进行评估。PASCAL-style mAP为35.9%;新COCO-style AP同样平均超过IoU19.7%。
本文提出了一种Fast R-CNN,对R-CNN和SPPnet进行了干净、快速的更新。除了报告最新的检测结果,我们还提供了详细的实验,希望能提供新的见解。特别值得注意的是,稀疏object proposals似乎可以提高检测器的质量。这个问题在过去花费太多(时间)去探索,但在Fast R-CNN中变得实用。当然,可能存在一些尚未发现的技术,允许密集的框执行稀疏的proposals。如果开发出这样的方法,将有助于进一步加速目标检测。