今天要分享的是我在YOLOv11目标检测网络上的一个创新改进——SPASPP(串并行空洞空间金字塔池化)模块。这个改进源自我们在处理红外小目标检测任务时遇到的实际问题:传统SPPF模块在多尺度特征融合和细节保持方面表现不足,特别是对于低对比度的红外小目标。
SPASPP模块通过融合柔性池化(SoftPooling)和空洞空间金字塔结构,显著提升了模型对多尺度目标的感知能力。实测在红外小目标检测任务上,mAP@0.5提升了3.2%,而计算量仅增加不到5%。这个改进特别适合需要处理复杂场景、多尺度目标的视觉任务,比如遥感图像分析、医疗影像检测等场景。
SPASPP采用双分支并行结构设计:
两个分支的输出会通过1×1卷积进行特征融合,最后与原输入进行残差连接。这种设计既保留了原SPPF模块的高效性,又增强了多尺度特征提取能力。
注意:空洞率的选择需要根据目标尺寸分布进行调整。对于小目标检测(如<32×32像素),建议使用1/3/5的空洞率组合;对于中大目标,可考虑3/6/9的组合。
柔性池化技术:相比传统MaxPooling,SoftPooling通过对激活值进行加权平均,保留了更多细节信息。这在处理低对比度的红外目标时特别关键。
多尺度空洞卷积:三个不同空洞率的并行卷积层可以同时捕获不同尺度的上下文信息:
轻量化设计:通过1×1卷积降维和残差连接,控制参数量增长。实测在YOLOv11n上仅增加0.8M参数。
python复制class SPASPP(nn.Module):
def __init__(self, c1, c2, e=0.5):
super().__init__()
c_ = int(c1 * e) # 中间通道数
# 上分支:SoftPooling路径
self.softpool = nn.Sequential(
nn.Conv2d(c1, c_, 1),
SoftPool2d(kernel_size=3, stride=1),
nn.Conv2d(c_, c_, 3, padding=1),
nn.BatchNorm2d(c_),
nn.SiLU()
)
# 下分支:空洞空间金字塔
self.aspp = nn.ModuleList([
nn.Sequential(
nn.Conv2d(c1, c_, 1),
nn.Conv2d(c_, c_, 3, padding=d, dilation=d),
nn.BatchNorm2d(c_),
nn.SiLU()
) for d in [1, 3, 5]
])
# 融合与输出
self.fuse = nn.Sequential(
nn.Conv2d(c_*4, c2, 1),
nn.BatchNorm2d(c2),
nn.SiLU()
)
self.shortcut = nn.Conv2d(c1, c2, 1) if c1 != c2 else nn.Identity()
def forward(self, x):
x1 = self.softpool(x)
x2 = [branch(x) for branch in self.aspp]
x_out = self.fuse(torch.cat([x1]+x2, dim=1))
return x_out + self.shortcut(x)
通道压缩比e:控制中间特征通道数的压缩比例,默认0.5。可根据硬件条件调整:
激活函数选择:实验表明SiLU(Swish)比ReLU更适合目标检测任务,能保留更多负半轴信息。
归一化策略:使用BatchNorm而非LayerNorm,因为:
ultralytics/nn/newsAddmodules下创建spaspp.py文件,写入上述代码__init__.py中添加:python复制from .spaspp import SPASPP
__all__ = ['SPASPP', ...]
tasks.py中的parse_model函数,添加SPASPP的解析逻辑yaml复制# yolov11n_SPASPP.yaml
backbone:
# [...]
- [-1, 1, SPASPP, [256]] # 替换原SPPF
# [...]
| 模型 | mAP@0.5 | 参数量(M) | GFLOPs |
|---|---|---|---|
| YOLOv11n | 63.2 | 3.1 | 7.8 |
| +SPPF | 64.7 | 3.2 | 8.1 |
| +SPASPP(ours) | 67.9 | 3.9 | 8.5 |
在Jetson Xavier NX上的实测结果:
现象:loss出现NaN或剧烈波动
解决方法:
可能原因:
调整方案:
优化策略:
在实际项目中,我发现SPASPP模块与注意力机制(如CBAM)组合使用时效果更佳。具体做法是在SPASPP后接一个轻量级CBAM,这样既能保持速度,又能进一步提升对小目标的检测精度。不过要注意控制计算量增长,避免影响实时性。