[空间金字塔池化]SPP-net

文章Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition提出空间金字塔池化(spatial pyramid pooling)的概念,避免了固定大小的图像输入,能够有效提高子窗口的识别精度;同时通过共用特征图的方式,极大的提高了检测速度

概述

Existing deep convolutional neural networks (CNNs) require a fixed-size (e.g., 224×224) input image. This requirement is “artificial” and may reduce the recognition accuracy for the images or sub-images of an arbitrary size/scale. In this work, we equip the networks with another pooling strategy, “spatial pyramid pooling”, to eliminate the above requirement. The new network structure, called SPP-net, can generate a fixed-length representation regardless of image size/scale. Pyramid pooling is also robust to object deformations. With these advantages, SPP-net should in general improve all CNN-based image classification methods. On the ImageNet 2012 dataset, we demonstrate that SPP-net boosts the accuracy of a variety of CNN architectures despite their different designs. On the Pascal VOC 2007 and Caltech101 datasets, SPP-net achieves state-of-the-art classification results using a single full-image representation and no fine-tuning.

现有的深度卷积神经网络需要一个固定大小(如224×224)的输入图像。这种要求是“人为的”,可能会降低任意大小/比例的图像或子图像的识别精度。在这项工作中,我们为网络配备了另一种池化策略 - “空间金字塔池化”,以消除上述要求。新的网络结构称为SPP-net,它可以不用考虑输入图像的大小/比例就能够生成固定长度的特征向量。金字塔池化对于目标变形也是健壮的。有了这些优势,SPP-net应该在总体上改进所有基于CNN的图像分类方法。在ImageNet 2012数据集上,我们证明了SPP-net提高了各种CNN的准确性,尽管它们的设计不同。在Pascal VOC 2007和Caltech101数据集上,SPP-net使用单个全图像表示就获得最好的分类结果,无需微调

The power of SPP-net is also significant in object detection. Using SPP-net, we compute the feature maps from the entire image only once, and then pool features in arbitrary regions (sub-images) to generate fixed-length representations for training the detectors. This method avoids repeatedly computing the convolutional features. In processing test images, our method is 24-102× faster than the R-CNN method, while achieving better or comparable accuracy on Pascal VOC 2007.

SPP-net的强大功能在目标检测中也很重要。使用SPP-net,我们只从整个图像中计算一次特征图,然后池化任意区域(子图像)中的特征,生成固定长度的表示来训练检测器。该方法避免了重复计算卷积特征。在处理测试图像时,我们的方法比R-CNN方法快24-102倍,同时在Pascal VOC 2007上达到更好或相当的精度

In ImageNet Large Scale Visual Recognition Challenge (ILSVRC) 2014, our methods rank #2 in object detection and #3 in image classification among all 38 teams. This manuscript also introduces the improvement made for this competition.

在ImageNet大规模视觉识别挑战赛(ILSVRC) 2014中,我们的方法在所有38个团队中在目标检测方面排名第二,在图像分类方面排名第三。本手稿还介绍了为这次比赛所做的改进

固定大小输入

如何实现?

在之前的CNN模型中,对于固定大小的输入有两种实现方式:裁剪(croping)或者变形(warping)

缺陷

上述两种方式或多或少有一些缺陷:

  • 对于裁剪:无法包含整个图像
  • 对于变形:导致图像几何失真

与此同时,固定尺度的输入不一定适用于所有尺寸的目标

为什么要固定大小?

卷积神经网络大体由两部分构成:

  1. 卷积层:以滑动窗口方式操作,并输出代表激活的空间排列的特征图
  2. 全连接层:需要固定长度的输入

所以仅仅对于卷积层而言,可以输入任意大小,而全连接层限制了整个网络的输入大小

空间金字塔池化

在最后一个卷积层之上添加一个SPP层(空间金字塔池化层),通过池化特征从而得到固定长度的输入向量,再进一步输入到全连接层中。也就是说,在更深的网络层次中(在卷积层和全连通层之间)执行一些信息“聚合”操作,从而避免在开始时需要裁剪或扭曲输入数据

SPP层包含如下特性:

  1. 无论输入大小如何,SPP都能够生成固定长度的输出,而在以前的深层网络中使用的滑动窗口池则不能实现
  2. SPP使用多级空间bin,而滑动窗口池仅使用单个窗口大小。多层池化已被证明对目标变形是健壮的
  3. 由于输入的灵活性,SPP可以池化不同尺度提取的特征

这些空间箱的大小与图像大小成比例,因此不管图像大小如何,箱的数量都是固定的。通过空间金字塔池化层的改造,不仅允许任意纵横比,而且允许任意尺度的图像

超参数测试

相关测试参考:空间金字塔池化层

假定最后一个卷积层输出大小为\(a\times a\),而金字塔等级为\(n\times n\)(就是输出\(n\times n\)维)

通过滑动窗口的方式实现池化操作,窗口大小为\(win=\left \lceil a/n \right \rceil\),步长大小为\(str=\left \lfloor a/n \right \rfloor\),其中\(\left \lceil \cdot \right \rceil\)\(\left \lfloor \cdot \right \rfloor\)分别表示向上舍入和向下取整操作

关于输入图像大小

文章测试了两种情况:

  1. 单尺度输入:将所有输入图像缩放至224(和之前一样)
  2. 多尺度输入:将所有输入图像缩放至224180

对于多尺度输入训练,每一轮使用同一个大小进行训练,从训练结果可知多尺度训练确实能够减少误差率

用可变大小的图像进行训练增加了尺度不变性并减少了过度拟合。我们开发了一种简单的多尺寸训练方法。对于接受可变输入大小的单个网络,我们通过共享所有参数的多个网络来近似它,而这些网络中的每一个都使用固定的输入大小来训练。在每次迭代,我们用给定的输入大小训练网络,并在下一个时期切换到另一个输入大小。实验表明,这种多尺度训练和传统的单尺度训练一样收敛,具有更好的测试精度

关于多级金字塔

文章提出了多种多级金字塔示例:

  1. 3级金字塔:\((3\times 3, 2\times 2, 1\times 1)\),其相应的步长和卷积核大小如下图所示
  2. 4级金字塔:\((6\times 6, 3\times 3, 2\times 2, 1\times 1)\)

训练结果分析

  1. 多级金字塔能够提高精度
  2. 多尺度输入训练能够提高精度
  3. 全图像表示能够提高精度

目标检测

学习文章第4章。SPP-net可以在R-CNN算法的基础上进一步提高mAP,使用ZFNet+SPP-net作为CNN模型

关于输入

使用了两种输入尺度进行测试:

  1. 单尺度训练:等比例缩放图像至s=688s表示较短边)
  2. 多尺度训练:等比例缩放图像至{480, 576, 688, 864, 1200},然后从缩放后的图像提取候选建议边界框(共5个),选择最接近\(224\times 224\)大小的边界框作为输入进行训练

Note:多尺度/单尺度缩放仅作用于训练阶段,在测试阶段可以输入任意大小的测试图像

关于特征投影

文章通过可视化的方式验证了特征和空间位置的相关性

R-CNN算法中,使用selectivesearch算法得到大约2000个候选建议。对于每个候选建议的目标检测,需要从图像中提取相应的子图像,缩放固定大小后输入到CNN模型提取卷积特征,再进行分类操作。文章通过可视化的方式验证了特征和空间位置的相关性,所以在SPP-net实现的目标检测算法中,同一图像的候选建议使用同一个CNN特征图。对于每个候选建议,将边界框窗口投影到之前计算得到的CNN特征图中,直接提取CNN特征,然后通过金字塔池化层得到固定大小的全连接层输入向量

参考文章APPENDIX A - Mapping a Window to Feature Maps.,作者提出了一种投影方法。首先,对于CNN模型的每一层,使用\(\left \lfloor p/2 \right \rfloor\)\(p\)表示卷积核大小)进行零填充;其次,原图中的坐标点\((x, y)\)投影到特征图中投影点\(({x}', {y}')\)的公式如下:

\[ (x, y) = (S{x}', S{y}') \]

参数\(S\)是各层步长的乘积,对于\(ZF-5\)而言,其\(S=16\)。另外,对于左上角坐标点计算,使用公式\({x}'= \left \lfloor x/S \right \rfloor+1\)取整,对于右下角坐标点计算,使用如下公式\({x}'= \left \lceil x/S \right \rceil-1\)取整

实验

仅需要重新训练全连接层

  1. 在微调阶段,设置IoU[0.5, 1]的候选建议为正样本,设置IoU[0.1, 0.5)的候选建议为负样本
  2. 250k次训练中使用学习率1e-4,后50k次训练中使用学习率1e-5

训练结果如上图所示,SPP-net不仅提高了检测精度,而且加快了检测速度(38 ~ 102倍)

PyTorch实现