为了解决现有CNN需要固定输入大小的问题,提出了
SPP-net
,使得针对任意尺寸的图像生成固定长度的特征表示。SPP-net
不仅可以应用在分类任务上,而且在检测任务上也有很大的性能提升。
Introduction
CNN正在取得快速的发展,然而在CNN的训练和测试阶段都有一个技术问题:CNN需要固定输入图像的尺寸,这些图片或者经过裁切(crop)或者经过变形缩放(warp),都在一定程度上导致图片信息的丢失和变形,限制了识别精确度。
如下图所示,上面是CNN一般的做法,对不符合网络输入大小的图像直接进行crop或warp,下面是SPP-net
的工作方式。SPP-net
加在最后一个卷积层的输出后面,使得不同输入尺寸的图像在进过前面的卷积池化过程后,再经过SPP-net
,得到相同大小的feature map
,最后再经过全连接层进行分类。

Spatital Pyramid Pooling
卷积层是不需要输入固定大小的图片的,而且还可以生成任意大小的特征图,只是全连接层需要固定大小的输入。因此,固定长度的约束仅限于全连接层。在本文中提出了Spatial Pyramid Pooling layer 来解决这一问题,使用这种方式,可以让网络输入任意的图片,而且还会生成固定大小的输出。
以下图为例,黑色图片代表卷积之后的特征图,接着我们以不同大小的块来提取特征,分别是4*4
,2*2
,1*1
,将这三张网格放到下面这张特征图上,就可以得到16+4+1=21种不同的块(Spatial bins),我们从这21个块中,每个块提取出一个特征,这样刚好就是我们要提取的21维特征向量。这种以不同的大小格子的组合方式来池化的过程就是空间金字塔池化(SPP)。比如,要进行空间金字塔最大池化,其实就是从这21个图片块中,分别计算每个块的最大值,从而得到一个输出单元,最终得到一个21维特征的输出。

金字塔池化的意义
总结而言,当网络输入的是一张任意大小的图片,这个时候我们可以一直进行卷积、池化,直到网络的倒数几层的时候,也就是我们即将与全连接层连接的时候,就要使用金字塔池化,使得任意大小的特征图都能够转换成固定大小的特征向量,这就是空间金字塔池化的意义(多尺度特征提取出固定大小的特征向量)。
SPP-net在目标检测中的应用
对于R-CNN
,整个过程是:
- 首先通过选择性搜索,对待检测的图片进行搜索出~2000个候选窗口。
- 把这2k个候选窗口的图片都缩放到227*227,然后分别输入CNN中,每个proposal提取出一个特征向量,也就是说利用CNN对每个proposal进行提取特征向量。
- 把上面每个候选窗口的对应特征向量,利用SVM算法进行分类识别。
可以看出R-CNN
的计算量是非常大的,因为2k个候选窗口都要输入到CNN中,分别进行特征提取。
而对于SPP-Net
,整个过程是:
- 首先通过选择性搜索,对待检测的图片进行搜索出2000个候选窗口。这一步和
R-CNN
一样。 - 特征提取阶段。这一步就是和
R-CNN
最大的区别了,这一步骤的具体操作如下:把整张待检测的图片,输入CNN中,进行一次性特征提取,得到feature maps
,然后在feature maps
中找到各个候选框的区域,再对各个候选框采用金字塔空间池化,提取出固定长度的特征向量。而R-CNN
输入的是每个候选框,然后在进入CNN,因为SPP-Net
只需要一次对整张图片进行特征提取,速度会大大提升。 - 最后一步也是和
R-CNN
一样,采用SVM算法进行特征向量分类识别。

下图为SPP-net
进行目标检测的完整步骤:
