输入图片 [B, 3, 640, 640] ↓ ┌──────────────────────────────────────┐ │ Backbone(主干特征提取网络) │ │ │ │ Conv → Conv → C2f → Conv → C2f → │ │ ↓ │ │ ★ CBAM │ ← 添加位置1:特征提取后 │ ↓ │ 增强特征表示能力 │ Conv → C2f → Conv → C2f → SPPF → │ │ ↓ │ │ ★ CBAM │ ← 添加位置2:最大特征层 │ │ │ 输出:多尺度特征 [P3, P4, P5] │ └──────────────────────────────────────┘ ↓ ┌──────────────────────────────────────┐ │ Neck(特征融合网络) │ │ │ │ Upsample → Concat → C2f → │ │ ↓ │ │ ★ CBAM │ ← 添加位置3:融合后增强 │ ↓ │ 增强多尺度融合效果 │ Upsample → Concat → C2f → │ │ ↓ │ │ ★ CBAM │ ← 添加位置4:小目标检测增强 │ │ └──────────────────────────────────────┘ ↓ ┌──────────────────────────────────────┐ │ Head(检测头) │ │ │ │ Detect → 输出检测结果 │ │ [类别, 置信度, bbox] │ │ │ └──────────────────────────────────────┘
| 位置 | 网络部分 | 作用 | 特征尺寸 |
|---|---|---|---|
| Backbone-3 | P2层 | 增强小特征提取 | 128通道 |
| Backbone-6 | P3层 | 增强中等特征 | 256通道 |
| Backbone-9 | P4层 | 增强大特征 | 512通道 |
| Backbone-13 | P5层 | 增强最大特征 | 1024通道 |
| Head-17 | Neck-P4 | 增强特征融合 | 512通道 |
| Head-21 | Neck-P3 | 增强小目标融合 | 256通道 |
| Head-26 | Head-P4 | 增强中等目标检测 | 512通道 |
| Head-31 | Head-P5 | 增强大目标检测 | 1024通道 |
CBAM = 通道注意力 + 空间注意力
先看哪个特征通道重要,再看图片哪个位置重要
问题:256个特征通道中,哪些对裂缝检测重要? ┌─────────────────────────────────────┐ │ 输入特征图 [B, 256, 32, 32] │ │ │ │ 每个通道提取不同特征: │ │ - 通道#15:边缘检测 │ │ - 通道#32:纹理检测 │ │ - 通道#128:颜色信息 │ │ - 通道#200:形状特征 │ └─────────────────────────────────────┘ ↓ ┌─────────────────────────────────────┐ │ 全局池化(压缩空间信息) │ │ │ │ 平均池化 → [B, 256, 1, 1] │ │ 最大池化 → [B, 256, 1, 1] │ │ │ │ 得到每个通道的整体重要性 │ └─────────────────────────────────────┘ ↓ ┌─────────────────────────────────────┐ │ MLP压缩(学习通道关系) │ │ │ │ 256 → 16 → 256 │ │ │ │ 压缩后恢复,学习通道间依赖关系 │ └─────────────────────────────────────┘ ↓ ┌─────────────────────────────────────┐ │ sigmoid激活(生成权重) │ │ │ │ 通道权重 [B, 256, 1, 1] │ │ │ │ 通道#15(边缘) → 0.85 ★重要! │ │ 通道#32(纹理) → 0.78 ★重要! │ │ 通道#128(颜色) → 0.25 ✗不重要 │ └─────────────────────────────────────┘ ↓ ┌─────────────────────────────────────┐ │ 加权融合 │ │ │ │ 输出 = 输入 × 通道权重 │ │ │ │ 边缘通道增强,颜色通道削弱 │ └─────────────────────────────────────┘
通俗理解:
就像调色板的滤镜选择器,保留裂缝检测有用的滤镜(边缘、纹理),削弱没用的滤镜(颜色)
问题:32×32的空间网格中,哪个位置有裂缝? ┌─────────────────────────────────────┐ │ 输入:通道加权后的特征 │ │ [B, 256, 32, 32] │ └─────────────────────────────────────┘ ↓ ┌─────────────────────────────────────┐ │ 通道池化(压缩通道信息) │ │ │ │ 平均池化 → [B, 1, 32, 32] │ │ 最大池化 → [B, 1, 32, 32] │ │ │ │ 得到每个空间位置的特征强度 │ └─────────────────────────────────────┘ ↓ ┌─────────────────────────────────────┐ │ 拼接 │ │ │ │ concat → [B, 2, 32, 32] │ │ │ │ 结合平均和最大信息 │ └─────────────────────────────────────┘ ↓ ┌─────────────────────────────────────┐ │ 7×7卷积(学习空间关系) │ │ │ │ 卷积 → [B, 1, 32, 32] │ │ │ │ 7×7感受野,捕捉裂缝的长条形特征 │ └─────────────────────────────────────┘ ↓ ┌─────────────────────────────────────┐ │ sigmoid激活(生成空间权重图) │ │ │ │ 空间权重图 [B, 1, 32, 32] │ │ │ │ ┌──────────────────┐ │ │ │ 0.1 0.1 0.1 0.1│ │ │ │ 0.2 [0.9][0.8] 0.2│ ← 裂缝位置! │ │ │ 0.1 [0.9] 0.1 0.1│ │ │ │ 0.1 0.1 0.1 0.1│ │ │ └──────────────────┘ │ │ │ │ 裂缝区域权重高,背景区域权重低 │ └─────────────────────────────────────┘ ↓ ┌─────────────────────────────────────┐ │ 加权融合 │ │ │ │ 输出 = 输入 × 空间权重 │ │ │ │ 裂缝区域增强,背景区域削弱 │ └─────────────────────────────────────┘
通俗理解:
就像聚光灯,照亮裂缝区域(权重0.9),暗淡背景区域(权重0.1)
输入特征图 [B, C, H, W] │ ├─────────────────────┐ │ │ ▼ ▼ 平均池化 最大池化 [B,C,1,1] [B,C,1,1] │ │ └──→ MLP压缩 ←───────┘ │ ▼ sigmoid │ ▼ 通道权重 [B,C,1,1] │ ▼ × 输入特征 │ ┌────────────────┴────────────────┐ │ 通道加权后的特征 [B,C,H,W] │ └────────────────┬────────────────┘ │ ├─────────────────────┐ │ │ ▼ ▼ 通道平均池化 通道最大池化 [B,1,H,W] [B,1,H,W] │ │ └──→ concat ←───────┘ │ ▼ 7×7卷积 │ ▼ sigmoid │ ▼ 空间权重 [B,1,H,W] │ ▼ × 输入特征 │ ▼ ┌────────────────┴────────────────┐ │ CBAM增强特征图 [B,C,H,W] │ │ (尺寸不变,质量提升) │ └─────────────────────────────────┘
通道注意力: MLP: 256 → 16 → 256 参数 = 256×16 + 16×256 = 8192 空间注意力: 7×7卷积: 2 → 1 参数 = 2×1×7×7 = 98 单个CBAM总参数 = 8192 + 98 = 8290 ≈ 8K
原始YOLOv8n: 3.01M CBAM×8: 8K × 8 = 64K 总参数: 3.01M + 0.064M = 3.08M
参数增加极少(仅2%),但效果显著!
传统CNN:所有特征通道平均对待 CBAM:自动选择重要特征通道 裂缝检测中: - 边缘特征 ★重要(裂缝有边缘) - 纹理特征 ★重要(裂缝有纹理) - 颜色特征 ✗不重要(裂缝颜色不明显) CBAM会自动增强边缘和纹理特征
传统CNN:所有空间位置平均对待 CBAM:自动聚焦重要位置 裂缝检测中: - 裂缝位置 ★重要(需要检测) - 背景位置 ✗不重要(会误检) CBAM会自动聚焦裂缝区域
通道注意力 + 空间注意力 = 双重增强 通道维度:选择用什么特征看 空间维度:选择看哪个位置 两者结合:用重要特征看重要位置
| 方法 | mAP50 | mAP50-95 | 参数量 | 提升 |
|---|---|---|---|---|
| YOLOv8n 基准 | 0.570 | 0.378 | 3.01M | - |
| YOLOv8n + 数据增强 | ~0.60 | ~0.40 | 3.01M | +5% |
| YOLOv8n + CBAM | ~0.62 | ~0.42 | 3.08M | +7-10% |
| YOLOv8n + CBAM + 增强 | ~0.65 | ~0.45 | 3.08M | +12-15% |
bash# 进入目录
cd /home/ubuntu/codebase/yexijia/github_project/tunnel/注意力机制改进
# 激活环境
conda activate co2
# 运行脚本
./run.sh
# 选择选项3:训练YOLOv8+CBAM(修改模型结构)
总结:CBAM通过通道和空间双重注意力,让网络聚焦重要特征和重要位置,参数增加极少但效果显著!
本文作者:Deshill
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!