今天水一篇博客,讲讲SPP池化结构;那这是个什么东西呢?它的作用又是什么呢?在了解它之前我们先简单了解一下大部分的神经网络;
引入:
在大部分的神经网络中,都将神经网络分为Backbone主干网络、Neck特征融合和Head三个部分,有的网络会略去Neck直接将Backbone和head结合,比如前面介绍的VGG、ResNet、ViT等模型在做分类任务是都会在后面接一个全链接层或者前馈网络进行分类输出;虽然卷积神经网络对输入数据的尺寸不敏感,可以适应不同尺寸的数据张量,但是模型最后的head模块属于全链接层,全联接层就要求输入张量的维度是固定的,这就要求输入卷积层的张量也必须是固定的尺寸,即便卷积运算对尺寸不敏感;
为了解决包含全联接层的卷积神经网络必须输入固定尺寸数据的问题,就诞生了SPP(空间金字塔池化)这样的结构;从名字上面听它就是一个池化模块,所以它不具备训练参数,就单纯是一个张量处理模块;它的诞生,实现了包含全联接层卷积神经网络可以输入不同尺寸的张量进行推理,无需在输入模型前再做统一尺寸的前处理操作,那具体它是如何实现的呢?
其实它的实现过程非常的简单,首先我们需要知道它应该放在模型的哪个位置,它处在卷积层提取完特征与全联接层交汇处,然后将卷积完成的特征图作为输入;
操作流程:
1、特征图分割:SPP 层将输入的特征图分割成多个不同大小的网格,这些网格的大小通常是 1x1、2x2、4x4 等等,形成一个金字塔结构,每个网格的大小决定了池化操作的感受野;
2、池化操作:对每个网格进行池化操作,通常使用最大池化(Max Pooling);最大池化会选择每个网格中的最大值作为输出。这样,每个网格都会生成一个固定大小的特征表示,需要注意的是这个池化操作是一个并发的过程;
3、特征拼接:将所有网格的特征表示拼接起来,形成一个固定长度的特征向量;这个特征向量随后可以作为后续全连接层的输入;
举个SPP例子:
假设我们有一张 448×448 的输入图像,通过卷积层后得到特征图 56×56×512;接下来,我们使用 SPP 层进行处理:
-
特征图分割:
- 1x1 网格:整个特征图作为一个网格
- 2x2 网格:特征图被分割成 4 个 28×28 的网格
- 4x4 网格:特征图被分割成 16 个 14×14的网格
-
池化操作:
- 1x1 网格:最大池化后的特征图尺寸为 1×1×512;
- 2x2 网格:最大池化后的特征图尺寸为 2×2×512=4×512=4×512;
- 4x4 网格:最大池化后的特征图尺寸为 4×4×512=16×512=16×512;
-
特征拼接:
拼接后的特征向量长度为:1×512 + 4×512 + 16×512 = 512+2048+8192=10752 -
全连接层分类:
将拼接后的特征向量 10752 输入到全连接层中,进行分类任务;
PS:有没有个疑问,为什么这样做就可以确定其维度呢?以上面的例子为例,输入同一个卷积网络的图片尺寸不一致,体现在最终特征图上也只是W和H维度的不同,C维度的大小不取决于输入图片大小,而是取决于得到该特征图的卷积层中卷积核的个数,所以同一个卷积网络C维度是固定的,SPP池化只需要将W和H调整统一即可;
优缺点:
优点:
-
尺度不变性:SPP 层能够处理不同尺寸和比例的输入图像,使模型具有尺度不变性。这意味着无论输入图像的大小如何,模型都能有效地提取特征。
-
减少计算量:通过池化操作,SPP 层能够降低特征图的维度,从而减少后续全连接层的计算量和模型中的参数数量。这有助于减轻过拟合并加速训练过程。
-
提高性能:SPP 层能够捕获输入图像的多尺度特征信息,提高模型的性能。这对于识别较大的图像结构或模式非常有帮助。
-
提供位置不变性:由于池化是对局部区域进行操作,SPP 层降低了网络对特征位置的敏感度,使模型对输入中的平移、旋转等变换更加鲁棒。
-
抑制噪声:通过聚合区域内的特征,SPP 层能减少个别像素噪声的影响,提取更具代表性的特征。
缺点:
1.计算效率低:SPP 通过并行使用多个不同大小的池化核(如 1x1、2x2、4x4 等)对输入特征图进行池化操作,然后将这些池化结果拼接在一起。这种方法虽然能够有效地提取多尺度特征,但计算量较大,尤其是在处理高分辨率特征图时;
2.占用资源较大:由于 SPP 并发使用多个不同大小的池化核,每个池化操作都需要独立的内存空间来存储中间结果;这会导致较高的内存占用,特别是在处理大规模特征图时;
SPP优化:
基于上述的模型缺点,在SPP的基础上又迭代优化出了新的池化结构SPPF,就是目前yolov8模型在用的一种池化金字塔结构;它的优化点有两个,一是改变并发池化核为串联结构,而是调整池化核的大小和池化方式;
举例说明SSPF:
假设输入特征图的尺寸为 W×H×C,其中 W 和 H 是特征图的高度和宽度,C 是特征图的通道数;
SPPF 的操作步骤:
-
特征图输入:
输入特征图尺寸为 W×H×CW×H×C -
快速池化操作:
通过三个 5x5 的最大池化核进行串行池化操作。每个池化操作后,特征图的尺寸保持不变,但特征信息被压缩,最终的特征图尺寸为 W×H×C;(有人会疑惑明明是池化操作,为什么特征图尺寸会不变呢?因为在每次做完池化操作之后都会进行padding操作,即在特征图外围补零) -
特征拼接:
拼接后的特征向量长度为:25C
SPPF 通过串行使用多个小池化核,显著提高了计算效率和速度,同时保持了多尺度特征融合的能力。与传统的 SPP 相比,SPPF 在处理高分辨率特征图时更加高效,降低了内存占用,使得模型在实际应用中更加实用。这些优化使得 SPPF 成为现代目标检测模型(如 YOLOv5 和 YOLOv8)中的一个重要组件。