在目标检测领域,YOLO系列算法因其出色的实时性和准确性一直备受关注。最近开源的YOLOv11在速度和精度平衡上又有了新的突破,但我们在实际工业场景测试中发现,对于小目标和密集目标的检测性能仍有提升空间。这时候,注意力机制就成了一个值得尝试的优化方向。
SE(Squeeze-and-Excitation)模块作为轻量级注意力机制的代表,最早出现在2017年ImageNet竞赛冠军方案中。它的核心思想是通过学习通道间的关系,自动增强重要特征通道的权重,抑制不重要的特征。我在多个工业检测项目中验证过,在backbone中嵌入SE模块通常能带来1-3%的mAP提升,而计算量增加不到5%。
SE模块包含三个关键操作:
数学表达为:
code复制z_c = F_sq(u_c) = 1/HW ∑_{i=1}^H ∑_{j=1}^W u_c(i,j)
s = F_ex(z,W) = σ(W_2δ(W_1z))
x̃_c = F_scale(u_c,s_c) = s_c·u_c
YOLOv11的backbone采用类似CSPNet的结构,存在大量3×3卷积堆叠。我们在实验中发现,浅层特征图中约有30%的通道激活值接近于零。通过引入SE模块,可以让网络动态调整通道重要性,特别有利于:
python复制class SEBlock(nn.Module):
def __init__(self, c, r=16):
super().__init__()
self.squeeze = nn.AdaptiveAvgPool2d(1)
self.excitation = nn.Sequential(
nn.Linear(c, c//r, bias=False),
nn.ReLU(inplace=True),
nn.Linear(c//r, c, bias=False),
nn.Sigmoid()
)
def forward(self, x):
b, c, _, _ = x.shape
y = self.squeeze(x).view(b, c)
y = self.excitation(y).view(b, c, 1, 1)
return x * y.expand_as(x)
经过对比实验,我们推荐在以下位置插入SE模块:
具体到YOLOv11的model.yaml配置:
yaml复制backbone:
# [...]
- [-1, 1, Conv, [128, 3, 2]] # 3-P3/8
- [-1, 3, C3, [128]]
- [-1, 1, SE, []] # 新增SE
- [-1, 1, Conv, [256, 3, 2]] # 4-P4/16
在COCO val2017上的对比数据:
| 模型 | mAP@0.5 | 参数量(M) | FLOPs(G) | 推理速度(ms) |
|---|---|---|---|---|
| YOLOv11-n | 42.1 | 3.1 | 7.8 | 3.2 |
| +SE(r=16) | 43.7 | 3.3 | 8.1 | 3.4 |
| YOLOv11-s | 47.3 | 7.2 | 16.5 | 5.1 |
| +SE(r=8) | 48.9 | 7.6 | 17.2 | 5.3 |
使用Grad-CAM可视化注意力变化:
现象:添加SE后loss震荡增大
解决方案:
实测数据:640×640输入下延迟增加0.2-0.5ms
优化方案:
我们在相同条件下对比了:
| 类型 | mAP增益 | 参数量增加 | 速度影响 |
|---|---|---|---|
| SE | +1.6 | 5% | 3% |
| CBAM | +1.9 | 8% | 7% |
| ECA | +1.2 | 1% | 1% |
| SimAM | +1.4 | 0% | 5% |
对于YOLO系列,SE仍然是性价比最高的选择
部署优化:将SE的sigmoid输出量化为8bit时,建议采用对称量化(比非对称量化精度高0.2%)
多任务适配:当同时做检测和分割时,建议只在检测分支加SE
剪枝兼容性:SE模块的通道剪枝需要特殊处理:
跨模型迁移:从YOLOv8移植到v11时,SE权重需要重新初始化(通道数不匹配)