空间金字塔池化(Spatial Pyramid Pooling, SPP)原理和代码实现(Pytorch)

空间金字塔池化(SPP)解决CNN输入图像大小固定问题,允许输入高宽比任意。SPP层通过不同尺寸的池化区域转换特征映射,使其在全连接层前变为固定大小。本文介绍了SPP的原理、公式和Python(PyTorch)实现。

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

想直接看公式的可跳至第三节 3.公式修正

一、为什么需要SPP

首先需要知道为什么会需要SPP。

我们都知道卷积神经网络(CNN)由卷积层和全连接层组成,其中卷积层对于输入数据的大小并没有要求,唯一对数据大小有要求的则是第一个全连接层,因此基本上所有的CNN都要求输入数据固定大小,例如著名的VGG模型则要求输入数据大小是 (224*224)

固定输入数据大小有两个问题:

1.很多场景所得到数据并不是固定大小的,例如街景文字基本上其高宽比是不固定的,如下图示红色框出的文字。

54yix2cv7w.png ehbtv2bv3p.png


2.可能你会说可以对图片进行切割,但是切割的话很可能会丢失到重要信息。

综上,SPP的提出就是为了解决CNN输入图像大小必须固定的问题,从而可以使得输入图像高宽比和大小任意。

二、SPP原理

更加具体的原理可查阅原论文:Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition

jcvjgdr3n2.png



上图是原文中给出的示意图,需要从下往上看:

  • 首先是输入层(input image),其大小可以是任意的
  • 进行卷积运算,到最后一个卷积层(图中是\(conv_5\))输出得到该层的特征映射(feature maps),其大小也是任意的
  • 下面进入SPP层
    • 我们先看最左边有16个蓝色小格子的图,它的意思是将从
### 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 模型对于复杂场景下物体识别的能力,尤其是在面对多种比例的目标时表现出显著优势。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值