论文:Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition 空间金字塔池化,大神何恺明于2014年写的paper:
论文地址:https://arxiv.org/pdf/1406.4729.pdf
RCNN在2013年发表后,大佬在2014年提出了空间金字塔池化,性能和准确率都大幅提高,且在后面很多网络中都延续了这一思想。这篇文章比较长,我们也基于论文将其大体翻译了一下,伙伴们要耐心看呀!
那么让我们一起开始学习吧!先放上大佬的照片来镇楼:

0. 摘要
当前深度卷积神经网络(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个组。本文介绍了为这个比赛所作的一些改进。
1. 简介
我们正见证计算机视觉领域飞速的变化,这一切得益于深度卷积神经网络(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能在输入尺寸任意的情况下产生固定大小的输出,而以前的深度网络[3]中的滑窗池化(sliding window pooling)则不能;
- SPP使用了多级别的空间箱(bin),而滑窗池化则只用了一个窗口尺寸。多级池化对于物体的变形十分鲁棒[15];
- 由于其对输入的灵活性,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可以将更深、更大的网络的性能显著提升。进一步,受检测框架驱动,我们发现借助灵活尺寸窗口对特征图进行多视角测试可以显著提高分类精度。本文对这些改动做了更加详细的说明。
2. 基于空间金字塔池化的深度网络
2.1 卷积层和特征图
在颇受欢迎的七层架构中[3][4]中,前五层是卷积层,其中一些后面跟着池化层。从池化层也使用滑窗的角度来看,这些池化层也可以认为是“卷积的”。最后两层是全连接的,跟着一个N路softmax输出,其中N是类别的数量。
上述的深度网络需要一个固定大小的图像尺寸。然后,我们注意到固定尺寸的要求,仅仅是因为全连接层的存在。另一方面,卷积层使用滑动的过滤器,它们的输出基本保持了原始输入的比例关系。它们的输出就是特征图[1]——它们不仅涉及响应的强度,还包括空间位置。
图2中,我们可视化了一些特征图。这些特征图来自于conv5层的一些过滤器。图2(c)显示了ImageNet数据集中激活最强的若干图像。可以看到一个过滤器能够被一些语义内容激活。例如,第55个过滤器(图2,左下)对圆形十分敏感;第66层(图2,右上)对∧形状特别敏感;第118个过滤器(图2,右下)对V形状非常敏感。这些输入图像中的形状会激活相应位置的特征图(图2中的箭头)。
值得注意的是,图2中生成的特征图并没有固定输入尺寸。深度卷积层生成的特征图和传统方法中的特征图很相似。这些传统方法中,SIFT向量或图像碎片被密集地抽取出来,在通过矢量量化,稀疏化或Fisher核函数进行编码。这些编码后的特征构成了特征图,然后通过词袋(BoW)或空间金字塔进行池化。类似的深度卷积的特征也可以这样做。
2.2 空间金字塔池化层
卷积层接受任意大小的输入,所以他们的输出也是各种大小。而分类器(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]中,一个全局最大池化,用于弱监督物体识别。全局池化操作相当于传统的词袋方法。
2.3 网络的训练
理论上将上述网络结构可以用标准的反向传播进行训练[1],与图像的大小无关。但实践中,GPU的实现(如cuda-convnet[3]和Caffe[35])更适合运行在固定输入图像上。接下来,我们描述我们的训练方法能够保持空间金字塔池化行为,同时还能充分利用GPU的优势。【训练时是基于固定尺寸的输入】
2.3.1 单一尺寸训练
如前人的工作一样,我们首先考虑接收裁剪成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)。
单一尺寸训练的主要目的是:开启多级别池化行为。实验表明这是获取精度的一个原因。
2.3.2 多尺寸训练
有SPP的网络可以应用于任意尺寸,为了在训练时解决不同图像尺寸的问题,我们考虑一些预设好的尺寸。现在考虑这两个尺寸:1