SPP(Spatial Pyramid Pooling)解读

SPP(Spatial Pyramid Pooling)解决了卷积神经网络中因图像尺寸变化导致的特征图大小不一的问题,通过多尺度池化窗口实现固定长度特征输出,增强模型对不同尺度图像的鲁棒性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.为什么会出现SPP结构,其作用是什么?
通过Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition论文可以基本了解其作用和基本结构,
作用图
从图中可以看到传统的操作是先将原图crop(裁剪/变换,也就是类似resize操作),直接送入卷积层,然后进入全连接分类。但是每幅图像中目标物体位置和大小难以保持一致,crop必然会影响图像特征的准确性。
由于卷积层与全连接层连接处必须保持固定的维度,若是不crop成统一大小,提取的特征图大小就不一样,没法送进全连接层,所以需要一种新的结构来解决这个问题,SPP就是最合适的方法。如图所示只需要将其加到卷积层后面就可以解决这个问题,其作用就是将不同的特征图转化为固定的特征图,不需要提前crop图像了。
2.其结构如下图所示:
在这里插入图片描述

其使用多个窗口(pooling window) 可以同一图像不同尺寸(scale)作为输入, 得到同样长度的池化特征,其可行性需要进行证明。证明前首先了解pooling层的计算过程。
设输入的特征图大小为W*H
池化层滤波器大小为F*F
步长为S
用零填充个数P
则池化后的特征图宽为N=(W-F+2P)/S+1
同理可得高;
总结:特征图输出大小=[(输入大小 - 滤波器大小 + 2*P)/步长]+1

接着证明SPP的可行性:
首先由定理: 任何一个数都可以写成若干个数的平方和可得:
在这里插入图片描述
故设输入特征图尺寸为WxH,由于输入图像尺寸是多样的,所以输入特征图尺寸也是不同的;同时设输入特征图个数为C,则全连接层的输出为Cxf, 也就是我们每个特征图要得到f个特征。
我们想要证明不同大小的特征图都可以通过多个池化层池化得到的f个特征,故就是证明
在这里插入图片描述
其中n=1,2,3…;首先设池化层滤波器大小为 (p1,p2),在计算是向上取整;
向上取整
设对应的步长(t1,t2分别水平和竖直的步长),计算时向下取整;
在这里插入图片描述
设池化层一种滤波器水平移动时的特征数为f1,同时设k是通过向下取整得出整数,即为步长大小;
在这里插入图片描述
则可得出下式,其中 l=[0,1]
在这里插入图片描述
即证明l在两种情况下都符合条件
l=1时,特征图的宽不可被n整除,p1需要向上取整故为k+1:
在这里插入图片描述
l=0,特征图的宽可被n整除时:
在这里插入图片描述
同理可证竖直方向的大小;
所以最终可得一种池化滤波器可得出n*n种特征,则f种特征可以由多个池化滤波后结合得到,即
在这里插入图片描述
得出结论可是通过设置多个池化层,然后通过n来自动调整池化层的滤波器大小和步长得到相同的特征图,然后将其结合得出最终想要的特征图尺寸。

总结
由论文可知由于对输入图像的不同纵横比和不同尺寸,SPP同样可以处理,所以提高了图像的尺度不变和降低了过拟合,且实验表明训练图像尺寸的多样性比单一尺寸的训练图像更容易使得网络收敛,SPP 对于特定的CNN网络设计和结构是独立的。(也就是说,只要把SPP放在最后一层卷积层后面,对网络的结构是没有影响的, 它只是替换了原来的pooling层);而且其不仅可以用于图像分类还可以用来目标检测。

### Dense Spatial Pyramid Pooling (DSPP) 的概念与实现 Dense Spatial Pyramid Pooling 是一种用于计算机视觉中的技术,旨在通过多尺度特征提取来增强模型的空间表示能力。它最初由 Kaiming He 等人在其研究中提出并应用于卷积神经网络架构中[^2]。 #### DSPP 的核心原理 DSPP 基于空间金字塔池化(Spatial Pyramid Pooling, SPP),后者允许输入图像具有任意尺寸而无需固定大小的约束。SPP 将特征图划分为不同数量的区域,并对每个区域执行最大池化操作以生成固定长度的输出向量。相比之下,DSPP 进一步引入密集连接的思想,在多个层次上捕获更丰富的上下文信息。这种设计使得 DSPP 能够更好地处理目标检测和语义分割等任务中的多尺度对象问题。 以下是 DSPP 实现的核心要点: 1. **多层次划分**: 特征图被分成若干层,每层对应不同的网格密度。例如,可以设置为 \(3 \times 3\), \(2 \times 2\) 和 \(1 \times 1\) 的子区域。 2. **池化操作**: 对每一层的所有子区域应用池化函数(通常为最大池化)。这会生成一组固定维度的特征向量集合。 3. **融合策略**: 不同层次的池化结果可以通过级联或加权求和的方式组合起来,形成最终的全局描述符。 下面是一个简单的 PyTorch 实现示例: ```python import torch.nn as nn import torch class DenseSpatialPyramidPooling(nn.Module): def __init__(self, input_channels, pool_sizes=[6, 3, 2, 1]): super(DenseSpatialPyramidPooling, self).__init__() self.pool_sizes = pool_sizes self.spatial_pyramids = nn.ModuleList() for size in pool_sizes: self.spatial_pyramids.append( nn.Sequential( nn.AdaptiveAvgPool2d(output_size=(size, size)), nn.Conv2d(input_channels, input_channels // len(pool_sizes), kernel_size=1), nn.ReLU(inplace=True) ) ) def forward(self, x): features = [] for sp in self.spatial_pyramids: pooled_feature = sp(x) upsampled_feature = nn.functional.interpolate(pooled_feature, size=x.size()[2:], mode='bilinear', align_corners=True) features.append(upsampled_feature) combined_features = torch.cat(features, dim=1) return combined_features ``` 此代码定义了一个 `DenseSpatialPyramidPooling` 类,其中包含了自适应平均池化以及后续的一维卷积层用来减少通道数。最后,所有经过池化的特征会被插值回原始分辨率并通过拼接方式结合起来。 上述方法能够有效提升 CNN 模型对于复杂场景下物体识别的能力,尤其是在面对多种比例的目标时表现出显著优势。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值