2.5 SPPNet

2.5 SPPNet

SPP(Spatial Pyramid Pooling,空间金字塔池化) 由何凯明团队在 ILSVEC 2014 中提出,利用空间金字塔池化方法可以提高已存在的一些 CNN 架构对于图像分类任务或目标检测任务的识别精度。

2.5.1 SPP 的目的

对于典型的 CNN 架构在图像处理上,我们一般要求图像的输出具有固定的尺寸大小,例如 224×224224\times 224,对于不满足该尺寸的图像,我们一般会通过图像裁剪或拉伸等变化形式进行处理,如图 1 所示。
2.5 SPPNet 【图 1】

对于裁剪的区域可能不包含整个对象,造成数据信息丢失以及拉伸操作带来的几何失真等,都会对我们任务的识别精度造成影响。因此,SPP 的提出最主要的目的就是要解决这个问题,使之适用于任意尺寸及比例的图像。

2.5.2 SPP 架构

在早期经典的一些 CNN 架构上,一般采用卷积层+池化层+全连接层的组合形式。实际上,卷积操作和池化操作(池化操作可以看作为一种特殊的卷积,下文将只考虑卷积)是可以在任意尺寸及比例的图片上进行的,对于一个固定的卷积核,卷积的输出是随输入的变换而近似同比例变换,卷积部分的网路参数只与卷积核的大小及个数有关,与输入输出尺度无关。

而我们之所以需要固定图片的输出尺度大小,是因为全连接层的存在,全连接层网络的网络参数与输入的神经元个数有关,因此,一旦网络架构确定,无论图片尺寸比例如何变化,在输入到全连接层前的大小必须固定。这就是 SPP 架构的设计点所在。

具体来说,SPP 层是在最后一个卷积层的顶部对卷积后的特征层进行池化操作,并使得池化后的结果长度固定,并将其池化后的结果输入到全连接层。

2.5 SPPNet 【图 2】

如图 2 所示,假定最后一个卷积层共有 256 个卷积核,即输出通道为 256,由于采用 SPP 结构,网络的输入尺寸可变,因此卷积后的特征图大小不等。但我们可以通过多个不同大小的网格化局部池化进行处理并重组,以上图为例,我们分别采用 4×4,4\times 4,2×22\times 21×11\times 1 的网格对特征图进行池化,在空间上犹如金字塔一般,故取名 SPP。

SPP 结构理论上的确对于任意大小的图像都有效,都可以通过反向传播算法进行训练,然而对于 GPU 加速硬件而言,若想得到较好的加速性能,仍然需要将其固定的图像大小上进行。

2.5.3 SPP 用于目标检测

SPP 当然是可以用于图像分类任务的,在本系列中,我们更加关注目标检测任务。在上一篇内容中,我们曾介绍过 R-CNN 算法,它是当时最先进的目标检测方法,在此我们先回顾一下 R-CNN 的主要流程:

  1. 对输入图像进行选择性搜索, 产生 ~2K 个区域提案
  2. 采用各向异性变形手段将候选区域缩放到 227×227227×227
  3. 利用 CNN 网络特征提取器对放缩后的数据进行提取特征
  4. 输出经过 SVM 分类判定, 得到一些不同类别的置信度
  5. 经过非极大值抑制处理筛选此时的保留的建议区域, 得到最终的置信度最高的不相邻的提案区域
  6. 利用框回归处理, 进一步提升预测框的准确度.

在这里除了第 2 步简单粗暴的图片缩放劣势外,R-CNN 最大的劣势在于第 3 步,每一个候选区域都需要经过一遍 CNN 特征提取,不同候选区域间没有共享计算。而 SPP 则不同,对于一张图像,CNN 特征提取操作只尽心一次,而候选框的选择是直接基于特征图而不是原始图像,这使得 SPP 在测试时相对于 R-CNN,加速了 10 到 100 倍。如图 3 和 图 4 所示。

2.5 SPPNet【图 3】2.5 SPPNet 【图 4】

2.5.4 候选区域映射

在 R-CNN 中,我们可以根据给你的候选区域直接在原始图像上进行裁剪,再进行特征提取,然而在 SPP 架构中,我们是先进行 CNN 特征提取,候选区域的选择必须在特征图上进行,这就涉及到如何将基于原始图像的候选区域选择转化为基于特征图的区域选择?

2.5 SPPNet 【图 5】

假设原始图像中候选框左上角坐标为 (x,y)(x,y),在特征图中对应为 (x,y)(x',y'),则二者之间的关系是什么?

对于卷积操作,pi=Sipi+1+((Ki1)/2P)p_i=S_i\cdot{p_{i+1}}+((K_i-1)/2-P),其中 pip_ipi+1p_{i+1} 分别表示原图中坐标位置及特征图中的坐标位置,K,S,PK,S,P 分别为卷积核大小,卷积步长以及填充像素数。如果令每一层的 P=Ki/2P=\lfloor{K_i/2}\rfloor,则当 KiK_i 为奇数时(通常卷积核大小为奇数),((Ki1)/2Ki/2=0((K_i-1)/2-\lfloor K_i/2\rfloor=0,因此,pi=Sipi+1p_i=S_i\cdot p_{i+1}

因此对于映射前后,左上角的点 x=x/S+1x' = \lfloor{x/S}\rfloor+1,对于右下角的点,x=x/S1x' = \lceil{x/S}\rceil-1

参考资料

  1. [2014 ECCV] [SPPNet]
    Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition
  2. [2015 TPAMI] [SPPNet]
    Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition
  3. sppnet_ilsvrc2014
  4. 目标检测2 - SPPNet

相关文章: