论文:Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition 空间金字塔池化,大神何恺明于2014年写的paper:
论文地址:https://arxiv.org/pdf/1406.4729.pdf
RCNN在2013年发表后,大佬在2014年提出了空间金字塔池化,性能和准确率都大幅提高,且在后面很多网络中都延续了这一思想。这篇文章比较长,我们也基于论文将其大体翻译了一下,伙伴们要耐心看呀!
那么让我们一起开始学习吧!先放上大佬的照片来镇楼:
当前深度卷积神经网络(CNNs)都需输入固定的图像尺寸(fixed-size),如224×224)。这种需要是“人为”的,并且当面对任意尺寸或比例的图像/子图像时,识别的精度降低(reduce the recognition accuracy)。本文中,我们给网络装配一个“空间金字塔池化”(spatial pyramid pooling)的池化策略,消除上述限制。本SPP-net结构能够产生固定大小的表示(fixed-length representation),而不关心输入图像的尺寸或比例。金字塔池化对物体形变很鲁棒(robust to object deformations)。 由于以上优点,SPP-net可普遍改进各种基于CNN的图像分类方法。在ImageNet-2012数据集上,SPP-net可将各种不同设计的CNN架构的精度都大幅提升。在PASCAL VOC 2007和Caltech101数据集上,SPP-net使用单一全图像表示,在没有调优的情况下,都达到了最好成绩。
SPP-net在物体检测上也表现突出。用SPP-net,我们只需要从整张图片计算一次特征图(feature map),然后对任意尺寸的区域(子图像)进行特征池化,以产生一个固定尺寸的表示(representation)用于训练检测器(detectors)。 这个方法避免了反复计算卷积特征。在处理测试图像时,我们的方法在VOC2007数据集上,达到相同或更好的性能情况下,比R-CNN方法快24-102X倍。
在ImageNet大规模视觉识别任务挑战(ILSVRC)2014上,我们的方法在物体检测上排名第2,在物体分类上排名第3,参赛的总共有38个组。本文介绍了为这个比赛所作的一些改进。
我们正见证计算机视觉领域飞速的变化,这一切得益于深度卷积神经网络(CNNs)和大规模的训练数据的出现。近来深度网络对图像分类,物体检测和其他识别任务,甚至很多非识别类任务上,都表现出了明显的性能提升。
然而,这些技术再训练和测试时都有一个问题,这些流行的CNNs都需要输入的图像尺寸是固定的(比如224×224),这限制了输入图像的长宽比和缩放尺度。当遇到任意尺寸的图像时,都是先将图像适应成固定尺寸,方法包括裁剪(crop)和变形(wrap),如Figure1(下图)所示。
但裁剪会导致信息的丢失,变形会导致位置信息的扭曲,就会影响识别的精度。另外,一个预先定义好的尺寸,在物体是缩放可变的时候就不适用了。固定尺寸,忽略了涉及比例(scale)的问题。
那么,为什么CNNs需要一个固定的输入尺寸呢?CNN主要由两部分组成,卷积部分和其后的全连接部分。卷积部分通过滑窗进行计算,并输出代表激活的空间排布的特征图(feature map)(图2)。事实上,卷积并不需要固定的图像尺寸,他可以产生任意尺寸的特征图。而另一方面,根据定义,全连接层则需要固定的尺寸输入。因此固定尺寸的问题来源于全连接层,也是网络的最后阶段。
本文引入一种空间金字塔池化( spatial pyramid pooling,SPP)层,以移除对网络固定尺寸的限制。尤其是,将SPP层放在最后一个卷积层之后。SPP层对特征进行池化,并产生固定长度的输出,这个输出再喂给全连接层(或其他分类器)。换句话说,在网络层次的较后阶段(也就是卷积层和全连接层之间)进行某种信息“汇总”,可以避免在最开始的时候就进行裁剪或变形。图1(下)展示了引入SPP层之后的网络结构变化。我们称这种新型的网络结构为SPP-net。
空间金字塔池化(普遍称谓:空间金字塔匹配spatial pyramid matching, SPM),是一种词袋(Bag-of-Words, BoW)模型的扩展。池袋模型是计算机视觉领域最成功的方法之一。它将图像切分成粗糙到精细各种级别,然后整合其中的局部特征。在CNN之前,SPP一直是各大分类比赛和检测比赛的冠军系统中的核心组件。
对深度CNNs而言,SPP有几个突出的优点:
通过实验,我们将展示所有这些因素,如何影响深度网络最终识别精度。
SPP-net不仅仅让测试阶段,允许任意尺寸的输入能够产生表示(representations);也允许训练阶段,图像可以有各种尺寸和缩放尺度。使用各种尺寸的图像进行训练,可以提高缩放不变性,以及减少过拟合。我们开发了一个简单的多尺度训练方法。为了实现一个单一的能够接受各种输入尺寸的网络,我们先使用分别训练固定输入尺寸的多个网络,这些网络之间共享权重(Parameters),然后再一起来代表这个单一网络。每个epoch,我们针对一个给定的输入尺寸进行网络训练,然后在下一个epoch,再切换到另一个尺寸。实验表明,这种多尺度训练和传统的单一尺度训练一样可以收敛,并且能达到更好的测试精度。
SPP的优点是与各类CNN设计是正交的(共同方向)。通过在ImageNet2012数据集上进行一系列可控的实验,我们发现SPP对这些不同的CNN架构都有提升。这些架构有不同的特征数量、尺寸、滑动距离(strides)、深度或其他的设计。所以我们有理由推测SPP可以帮助提升更多复杂的(更大、更深)的卷积架构。SPP-net也做到了 Caltech101 和Pascal VOC 2007上的最好结果,而只使用了一个全图像表示,且没有调优。
在图像检测方面,SPP-net也表现优异。目前领先的方法是R-CNN,候选窗口的特征是借助深度神经网络进行抽取的。此方法在VOC和ImageNet数据集上都表现出了出色的检测精度。但R-CNN的特征计算十分耗时,因为他对每张图片中的上千个变形后的区域的像素反复调用CNN。本文中,我们展示了我们只需要在整张图片上运行一次卷积网络层(不关心窗口的数量),然后再使用SPP-net在特征图上抽取特征。这个方法缩减了上百倍的耗时。在特征图(而不是图像区域)上训练和运行检测器是一个很受欢迎的想法[23][24][20][5]。但SPP-net延续了深度CNN特征图的优势,也结合了SPP兼容任意窗口大小的灵活性,所以做到了出色的精度和效率。 我们的实验中,基于SPP-net的系统(建立在R-CNN流水线上)比R-CNN计算特征要快24-102X倍,而精度却更高。结合最新的推荐方法EdgeBoxes[25],我们的系统达到了每张图片处理0.5s的速度(全部步骤)。这使得我们的方法变得更加实用。
本论文的一个早先版本发布在ECCV2014上。基于这个工作,我们参加了ILSVRC 2014 [26],在38个团队中,取得了物体检测第2名和图像分类第3名的成绩。针对ILSVRC 2014我们也做了很多修改。我们将展示SPP-nets可以将更深、更大的网络的性能显著提升。进一步,受检测框架驱动,我们发现借助灵活尺寸窗口对特征图进行多视角测试可以显著提高分类精度。本文对这些改动做了更加详细的说明。
在颇受欢迎的七层架构中[3][4]中,前五层是卷积层,其中一些后面跟着池化层。从池化层也使用滑窗的角度来看,这些池化层也可以认为是“卷积的”。最后两层是全连接的,跟着一个N路softmax输出,其中N是类别的数量。
上述的深度网络需要一个固定大小的图像尺寸。然后,我们注意到固定尺寸的要求,仅仅是因为全连接层的存在。另一方面,卷积层使用滑动的过滤器,它们的输出基本保持了原始输入的比例关系。它们的输出就是特征图[1]——它们不仅涉及响应的强度,还包括空间位置。
图2中,我们可视化了一些特征图。这些特征图来自于conv5层的一些过滤器。图2(c)显示了ImageNet数据集中激活最强的若干图像。可以看到一个过滤器能够被一些语义内容激活。例如,第55个过滤器(图2,左下)对圆形十分敏感;第66层(图2,右上)对∧形状特别敏感;第118个过滤器(图2,右下)对V形状非常敏感。这些输入图像中的形状会激活相应位置的特征图(图2中的箭头)。
值得注意的是,图2中生成的特征图并没有固定输入尺寸。深度卷积层生成的特征图和传统方法中的特征图很相似。这些传统方法中,SIFT向量或图像碎片被密集地抽取出来,在通过矢量量化,稀疏化或Fisher核函数进行编码。这些编码后的特征构成了特征图,然后通过词袋(BoW)或空间金字塔进行池化。类似的深度卷积的特征也可以这样做。
卷积层接受任意大小的输入,所以他们的输出也是各种大小。而分类器(SVM/softmax)或者全连接层需要固定的输入大小的向量。这种向量可以使用词袋方法通过池化特征来生成。空间金字塔池化对BoW进行了改进,以便在池化过程中保留局部空间块(local spatial bins)中的空间保留。这些空间块的尺寸和图像的尺寸是成比例的,这样块的数量就是固定的了。而深度网络的滑窗池化(sliding window pooling)则对依赖于输入图像的尺寸。
为了让我们的神经网络适应任意尺寸的图像输入,我们用一个空间金字塔池化层替换掉了最后一个池化层(eg,最后一个卷积层之后的pool5)。
图3示例了这种方法。在每个空间块中,我们池化每个过滤器的响应(本文中采用了最大池化法)。空间金字塔的输出是一个kM维向量,M代表块的数量,k代表最后一层卷积层的过滤器的数量。 这个固定维度的向量就是全连接层的输入。
【再进一步分析】
黑色图片代表卷积层之后的特征图,随后我们以不同大小的块来提取特征,分别是44,22,1*1,将这三张网格放到下面这张特征图上,就可以得到16+4+1=21种不同的块(Spatial bins).我们从这21个块中,每个块提取出一个特征,这样刚好就是我们要提取的21维特征向量。这种以不同的大小格子的组合方式来池化的过程就是空间金字塔池化(SPP)。
比如,要进行空间金字塔最大池化,其实就是从这21个图片块中,分别计算每个块的最大值,从而得到一个输出单元,最终得到一个21维特征的输出。
输出向量大小为Mk,M=#bins(块数), k=#filters(卷积核个数),作为全连接层的输入。
例如上图,Conv5计算出的feature map是任意大小的,经过SPP之后,变成固定大小的输出了,以上图为例,共输出(16+4+1)*256的特征。(有256个卷积核)
有了空间金字塔池化,输入图像就可以是任意尺寸了。不但允许任意比例关系,而且支持任意缩放尺度。我们也可以将输入图像缩放到任意尺度(例如min(w;h)=180,224,…)并且使用同一个深度网络。当输入图像处于不同的尺度时,带有相同大小卷积核的网络就可以在不同的尺度上抽取特征。跨多个尺度在传统方法中十分重要,比如SIFT向量就经常在多个尺度上进行抽取[29][27](受碎片和高斯过滤器的大小所决定)。我们接下来会说明多尺度在深度网络的精度方面的重要作用。【多尺度特征可以提取出固定大小的特征向量】
有趣的是,粗糙的金字塔级别只有一个块,覆盖了整张图像(1 x 1 bin)。这就是一个全局池化操作,当前有很多正在进行的工作正在研究它。在[31][32],全局池化用于减小模型尺寸,并减少过拟合,在[33]中,一个放在全连接层之后的全局平均池化,被用来提高测试阶段的精确度;在[34]中,一个全局最大池化,用于弱监督物体识别。全局池化操作相当于传统的词袋方法。
理论上将上述网络结构可以用标准的反向传播进行训练[1],与图像的大小无关。但实践中,GPU的实现(如cuda-convnet[3]和Caffe[35])更适合运行在固定输入图像上。接下来,我们描述我们的训练方法能够保持空间金字塔池化行为,同时还能充分利用GPU的优势。【训练时是基于固定尺寸的输入】
如前人的工作一样,我们首先考虑接收裁剪成224×224图像的网络。裁剪的目的是数据增强。对于一个给定尺寸的图像,我们先计算空间金字塔池化所需要的块(bins)的大小。试想一个尺寸是a x a(也就是13×13)的conv5之后特征图。对于n x n块的金字塔级,我们实现一个滑窗池化过程,窗口大小为win = 上取整[a/n],步幅str = 下取整[a/n]. 对于l层金字塔,我们实现l个这样的层。然后将l个层的输出进行连接,输出给全连接层。图4展示了一个cuda卷积网络风格的3层金字塔的样例。(3×3, 2×2, 1×1)。
单一尺寸训练的主要目的是:开启多级别池化行为。实验表明这是获取精度的一个原因。
有SPP的网络可以应用于任意尺寸,为了在训练时解决不同图像尺寸的问题,我们考虑一些预设好的尺寸。现在考虑这两个尺寸:180×180,224×224。我们使用缩放(resize)而不是裁剪,将前述的224×224的区域图像变为180×180大小。这样,不同尺度的区域仅仅是分辨率上的不同,而不是内容和布局上的不同。 对于接受180×180输入的网络,我们实现另一个固定尺寸的网络。本例中,conv5输出的特征图尺寸是a x a=10×10。我们仍然使用win = 上取整[a/n],str = 下取整[a/n],实现每个金字塔池化层。这个180网络的空间金字塔层的输出的大小就和224网络的一样了。这样,这个180网络就和224网络拥有一样的参数了。换句话说,训练过程中,我们通过使用共享参数的两个固定尺寸的网络实现了不同输入尺寸的SPP-net。
为了降低从一个网络(比如224)向另一个网络(比如180)切换的开销,我们在每个网络上训练一个完整的epoch,然后在下一个完成的epoch再切换到另一个网络(权重保留)。依此往复。实验中我们发现多尺寸训练的收敛速度和单尺寸差不多。
多尺寸训练的主要目的是在保证已经充分利用现在被较好优化的固定尺寸网络实现的同时,模拟不同的输入尺寸。 除了上述两个尺度的实现,我们也在每个epoch中测试了不同的s x s输入,s是从180到224之间均匀选取的。后面将在实验部分报告这些测试的结果。
注意,上面的单尺寸或多尺寸方法只用于训练阶段。在测试阶段,是直接对各种尺寸的图像应用SPP-net的。
【总结】
[不同数据集下,SPP的应用,加以一些小的trick,并且探讨了很多小的因素,小的提升,以及他们的提升的来源。]
我们在1000类别的Image2012训练集上训练了网络。我们的训练算法参照了前人的实践工作[3][4][36]。图像会被缩放,较小的维度是256,再从中间、四个角裁出224×224。图像会通过水平翻转和颜色变换[3]进行数据增强。
最后两层全连接层会使用Dropout[3]。learning rate起始值是0.01,当错误率停滞后就除以10。我们的实现基于公开的cuda-convnet源代码[3]和Caffe[35]。所有网络都是在单一GeForceGTX TitanGPU(6G内存)耗时二到四周训练的。
SPP的优势是和使用的卷积神经网络无关。我研究了四种不同的网络架构[3][4][5](或他们的修改版),对所有这些架构,SPP都提升了准确度。基准架构如表1,简单介绍如下:
– ZF-5:基于Zeiler和Fergus的“快速”模式[4]的网络架构。数字5代表5层卷积网络。
– Convnet*-5:基于Krizhevsky等人工作[3]的修改。我们在conv2和conv3(而不是conv1和conv2)之后加入了两个池化层。这样,每一层之后的特征图就和ZF-5的尺寸一样了。
– Overfeat-5/7:基于Overfeat论文[5],使用了[6]的修改。对比ZF-5/Convnet*-5,这个架构在最后一个池化层产生了更大的特征图(18×18而不是13×13)。还在conv3和后续的卷积层使用了更多的过滤器(512)。我们也研究了7层卷积网络,其中conv3和conv7结构一样。
基准模型中,最后卷积层之后的池化层会产生6×6的特征图,然后跟着两个4096维度的全连接层,和一个1000路的softmax层。这些基准网络的表现参见表2(a),我们针对ZF-5进行了70个epoch,而其他的用了90个epoch。ZF-5的表现比[4]中报告的那个要好。增益主要来源于角落裁切来源于整张图片,[36]中也提到了这点。
表2(b)中我们显示了使用单尺寸训练的结果。训练和测试尺寸都是224×224.这些网络中,卷积网络都和他们的基准网络有相同的结构,只是最后卷积层之后的池化层,被替换成了SPP层。表2中的结果我们使用了4层金字塔,{6x6, 3×3, 2×2, 1x1}(总共50个块)。为了公平比较,我们仍然使用标准的10-view预测法,每个view都是一个224×224的裁切。表2(b)中的结果显示了明显的性能提升。有趣的是,最大的提升(top-1 error,1.65%)来自于精度最高的网络架构。既然我们一直使用相同10个裁切view。这些提升只能是来自于多层次池化。【控制变量法 证明了多层级SPP确实有提升】
值得注意的是多层次池化带来的提升不只是因为更多的参数;而是因为多层次池化对:对象的变形和空间布局更加鲁棒[15]。为了说明这个,我们使用一个不同的4层金字塔({4×4, 3×3, 2×2, 1×1},供30个块)训练另一个ZF-5网络。这个网络有更少的参数,因为他的全连接层fc6有30×256维输入而不是36×256维。 网络的top-1/top-5错误率分别是35.06/14.04和50块的金字塔网络相近,明显好于非SPP基准网络(35.99/14.76)。
【控制变量法证明:参数一致时,SPP对性能进行了提高->spp有效果】
表2(c)展示了多尺寸训练的结果。训练尺寸是224和180,测试尺寸是224。我们还使用标准的10-view预测法。所有架构的top-1/top-5错误率进一步下降。SPP-net(Overfeat-7)的Top-1 错误率降到29.68%,比非SPP网络低了2.33%,比单尺寸训练降低了0.68%。
除了使用180和224两个尺寸,我们还随机选了[180;224]之间多个尺寸。SPP-net(Overfeat-7)的top1/5错误率是30.06%/10.96%。Top-1错误率比两尺寸版本有所下降,可能因为224这个尺寸(测试时用的尺寸)被更少的访问到。但结果仍然比单一尺寸版本要好。
之前的CNN解决方案[5][36]也处理了不同尺寸问题,但他们主要是基于测试阶段。在Overfeat[5]和Howard的方法[36]中,单一网络在测试阶段被应用于不同的尺度,然后将分数平均。Howard进一步在低/高两个分辨率图像区域上训练了两个不同的网络,然后平均分支。据我们所知,我们是第一个对不同尺寸训练单一网络的方法。
接下来我们研究全图像视角的准确度。我们将图像保持比例不变的情况下缩放到min(w;h)=256。SPP-net应用到一整张图像上。为了公平比较,我们也计算中央224×224裁切这单一视图(上述评估都用过)的准确度。单视图比较的准确度见表3。验证了ZF-5/Overfeat-7,top-1错误率在全视图表示中全部下降。这说明保持完整内容的重要性。即使网络训练时只使用了正方形图像,却也可以很好地适应其他的比例。
对比表2和表3我们发现,结合多种视图大体上要好于全图像视图。然而全视图图像的表示仍然有价值。首先,经验上看,我们发现(下节会讨论)即使结合几十个视图,额外增加两个全图像视角(带翻转)仍然可以提高准确度大约0.2%。其次,全图像视图从方法论上讲与传统方法[15][17][19]保持了一致,这些方法中对整张图像进行编码的SIFT向量被池化在一起。第三,在其他一些应用中,比如图像恢复[37],相似度评分需要图像表示而不是分类得分。一个全图像的表示就会成为首选。
受我们的检测算法的启发(在下一节中介绍),我们进一步提出了在特征图上的多视图测试方法。多亏了SPP的灵活性,我们可以轻松地从卷积特征图中任意大小的窗口(视图)中提取特征。
在测试阶段,我们调整图像的大小,使min(w; h)= s,其中s代表预定义比例(如256)。然后我们计算整个图像的卷积特征图。对于翻转视图的使用,我们还计算翻转图像的特征图。给定图像中的任何视图(窗口),我们将这个窗口到特征图(映射的方式在附录中),然后使用SPP从这个窗口汇集特征(参见图5)。汇集的特征然后被馈送到fc层以计算该窗口的softmax分数。这些分数求平均可以得到最终预测值。对于标准的10视图,我们使用s = 256,并且视图是224×224窗口,在角落或中心。实验表明,特征图上裁剪的10视图预测的top5 error与在图像上的原始10视图预测,误差在0.1%附近。
我们进一步应用这种方法从多个尺度中提取多个视图。我们将图像重新调整为六个规模{224, 256, 300, 360, 448, 560}并为每个比例计算整个图像的特征图。我们使用224×224作为任何比例的视图大小,因此对于不同比例,这些视图在原始图像上具有不同的相对大小。 我们对每个比例使用18个视图view:一个在中心,四个在角落,四个在每一侧的中间,有/没有翻转(当s = 224时,有6个不同的视图)。
这96个视图的组合将前5个错误从10.95%减少到9.36%。 组合两个全图像视图(翻转)进一步将前5个错误减少到9.14%。【多视图组合确实可以提高准确度】
在Overfeat论文[5]中,视图也是从卷积特征图而不是图像裁剪中提取的。 但是,他们的view不能有任意大小; 相反,窗口是汇集的特征与所需维度相匹配的窗口。 我们凭经验发现这些受限制的window比我们灵活定位/大小的window更不利。
在表4中,我们与之前的最新方法进行了比较。 Krizhevsk等人[3]是ILSVRC 2012中的获胜方法; Overfeat [5],Howard[36]和Zeiler&Fergus [4]是ILSVRC 2013中的主要方法。我们只考虑单网络性能进行可管理的比较。
我们最好的单一网络在验证集上实现了9.14%的top-5 error。 这正是我们提交给ILSVRC 2014 [26]的单一模型。测试集上的top-5 error为9.08%(ILSVRC 2014具有与ILSVRC 2012相同的训练/验证/测试数据)。 在结合11个模型后,我们团队的结果(8.06%)在参加2014年ILSVRC的所有38个团队中排名第3(表5)。 由于SPPnet的优点通常应该独立于体系结构,我们期望它将进一步改进更深和更大(deeper and larger)的卷积体系结构。
我们的方法可以生成全视图图像表示。通过在ImageNet上预训练的上述网络,我们从目标数据集中的图像中提取这些表示并重新训练SVM分类器[38]。在SVM培训中,我们故意不使用任何数据扩充(翻转/多视图)。我们l2规范化SVM训练的功能。
Pascal VOC 2007 [22]中的分类任务涉及20个类别中的9,963个图像。 5,011张图片用于训练,其余图片用于测试。性能通过mAP评估。表6总结了结果。
我们从表6(a)中的基本模型开始。该模型为ZF-5,不含SPP。要应用此模型,我们调整图像大小以使其较小的尺寸为224,并裁剪中心224×224区域。 SVM通过层的特征进行训练。在此数据集上,图层越深,结果越好。在表6(b)中,我们用SPP-net代替无SPP网络。作为第一步比较,我们仍然在中心应用SPP-net 224×224裁剪。 fc层的结果得到改善。此增益主要归因于多级池化。
表6(c)显示了我们在完整图像上的结果,其中图像被调整大小以使较短边为224。我们发现结果显着改善(78.39%对76.45%)。这是由于维护完整内容的全图像表示。
由于我们网络的使用不依赖于规模,因此我们调整图像大小以使较小的维度为s并使用相同的网络来提取特征。我们发现s = 392基于验证集给出了最好的结果(表6(d))。这主要是因为物体在VOC 2007中占据较小的区域而在ImageNet中占据较大的区域,因此两组之间的相对物体尺度不同。这些结果表明分类任务中的比例问题,SPP-net可以部分解决这种“规模不匹配”问题
在表6(e)中,网络架构被我们的最佳模型(Overfeat-7,多尺寸训练)取代,并且mAP增加到82.44%。 表8总结了我们的结果以及与现有技术方法的比较。 在这些方法中,VQ [15],LCC [18]和FK [19]均基于空间金字塔匹配,[13],[4],[34],[6]基于深度网络。 在这些结果中,Oquab等人(77.7%)和Chatfield等人(82.42%)是通过网络微调和多视图测试获得的。 我们的结果与现有技术相当,仅使用单个全图像表示且无需微调。
Caltech101数据集[21]包含102个类别(一个背景)中的9,144个图像。我们为每个类别随机抽样30张图片进行培训,每个类别最多50张图片进行测试。我们重复10次随机分割并平均准确度。表7总结了我们的结果。
在Pascal VOC 2007和Caltech101结果中有一些共同的观察结果:SPP-net优于无SPP网(表7(b)对比(a)),并且全视图表示优于裁剪((c)与(b))。但Caltech101的结果与Pascal VOC有一些差异。完全连接的层不太准确,SPP层更好。这可能是因为Caltech101中的对象类别较少。这与ImageNet中的相关,更深层次更专业。此外,我们发现,在我们在该数据集上测试的尺度中,尺度224具有最佳性能。这主要是因为Caltech101中的对象也占据了图像的大部分区域,就像ImageNet的情况一样。
除了裁剪,我们还评估拉伸图像以适应224×224大小。此解决方案保留了完整的内容,但引入了失真。在SPP(ZF-5)模型中,使用SPP层作为特征的精度为89.91% - 低于91.44%(在未失真的完整图像上使用相同的模型)
表8总结了我们与Caltech101上最先进的方法相比的结果。我们的业绩(93.42%)大幅超出之前的纪录(88.54%)(4.88%)
深度网络已经被用于物体检测。我们简要回顾一下最先进的R-CNN[7]。R-CNN首先使用选择性搜索[20]从每个图像中选出2000个候选窗口。然后将每个窗口中的图像区域变形到固定大小227×227。一个事先训练好的深度网络被用于抽取每个窗口的特征。然后用二分类的SVM分类器在这些特征上针对检测进行训练。R-CNN产生的引人注目的成果。但R-CNN在一张图像的2000个窗口上反复应用深度卷积网络,十分耗时。在测试阶段的特征抽取时是主要耗时瓶颈。
我们将SPP-net应用于物体检测。只在整张图像上抽取一次特征。然后在每个特征图的候选窗口上应用空间金字塔池化,形成这个窗口的一个固定长度表示(见图5)。因为只应用一次卷积网络,我们的方法快得多。
我们的方法是从特征图中直接抽取特征,而R-CNN则要从图像区域抽取。之前的一些工作中,可变性部件模型(Deformable Part Model, DPM)从HOG[24]特征图的窗口中抽取图像,选择性搜索方法[20]从SIFT编码后的特征图的窗口中抽取特征。Overfeat也是从卷积特征图中抽取特征,但需要预定义的窗口尺寸。作为对比,我们的特征抽取可以在任意尺寸的深度卷积特征图窗口上。
我们使用选择性搜索[20]的“fast”模式对每张图片产生2000个候选窗口。然后缩放图像以满足min(w;h) = s,并且从整张图像中抽取特征图。我们暂时使用ZF-5的SPP-net 模型(单一尺寸训练)。在每个候选窗口,我们使用一个4级空间金字塔(1×1, 2×2, 3×3, 6×6, 总共50块)。每个窗口将产生一个12800(256×50)维的表示。这些表示传递给网络的全连接层。然后我们针对每个分类训练一个二分线性SVM分类器。
【对比】
- 对于R-CNN,整个过程是:
- 通过选择性搜索,对待检测的图片进行搜索出~2000个候选窗口。
- 把这2k个候选窗口的图片都缩放到227*227,然后分别输入CNN中,每个proposal提取出一个特征向量,(即:利用CNN对每个proposal进行提取特征向量。)
- 把上面每个候选窗口的对应特征向量,利用SVM算法进行分类识别。 可以看出R-CNN的计算量是非常大的,因为2000个候选窗口都要输入到CNN中,分别进行特征提取。
- 而对于SPP-Net,整个过程是:
- 首先通过选择性搜索,对待检测的图片进行搜索出2000个候选窗口。(这一步和R-CNN一样)
- 特征提取阶段。区别!! 这一步骤的具体操作如下:把整张待检测的图片,输入CNN中,进行一次性特征提取,得到特征图,然后在特征图中找到各个候选框的区域,再对各个候选框采用空间金字塔池化,提取出固定长度的特征向量。而R-CNN输入的是每个候选框,然后在进入CNN,因为SPP-Net只需要一次对整张图片进行特征提取,速度会大大提升。
- 最后一步,采用SVM算法进行特征向量分类识别。
【如何将我们想要的proposal映射到特征图之上,从而进行SPP?】
过程中描述的“找到”,其实是一个映射。原图中的proposal,经过多层卷积之后,位置还是相对于原图不变的。
对于映射关系,论文中给出了一个公式:
假设(x’,y’)表示特征图上的坐标点,坐标点(x,y)表示原输入图片上的点,那么它们之间有如下转换关系,这种映射关心与网络结构有关:
( x , y ) = ( S ∗ x ’ , S ∗ y ’ ) (x,y)=(S*x’,S*y’) (x,y)=(S∗x’,S∗y’)
反过来,我们希望通过(x,y)坐标求解(x’,y’),那么计算公式如下:
Left、Top: x ′ = ⌊ x / S ⌋ + 1 \text{Left、Top:}x'=\lfloor{x/S} \rfloor +1 Left、Top:x′=⌊x/S⌋+1
Right、Bottom: x ′ = ⌈ x / S ⌉ − 1 \text{Right、Bottom:}x'=\lceil{x/S} \rceil -1 Right、Bottom:x′=⌈x/S⌉−1
其中S就是CNN中所有的strides的乘积,包含了池化、卷积的stride。
比如,对于下图的集中网络结构,S的计算如下:
论文中使用的是:
ZF-5: S = 2 ∗ 2 ∗ 2 ∗ 2 = 16 S=2*2*2*2=16 S=2∗2∗2∗2=16
Overfeat-5/7 : S = 2 ∗ 3 ∗ 2 = 12 S =2*3*2 =12 S=2∗3∗2=12
Appendix: Mapping a window to the feature map
在检测算法(以及特征图上的多视图测试)中,在图像域中给出窗口,并且我们使用它来裁剪已经多次子采样的卷积特征图(例如,conv5)。所以我们需要在要素图上对齐窗口。
在我们的实现中,我们将窗口的角点投影到特征映射中的像素,使得图像域中的该角点最接近该特征映射像素的感知字段的中心。所有卷积和池化层的填充使映射变得复杂。为简化实施,在部署期间,我们为bp / 2c像素填充滤波器大小为的图层。
因此,对于以( x 0 x_0 x0, y 0 y_0 y0)为中心的响应,其在图像域中的有效感受域以(x,y)=(S x 0 x_0 x0,S y 0 y_0 y0)为中心,其中S是所有先前步幅的乘积。在我们的模型中,对于conv5上的ZF-5,S = 16,对于conv5 / 7,对于Overfeat-5/7,S = 12。给定图像域中的窗口,我们将左(顶部)边界投影为:x 0 = bx / Sc + 1和右(底部)边界x 0 = dx / Se - 1.如果填充不是bp / 2c ,我们需要为x添加适当的偏移量。
我们的SVN实现追随了[20][7]。我们使用真实标注的窗口去生成正例。负例是那些与正例窗口重叠不超过30%的窗口(使用IoU比例)。如果一个负例与另一个负例重叠超过70%就会被移除。我们使用标准的难负例挖掘算法(standard hard negative mining [23])训练SVM。这个步骤只迭代一次。对于全部20个分类训练SVM小于1个小时。测试阶段,训练器用来对候选窗口打分。然后在打分窗口上使用最大值抑制[23]算法(30%的阈值)。
通过多尺度特征提取,我们的方法可以得到改进。将图像缩放成min(w;h) = s \belongs S = {480; 576; 688; 864; 1200 },然后针对每个尺度计算conv5的特征图。一个结合这些这些不同尺度特征的策略是逐个channel的池化。但我们从经验上发现另一个策略有更好的效果。对于每个候选窗口,我们选择一个单一尺度s \belongs S,令缩放后的候选窗口的像素数量接近与224×224。然后我们从这个尺度抽取的特征图去计算窗口的特征。如果这个预定义的尺度足够密集,窗口近似于正方形。我们的方法粗略地等效于将窗口缩放到224×224,然后再从中抽取特征。但我们的方法在每个尺度只计算一次特征图,不管有多少个候选窗口。
我们参照[7]对预训练的网络进行了调优。由于我们都是从conv5的特征图中池化出任意尺寸的窗口,为了简单起见,我们只调优全连接层。本例中,数据层接受conv5之后的固定长度的池化后的特征,后面跟着fc_{6,7}和一个新的21路(有一个负例类别)fc8层。fc8的权重使用高斯分布进行初始化σ=0.01。我们修正所有的learning rate为1e-4,再将全部三层调整为1e-5。调优过程中正例是与标注窗口重叠度达到[0.5, 1]的窗口,负例是重叠度为[0.1, 0.5)的。每个mini-batch,25%是正例。我们使用学习率1e-4训练了250k个minibatch,然后使用1e-5训练50k个minibatch。因为我们只调优fc层,所以训练非常的快,在GPU上只需要2个小时,不包括预缓存特征图所需要的1小时。另外,遵循[7],我们使用了约束框回归来后处理预测窗口。用于回归的特征也是conv5之后的池化后的特征。用于回归训练的是那些与标注窗口至少重叠50%的窗口。
我们在Pascal VOC 2007数据集的检测任务上,评测了我们的方法。表9展示了我们的不同层的结果,使用了1-scale(s=688)或5-scale。R-CNN的结果见[7],他们使用了5个卷积层的AlexNet[3]。使用pool5层我们的结果是44.9%,R-CNN的结果是44.2%。但使用未调优的fc6层,我们的结果就不好。可能是我们的fc层针对图像区域进行了预训练,在检测案例中,他们用于特征图区域。而特征图区域在窗口框附近会有较强的激活,而图像的区域就不会这样。这种用法的不同是可以通过调优解决的。使用调优后的fc层,我们的结果就比R-CNN稍胜一筹。经过约束框回归,我们的5-scale结果(59.2%)比R-CNN(58.5%)高0.7%。,而1-scale结果(58.0%)要差0.5%。
表10中,我们进一步使用相同预训练的SPPnet模型(ZF-5)和R-CNN进行比较。本例中,我们的方法和R-CNN有相当的平均成绩。R-CNN的结果是通过预训练模型进行提升的。这是因为ZF-5比AlexNet有更好的架构,而且SPPnet是多层次池化(如果使用非SPP的ZF-5,R-CNN的结果就会下降)。
表11表明了每个类别的结果。表11也包含了其他方法。选择性搜索(SS)[20]在SIFT特征图上应用空间金字塔匹配。DPM[23]和Regionlet[39]都是基于HOG特征的[24]。Regionlet方法通过结合包含conv5的同步特征可以提升到46.1%。DetectorNet[40]训练一个深度网络,可以输出像素级的对象遮罩。这个方法仅仅需要对整张图片应用深度网络一次,和我们的方法一样。但他们的方法mAP比较低(30.5%)。
尽管具有可比较的准确度,但我们的方法比R-CNN快得多。 R-CNN中卷积特征计算的复杂度为O(n·2272),窗口数为n(〜2000)。我们方法的这种复杂性是在尺度s下的O(r·s 2),其中r是纵横比。假设r约为4/3。在s = 688的单尺度版本中,这种复杂性约为R-CNN的1/160;在5级版本中,这种复杂性约为R-CNN的1/24。
在表10中,我们使用相同的SPP(ZF-5)模型对特征计算的运行时间进行了公平的比较。 RCNN的实现来自Caffe [35]中实现的作者发布的代码。我们还在Caffe中实现了我们的特征计算。在表10中,我们使用GPU评估100个随机VOC图像的平均时间。R-CNN每张图像需要14.37秒进行卷积,而我们的1比例版本每张图像仅需0.053秒。所以我们比RCNN快270倍。对于卷积,我们的5级版本每张图像需要0.293秒,因此比R-CNN快49倍。我们的卷积特征计算速度非常快,以至于fc层的计算时间占用了相当大的一部分。表10显示计算4,096-d fc7特征的GPU时间为每个图像0.089秒。考虑到卷积和完全连接的特征,我们的1比例版本比R-CNN快102倍,低于1.2%;我们的5级版本快38倍,并且具有可比较的结果。
我们还比较了表9中的运行时间,其中R-CNN使用AlexNet [3],如原始论文[7]中所述。我们的方法是24×到64倍更快。请注意,AlexNet [3]在每个转换层上具有与ZF5相同数量的滤波器。 AlexNet更快,因为它在某些层上使用拆分,这是为[3]中的两个GPU设计的。
借助最近的窗口提议方法[25],我们进一步实现了一个高效的完整系统。选择性搜索(SS)提议[20]在CPU上每个映像大约需要1-2秒。 EdgeBoxes [25]的方法只需要0.2秒。请注意,仅在测试期间使用快速提议方法就足够了。使用与上述相同的模型(使用SS),我们仅测试由EdgeBoxes生成的提议。 mAP是52.8,没有边界框回归。考虑到EdgeBoxes不用于训练,这是合理的。然后我们在训练阶段使用SS和EdgeBox作为建议,并且在测试阶段仅采用EdgeBoxes。由于额外的训练样本,mAP为56.3,没有边界框回归,优于55.2(表10)。在这种情况下,每个图像的整体测试时间约为0.5秒,包括所有步骤(proposal和识别)。这使我们的方法适用于实际应用。
模型结合对于提升CNN为基础的分类准确度有重要的提升作用[3]。我们提出一种简单的用于检测的结合方法。
首先在ImageNet上预训练另一个网络,使用的结构都相同,只是随机初始化不同。然后我们重复上述的检测算法。表12(SPP-net(2))显示了这个网络的结果。他的mAP可以和第一名的网络相媲美(59.1%vs59.2%),并且在11个类别上要好于第一网络。
给定两个模型,我们首先使用每个模型对测试图像的候选框进行打分。然后对并联的两个候选框集合上应用最大化抑制。一个方法比较置信的窗口就会压制另一个方法不太置信的窗口。通过这样的结合,mAP提升到了60.9%(表12)。结合方法在20类中的17个的表现要好于单个模型。这意味着双模型是互补的。
我们进一步发现这个互补性主要是因为卷积层。我们尝试结合卷积模型完全相同的两个模型,则没有任何效果。
ILSVRC 2014检测[26]任务涉及200个类别。训练/验证/测试集中有~450k / 20k / 40k图像。我们专注于提供的仅数据轨道的任务(不允许使用1000类CLS训练数据)。
检测(DET)和分类(CLS)训练数据集之间存在三个主要差异,这极大地影响了训练前的质量。
首先,DET训练数据仅为CLS训练数据的1/3。这似乎是仅提供数据的DET任务的基本挑战。(检测数据少)
其次,DET的类别编号是CLS的1/5。为了克服这个问题,我们利用提供的子类别标签2进行预训练。共有499个非重叠子类别(即,所提供的类别层次结构中的叶节点)。因此,我们在DET训练集上预训练499类网络。(检测类别少)
第三,DET / CLS训练集之间的对象尺度分布是不同的。 CLS中的主要对象尺度约为图像长度的0.8,但在DET中约0.5。为了解决比例差异,我们将每个训练图像的大小调整为min(w,h)= 400(而不是256),并随机裁剪224×224个视图以进行训练。仅当裁剪与地面实况对象重叠至少50%时才使用裁剪。(物体规模不同)
我们验证了预训练对Pascal VOC 2007的影响。对于CLS训练前baseline,我们考虑了pool5特征(表9中的mAP为43.0%)。替换为在DET上预训练的200类网络,mAP显着降至32.7%。 499类预训练网络将结果提高到35.9%。有趣的是,即使训练数据量没有增加,训练更多类别的网络也会提高功能质量。最后,用min(w,h)= 400而不是256的训练进一步将mAP提高到37.8%。即便如此,我们仍然看到与CLS预训练结果,仍然存在相当大的差距。这表明大数据对深度学习的重要性。
对于ILSVRC 2014,我们培训了499类Overfeat7 SPP-net。其余步骤类似于VOC 2007案例。在[7]之后,我们使用验证集来生成正/负样本,其中窗口由选择性搜索快速模式提出。训练集仅使用地面真实窗口提供正样本。我们微调fc层,然后使用验证和训练集中的样本训练SVM。在验证集上训练边界框回归。
我们的单一模型在ILSVRC 2014测试集中导致31.84%的mAP [26]。我们使用本文介绍的策略组合了六个相似的模型。测试集中的mAP为35.11%[26]。该结果在ILSVRC 2014的提供数据专用轨道中排名第2(表13)[26]。获胜的结果是新加坡国立大学的37.21%,它使用上下文信息。
我们的系统在这个数据集的速度上仍然显示出很大的优势。我们的单个模型需要0.6秒(对于转换为0.5,对于fc为0.1,不包括建议),每个测试图像在GPU上提取来自所有5个等级的卷积特征。使用相同的模型,RCNN的每个图像需要32秒。对于40k测试图像,我们的方法需要8 GPU·小时来计算卷积特征,而RCNN需要15个GPU·天。
==SPP对于处理不同的尺度、尺寸和长宽比是十分灵活的解决方案。==这些问题在视觉识别时非常重要,但深度网络中大家却很少考虑这个问题。我们建议使用空间金字塔池化层来训练深度网络。这种SPP-net在分类和检测任务上都表现出了出色的精度并显著加速了DNN为基础的检测任务。我们的研究也表明很多CV领域成熟的技术再基于深度网络的识别中仍然可以发挥重要的作用。
论文翻译参考博文(感恩各位大佬们!):
https://blog.csdn.net/mengduanhonglou/article/details/78470682
https://blog.csdn.net/alibabazhouyu/article/details/80058009