传统的 CNN 通常要求输入图像的尺寸是固定的(例如224×224,这是因为全连接层(Fully Connected Layer)需要固定长度的输入向量。然而,实际应用中,图像的尺寸各异,我们需要对输入图像进行一些预处理工作,转换为指定尺寸而后输入到网络中,如下图:

强制调整尺寸可能导致图像变形或信息丢失。空间金字塔池化(Spatial Pyramid Pooling)是一种在卷积神经网络(CNN)中应用的技术,解决输入图像尺寸不固定的问题,广泛应用于计算机视觉任务中,特别是在目标检测、图像分类和语义分割等领域。SPP 通过在卷积层之后引入空间金字塔池化层,使网络能够接受任意尺寸的输入图像,同时生成固定长度的特征向量,进而输入全连接层进行分类或检测。

SPP 层到底做了什么?如下图:

SPP的核心思想是将特征图划分为多个空间区域(bins),并在每个区域内执行池化操作,通常使用多层次的池化策略。具体步骤如下:
- 特征图输入:SPP 层接收来自卷积层的特征图,这些特征图可以是任意大小。
- 分层池化:将特征图划分为多个空间区域,并在每个区域内执行最大池化(max pooling)。例如:
- 第一层:1个大区域(全局池化)
- 第二层:4个区域(2×2)
- 第三层:16个区域(4×4)
- 固定输出:通过上述步骤,SPP层生成固定长度的输出特征向量,这些向量可以直接输入到后续的全连接层进行分类或其他任务。
这种方法不仅保留了多尺度的空间信息,还避免了对输入图像进行裁剪或缩放所带来的信息损失。接下来,我们看一个例子,来说明这一过程:
我们输入两个不同尺寸的特征图分别为:13×13×256 和 10×10×256。首先,对将每个特征图划分为固定区域:
- 1×1 :将整个特征图视为一个区域,进行最大池化,输出大小为1×256
- 2×2:将特征图划分为 2×2 的 4 个区域,每个区域池化后输出大小为 1×256,总共 4×256
- 4×4:将特征图划分为 4×4 的 16 个区域,每个区域池化后输出大小为 1×256,总共 16×256
在实际操作中,对于尺寸不能被整除的情况(例如 10×10 划分成4×4),通常使用自适应池化或通过适当的边界调整来确保每个区域内能得到一个池化值。
13×13×256 | 10×10×256 | |
1×1 | 1×256 | 1×256 |
2×2 | 4×256 | 4×256 |
4×4 | 16×256 | 16×256 |
(1+4+16)x256 | (1+4+16)x256 |
将三个池化层的输出在通道维度上拼接(或拉平成一维向量后拼接),对于每个特征图拼接后的维度均为21×256。