当前位置: 首页 > news >正文

yolo核心组件10:SPP 空间金字塔池化

SPP 空间金字塔池化

[!abstract] 论文信息

  • 论文标题: Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition
  • 作者: Kaiming He, Xiangyu Zhang, Shaoqing Ren, Jian Sun
  • 发表: ECCV 2014 / TPAMI 2015
  • 论文地址: https://arxiv.org/abs/1406.4729
  • 核心贡献: 提出空间金字塔池化层,使CNN能够接受任意尺寸的输入图像,同时增强多尺度特征表达能力

一、核心思想

SPP (Spatial Pyramid Pooling) 的核心思想是在不同空间尺度上进行池化,然后将结果拼接,从而捕获多尺度的特征信息。

SPP 解决了两个关键问题:

  1. 输入尺寸固定:传统CNN要求固定尺寸输入,SPP 允许任意尺寸输入
  2. 多尺度特征:通过多尺度池化,同时捕获局部细节和全局语义

在 YOLO 中,SPP 主要用于增强网络的感受野,通过多个不同大小的池化窗口提取多尺度特征。


二、模块结构

2.1 SPP 池化结构

输入特征图 [B×C×H×W] │ ┌─────┼─────┬─────────────┐ │ │ │ │ │ MaxPool MaxPool MaxPool │ 5×5 9×9 13×13 │ │ │ │ │ [B×C [B×C [B×C │ ×1×1] ×1×1] ×1×1] │ │ │ │ └─────┴─────┴─────────────┘ │ Concat (通道维度) │ [B×4C×1×1] │ 保持或降维

2.2 在 YOLO 中的 SPP 结构

输入特征图 [B×C×H×W] │ Conv1×1 (通道压缩) │ ┌─────┼─────┬─────────────┐ │ │ │ │ 原图 MaxPool MaxPool MaxPool 保留 5×5 9×9 13×13 │ │ │ │ │ padding padding padding │ =2,1,2 =4,4,6 =6,6,6 │ │ │ │ └─────┴─────┴─────────────┘ │ Concat (通道维度) │ [B×4C×H×W] │ Conv1×1 (通道恢复) │ 输出 [B×C×H×W]

2.3 不同池化核的效果

池化核感受野捕获信息
原始1×1局部细节
5×5~5×5局部模式
9×9~9×9中等尺度
13×13~13×13大尺度/全局

三、数学公式

3.1 最大池化

MaxPoolk(X)i,j=max⁡(m,n)∈Ri,jkXm,n\text{MaxPool}_k(X)_{i,j} = \max_{(m,n) \in \mathcal{R}_{i,j}^k} X_{m,n}MaxPoolk(X)i,j=(m,n)Ri,jkmaxXm,n

其中Ri,jk\mathcal{R}_{i,j}^kRi,jk是以(i,j)(i,j)(i,j)为中心、大小为k×kk \times kk×k的区域。

3.2 SPP 输出

SPP(X)=Concat(X,MaxPool5(X),MaxPool9(X),MaxPool13(X))\text{SPP}(X) = \text{Concat}\Big(X, \text{MaxPool}_5(X), \text{MaxPool}_9(X), \text{MaxPool}_{13}(X)\Big)SPP(X)=Concat(X,MaxPool5(X),MaxPool9(X),MaxPool13(X))

3.3 等效感受野

RFSPP=max⁡(k1,k2,k3,...)\text{RF}_{\text{SPP}} = \max(k_1, k_2, k_3, ...)RFSPP=max(k1,k2,k3,...)

使用5×55\times55×59×99\times99×913×1313\times1313×13的池化核时,等效感受野为13×1313\times1313×13

3.4 输出尺寸(通用公式)

对于输入尺寸H×WH \times WH×W,使用k×kk \times kk×k池化核和 paddingppp

Hout=⌊H+2p−ks⌋+1H_{out} = \left\lfloor\frac{H + 2p - k}{s}\right\rfloor + 1Hout=sH+2pk+1

在 YOLO 的 SPP 中,通过选择合适的 padding 使得输出尺寸与输入相同(Hout=HH_{out} = HHout=H)。


四、代码实现

4.1 标准 SPP 实现

importtorchimporttorch.nnasnnclassSPP(nn.Module):"""Spatial Pyramid Pooling 多尺度最大池化,增强感受野。 """def__init__(self,c1,c2,k=(5,9,13)):""" Args: c1: 输入通道数 c2: 输出通道数 k: 池化核大小列表 """super().__init__()c_=c1//2# 隐藏通道数self.cv1=nn.Conv2d(c1,c_,1,1,bias=False)self.cv2=nn.Conv2d(c_*(len(k)+1),c2,1,1,bias=False)self.bn=nn.BatchNorm2d(c2)self.act=nn.SiLU(inplace=True)self.pools=nn.ModuleList()forkiink:self.pools.append(nn.MaxPool2d(kernel_size=ki,stride=1,padding=ki//2))defforward(self,x):x=self.cv1(x)# 原始 + 多尺度池化outs=[x]+[pool(x)forpoolinself.pools]returnself.act(self.bn(self.cv2(torch.cat(outs,dim=1))))

4.2 原始论文版本(支持任意输入)

classSPP_Original(nn.Module):"""原始论文的 SPP,支持任意尺寸输入"""def__init__(self,pool_sizes=[1,2,4]):super().__init__()self.pool_sizes=pool_sizesdefforward(self,x):bs,c,h,w=x.size()pooled=[]forsizeinself.pool_sizes:pool=nn.AdaptiveMaxPool2d(size)pooled.append(pool(x).view(bs,-1))returntorch.cat(pooled,dim=1)

4.3 简化版 SPP(YOLO 常用)

classSPP_Simple(nn.Module):"""简化的 SPP 模块"""def__init__(self,c1,c2):super().__init__()c_=c1//2self.cv1=nn.Sequential(nn.Conv2d(c1,c_,1,bias=False),nn.BatchNorm2d(c_),nn.SiLU(inplace=True))self.cv2=nn.Sequential(nn.Conv2d(c_*4,c2,1,bias=False),nn.BatchNorm2d(c2),nn.SiLU(inplace=True))self.m1=nn.MaxPool2d(5,1,2)self.m2=nn.MaxPool2d(9,1,4)self.m3=nn.MaxPool2d(13,1,6)defforward(self,x):x=self.cv1(x)returnself.cv2(torch.cat([x,self.m1(x),self.m2(x),self.m3(x)],1))

五、在YOLO中的应用

5.1 SPP 在 YOLO 中的位置

Backbone: ... → C3/C2f (高层特征) → SPP (增强感受野) ← 在这里 → C3/C2f (进一步融合) → 输出到 Neck

5.2 YOLOv5 配置示例

# YOLOv5 backbone (含 SPP)backbone:-[-1,1,Conv,[64,3,2]]-[-1,1,Conv,[128,3,2]]-[-1,3,C3,[128]]-[-1,1,Conv,[256,3,2]]-[-1,6,C3,[256]]-[-1,1,Conv,[512,3,2]]-[-1,9,C3,[512]]-[-1,1,Conv,[1024,3,2]]-[-1,3,C3,[1024]]-[-1,1,SPP,[1024,[5,9,13]]]# SPP层-[-1,3,C3,[1024]]

5.3 SPP 的作用分析

方面无 SPP有 SPP
感受野受限于卷积核扩展到 13×13+
多尺度能力单一尺度多尺度融合
大目标检测较弱增强
计算量基准增加约 5-10%
参数量基准增加少量

六、优缺点

优点

  1. 增强感受野:通过大尺度池化核扩大特征图的有效感受野
  2. 多尺度特征:同时捕获不同尺度的特征信息
  3. 计算高效:池化操作本身计算量极小
  4. 即插即用:可方便地插入到任何 CNN 架构中
  5. 减少过拟合:池化操作具有一定的正则化效果

缺点

  1. 信息丢失:最大池化会丢失部分空间信息
  2. 固定池化核:池化核大小需要预先设定,不够灵活
  3. 边界效应:大池化核在特征图边界处的处理可能引入误差
  4. 量化敏感:池化操作在模型量化时可能造成精度损失
  5. 缺乏自适应:对所有位置使用相同的池化策略

参考

  1. He, K., Zhang, X., Ren, S., & Sun, J. (2015). Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition.TPAMI 2015.
  2. https://arxiv.org/abs/1406.4729
  3. https://github.com/ShaoqingRen/SPP_net
http://www.cnnetsun.cn/news/3830267.html

相关文章:

  • Python游戏开发实战:从零构建飞机大战游戏,掌握Pygame核心机制
  • MySQL 8.0与Navicat安装配置全指南:从零搭建高效数据库开发环境
  • VS Code生成DLL的完整教程
  • 【AI与同态加密融合实战指南】:20年密码学专家亲授5大落地场景与避坑清单
  • 2026年新疆做智慧燃气安全监管平台的厂家有哪些?
  • 可执行文件图标修改全攻略:从原理到Python、C#、Qt实战
  • 嵌入式系统防御性编程:构建高可靠性系统的关键策略
  • NodeEditor与WebSocket整合实战:实时可视化编程开发指南
  • LabVIEW与Excel交互的优化策略与实战技巧
  • FigmaCN终极指南:3种方法快速免费解锁中文版Figma界面
  • 亚马逊CLI工具定价实测:免费额度包月年费透明对比
  • 大模型稳定输出JSON的完整方案:从Prompt工程到Function Calling实战
  • 5个理由告诉你:为什么AnotherRedisDesktopManager是最好的Redis桌面管理器
  • Deep Rock Galactic终极保存编辑器完整指南:免费快速修改你的游戏存档
  • MAXBAND相位差计算与交通仿真对接技术解析
  • iFakeLocation终极指南:无需越狱的iOS虚拟定位完全解析
  • AI供应链投毒危机爆发!2024年Q1全球8大主流开源模型遭定向污染,附12个关键检查点清单
  • Unity 2D游戏智能寻路进阶:NavMeshPlus实战与千单位性能优化
  • COMSOL与Matlab联合仿真在岩石力学水力压裂中的应用
  • C# LINQ核心技术与实战优化指南
  • Nginx反向代理与upstream模块配置详解
  • C4D到UE5交互场景转换:Datasmith版本兼容性与蓝图交互实战
  • 游戏逆向开发实战指南:从内存扫描到协议分析的全栈技能
  • 3个核心魔法:让Plain Craft Launcher 2成为你的Minecraft游戏管家
  • DeepSeek-V4-Flash API 公测指南:低成本大模型调用实践
  • 在上海做了几年 EPE 珍珠棉深加工,聊聊选材料的几点心得
  • 电信优化BT Tracker服务器性能提升实践
  • 微信小程序家校互动平台开发实践与优化
  • 终极GTA5辅助工具YimMenu:5分钟快速入门与安全使用指南
  • 基于LangChain与Ollama构建本地AI智能体:从原理到工程实践