Fast RCNN

Fast RCNN
Abstract
本文提出了一种快速基于区域的卷积网络目标检测方法(Fast RCNN)。Fast RCNN基于之前使用深度卷积网络来更好的进行候选目标区域分类的工作基础之上。和之前的工作相比,Fast RCNN提供了几种创新来提高训练和测试的速度并提升了检测的准确性。Fast RCNN训练VGG16的速度要比RCNN快9倍,在测试时的快213倍,并在PASCAL VOC上实现了更高的mAP。和SPPnet相比,Fast RCNN训练VGG16的速度快上3倍,测试时快10倍并且更加准确。Fast RCNN由python 和C++实现,并且已经开源。
Introduction
近来,深度卷积网络已经显著提升了图像分类和目标检测的准确性。和图像分类相比,目标检测是一个更具有挑战性的工作,需要更复杂的方法解决。由于其复杂性,当前的模型训练方法一般是多阶段,并且十分缓慢且精度不高。
复杂性的上升是由于检测需要对物体的位置进行准确的定位,这就有两个首要的问题。其一,许多候选的物体位置需要被处理。其二,这些候选区域只提供粗略的位置并且必须被修正来提供更加精确的定位。解决这些问题的方法通常需要牺牲,速度,准确性和模型的简单性。
在本文中,我们依次展示了当前最先进的基于卷积网络的目标检测器的训练过程。我们提出了一个单阶段训练方法,联合学习候选区域分类以及修正空间定位的精度。
这种方法训练VGG16的速度比RCNN快9倍,比SPPnet快3倍。在运行时,每张图片仅需要耗费0.3s,在PASCAL VOC 2012 上实现最高的准确率为66%。
R-CNN and SPPnet
RCNN通过使用深度卷积神经网络来分类目标候选区域实现了极好的目标检测准确性。不过,它也有一些显著的缺陷。1.训练是一个多阶段的过程。R-CNN首先在目标候选框上使用log损失来微调神经网络。之后,用卷积网络学习到的特征来调整SVM。这些SVM分类器的作用是目标检测器,代替了通过微调学习到的softmax分类器。在第三个训练阶段,学习到了bounding-box回归器。2.训练十分的耗费空间和时间。对于SVM以及bounding box回归器的训练来说,会从每张图片的每一个候选区域中提取特征并写入到磁盘中。使用很深的网络,例如VGG16,这个过程大约5000个图像在单个GPU上要花费2.5天。这些特征需要数百G的存储空间。3.目标检测的速度很慢。在测试时。特征会从每张图片上的每个候选区域中提取。在一块GPU上检测一张图片需要花费47s。
RCNN很慢是因为它对每一个候选区域进行卷积网络前传,而不进行计算共享。空间金字塔池化网络(SPPnets)被提出出来通过计算共享来对RCNN进行加速。SPPnet网络对每一个完整的图像计算卷积特征图,之后使用从共享的特征图中提取出来的特征向量来对每一个候选区域进行分类。特征通过最大池化候选区域中特征图部分而被提取出来并转化为固定大小。多个输出被池化,之后连接成最大金字塔。SPPnet在测试时可以将RCNN加速到10到100倍。训练的时间也因为更快的特征提取而被减少了三倍。
不过,SPPnet也有一些显著的缺陷。就像RCNN一样,训练过程是一个多阶段的流水线,包含了特征提取,使用log损失来对网络进行微调,训练SVMs,以及最后的bounding box 回归器的拟合。特征也会被写入到磁盘当中。但是不像RCNN,微调算法不能更新空间金字塔之前的卷积层。不难预料,这种限制使得对于很深的网络来说,其准确性受到了限制。
Contribution
我们提出了一种新的算法,很好的解决了RCNN以及SPPnet中存在的问题,并且提高了准确性以及速度。Fast RCNN有以下几个优点。1、map值高于RCNN以及SPPnet。2、训练过程使用多任务loss,只有一个阶段。3、训练可以更新所有的网络层。4、不需要存储提取出来的特征。

Architecture and training
图1展示了Fast RCNN的结构。Fast RCNN网络将一整张图片以及一系列目标候选区域作为输入。网络首先用几个卷积层来对整张图片进行处理,之后使用一个最大池化层来产生卷积特征图。对于每一个候选框,ROI池化层从特征图中抽取固定大小的特征向量。每个向量被喂到一系列的池化层中,之后产生两个同级的向量层:其中一个输出K个类别加一个背景类别的概率估计,另一个为K个类别中每一个类别输出4个真实值。每一组值都是对某一个类别回归框位置的修正。
The RoI pooling layer
RoI池化层使用最大池化来将roi区域中有价值的特征转化为一个小的特征图,固定的大小为H*W。H和W是这一层的超参,独立于任何的RoI之外。在本文之中,RoI是卷积特征图中的一个矩形窗口。每一个RoI都是有四个值确定的。
RoI最大池化通过将窗口分成一系列的子窗口,并得出大约的面积。然后对每一个子窗口输出进行最大池化,将输出合并到相应的输出单元之中。同标准的最大池化一样,池化操作是对每一个特征图通道单独作用的。
Initiaizing from pre-trained networks
用了三个预训练的ImageNet网络进行预训练,每个网络有5个最大池化层以及5到13个卷积层。当预训练网络初始化一个Fast RCNN网络时,会进行三个变体。
首先,最后一个最大池化层会被ROI池化层所代替。
其次,网络的最后一个全连接层和softmax层会被之前描述过的两个同级层所代替。
第三,网络被修正成两个输入,一系列图片,以及这些图片上的一系列ROI。
Fine-tuning for detection
对于Fast RCNN来说,用反向传播算法计算所有的网络权重是十分重要的能力。首先,先阐述一下,为什么sPPnet无法更新位于空间金字塔下面的层的权重。
根本原因是,当训练样本来自于不同的图片时SPP的反向传播算法是十分低效率的。(why?如果都来自于一张图片是否就高效?)这也正是RCNN以及SPPnet的训练方式。这种低效率的原因是每个ROI的感受野太大了,有时候甚至包括了整个图片。由于正向传播算法必须处理整个感受野,训练的输入经常很大。
我们提出了一种效率更高的方式,即在训练过程中特征共享。Fast RCNN中的SGD的批量的采样是分层的,先采图片,再对每个图片采样ROI。ROI来自于同一个图片,可以减少正向以及反向的计算和存储。当我们使得图片的数量减少时,就可以使得mini-batch的计算减少。
这种想法,有可能会因为ROI之间的相关性使得训练收敛变慢,不过实际使用时这个问题并没有发生。
为了分层采样,Fast RCNN采用了流水线的训练过程,使用了一个微调联合优化了一个softmax分类器和bounding box回归器,而不是在三个阶段,分别训练一个softmax分类器。SVM以及回归器。

Multi-task loss
Fast RCNN有两个同级的输出层。第一个输出K+1上的类别概率,这是通过全连接层上的softmax实现的。第二个输出bounding box回归的偏移量。、
每一个训练的ROI的label 包含了类别和框。我们用一个多任务的loss来联合训练分类和bounding box回归。Loss如下:

对于背景ROI没有bounding box,因此它的第二个loss也就自动忽略了。对于bounding box回归的loss的具体展开如下。

其中L1是比较鲁棒的,对于异常点不是十分敏感,与之相比RCNN以及SPPnet中的L2就相对敏感。当回归的目标无界的时候,,带有L2损失的训练需要更仔细的微调学习率来防止梯度爆炸。
等式1中的超参控制着两个loss的平衡。
Mini-batch sampling
在微调阶段,每个SGD小批量是由2张图片构成的。Batch的size是128,每张图片上采样64个ROI。我们从候选框中选择25%的ROI,这些的IoU至少是0.5。这些ROI包含了被标记为前景物体的目标类别。剩余的ROI从其他的IOU在0.1-0.5之间的选,这些是背景样本。(The lower threshold of 0.1 appears to act as a heuristic for hard example mining ???)训练过程中,图片有50%的可能性会发生水平反转。不需要进行其他的数据增强。
Back-propagation through RoI pooling layers。
反向传播经过RoI池化层。为了清楚起见,我们假设每一个batch只有一张图片。结论是有扩展性的,因为传播对每一张图片都是独立的。

SGD hyper-parameters
用于Softmax分类和检测框回归的全连接层的权重分别使用具有方差0.01和0.001的零均值高斯分布初始化。偏置初始化为0。所有层的权重学习率为1倍的全局学习率,偏置为2倍的全局学习率,全局学习率为0.001。 当对VOC07或VOC12 trainval训练时,我们运行SGD进行30k次小批量迭代,然后将学习率降低到0.0001,再训练10k次迭代。当我们训练更大的数据集,我们运行SGD更多的迭代,如下文所述。 使用0.9的动量和0.0005的参数衰减。
2.4 Scale invariance
两种实现尺度不变对象检测的方法:(1)通过“brute force”学习和(2)通过使用图像金字塔。 在“brute force”方法中,在训练和测试期间以预定义的像素大小处理每个图像。网络必须直接从训练数据学习尺度不变性目标检测。相反,多尺度方法通过图像金字塔向网络提供近似尺度不变性。 在测试时,图像金字塔用于大致缩放-规范化每个候选框。 在多尺度训练期间,我们在每次图像采样时随机采样金字塔尺度,遵循5,作为数据增强的形式。由于GPU内存限制,我们只对较小的网络进行多尺度训练。
3.Fast RCNN detection
一旦网络被预先微调好了,检测就相当于是网络进行前向。网络会将一张图片和一系列目标候选框作为输入。在测试的时候,输入进的候选框大约是2000个。
对于每一个测试Roi,前向输出了类别概率的分布,以及大约的预测框的偏移量。之后对每一个类别进行非最大值抑制。

3.1Truncated SVD for faster detection
对于图像分类的过程,花费在全连接层的时间要比花费在卷积层的时间要少。与之相反的,检测的时候大约一半的时间都花费在了全连接层上了。通过这种truncated svd的方法可以压缩这些用在全连接层上的时间。

4 Main result
本文主要有三个成就
1.在三个数据集上取得了最好的效果
2.和RCNN 以及Sppnet相比训练和检测更快了
3.VGG16网络的微调 提升了最后的mAP

4.1 Experimental setup
我们的实验有三个预训练的Imagenet 模型。我们的实验使用了三个经过预训练的ImageNet网络模型,这些模型可以在线获得第一个是来自R-CNN3的CaffeNet(实质上是AlexNet1)。 我们将这个CaffeNet称为模型S,即小模型。第二网络是来自14的VGG_CNN_M_1024,其具有与S相同的深度,但是更宽。 我们把这个网络模型称为M,即中等模型。最后一个网络是来自15的非常深的VGG16模型。由于这个模型是最大的,我们称之为L。在本节中,所有实验都使用单尺度训练和测试。

5 Design evaluation

我们通过实验来了解Fast RCNN与R-CNN和SPPnet的比较,以及评估设计决策。按照最佳实践,我们在PASCAL VOC07数据集上进行了这些实验。

5.1 Does multi-task training help?

多任务训练是方便的,因为避免了管理顺序训练任务流水线。也有潜力提高训练结果,因为任务之间通过共享的表示来相互影响。那么,多任务能否提高fast RCNN中目标检测的准确性呢?
5.2 Scale invariance to brute force or fitness
我们比较两个策略实现尺度不变物体检测:暴力学习(单尺度)和图像金字塔(多尺度)。在任一情况下,我们将图像的尺度定义为其最短边的长度。
所有单尺度实验使用像素,对于一些图像,可以小于600,因为我们保持横纵比缩放图像,并限制其最长边为1000像素。选择这些值使得VGG16在微调期间不至于GPU内存不足。较小的模型占用显存更少,所以可受益于较大的值。然而,每个模型的优化不是我们的主要的关注点。我们注意到PASCAL图像是384×473像素的,因此单尺度设置通常以1.6倍的倍数上采样图像。因此,RoI池化层的平均有效步进为约10像素。在多尺度设置中,我们使用5中指定的相同的五个尺度以方便与SPPnet进行比较。但是,我们以2000像素为上限,以避免GPU内存不足。表7显示了当使用一个或五个尺度进行训练和测试时的模型S和M的结果。也许在5中最令人惊讶的结果是单尺度检测几乎与多尺度检测一样好。我们的研究结果能证明他们的结果:深度卷积网络擅长直接学习尺度不变性。多尺度方法消耗大量的计算时间仅带来了很小的mAP增加(表7)。在VGG16(模型L)的情况下,我们受限于实施细节仅能使用单个尺度。然而,它得到了66.9%的mAP,略高于R-CNN的66.0%19,尽管R-CNN在每个候选区域被缩放为规范大小,在意义上使用了“无限”尺度。由于单尺度处理提供速度和精度之间的最佳折衷,特别是对于非常深的模型,本小节以外的所有实验使用单尺度训练和测试,像素。
5.3 Do we need more training data?
当提供更多的数据时,好的检测器的效果会变好。DPM很容易就饱和了,这里进行了一系列的数据增加的工作,mAP会有所提高。

5.4 DO SVMS outperform softmax?
Fast rcnn使用的是softmax分类器,rcnn和sppnet使用的是svm。这里进行了几组对照实验,来看一下哪一种更好。对于fast rcnn来说,这三种网络中,都是softmax更好,不过好的不多。这论证了一次微调比之前多级训练方法来说已经是足够了。

5.5 Are more proposals always better?
Not yet

6 Conclusion
本文提出Fast R-CNN,一个对R-CNN和SPPnet干净,快速的更新。 除了报告目前的检测结果之外,我们还提供了详细的实验,希望提供新的见解。 特别值得注意的是,稀疏目标候选区域似乎提高了检测器的质量。 过去探索这个问题过于昂贵(在时间上),但Fast R-CNN使其变得可能。当然,可能存在允许dense box执行以及稀疏候选框的尚未发现的技术。这样的方法如果被开发,可以帮助进一步加速目标检测。Fast RCNN
Abstract
本文提出了一种快速基于区域的卷积网络目标检测方法(Fast RCNN)。Fast RCNN基于之前使用深度卷积网络来更好的进行候选目标区域分类的工作基础之上。和之前的工作相比,Fast RCNN提供了几种创新来提高训练和测试的速度并提升了检测的准确性。Fast RCNN训练VGG16的速度要比RCNN快9倍,在测试时的快213倍,并在PASCAL VOC上实现了更高的mAP。和SPPnet相比,Fast RCNN训练VGG16的速度快上3倍,测试时快10倍并且更加准确。Fast RCNN由python 和C++实现,并且已经开源。
Introduction
近来,深度卷积网络已经显著提升了图像分类和目标检测的准确性。和图像分类相比,目标检测是一个更具有挑战性的工作,需要更复杂的方法解决。由于其复杂性,当前的模型训练方法一般是多阶段,并且十分缓慢且精度不高。
复杂性的上升是由于检测需要对物体的位置进行准确的定位,这就有两个首要的问题。其一,许多候选的物体位置需要被处理。其二,这些候选区域只提供粗略的位置并且必须被修正来提供更加精确的定位。解决这些问题的方法通常需要牺牲,速度,准确性和模型的简单性。
在本文中,我们依次展示了当前最先进的基于卷积网络的目标检测器的训练过程。我们提出了一个单阶段训练方法,联合学习候选区域分类以及修正空间定位的精度。
这种方法训练VGG16的速度比RCNN快9倍,比SPPnet快3倍。在运行时,每张图片仅需要耗费0.3s,在PASCAL VOC 2012 上实现最高的准确率为66%。
R-CNN and SPPnet
RCNN通过使用深度卷积神经网络来分类目标候选区域实现了极好的目标检测准确性。不过,它也有一些显著的缺陷。1.训练是一个多阶段的过程。R-CNN首先在目标候选框上使用log损失来微调神经网络。之后,用卷积网络学习到的特征来调整SVM。这些SVM分类器的作用是目标检测器,代替了通过微调学习到的softmax分类器。在第三个训练阶段,学习到了bounding-box回归器。2.训练十分的耗费空间和时间。对于SVM以及bounding box回归器的训练来说,会从每张图片的每一个候选区域中提取特征并写入到磁盘中。使用很深的网络,例如VGG16,这个过程大约5000个图像在单个GPU上要花费2.5天。这些特征需要数百G的存储空间。3.目标检测的速度很慢。在测试时。特征会从每张图片上的每个候选区域中提取。在一块GPU上检测一张图片需要花费47s。
RCNN很慢是因为它对每一个候选区域进行卷积网络前传,而不进行计算共享。空间金字塔池化网络(SPPnets)被提出出来通过计算共享来对RCNN进行加速。SPPnet网络对每一个完整的图像计算卷积特征图,之后使用从共享的特征图中提取出来的特征向量来对每一个候选区域进行分类。特征通过最大池化候选区域中特征图部分而被提取出来并转化为固定大小。多个输出被池化,之后连接成最大金字塔。SPPnet在测试时可以将RCNN加速到10到100倍。训练的时间也因为更快的特征提取而被减少了三倍。
不过,SPPnet也有一些显著的缺陷。就像RCNN一样,训练过程是一个多阶段的流水线,包含了特征提取,使用log损失来对网络进行微调,训练SVMs,以及最后的bounding box 回归器的拟合。特征也会被写入到磁盘当中。但是不像RCNN,微调算法不能更新空间金字塔之前的卷积层。不难预料,这种限制使得对于很深的网络来说,其准确性受到了限制。
Contribution
我们提出了一种新的算法,很好的解决了RCNN以及SPPnet中存在的问题,并且提高了准确性以及速度。Fast RCNN有以下几个优点。1、map值高于RCNN以及SPPnet。2、训练过程使用多任务loss,只有一个阶段。3、训练可以更新所有的网络层。4、不需要存储提取出来的特征。

Architecture and training
图1展示了Fast RCNN的结构。Fast RCNN网络将一整张图片以及一系列目标候选区域作为输入。网络首先用几个卷积层来对整张图片进行处理,之后使用一个最大池化层来产生卷积特征图。对于每一个候选框,ROI池化层从特征图中抽取固定大小的特征向量。每个向量被喂到一系列的池化层中,之后产生两个同级的向量层:其中一个输出K个类别加一个背景类别的概率估计,另一个为K个类别中每一个类别输出4个真实值。每一组值都是对某一个类别回归框位置的修正。
The RoI pooling layer
RoI池化层使用最大池化来将roi区域中有价值的特征转化为一个小的特征图,固定的大小为H*W。H和W是这一层的超参,独立于任何的RoI之外。在本文之中,RoI是卷积特征图中的一个矩形窗口。每一个RoI都是有四个值确定的。
RoI最大池化通过将窗口分成一系列的子窗口,并得出大约的面积。然后对每一个子窗口输出进行最大池化,将输出合并到相应的输出单元之中。同标准的最大池化一样,池化操作是对每一个特征图通道单独作用的。
Initiaizing from pre-trained networks
用了三个预训练的ImageNet网络进行预训练,每个网络有5个最大池化层以及5到13个卷积层。当预训练网络初始化一个Fast RCNN网络时,会进行三个变体。
首先,最后一个最大池化层会被ROI池化层所代替。
其次,网络的最后一个全连接层和softmax层会被之前描述过的两个同级层所代替。
第三,网络被修正成两个输入,一系列图片,以及这些图片上的一系列ROI。
Fine-tuning for detection
对于Fast RCNN来说,用反向传播算法计算所有的网络权重是十分重要的能力。首先,先阐述一下,为什么sPPnet无法更新位于空间金字塔下面的层的权重。
根本原因是,当训练样本来自于不同的图片时SPP的反向传播算法是十分低效率的。(why?如果都来自于一张图片是否就高效?)这也正是RCNN以及SPPnet的训练方式。这种低效率的原因是每个ROI的感受野太大了,有时候甚至包括了整个图片。由于正向传播算法必须处理整个感受野,训练的输入经常很大。
我们提出了一种效率更高的方式,即在训练过程中特征共享。Fast RCNN中的SGD的批量的采样是分层的,先采图片,再对每个图片采样ROI。ROI来自于同一个图片,可以减少正向以及反向的计算和存储。当我们使得图片的数量减少时,就可以使得mini-batch的计算减少。
这种想法,有可能会因为ROI之间的相关性使得训练收敛变慢,不过实际使用时这个问题并没有发生。
为了分层采样,Fast RCNN采用了流水线的训练过程,使用了一个微调联合优化了一个softmax分类器和bounding box回归器,而不是在三个阶段,分别训练一个softmax分类器。SVM以及回归器。

Multi-task loss
Fast RCNN有两个同级的输出层。第一个输出K+1上的类别概率,这是通过全连接层上的softmax实现的。第二个输出bounding box回归的偏移量。、
每一个训练的ROI的label 包含了类别和框。我们用一个多任务的loss来联合训练分类和bounding box回归。Loss如下:

对于背景ROI没有bounding box,因此它的第二个loss也就自动忽略了。对于bounding box回归的loss的具体展开如下。

其中L1是比较鲁棒的,对于异常点不是十分敏感,与之相比RCNN以及SPPnet中的L2就相对敏感。当回归的目标无界的时候,,带有L2损失的训练需要更仔细的微调学习率来防止梯度爆炸。
等式1中的超参控制着两个loss的平衡。
Mini-batch sampling
在微调阶段,每个SGD小批量是由2张图片构成的。Batch的size是128,每张图片上采样64个ROI。我们从候选框中选择25%的ROI,这些的IoU至少是0.5。这些ROI包含了被标记为前景物体的目标类别。剩余的ROI从其他的IOU在0.1-0.5之间的选,这些是背景样本。(The lower threshold of 0.1 appears to act as a heuristic for hard example mining ???)训练过程中,图片有50%的可能性会发生水平反转。不需要进行其他的数据增强。
Back-propagation through RoI pooling layers。
反向传播经过RoI池化层。为了清楚起见,我们假设每一个batch只有一张图片。结论是有扩展性的,因为传播对每一张图片都是独立的。

SGD hyper-parameters
用于Softmax分类和检测框回归的全连接层的权重分别使用具有方差0.01和0.001的零均值高斯分布初始化。偏置初始化为0。所有层的权重学习率为1倍的全局学习率,偏置为2倍的全局学习率,全局学习率为0.001。 当对VOC07或VOC12 trainval训练时,我们运行SGD进行30k次小批量迭代,然后将学习率降低到0.0001,再训练10k次迭代。当我们训练更大的数据集,我们运行SGD更多的迭代,如下文所述。 使用0.9的动量和0.0005的参数衰减。
2.4 Scale invariance
两种实现尺度不变对象检测的方法:(1)通过“brute force”学习和(2)通过使用图像金字塔。 在“brute force”方法中,在训练和测试期间以预定义的像素大小处理每个图像。网络必须直接从训练数据学习尺度不变性目标检测。相反,多尺度方法通过图像金字塔向网络提供近似尺度不变性。 在测试时,图像金字塔用于大致缩放-规范化每个候选框。 在多尺度训练期间,我们在每次图像采样时随机采样金字塔尺度,遵循5,作为数据增强的形式。由于GPU内存限制,我们只对较小的网络进行多尺度训练。
3.Fast RCNN detection
一旦网络被预先微调好了,检测就相当于是网络进行前向。网络会将一张图片和一系列目标候选框作为输入。在测试的时候,输入进的候选框大约是2000个。
对于每一个测试Roi,前向输出了类别概率的分布,以及大约的预测框的偏移量。之后对每一个类别进行非最大值抑制。

3.1Truncated SVD for faster detection
对于图像分类的过程,花费在全连接层的时间要比花费在卷积层的时间要少。与之相反的,检测的时候大约一半的时间都花费在了全连接层上了。通过这种truncated svd的方法可以压缩这些用在全连接层上的时间。

4 Main result
本文主要有三个成就
1.在三个数据集上取得了最好的效果
2.和RCNN 以及Sppnet相比训练和检测更快了
3.VGG16网络的微调 提升了最后的mAP

4.1 Experimental setup
我们的实验有三个预训练的Imagenet 模型。我们的实验使用了三个经过预训练的ImageNet网络模型,这些模型可以在线获得第一个是来自R-CNN3的CaffeNet(实质上是AlexNet1)。 我们将这个CaffeNet称为模型S,即小模型。第二网络是来自14的VGG_CNN_M_1024,其具有与S相同的深度,但是更宽。 我们把这个网络模型称为M,即中等模型。最后一个网络是来自15的非常深的VGG16模型。由于这个模型是最大的,我们称之为L。在本节中,所有实验都使用单尺度训练和测试。

5 Design evaluation

我们通过实验来了解Fast RCNN与R-CNN和SPPnet的比较,以及评估设计决策。按照最佳实践,我们在PASCAL VOC07数据集上进行了这些实验。

5.1 Does multi-task training help?

多任务训练是方便的,因为避免了管理顺序训练任务流水线。也有潜力提高训练结果,因为任务之间通过共享的表示来相互影响。那么,多任务能否提高fast RCNN中目标检测的准确性呢?
5.2 Scale invariance to brute force or fitness
我们比较两个策略实现尺度不变物体检测:暴力学习(单尺度)和图像金字塔(多尺度)。在任一情况下,我们将图像的尺度定义为其最短边的长度。
所有单尺度实验使用像素,对于一些图像,可以小于600,因为我们保持横纵比缩放图像,并限制其最长边为1000像素。选择这些值使得VGG16在微调期间不至于GPU内存不足。较小的模型占用显存更少,所以可受益于较大的值。然而,每个模型的优化不是我们的主要的关注点。我们注意到PASCAL图像是384×473像素的,因此单尺度设置通常以1.6倍的倍数上采样图像。因此,RoI池化层的平均有效步进为约10像素。在多尺度设置中,我们使用5中指定的相同的五个尺度以方便与SPPnet进行比较。但是,我们以2000像素为上限,以避免GPU内存不足。表7显示了当使用一个或五个尺度进行训练和测试时的模型S和M的结果。也许在5中最令人惊讶的结果是单尺度检测几乎与多尺度检测一样好。我们的研究结果能证明他们的结果:深度卷积网络擅长直接学习尺度不变性。多尺度方法消耗大量的计算时间仅带来了很小的mAP增加(表7)。在VGG16(模型L)的情况下,我们受限于实施细节仅能使用单个尺度。然而,它得到了66.9%的mAP,略高于R-CNN的66.0%19,尽管R-CNN在每个候选区域被缩放为规范大小,在意义上使用了“无限”尺度。由于单尺度处理提供速度和精度之间的最佳折衷,特别是对于非常深的模型,本小节以外的所有实验使用单尺度训练和测试,像素。
5.3 Do we need more training data?
当提供更多的数据时,好的检测器的效果会变好。DPM很容易就饱和了,这里进行了一系列的数据增加的工作,mAP会有所提高。

5.4 DO SVMS outperform softmax?
Fast rcnn使用的是softmax分类器,rcnn和sppnet使用的是svm。这里进行了几组对照实验,来看一下哪一种更好。对于fast rcnn来说,这三种网络中,都是softmax更好,不过好的不多。这论证了一次微调比之前多级训练方法来说已经是足够了。

5.5 Are more proposals always better?
Not yet

6 Conclusion
本文提出Fast R-CNN,一个对R-CNN和SPPnet干净,快速的更新。 除了报告目前的检测结果之外,我们还提供了详细的实验,希望提供新的见解。 特别值得注意的是,稀疏目标候选区域似乎提高了检测器的质量。 过去探索这个问题过于昂贵(在时间上),但Fast R-CNN使其变得可能。当然,可能存在允许dense box执行以及稀疏候选框的尚未发现的技术。这样的方法如果被开发,可以帮助进一步加速目标检测。Fast RCNN
Abstract
本文提出了一种快速基于区域的卷积网络目标检测方法(Fast RCNN)。Fast RCNN基于之前使用深度卷积网络来更好的进行候选目标区域分类的工作基础之上。和之前的工作相比,Fast RCNN提供了几种创新来提高训练和测试的速度并提升了检测的准确性。Fast RCNN训练VGG16的速度要比RCNN快9倍,在测试时的快213倍,并在PASCAL VOC上实现了更高的mAP。和SPPnet相比,Fast RCNN训练VGG16的速度快上3倍,测试时快10倍并且更加准确。Fast RCNN由python 和C++实现,并且已经开源。
Introduction
近来,深度卷积网络已经显著提升了图像分类和目标检测的准确性。和图像分类相比,目标检测是一个更具有挑战性的工作,需要更复杂的方法解决。由于其复杂性,当前的模型训练方法一般是多阶段,并且十分缓慢且精度不高。
复杂性的上升是由于检测需要对物体的位置进行准确的定位,这就有两个首要的问题。其一,许多候选的物体位置需要被处理。其二,这些候选区域只提供粗略的位置并且必须被修正来提供更加精确的定位。解决这些问题的方法通常需要牺牲,速度,准确性和模型的简单性。
在本文中,我们依次展示了当前最先进的基于卷积网络的目标检测器的训练过程。我们提出了一个单阶段训练方法,联合学习候选区域分类以及修正空间定位的精度。
这种方法训练VGG16的速度比RCNN快9倍,比SPPnet快3倍。在运行时,每张图片仅需要耗费0.3s,在PASCAL VOC 2012 上实现最高的准确率为66%。
R-CNN and SPPnet
RCNN通过使用深度卷积神经网络来分类目标候选区域实现了极好的目标检测准确性。不过,它也有一些显著的缺陷。1.训练是一个多阶段的过程。R-CNN首先在目标候选框上使用log损失来微调神经网络。之后,用卷积网络学习到的特征来调整SVM。这些SVM分类器的作用是目标检测器,代替了通过微调学习到的softmax分类器。在第三个训练阶段,学习到了bounding-box回归器。2.训练十分的耗费空间和时间。对于SVM以及bounding box回归器的训练来说,会从每张图片的每一个候选区域中提取特征并写入到磁盘中。使用很深的网络,例如VGG16,这个过程大约5000个图像在单个GPU上要花费2.5天。这些特征需要数百G的存储空间。3.目标检测的速度很慢。在测试时。特征会从每张图片上的每个候选区域中提取。在一块GPU上检测一张图片需要花费47s。
RCNN很慢是因为它对每一个候选区域进行卷积网络前传,而不进行计算共享。空间金字塔池化网络(SPPnets)被提出出来通过计算共享来对RCNN进行加速。SPPnet网络对每一个完整的图像计算卷积特征图,之后使用从共享的特征图中提取出来的特征向量来对每一个候选区域进行分类。特征通过最大池化候选区域中特征图部分而被提取出来并转化为固定大小。多个输出被池化,之后连接成最大金字塔。SPPnet在测试时可以将RCNN加速到10到100倍。训练的时间也因为更快的特征提取而被减少了三倍。
不过,SPPnet也有一些显著的缺陷。就像RCNN一样,训练过程是一个多阶段的流水线,包含了特征提取,使用log损失来对网络进行微调,训练SVMs,以及最后的bounding box 回归器的拟合。特征也会被写入到磁盘当中。但是不像RCNN,微调算法不能更新空间金字塔之前的卷积层。不难预料,这种限制使得对于很深的网络来说,其准确性受到了限制。
Contribution
我们提出了一种新的算法,很好的解决了RCNN以及SPPnet中存在的问题,并且提高了准确性以及速度。Fast RCNN有以下几个优点。1、map值高于RCNN以及SPPnet。2、训练过程使用多任务loss,只有一个阶段。3、训练可以更新所有的网络层。4、不需要存储提取出来的特征。

Architecture and training
图1展示了Fast RCNN的结构。Fast RCNN网络将一整张图片以及一系列目标候选区域作为输入。网络首先用几个卷积层来对整张图片进行处理,之后使用一个最大池化层来产生卷积特征图。对于每一个候选框,ROI池化层从特征图中抽取固定大小的特征向量。每个向量被喂到一系列的池化层中,之后产生两个同级的向量层:其中一个输出K个类别加一个背景类别的概率估计,另一个为K个类别中每一个类别输出4个真实值。每一组值都是对某一个类别回归框位置的修正。
The RoI pooling layer
RoI池化层使用最大池化来将roi区域中有价值的特征转化为一个小的特征图,固定的大小为H*W。H和W是这一层的超参,独立于任何的RoI之外。在本文之中,RoI是卷积特征图中的一个矩形窗口。每一个RoI都是有四个值确定的。
RoI最大池化通过将窗口分成一系列的子窗口,并得出大约的面积。然后对每一个子窗口输出进行最大池化,将输出合并到相应的输出单元之中。同标准的最大池化一样,池化操作是对每一个特征图通道单独作用的。
Initiaizing from pre-trained networks
用了三个预训练的ImageNet网络进行预训练,每个网络有5个最大池化层以及5到13个卷积层。当预训练网络初始化一个Fast RCNN网络时,会进行三个变体。
首先,最后一个最大池化层会被ROI池化层所代替。
其次,网络的最后一个全连接层和softmax层会被之前描述过的两个同级层所代替。
第三,网络被修正成两个输入,一系列图片,以及这些图片上的一系列ROI。
Fine-tuning for detection
对于Fast RCNN来说,用反向传播算法计算所有的网络权重是十分重要的能力。首先,先阐述一下,为什么sPPnet无法更新位于空间金字塔下面的层的权重。
根本原因是,当训练样本来自于不同的图片时SPP的反向传播算法是十分低效率的。(why?如果都来自于一张图片是否就高效?)这也正是RCNN以及SPPnet的训练方式。这种低效率的原因是每个ROI的感受野太大了,有时候甚至包括了整个图片。由于正向传播算法必须处理整个感受野,训练的输入经常很大。
我们提出了一种效率更高的方式,即在训练过程中特征共享。Fast RCNN中的SGD的批量的采样是分层的,先采图片,再对每个图片采样ROI。ROI来自于同一个图片,可以减少正向以及反向的计算和存储。当我们使得图片的数量减少时,就可以使得mini-batch的计算减少。
这种想法,有可能会因为ROI之间的相关性使得训练收敛变慢,不过实际使用时这个问题并没有发生。
为了分层采样,Fast RCNN采用了流水线的训练过程,使用了一个微调联合优化了一个softmax分类器和bounding box回归器,而不是在三个阶段,分别训练一个softmax分类器。SVM以及回归器。

Multi-task loss
Fast RCNN有两个同级的输出层。第一个输出K+1上的类别概率,这是通过全连接层上的softmax实现的。第二个输出bounding box回归的偏移量。、
每一个训练的ROI的label 包含了类别和框。我们用一个多任务的loss来联合训练分类和bounding box回归。Loss如下:

对于背景ROI没有bounding box,因此它的第二个loss也就自动忽略了。对于bounding box回归的loss的具体展开如下。

其中L1是比较鲁棒的,对于异常点不是十分敏感,与之相比RCNN以及SPPnet中的L2就相对敏感。当回归的目标无界的时候,,带有L2损失的训练需要更仔细的微调学习率来防止梯度爆炸。
等式1中的超参控制着两个loss的平衡。
Mini-batch sampling
在微调阶段,每个SGD小批量是由2张图片构成的。Batch的size是128,每张图片上采样64个ROI。我们从候选框中选择25%的ROI,这些的IoU至少是0.5。这些ROI包含了被标记为前景物体的目标类别。剩余的ROI从其他的IOU在0.1-0.5之间的选,这些是背景样本。(The lower threshold of 0.1 appears to act as a heuristic for hard example mining ???)训练过程中,图片有50%的可能性会发生水平反转。不需要进行其他的数据增强。
Back-propagation through RoI pooling layers。
反向传播经过RoI池化层。为了清楚起见,我们假设每一个batch只有一张图片。结论是有扩展性的,因为传播对每一张图片都是独立的。

SGD hyper-parameters
用于Softmax分类和检测框回归的全连接层的权重分别使用具有方差0.01和0.001的零均值高斯分布初始化。偏置初始化为0。所有层的权重学习率为1倍的全局学习率,偏置为2倍的全局学习率,全局学习率为0.001。 当对VOC07或VOC12 trainval训练时,我们运行SGD进行30k次小批量迭代,然后将学习率降低到0.0001,再训练10k次迭代。当我们训练更大的数据集,我们运行SGD更多的迭代,如下文所述。 使用0.9的动量和0.0005的参数衰减。
2.4 Scale invariance
两种实现尺度不变对象检测的方法:(1)通过“brute force”学习和(2)通过使用图像金字塔。 在“brute force”方法中,在训练和测试期间以预定义的像素大小处理每个图像。网络必须直接从训练数据学习尺度不变性目标检测。相反,多尺度方法通过图像金字塔向网络提供近似尺度不变性。 在测试时,图像金字塔用于大致缩放-规范化每个候选框。 在多尺度训练期间,我们在每次图像采样时随机采样金字塔尺度,遵循5,作为数据增强的形式。由于GPU内存限制,我们只对较小的网络进行多尺度训练。
3.Fast RCNN detection
一旦网络被预先微调好了,检测就相当于是网络进行前向。网络会将一张图片和一系列目标候选框作为输入。在测试的时候,输入进的候选框大约是2000个。
对于每一个测试Roi,前向输出了类别概率的分布,以及大约的预测框的偏移量。之后对每一个类别进行非最大值抑制。

3.1Truncated SVD for faster detection
对于图像分类的过程,花费在全连接层的时间要比花费在卷积层的时间要少。与之相反的,检测的时候大约一半的时间都花费在了全连接层上了。通过这种truncated svd的方法可以压缩这些用在全连接层上的时间。

4 Main result
本文主要有三个成就
1.在三个数据集上取得了最好的效果
2.和RCNN 以及Sppnet相比训练和检测更快了
3.VGG16网络的微调 提升了最后的mAP

4.1 Experimental setup
我们的实验有三个预训练的Imagenet 模型。我们的实验使用了三个经过预训练的ImageNet网络模型,这些模型可以在线获得第一个是来自R-CNN3的CaffeNet(实质上是AlexNet1)。 我们将这个CaffeNet称为模型S,即小模型。第二网络是来自14的VGG_CNN_M_1024,其具有与S相同的深度,但是更宽。 我们把这个网络模型称为M,即中等模型。最后一个网络是来自15的非常深的VGG16模型。由于这个模型是最大的,我们称之为L。在本节中,所有实验都使用单尺度训练和测试。

5 Design evaluation

我们通过实验来了解Fast RCNN与R-CNN和SPPnet的比较,以及评估设计决策。按照最佳实践,我们在PASCAL VOC07数据集上进行了这些实验。

5.1 Does multi-task training help?

多任务训练是方便的,因为避免了管理顺序训练任务流水线。也有潜力提高训练结果,因为任务之间通过共享的表示来相互影响。那么,多任务能否提高fast RCNN中目标检测的准确性呢?
5.2 Scale invariance to brute force or fitness
我们比较两个策略实现尺度不变物体检测:暴力学习(单尺度)和图像金字塔(多尺度)。在任一情况下,我们将图像的尺度定义为其最短边的长度。
所有单尺度实验使用像素,对于一些图像,可以小于600,因为我们保持横纵比缩放图像,并限制其最长边为1000像素。选择这些值使得VGG16在微调期间不至于GPU内存不足。较小的模型占用显存更少,所以可受益于较大的值。然而,每个模型的优化不是我们的主要的关注点。我们注意到PASCAL图像是384×473像素的,因此单尺度设置通常以1.6倍的倍数上采样图像。因此,RoI池化层的平均有效步进为约10像素。在多尺度设置中,我们使用5中指定的相同的五个尺度以方便与SPPnet进行比较。但是,我们以2000像素为上限,以避免GPU内存不足。表7显示了当使用一个或五个尺度进行训练和测试时的模型S和M的结果。也许在5中最令人惊讶的结果是单尺度检测几乎与多尺度检测一样好。我们的研究结果能证明他们的结果:深度卷积网络擅长直接学习尺度不变性。多尺度方法消耗大量的计算时间仅带来了很小的mAP增加(表7)。在VGG16(模型L)的情况下,我们受限于实施细节仅能使用单个尺度。然而,它得到了66.9%的mAP,略高于R-CNN的66.0%19,尽管R-CNN在每个候选区域被缩放为规范大小,在意义上使用了“无限”尺度。由于单尺度处理提供速度和精度之间的最佳折衷,特别是对于非常深的模型,本小节以外的所有实验使用单尺度训练和测试,像素。
5.3 Do we need more training data?
当提供更多的数据时,好的检测器的效果会变好。DPM很容易就饱和了,这里进行了一系列的数据增加的工作,mAP会有所提高。

5.4 DO SVMS outperform softmax?
Fast rcnn使用的是softmax分类器,rcnn和sppnet使用的是svm。这里进行了几组对照实验,来看一下哪一种更好。对于fast rcnn来说,这三种网络中,都是softmax更好,不过好的不多。这论证了一次微调比之前多级训练方法来说已经是足够了。

5.5 Are more proposals always better?
Not yet

6 Conclusion
本文提出Fast R-CNN,一个对R-CNN和SPPnet干净,快速的更新。 除了报告目前的检测结果之外,我们还提供了详细的实验,希望提供新的见解。 特别值得注意的是,稀疏目标候选区域似乎提高了检测器的质量。 过去探索这个问题过于昂贵(在时间上),但Fast R-CNN使其变得可能。当然,可能存在允许dense box执行以及稀疏候选框的尚未发现的技术。这样的方法如果被开发,可以帮助进一步加速目标检测。

深度学习之卷积神经网络CNN做手写体识别的VS代码。支持linux版本和VS2012版本。 tiny-cnn: A C++11 implementation of convolutional neural networks ======== tiny-cnn is a C++11 implementation of convolutional neural networks. design principle ----- * fast, without GPU 98.8% accuracy on MNIST in 13 minutes training (@Core i7-3520M) * header only, policy-based design supported networks ----- ### layer-types * fully-connected layer * convolutional layer * average pooling layer ### activation functions * tanh * sigmoid * rectified linear * identity ### loss functions * cross-entropy * mean-squared-error ### optimization algorithm * stochastic gradient descent (with/without L2 normalization) * stochastic gradient levenberg marquardt dependencies ----- * boost C++ library * Intel TBB sample code ------ ```cpp #include "tiny_cnn.h" using namespace tiny_cnn; // specify loss-function and optimization-algorithm typedef network CNN; // tanh, 32x32 input, 5x5 window, 1-6 feature-maps convolution convolutional_layer C1(32, 32, 5, 1, 6); // tanh, 28x28 input, 6 feature-maps, 2x2 subsampling average_pooling_layer S2(28, 28, 6, 2); // fully-connected layers fully_connected_layer F3(14*14*6, 120); fully_connected_layer F4(120, 10); // connect all CNN mynet; mynet.add(&C1); mynet.add(&S2); mynet.add(&F3); mynet.add(&F4); assert(mynet.in_dim() == 32*32); assert(mynet.out_dim() == 10); ``` more sample, read main.cpp build sample program ------ ### gcc(4.6~) without tbb ./waf configure --BOOST_ROOT=your-boost-root ./waf build with tbb ./waf configure --TBB --TBB_ROOT=your-tbb-root --BOOST_ROOT=your-boost-root ./waf build with tbb and SSE/AVX ./waf configure --AVX --TBB --TBB_ROOT=your-tbb-root --BOOST_ROOT=your-boost-root ./waf build ./waf configure --SSE --TBB --TBB_ROOT=your-tbb-root --BOOST_ROOT=your-boost-root ./waf build or edit inlude/config.h to customize default behavior. ### vc(2012~) open vc/tiny_cnn.sln and build in release mode.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值