论文翻译——Fast-R-CNN(端到端开篇, End to end)

 快速的区域卷积网络方法(Fast R-CNN)

 

论文地址:https://arxiv.org/abs/1504.08083

摘要:

  本文提出一种基于快速的区域卷积网络方法(Fast R-CNN)用于物体检测(object detection)。Fast R-CNN建立在先前的工作的基础上,能够有效的使用深度卷积网络对物体候选区域(Region Proposals)进行分类。和之前的工作相比,Fast R-CNN采用了多种创新技术去提高训练和测试速度,然而它也提高了物体的检测精度。Fast R-CNN在很深的VGG16网络上的训练速度是R-CNN的9倍,测试速度是R-CNN的213倍,并且在PASCALVOC2012数据集上获得很高的平均精度均值(Mean Average Precision),简称MAP。相比于SPP-Net,Fast R-CNN在VGG16网络上的训练速度是SPP-Net的3倍,测试速度是SPP-Net的10倍,并且更精确了。Fast R-CNN被实现通过Python 和C++(利用Caffe),而且以MIT License是开源的、可利用的。地址是:https://github.com/rbgirshick/fast-rcnn

 

1. 引言

  最近,深度卷积网络在图像分类(image classification)和物体检测(object detection)领域有了很明显的提高。相比于图像分类问题,物体检测是一个更具挑战性的任务,它需要使用更复杂的方法去解决。正是由于这种复杂性,当前很多训练模型的方法都是采用多阶段流水线的形式,不仅很慢而且很不优雅。

  复杂性产生(Complexity arises)的原因是检测需要获得物体的精确位置,从而产生了两个主要的挑战(Challenges)。首先,许多的物体候选区域(经常被称为“Proposals”)必须被处理。其次,这些所谓的候选区域仅仅能提供物体的一个粗略位置信息,因此必须对它进行细化(Refine)以实现更精确的定位。解决这些问题往往需要在速度、精度、简易性上进行适当的妥协折中(Compromise)。

  在这篇论文中,我们简化了(streamline)基于最先进(state-of-the-art)的卷积网络的物体检测的训练过程(R-CNN和SPP-Net)。我们提出了一种单阶段(single-stage)的训练算法(algorithm),该算法将候选区域物体分类和它们的空间(spatial)位置细化合并在一起去学习训练(这里指的是图像分类和边界框回归)。

  由此产生的方法可以更快的训练一个非常深的卷积网络(VGG16,9倍于R-CNN,3倍于SPP-Net)。在测试时,检测网络处理一张图片仅仅需要0.3s(不包括候选区域的产生的时间),而且在PASCAL VOC 2012上的MAP为66%(R-CNN仅仅62%)。

 

1.1. R-CNN和SPP-Net

  基于区域的卷积网络方法(R-CNN)通过使用深度卷积网络完成了对物体候选区域的分类,并得到了很好的物体检测精度。然而,R-CNN有着明显地(notable)缺陷(drawbacks):

  (1)训练是多阶段流水线(Pipeline):首先,R-CNN利用物体候选区域(Object Proposals)对卷积网络(ConvNet)模型进行调优(fine-tunes),损失函数是采用log损失,其实就是softmax函数。然后,让SVMs去适应了卷积特征(其实就是训练了SVM分类器)。这些SVMs通过fine-tuning取代了softmax分类器作为物体检测器。在第三个训练阶段,边界框(Bounding-box)回归器被训练学习。

  (2)训练在空间和时间上都很昂贵(expensive):对于SVM分类器和边界框回归器的训练来说,所输入的特征需要每一张图片的每一个候选区域中被提取(extract)并被写入磁盘(disk)。对于非常深的网络,比如VGG16,训练VOC2017的大约5000张图片的训练集需要花费2.5个GPU-Days,这些特征需要数百GB的存储空间(storage)。

  (3)物体检测速度很慢:在测试时,特征从每一张测试图片的每一个物体候选区域被提取出来。对于VGG16网络来说,检测一张图片花费47s(在GPU上)。

  R-CNN是很慢的原因是对于图片的每一个候选区域都执行一次前向传播计算(提取特征的卷积层),没有共享卷积计算(sharing computation)。SPP-Net提出了共享计算去加速R-CNN算法。SPP-Net方法对于一张完整的输入图片只计算一次卷积特征映射,然后从共享的特征映射提取每一个物体候选区域所对应的特征向量并做分类处理。对于每一个候选区域最大池化(max-pooling)它的特征映射提取它的特征向量,输出是固定的大小。汇聚多种不同大小的池化输出,然后在空间金字塔池化层连接它们。SPP-Net在测试上是R-CNN的10-100倍;在训练时由于加快了候选区域的特征提取,训练时间减少了3倍。(共享卷积计算)

  SPP-Net也存在很明显地缺点。像R-CNN一样,训练是多阶段流水线,包含特征提取,利用log损失(softmax)fine-tuning网络,训练SVM分类器,最终拟合了边界框回归器。这些训练所需提取的特征需要存入磁盘。但是和R-CNN不同的是,在SPP-Net中的fine-tuning不同更新空间金字塔之前的池化层之前的卷积层。不足为奇,这种限制(固定卷积层)限制了非常深的网络(VGG16)的精度。

 

1.2. 贡献(Contributions)

   我们提出了一种新的训练算法(algorithm),该算法在消除/修复(fix)R-CNN和SPPNet缺点(disadvantages)的同时,还提高了它们速度和精度。我们把这种方法叫做Fast R-CNN,因为该方法在训练和测试的时候是比较快的。Fast R-CNN方法的优点如下:

  (1)比R-CNN和SPPNet更高的检测精度(mAP)

  (2)训练是单阶段的,使用了多任务损失函数

  (3)训练可以更新所有的网络层参数

  (4)不需要磁盘去存储大量提取的特征 

   Fast R-CNN算法是使用Python和C++(Caffe)来编写实现的。它可以在开源的MIT Li-cense下获得,地址是:https://github.com/rbgirshick/fast-rcnn 

 

 2. Fast R-CNN的架构和训练(Architecture and Training)

   图片1说明(illustrates)了Fast R-CNN的架构。Fast R-CNN网络将一个完整的图像和一组目标推荐区域作为输入。该网络首先通过几个(几组)卷积层和最大池化层处理输入的整个图像产生一个卷积特征映射(feature map)。然后,对于每一个目标推荐区域,使用感兴趣区域(RoI)池化层从特征映射图上提取固定维度的特征向量。每一个特征向量被输入(fed into)到一系列全连接层中,最终得到了两个同级的输出:第一个输出产生的是一个(K + 1)类的softmax概率估计(probability estimates),它包括了k个目标类别和一个背景类;第二个层是对于K个目标类的每一个类别输出4个实数值。K类目标的每一类的4个数字对边界框的位置进行编码,以获得更精细(refine)的边界框位置。

  图一. fast R-CNN架构。输入图像和多个感兴趣区域RoI被输入到完全卷积网络(这里指卷积网络的前面的所有卷积层)。每个感兴趣区域RoI被池化为固定尺寸的特征映射,然后通过全连接层映射到特征向量。网络中每个RoI有两个输出向量:softmax概率和每个类别的编辑框回归偏移量。该架构使用多任务损失函数实现了端到端的训练

 2.1 感兴趣区域池化层(RoI pooling layer)

   RoI 池化层使用最大池化操作将任何有效的感兴趣区域内的特征转换为一个固定空间范围H*W(例如,7*7)较小的特征映射,其中H和W是独立于任何特定(particular)的RoI区域的超参数(hyper-parameters)。在本文中,每一个RoI是被转换为在卷积特征映射上的一个矩形窗口。每个RoI通过4元组(r,c,h,w)来定义,矩形左上角顶点(r,c),矩形的高和宽是(h,w)。

   感兴趣区域最大池化的作用是通过尺寸大约(approximate)h/H * w/W 的子窗口将  h*w  的RoI窗口划分(dividing)为  H*W  的网格(grid cell),然后将每个子窗口中的值最大池化到相应的输出网格单元。池化操作是标准的最大池化,它独立的作用于特征映射的每一个通道(池化是不夸通道的)。RoI层是SPPNet网络中的空间金字塔池化层的一个简单的特例,它是只有一个尺度的金字塔层。我们使用文献[11](这里就是何恺明的SPPNet)中给出的池化窗口进行计算。

 2.2 从预训练(pre-trained)的网络初始化

   我们的实验采用了三种在ImageNet数据集上预训练的网络,每一个网络拥有5个最大池化层和5-13个卷积层(可查看4.1节获取详细网络结构)。当一个预训练的网络初始化Fast R-CNN网络时,它经历(undergoes)了三次转换(transformations)。

  首先,最后一个最大池化层被RoI池化层所取代,该RoI池化层通过设置合理H和W实现了与第一个全连接层兼容性配置(例如,H=W=7,对于VGG16)。

  其次,网络的最后的全连接层和softmax层(被训练1000个类别在ImageNet分类数据集上)被两个同级并列的层所取代(一个是K+1个类别的softmax分类层,另一个是指定类别的边界框回归偏移量)。

  第三,网络被修改为两种数据输入:一个是图像列表,另一个是这些图像的RoI列表。

 2.3 微调网络用于目标检测(Fine-tuning for detection)

  对于Fast R-CNN来说,使用反向传播算法(back-propagation)训练网络的所有权重是一个很重要的功能。首先,让我们阐述一下为什么SPPNet不能去更新空间金字塔池化层之下的卷积层权重。

  根本的原因在于当每一个训练样本(即RoI)来自于不同的图像时,通过SPP层的反向传播的效率是很低的,这正是R-CNN和SPPNet网络的训练方式。这种效率低下源自于(stems from)每一个感兴趣区域ROI可能有一个非常大的感受野(receptive field),通常跨越(spanning)整个输入图像。由于前向传播过程必须处理整个感受野,因此训练需要的输入很大(通常是整幅图像)。

  我们提出了一种更加有效的训练方法,它在训练期间利用特征共享。在Fast R-CNN训练时,随机梯度下降(SGD)的小批量(mini-batches)采用分层抽样,首先采样N个图像,然后对于每一张图像采样R/N个RoI区域。更重要的是,来自于同一张图像的所有RoI区域在前向传播和反向传播过程中共享计算和内存。这样使得较小的N会减少mini-batch的计算量。例如,当使用N=2,R=128,这个提出(propose)的训练方案(scheme)比来自128张的一个RoI区域(即,R-CNN和SPP-Net的训练策略strategy)快了大约(roughly)64倍。

  对于这种策略(strategy)的一个担忧是它可能导致训练时的收敛(convergence)速度减缓,因为来自于同一张图像的RoI区域是相关的(correlated)。这种担忧在实际问题中并没有出现,我们使用了比R-CNN更少的迭代步数,采用N=2,R=128这种策略反而取得了很好的结果。

  除了分层抽样之外,Fast R-CNN使用一个阶段的微调同时优化softmax分类器和边界框回归器来简化的训练过程,而不是三个单独的极端训练softmax分类器、SVM、回归器(像R-CNN和SPPNet中那样)。该程序(procedure)的组成部分(损失、小批量采样策略、RoI池化层的方向传播、SGD超惨)如下所示。

   多任务损失(Multi-task loss)

   Fast R-CNN网络有两个同级(sibling)并列的输出层,第一个输出层是一个离散的概率分布(对于每一个RoI区域),p = (p0,...,pk),包含有 K+1 个类别。通常 p 由全连接层的 k+1 个输出上的softmax计算得到的。第二个同级的输出层是边界框回归偏移量(offsets),对于每个K对象类,有 tk = (tkx,tky,tkw,tkh),索引是K。我们使用了文献[9](本文作者的另一篇文章)中给出的  t的参数化,其中 t指定相对于目标推荐区域的尺度不变的平移和对数空间的高度、宽度的偏移。

  每个训练的RoI区域都标注有完全真实的类(ground-truth class) u 和完全真实的边界框(ground-truth bounding-box)回归目标 v 。我们对于每一个标注的 RoI 区域使用多任务损失函数 L 来联合训练分类和边界框回归:

        L(p,u,tu,v)= Lcls(p,u)+ λ * [u >= 1] * Lloc(tu,v)          (1)     

  这里, Lcls(p,u) = -logpu,表示对真实类的对数损失(也就是交叉熵损失)。

  第二个任务损失 Lloc 是针对类 u 和 v = (vx,vy,vw,vh)的真实边界框回归目标的元组定义的,并且预测的元组 tu = (tux,tuy,tuw,tuh),还是针对u类别。当u>1时,中括号的指示器函数 [u >= 1]的计算结果为1,否则为0。对于背景 ROI 区域没有完全真实的边界框的概念(notion)。因此(hence)Lloc  被忽略(ignored)。对于边界框回归,我们使用如下的损失函数:

  Lloc(tu,v)= ∑ i=(x,y,w,h) smoothL1(tui,vi)                              (2)

   这里,

  smoothL1(x) = {0.5 * x^2,if |x| < 1|x| - 0.5,if |x| >=1}                (3)

   它是一种强大(robust)的L1损失,对于异常值的敏感度要低于R-CNN和SPPNet中使用的 L损失。当回归目标无限制时,L损失训练可能需要仔细的调整学习率以防止梯度爆炸。式子3消除了这种敏感性。

  在方程1中的超参λ控制两个任务损失之间的平衡。我们将真实的回归目标  vi  标准化为零均值和单位方差。所有实验都使用λ=1。

  我们注意到文献[6]使用相关的损失来训练一个与类无关的区域建议网络。与我们的方法不同,它提出了一种双网络的系统,它将定位与分类分开。OverFeat、R-CNN和SPPNet也训练分类器和边界框定位器,但是这些方法使用阶段式训练,我们将在5.1节展示它们对于Fast R-CNN来说是次优的。

  小批量抽样(Mini-batch sampling)

  在微调(fine-tuning)期间,每个SGD的mini-batch是由N=2个图像构成(constuct),随机选择单一形式(通常的做法是,我们实际上只对数据集的排列进行了调整)。我们使用的min-batches的尺寸是R=128,每1个图像采样了64个RoI区域。与文献[9]中一样,我们从目标推荐区域中选择25%的推荐区域和真正边界框交并比(IOU)大于0.5的区域。这些RoI区域包括用前景对象类标记的示例(类别指示函数),例如: [ u >= 1] 。剩余的RoI区域从和真实边界框交并比在[0.1,0.5)的推荐区域中采样,参考文献[11]。这些是背景示例,并标记 u = 0 。0.1的下限阈值似乎充当了困难实例挖掘的启发式算法[8]。在训练期间,图像以0.5 的概率进行水平翻转,没有使用其它的数据增强方法。

  通过RoI池化层的反向传播(Back-propagration through RoI pooling layers)

  通过RoI池化层的反向传播的导出路径。为了清楚起见(for clarity),我们假设每个mini-batch仅仅有一张图片,即N=1,但是扩展到N>1是显而易见的( straightforward),因为对于所有的图片的前向传播过程都是独立的。

  令为进入RoI池化层的第 i 个激活输入,并让为 r 层RoI的第 j 个输出。RoI池化层计算,其中是子窗口中输入单最大池化层的输入索引集。单个可以分配给几个不同的输出

  RoI池化层的方向函数通过遵循argmax开关计算损失函数相对于每个输入变量的偏导数:

     (4)

  换言之,对于每个小批量RoI r 和每个合并输出单元  ,如果 i 是通过最大合并为 选择的argmax,则偏导数就会累计。再反向传播中,偏导数已经由顶部的RoI池化层的反向函数计算。

  SGD超参数(SGD hyper-parameters)

  全连接层被用来做softmax分类和bounding-box回归,它们的权重初始化分别( respectively)采用具有标准差为0.01和0.001的零均值高斯分布,偏差(biases)被初始化为0。对于所有的层来说,每一层权重的学习率为1,偏差的学习率为2,全局学习率为0.001。在训练集VOC07或者VOC12上训练时,我们运行SGD进行30K次的小批量迭代,然后将学习率降低到0.0001并进行另外10K次迭代训练。当我们在更大的数据集上训练时,我们运行SGD以进行更多的迭代,如稍后所述。使用0.9的动量和0.0005的参数衰减(关于权重和偏差)。

2.4 尺度不变性(Scale invariance)

  我们探索了在物体检测中两种实现尺度不变的方法:(1)通过“强力”学习。(2)通过使用图像金字塔。这些策略遵循了文献[11](SPPNet)中的两个方法。对于蛮力方法,在训练和测试期间以预定义的像素大小处理每个图像。网络必须从训练数据中学习尺度不变的物体检测。

  相反,多尺度方法通过图像金字塔为网络提供近似的尺度不变性。在测试时,图像金字塔用于近似地缩放规范化每个建议区域。在多尺度训练期间,我们在每次采样图像时随机采样金字塔尺度[11],作为数据增强的一种形式。由于GPU内存限制,我们仅针对较小的网络进行多尺度训练。

 

 3. 快速的R-CNN检测(Fast R-CNN detection)

 

 

 

posted @ 2019-03-28 21:00  我的明天不是梦  阅读(3038)  评论(0编辑  收藏  举报