yolo检测核心组件1:SE注意力机制 (Squeeze-and-Excitation)
!abstract 论文信息
- 标题: Squeeze-and-Excitation Networks
- 作者: Jie Hu, Li Shen, Gang Sun
- 年份: 2018
- 会议: CVPR 2018
- 核心贡献: 通道注意力机制,动态调整通道权重
一、核心思想

SE注意力的核心: 学习每个通道的重要性
传统卷积:
┌─────────────────────────────────────┐
│ 所有通道同等重要 │
│ 输出 = 卷积(输入) │
└─────────────────────────────────────┘
SE注意力:
┌─────────────────────────────────────┐
│ 学习每个通道的权重 │
│ 输出 = 卷积(输入) × 通道权重 │
└─────────────────────────────────────┘
直觉理解:
- 不同通道提取不同的特征(边缘、纹理、形状等)
- 对于不同任务,不同通道的重要性不同
- SE模块让网络自动学习通道的重要性
二、SE模块结构
SE模块结构:
输入特征图 (C×H×W)
│
▼
┌─────────────────────────────────────┐
│ Squeeze (压缩) │
│ 全局平均池化 │
│ C×H×W → C×1×1 │
│ │
│ 将每个通道压缩为一个值 │
│ 代表该通道的全局信息 │
└─────────────────────────────────────┘
│
▼
┌─────────────────────────────────────┐
│ Excitation (激励) │
│ 全连接层 → ReLU → 全连接层 → Sigmoid │
│ C×1×1 → C/r×1×1 → C×1×1 │
│ │
│ r是缩放因子,通常r=16 │
│ 学习通道间的非线性关系 │
│ 输出0~1的通道权重 │
└─────────────────────────────────────┘
│
▼
┌─────────────────────────────────────┐
│ Scale (缩放) │
│ 输入特征图 × 通道权重 │
│ C×H×W × C×1×1 → C×H×W │
│ │
│ 对每个通道加权 │
│ 重要通道权重接近1 │
│ 不重要通道权重接近0 │
└─────────────────────────────────────┘
│
▼
输出特征图 (C×H×W)
三、数学公式
SE模块的数学表达:
1. Squeeze (全局平均池化):
z_c = (1/H×W) × Σ(i,j) u_c(i,j)
其中:
- u_c: 第c个通道的特征图
- z_c: 第c个通道的全局描述符
- H, W: 特征图的高和宽
2. Excitation (门控机制):
s = σ(W₂ × ReLU(W₁ × z))
其中:
- z: 全局描述符向量 (C×1)
- W₁: 第一个全连接层 (C/r × C)
- W₂: 第二个全连接层 (C × C/r)
- σ: Sigmoid函数
- r: 缩放因子 (通常r=16)
3. Scale (加权):
x̃_c = s_c × u_c
其中:
- s_c: 第c个通道的权重
- u_c: 第c个通道的特征图
- x̃_c: 加权后的特征图
四、代码实现
python
import torch
import torch.nn as nn
class SEBlock(nn.Module):
"""SE注意力模块"""
def __init__(self, channels, reduction=16):
super(SEBlock, self).__init__()
# Squeeze: 全局平均池化
self.avg_pool = nn.AdaptiveAvgPool2d(1)
# Excitation: 门控机制
self.fc = nn.Sequential(
nn.Linear(channels, channels // reduction, bias=False),
nn.ReLU(inplace=True),
nn.Linear(channels // reduction, channels, bias=False),
nn.Sigmoid()
)
def forward(self, x):
b, c, _, _ = x.size()
# Squeeze
y = self.avg_pool(x).view(b, c)
# Excitation
y = self.fc(y).view(b, c, 1, 1)
# Scale
return x * y.expand_as(x)
五、在YOLO中的应用
SE模块在YOLO中的应用:
1. YOLOv5:
- 在C3模块中可选使用SE
- 通过配置文件启用
2. YOLOv8:
- 在某些变体中使用SE
- 作为注意力机制的选项
3. 改进YOLO:
- 可以在骨干网络中添加SE模块
- 提升特征表达能力
SE模块的插入位置
不要只关注SE模块能否加入YOLO,更应通过实验比较不同插入位置的效果:
-
Backbone(骨干网络)
- 增强高层语义特征的通道表达能力
- 可能带来额外的推理延迟
-
Neck(特征融合网络)
- 对多尺度特征融合通常更有意义
- 适合重点关注不同尺度目标的检测任务
-
Head前(检测头之前)
- 可能有助于分类特征的筛选
- 对边界框定位的提升未必稳定,需要通过消融实验验证
建议在相同数据集和训练配置下,分别比较上述插入位置,并记录mAP、参数量、FLOPs和FPS,综合评估精度与部署成本。
六、优缺点
优点
✅ 简单有效: 结构简单,易于实现
✅ 通道建模: 有效建模通道间关系
✅ 即插即用: 可以添加到任何网络
✅ 计算量小: 增加的计算量很小
缺点
❌ 只关注通道: 没有考虑空间信息
❌ 全局池化: 可能丢失空间细节
❌ 缩放因子: 需要手动设置r