SPPnet出来之后,RBG大神迅速回怼,抛出了更快更好的Fast-RCNN。新的思路是, 将之前的多阶段训练合并成了单阶段训练,面对灵活尺寸问题,大神借鉴了空间金字塔的思路,使用了一层的空间金字塔。
摘要
本文提出了一个快速的基于区域推荐的卷积网络方法(Fast R-CNN)用于对象检测。Fast R-CNN在前人工作的基础上使用深度卷积网络,可以更有效地分类物体推荐。相比之前的工作,Fast R-CNN进行了多项创新,在提高了检测精度的同时,也提高了训练和测试速度。Fast R-CNN训练了一个超深VGG16网络,训练时间比R-CNN快9倍,测试时间快213倍,在PASCAL VOC2012上达到了更高的mAP。相比SPPnet,Fast R-CNN训练快3倍,测试快10倍,并且更加准确。
介绍
近来,深度卷积网络在图像分类和物体检测精度上进展显著。相比物体分类,物体定位更具挑战,需要更加复杂的方法。由于其复杂性,当前的方法都是多阶段流水线模型训练,缓慢而粗放。复杂度源于检测需要物体的精准位置信息,带来了两个基本挑战。【提出了检测问题的两个基本挑战】
一、大量候选位置需要处理(“推荐”proposals)。
二、候选框的位置比较粗糙,必须进一步细化才能精准定位。对这些问题的解决包括速度、精度或简易性。
本文将梳理现代卷积网络物体检测器的训练流程[9][11]。提出一个单阶段训练算法,既能学习“对推荐框进行分类”,也能“精细空间位置”。
最终得到的方法可以训练一个深度检测网络(VGG16[20]),比R-CNN快9倍,比SPPnet快3倍。运行时,该检测网络每0.3s处理一张图片(不包括物体推荐的时间),而且在PASCAL VOC2012上的准确度达到新的高度,mAP66%(而R-CNN为62%)。
R-CNN和SPPnet
基于区域的深度卷积网络RCNN[9]通过使用“深度卷积网络“来分类,在物体proposal上达到了出色的物体检测成绩。但其缺点十分明显:
- 需要多阶段流水线训练。 R-CNN需要先使用log损失在物体的proposal上调优卷积网络,然后,还要让SVMs去适应卷机网络的特征。这些SVMs取代了通过调优学到的softmax分类器,成为物体检测器。在第三阶段,还要进行约束框回归。
- 训练费时费空间。 对于SVM和约束框回归的训练,特征是从每张图片的每个物体proposal中抽取出来再写到硬盘的。对于非常深的网络,比如VGG16,对VOC07训练验证集这个过程需要消耗2.5GPU天。这些特征需要数百G的存储空间。
- 物体检测非常慢。 测试阶段,每张测试图像的每个物体proposal都要进行特征抽取。VGG16检测每张图像需要在GPU上耗费47s。
R-CNN如此之慢,就是因为在每个proposal上都是用卷积网络,没有共享计算。空间金字塔池化网络(SPPnets)则通过共享计算加速了R-CNN。SPPnet方法对整张输入图像只计算一次卷积特征图,然后对每个对象proposal,使用从共享特征图中抽取出来的特征向量,进行分类。对于每一个推荐,通过最大池化推荐框内的部分特征图,到一个固定尺寸(比如6×6)的输出,来抽取特征。多个输出尺寸被池化,然后再使用空间金字塔池化进行连接。SPPnet在测试阶段加速了R-CNN大概10到100倍。训练时间也缩减了3倍,因为特征的抽取快了很多。
SPPnet也有明显的缺点。像R-CNN一样,它也训练一个多阶段流水线涉及到特征抽取、使用log loss调优网络,训练SVMs,最后再进行约束框回归。特征还要写到硬盘。但不同于R-CNN的是,调优算法没法更新空间金字塔池化层前面的卷积层。不出所料,这个限制(固定的卷积层)限制了非常深的网络的精度。
贡献
我们提出一个全新的训练算法,可以解决R-CNN和SPPnet的这些缺点,还能提高速度和精度。因为其在训练和测试阶段都明显地快,所以我们称之为Fast R-CNN。Fast R-CNN方法有多个优点:
- 更高的检测精度(mAP)
- 使用多任务loss进行单阶段训练
- 训练可以更新所有层
- 不需要硬盘存储特征缓存
Fast R-CNN架构和训练
下图展示了Fast R-CNN的架构。一个Fast R-CNN网络将整张图片和一组对象proposal作为输入。网络首先使用卷积网络和最大池化处理整张图像产生卷积特征图。然后对每个对象proposal,一个RoI(Region of Interest)池化层从特征图中抽取出一个固定尺寸的特征向量。每个特征向量传递给后续一系列的全连接层(fc),这些全连接层,最终分裂成两个并行的输出层,一个用于产生K+1(1代表背景)类的softmax概率,一个针对每个对象类别输出四个实数值,每组实数值编码了对应类别的约束框bbx的位置。
训练细节
- 输入是224×224的固定大小图片;
- 经过5个卷积层+2个降采样层(分别跟在第一和第二个卷积层后面);
- 进入ROIPooling层(其输入是conv5层的输出和region proposal,region proposal个数大约为2000个);
- 再经过两个output都为4096维的全连接层;
- 分别经过output各为21和84维的全连接层(并列的,前者是分类输出,后者是回归输出);
- 最后接上两个损失层(分类是softmax,回归是smoothL1);
【进一步提升速度和无法优化网络的问题】大神提出了端到端训练的Fast R-CNN网络 。该网络用ROI(Region Of Interest)池化,可以看作空间金字塔池化的简化版本,即使用了一种池化尺度。此外,该网络将候选框回归任务也通过CNN实现,在卷积层后面的全连接层分为两支,一支用于识别目标类别,一支用于预测回归框所在位置及长宽。值得注意的是,为了实现端到端的训练,Fast R-CNN放弃了SVM分类器,而是选择微调后网络自身的softmax分类器。这样一来,特征提取,目标分类、候选框回归三部分可以同时进行端到端(end-to-end)训练。 (基于VGG16的Fast RCNN算法在训练速度上比RCNN快了将近9倍,比SPPnet快大概3倍;测试速度比RCNN快了213倍,比SPPnet快了10倍。在VOC2012上的mAP在66%左右)
ROI Pooling
由于region proposal的尺度各不相同,而期望提取出来的特征向量维度相同,因此需要某种特殊的技术来做保证。ROIPooling的提出便是为了解决这一问题的。
Roi pooling层也是pooling层的一种,只是针对于ROI们的pooling操作而已
Roi pooling层的过程就是为了将proposal抠出来的过程,然后resize到统一的大小。
Roi pooling层的操作如下:
• 1、根据输入的image,将Roi映射到feature map对应的位置;
• 2、将映射后的区域划分为相同大小的sections(H×W大小的网格sections数量和输出的维度相同);
• 3、对每个section进行max pooling操作;即每一个网格对应一个输出值)
• 4、将所有输出值组合起来便形成固定大小的feature map
【经后面研究,ROIpooling对非常深的网络很重要,也是增加了更深的可能性】
放上一张大佬的博客截图解释ROI来镇楼
训练样本
【从预训练网络中初始化】
我们实验了三个预训练ImageNet[4]网络,每个都有5个最大池化层,5-13个卷积层(见4.1节)。当用一个预训练的网络初始化一个Fast R-CNN网络需要经历三个转换。
一、最后的最大池化层要替换成RoI池化层,配置的参数H和W要与网络的第一个全连接层相适应(eg,对于VGG16来说,就是H=W=7)。
二、网络的最后一个卷积层和softmax(1000路ImageNet分类)层要替换成两个并行的层。一个是全连接层并输出K+1路的softmax,一个是类别相关的约束框回归器。
三、网络修改为接受两个数据输入:一组图像和一组这些图像的RoI。
【训练过程】
训练过程中每个mini-batch包含2张图像和128个region proposal(即ROI,64个ROI/张),其中大约25%的ROI和ground truth的IOU值大于0.5(即正样本),且只通过随机水平翻转进行数据增强。
Fast R-CNN在训练时通过共享训练使效率更高,比如每个mini-batch的训练样本来自N=2张输入图片,为了获取R=128个学习样本,需要从每张图片中采样R/N=64个ROI.由于对于同一张图片的不同ROI之间在前向传播和反向传播时是共享计算、共享内存的,因此相比于128个来自128个图片的ROI,网络有64倍的速度提升。
损失函数
我们知道Fast RCNN有两个输出,将多损失融合(分类损失和回归损失融合),【分类采用log loss(即对真实分类的概率取负log,分类输出K+1维),回归的loss和R-CNN基本一样。】
它是L1Loss,比较鲁棒,没有R-CNN和SPPnet中使用的L2 Loss对异常值那么敏感。当回归目标不受控时,使用L2 Loss训练需要更加细心的learning rate调整以避免梯度爆炸。等式3消除了这个敏感性。
等式中的超参数λ用于调整两个loss的平衡。我们归一化回归目标v_i到期望0和单位方差。所有的实验都是用λ = 1。
我们注意到[6]是用了一个相关的loss用于训练未知类物体推荐网络。不同于我们方法的是,[6]主张是用两个网络以分开定位和分类。Overfeat[19],R-CNN[9]和SPPnet[11]也分开训练分类器和约束框定位器,但这些方法都得分阶段进行训练,对来Fast R-CNN不是最佳选择(5.1节)。
多任务Loss:在此之前,不同的任务还是要训练不同的网络,从这里开始意识到卷积网络的特征提取的特性,从而用不同的损失函数来训练同一个网络的不同分支
如何定义不同的任务也是很大的问题,不仅是分类、回归不同,差别很大的分类也是。
训练整体架构总结
一旦一个Fast R-CNN调优好,检测就是运行一次前向传播(假设物体推荐已经事先计算好了!)。网络对输入的图像(或者一个图像金字塔,编码成一系列图像)和R个对象推荐的列表进行打分。尽管我们一直分析更大的类别数量(≈ 45k),但测试阶段R一般都是2000左右。使用图像金字塔时,每个RoI都赋值给一个能让RoI接近2242像素的尺度[11]。
对于每个测试RoI r,前向传播输出类的后验概率分布p和一个预测的约束框相对r的偏移值(对于每个类别K都有一个偏移量预测)。我们针对每个类别k对r赋予一个检测置信值,预估概率Pr(class=k|r)= p_k,然后使用对每个类别,分别应用R-CNN[9]中使用的非最大值抑制算法。
改进
• 对于整张图像先提取了泛化特征,这样减少了大量的计算量
• ROIPooling的提出,巧妙的解决了尺度放缩的问题
• 回归一同放进网络训练,用softmax代替SVM分类器,更加简单高效
不足
region proposal的提取仍然采用selective search,整个检测流程时间大多消耗在这上面(生成region proposal大约2~3s,而特征提取+分类只需要0.32s),之后的Faster RCNN的改进之一便是此点。
多任务训练有帮助吗?
多任务训练很方便,因为它避免了管理顺序训练的任务的管道。但它也有可能改善结果,因为任务通过共享表示(ConvNet)相互影响[2]。多任务训练是否可以提高fast R-CNN中的物体检测精度
尺度不变性:
在任何一种情况下,我们都将图像的比例s定义为其最短边的长度。所有单尺度实验都使用s = 600像素;对于某些图像,s可能小于600,因为我们将最长的图像侧限制为1000像素并保持图像的纵横比。选择这些值使得VGG16在微调期间适合GPU内存。较小的模型不受内存限制,可以从较大的s值中受益;但是,为每个模型优化s不是我们主要关注的问题。
我们注意到PASCAL图像平均为384×473像素,因此单尺度设置通常将图像上采样1.6倍。因此,RoI汇集层的平均有效步幅≈10个像素。
在多尺度设置中,我们使用[11]中指定的相同的五个尺度(s 2 f480; 576; 688; 864; 1200g)以便于与SPPnet进行比较。但是,我们将最长边设为2000像素,以避免超过GPU内存。
我们需要更多的培训数据吗?
【此时观点,越多的训练数据越好】
当提供更多训练数据时,良好的物体探测器应该得到改善。Zhu等人 [24]发现DPM [8]的 mAP仅在几百到几千个训练样例后到达饱和。在这里,我们使用VOC12 train-val set增加VOC07 train-val set,图像数量增加3倍至16.5k,以评估Fast R-CNN。训练集将VOC07测试的mAP从66.9%提高到70.0%(表1)。对此数据集进行培训时,我们使用60k小批量迭代而不是40k。
我们对VOC10和2012进行了类似的实验,为此我们从VOC07 train-val,test和VOC12 train-val的联合构建了21.5k图像的数据集。在对该数据集进行训练时,我们使用100k SGD迭代并将学习率降低0:1×每40k次迭代(而不是每次30k)。对于VOC10和2012,mAP分别从66.1%提高到68.8%,从65.7%提高到68.4%。
SVM的表现优于softmax吗
Fast R-CNN使用在微调期间学习的softmax分类器,而不是像在R-CNN和SPPnet中那样训练一对多线性SVM。为了理解这一选择的影响,我们在Fast R-CNN中采用难负例挖掘实现了SVM训练。我们使用R-CNN中相同的训练算法和超参数。
表8显示,对于所有三个网络,softmax略微优于SVM,+ 0.1至+0.8 mAP点。这种影响很小,但它表明,与以前的多阶段训练方法相比,“一次性”微调就足够了。我们注意到softmax与一对多SVM不同,在对RoI进行评分时引入了类之间的竞争。