摘要
本文提出了一种基于快速区域的卷积网络方法(Fast R-CNN)用于目标检测。Fast R-CNN建立在先前的工作基础上,使用深度卷积网络高效地对对象提议框进行分类。与之前的工作相比,Fast R-CNN应用了多项创新来提高训练和测试速度,同时提高了检测精度。Fast R-CNN训练非常深的VGG16网络比R-CNN快9倍,测试时间方面快213倍,并在PASCAL VOC 2012上实现更高的mAP。与SPPnet相比,Fast R-CNN训练VGG16快3倍,测试快10倍,并且更准确。Fast R-CNN使用Python和C ++实现(使用Caffe),可在MIT开源许可证下获得:https://github.com/rbgirshick/fast-rcnn。
1 简介
深度卷积网显着改善了图像分类和目标检测的准确性。与图像分类相比,目标检测是一项更具挑战性的任务,需要更复杂的方法来解决。由于这种复杂性,当前的方法通常使用多阶段pipelines训练模型,这显得缓慢且不优雅。
复杂性的产生是因为检测需要对象的准确位置,这使得检测任务面临需要两个主要挑战。首先,必须处理许多目标的候选位置(通常称为提议)。其次,这些候选框仅提供对象的粗略位置,必须精修以实现精确定位。解决这些问题往往会影响速度,准确性和简单性。
本文简化了基于ConvNet的最先进物体检测器的训练过程,提出了一种单阶段训练算法,该算法同时学习对目标提议框进行分类和精修其空间位置。
由此产生的方法可以训练一个非常深的检测网络(VGG16),训练速度比R-CNN快9倍,比SPPnet快3倍。在运行时,检测网络处理一张图像需要0.3s(不包括对象建议框生成时间),同时在PASCAL VOC 2012上实现了最高精度,mAP为66%(对于R-CNN为62%)。
1.1 R-CNN和SPPnet
基于区域的卷积网络方法(R-CNN)通过使用深度ConvNet对目标提议框进行分类,实现了出色的对象检测精度。然而,R-CNN有明显的缺点:
训练是一个多阶段的pipeline。R-CNN首先通过使用log损失在对象提议框上微调ConvNet。然后,它将SVM用于ConvNet提取的特征之上。这些SVM充当物体检测器,取代了通过微调学习的softmax分类器。在第三个训练阶段,学习边界框回归量。
训练过程需要耗费很大的空间和很多的时间。对于SVM和边界框回归训练,从每个图像中的每个对象提议框中提取特征并将其写入磁盘。 对于非常深的网络,例如VGG16,这个过程需要2.5个GPU/天才能处理VOC07 trainval set的5k图像。这些特征需要数百GB的存储空间。
物体检测很慢。在测试时,需要从每个测试图像中的每个对象提议框中提取特征。使用VGG16进行检测需要47秒/图像(在GPU上)。
R-CNN很慢,因为它为每个对象提议框执行一次ConvNet的前向传递,而不共享这些计算。空间金字塔池化网络(SPPnets)提出通过共享卷积计算来加速R-CNN。SPPnet方法计算整个输入图像的卷积特征图,然后使用从共享特征图中提取的特征向量对每个对象提议进行分类。提议框的特征来自于将提议框所对应的特征图的部分最大化为固定大小的输出(例如,6×6)。池化得到多个输出大小,然后在空间金字塔池中连接。SPPnet在测试时将R-CNN加速10到100倍。由于更快的提议框特征提取,训练时间也减少了3倍。
SPPnet也有明显的缺点。与R-CNN一样,训练是一个多阶段的pipeline,涉及提取特征,利用对数损失对网络进行微调,训练SVM以及最终的边界框回归。特征也写入磁盘。但与R-CNN不同,SPPNet中提出的微调算法无法更新空间金字塔池层之前的卷积层。不出所料,这种限制(固定卷积层不进行训练)限制了非常深的网络的准确性。
1.2 改进
本文提出了一种新的训练算法,它可以解决R-CNN和SPPnet的缺点,同时提高它们的速度和准确性。这种方法被称为Fast R-CNN,因为它训练和测试的速度相对较快。Fast RCNN方法有以下几个优点:
(1) 比R-CNN,SPPnet更高的检测质量(mAP)
(2) 训练是单阶段的,使用多任务损失
(3) 训练可以更新所有网络层
(4) 不需要磁盘存储缓存特征
快速R-CNN是用Python和C ++编写的(Caffe),可以通过https://github.com/rbgirshick/fast-rcnnMIT的开源许可证获得。
2 Fast R-CNN的架构与训练
图1展示了Fast R-CNN的架构。Fast R-CNN网络将整个图像和一组对象提议框作为输入。网络首先使用几个卷积(conv)和最大池化层处理整个图像,以生成卷积特征图。然后,对于每个对象提议框,兴趣区域(RoI)池化层从提议框对应的特征图中提取固定长度的特征向量。每个特征向量被馈送到一系列全连接(fc)层,最终分支为两个并行输出层:一个层产生针对K个对象类别加上一个除这K个类别外的背景类的softmax概率估计,另一个层输为K个对象类的每个目标输出4个实数。每组的4个值表示K类中每个框的边界框位置精修量。
2.1 兴趣区域池化层
RoI池化层使用最大池化将任何有效的兴趣区域内的特征转换为具有固定空间范围H×W(例如,7×7)的小特征图,其中H和W是层超参数,独立于任何特定的RoI。在本文中,RoI是一个对应着卷积特征图的矩形窗口。每个RoI由一个四元组(r,c,h,w)定义,指定其左上角(r,c)及其高度和宽度(h,w)。
图1 Fast R-CNN的架构
RoI max pooling通过将h×w的RoI窗口划分为大约h / H×w / W大小的子窗口,组成H×W的网格,然后将每个子窗口中的值最大池化到相应的输出网格单元中。池化独立应用于每个特征通道,如标准最大池化那样。RoI层只是SPPnets中使用的空间金字塔池化层的特例,其中只有一个金字塔层。使用中给出的池化子窗口计算。
2.2 由预先训练的网络初始化
本文尝试了三个预先在ImageNet上训练过的网络,每个网络都有五个最大池化层处于五个和十三个卷积层之间(有关网络详细信息,请参见第4.1节)。当预训练的网络初始化Fast R-CNN网络时,它经历三次转换。
首先,最后的最大池化层由RoI池化层代替,该池化层通过将H和W设置为与网络的第一个全连接层(例如,对于VGG16,H = W = 7)相适应。
其次,网络的最后一个全连接层和softmax(经过1000类ImageNet分类训练)被前面描述的两个平行层替换(一个全连接的层后接基于K + 1个类别的softmax,另一个是类别特定的边界框回归)。
第三,网络被修改为采用两个数据输入:图像列表和这些图像中的RoI列表。
2.3 检测的微调
使用反向传播训练所有网络权重是Fast R-CNN的重要能力。首先,本文将阐明为什么SPPnet无法更新空间金字塔池化层以下的权重。
根本原因是当每个训练样本(例如RoI)来自不同的图像时,通过SPP层的反向传播是非常低效的,这正是R-CNN和SPPnet网络的训练方式。效率低的原因在于每个RoI可能具有非常大的感受野,通常跨越整个输入图像。由于前向传播必须处理整个感受野,因此训练输入很大(通常是整个图像)。
本文提出了一种更有效的训练方法,该方法利用了在训练期间特征共享的优势。在Fast RCNN训练中,随机梯度下降(SGD)小批量分层采样,首先采样N个图像,然后通过从每个图像采样R / N 个RoI。重要的是,来自相同图像的RoI在前向和后向传递中共享计算和存储器。使N减小可以减少小批量计算。例如,当使用N = 2且R = 128时,所提出的训练方案比从128个不同图像各采样一个RoI(R-CNN和SPPnet策略)快大约64倍。对该策略的一个担忧是它可能导致训练收敛不好,因为来自相同图像的RoI是相关的。这个问题似乎不是一个实际问题,本文使用比R-CNN更少的SGD迭代,使用N = 2和R = 128获得了很好的结果。