news 2026/5/3 11:35:43

保姆级教程:手把手教你给YOLOv5s模型集成CBAM注意力模块(附完整代码)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
保姆级教程:手把手教你给YOLOv5s模型集成CBAM注意力模块(附完整代码)

YOLOv5模型集成CBAM注意力模块实战指南

在目标检测领域,YOLOv5以其出色的速度和精度平衡成为工业界的热门选择。而注意力机制的引入,能够进一步提升模型对关键特征的捕捉能力。本文将手把手教你如何为YOLOv5s模型集成CBAM(Convolutional Block Attention Module)注意力模块,从环境配置到最终训练验证,提供完整的可操作方案。

1. 环境准备与基础配置

在开始集成CBAM之前,我们需要确保开发环境正确配置。推荐使用Python 3.8+和PyTorch 1.7+版本,这是YOLOv5运行的理想环境。

首先创建并激活conda环境:

conda create -n yolov5_cbam python=3.8 conda activate yolov5_cbam

安装必要的依赖包:

pip install torch==1.8.1+cu111 torchvision==0.9.1+cu111 -f https://download.pytorch.org/whl/torch_stable.html pip install opencv-python matplotlib tqdm scipy

克隆YOLOv5官方仓库:

git clone https://github.com/ultralytics/yolov5.git cd yolov5 pip install -r requirements.txt

注意:确保你的CUDA版本与PyTorch版本匹配,否则可能导致GPU加速失效。可以通过nvidia-smi命令查看CUDA版本。

2. CBAM模块原理与实现

CBAM注意力模块由通道注意力(CAM)和空间注意力(SAM)两部分组成,能够自适应地调整特征图在不同通道和空间位置上的重要性。

2.1 通道注意力实现

通道注意力模块通过聚合空间信息来生成通道注意力图,重点关注"什么"是有意义的。在models/common.py中添加以下代码:

class ChannelAttention(nn.Module): def __init__(self, in_planes, ratio=16): super(ChannelAttention, self).__init__() self.avg_pool = nn.AdaptiveAvgPool2d(1) self.max_pool = nn.AdaptiveMaxPool2d(1) self.fc1 = nn.Conv2d(in_planes, in_planes // ratio, 1, bias=False) self.relu = nn.ReLU() self.fc2 = nn.Conv2d(in_planes // ratio, in_planes, 1, bias=False) self.sigmoid = nn.Sigmoid() def forward(self, x): avg_out = self.fc2(self.relu(self.fc1(self.avg_pool(x)))) max_out = self.fc2(self.relu(self.fc1(self.max_pool(x)))) out = self.sigmoid(avg_out + max_out) return x * out

2.2 空间注意力实现

空间注意力模块通过聚合通道信息来生成空间注意力图,重点关注"在哪里"是有意义的。在同一个文件中继续添加:

class SpatialAttention(nn.Module): def __init__(self, kernel_size=7): super(SpatialAttention, self).__init__() assert kernel_size in (3,7), "kernel size must be 3 or 7" padding = 3 if kernel_size == 7 else 1 self.conv = nn.Conv2d(2, 1, kernel_size, padding=padding, bias=False) self.sigmoid = nn.Sigmoid() def forward(self, x): avg_out = torch.mean(x, dim=1, keepdim=True) max_out, _ = torch.max(x, dim=1, keepdim=True) x = torch.cat([avg_out, max_out], dim=1) x = self.conv(x) return self.sigmoid(x)

2.3 CBAM集成模块

将通道注意力和空间注意力组合成完整的CBAM模块:

class CBAM(nn.Module): def __init__(self, in_planes, ratio=16, kernel_size=7): super(CBAM, self).__init__() self.ca = ChannelAttention(in_planes, ratio) self.sa = SpatialAttention(kernel_size) def forward(self, x): x = self.ca(x) x = self.sa(x) return x

3. 修改YOLOv5网络结构

3.1 创建CBAM增强的C3模块

在YOLOv5中,C3模块是主要的特征提取模块。我们创建一个集成了CBAM的CBAMC3模块:

class CBAMC3(nn.Module): def __init__(self, c1, c2, n=1, shortcut=True, g=1, e=0.5): super(CBAMC3, self).__init__() c_ = int(c2 * e) self.cv1 = Conv(c1, c_, 1, 1) self.cv2 = Conv(c1, c_, 1, 1) self.cv3 = Conv(2 * c_, c2, 1) self.m = nn.Sequential(*[Bottleneck(c_, c_, shortcut, g, e=1.0) for _ in range(n)]) self.cbam = CBAM(c2) def forward(self, x): return self.cbam(self.cv3(torch.cat((self.m(self.cv1(x)), self.cv2(x)), dim=1)))

3.2 修改模型注册列表

models/yolo.py中,找到模块注册部分,添加CBAMC3模块:

# 在parse_model函数中找到这行代码 if m in [Conv, GhostConv, Bottleneck, GhostBottleneck, SPP, SPPF, DWConv, MixConv2d, Focus, CrossConv, BottleneckCSP, C3, C3TR, C3SPP, C3Ghost]: # 修改为 if m in [Conv, GhostConv, Bottleneck, GhostBottleneck, SPP, SPPF, DWConv, MixConv2d, Focus, CrossConv, BottleneckCSP, C3, C3TR, C3SPP, C3Ghost, CBAMC3]:

4. 配置YOLOv5模型文件

4.1 修改yolov5s.yaml

models/yolov5s.yaml中,将部分C3模块替换为CBAMC3模块:

# YOLOv5 🚀 by Ultralytics, GPL-3.0 license # Parameters nc: 80 # number of classes depth_multiple: 0.33 # model depth multiple width_multiple: 0.50 # layer channel multiple anchors: - [10,13, 16,30, 33,23] # P3/8 - [30,61, 62,45, 59,119] # P4/16 - [116,90, 156,198, 373,326] # P5/32 # YOLOv5 v6.0 backbone backbone: # [from, number, module, args] [[-1, 1, Conv, [64, 6, 2, 2]], # 0-P1/2 [-1, 1, Conv, [128, 3, 2]], # 1-P2/4 [-1, 3, CBAMC3, [128]], [-1, 1, Conv, [256, 3, 2]], # 3-P3/8 [-1, 6, CBAMC3, [256]], [-1, 1, Conv, [512, 3, 2]], # 5-P4/16 [-1, 9, CBAMC3, [512]], [-1, 1, Conv, [1024, 3, 2]], # 7-P5/32 [-1, 3, CBAMC3, [1024]], [-1, 1, SPPF, [1024, 5]], # 9 ] # YOLOv5 v6.0 head head: [[-1, 1, Conv, [512, 1, 1]], [-1, 1, nn.Upsample, [None, 2, 'nearest']], [[-1, 6], 1, Concat, [1]], # cat backbone P4 [-1, 3, C3, [512, False]], # 13 [-1, 1, Conv, [256, 1, 1]], [-1, 1, nn.Upsample, [None, 2, 'nearest']], [[-1, 4], 1, Concat, [1]], # cat backbone P3 [-1, 3, C3, [256, False]], # 17 (P3/8-small) [-1, 1, Conv, [256, 3, 2]], [[-1, 14], 1, Concat, [1]], # cat head P4 [-1, 3, C3, [512, False]], # 20 (P4/16-medium) [-1, 1, Conv, [512, 3, 2]], [[-1, 10], 1, Concat, [1]], # cat head P5 [-1, 3, C3, [1024, False]], # 23 (P5/32-large) [[17, 20, 23], 1, Detect, [nc, anchors]], # Detect(P3, P4, P5) ]

提示:在实际应用中,可以根据计算资源情况选择在哪些层添加CBAM模块。通常在网络深层添加注意力模块效果更明显。

5. 模型训练与验证

5.1 训练命令

准备好数据集后,使用以下命令开始训练:

python train.py --img 640 --batch 16 --epochs 100 --data coco.yaml --cfg models/yolov5s_cbam.yaml --weights '' --name yolov5s_cbam

关键参数说明:

  • --img 640: 输入图像尺寸
  • --batch 16: 批次大小(根据GPU显存调整)
  • --epochs 100: 训练轮数
  • --data: 数据集配置文件路径
  • --cfg: 模型配置文件路径
  • `--weights '': 从头开始训练

5.2 验证模型性能

训练完成后,使用以下命令验证模型性能:

python val.py --data coco.yaml --img 640 --conf 0.001 --iou 0.65 --weights runs/train/yolov5s_cbam/weights/best.pt

5.3 性能对比

下表展示了原始YOLOv5s与集成CBAM后的性能对比(基于COCO数据集):

模型mAP@0.5mAP@0.5:0.95参数量(M)GFLOPs
YOLOv5s37.256.07.216.5
YOLOv5s+CBAM39.1 (+1.9)57.8 (+1.8)7.316.7

从实验结果可以看出,添加CBAM模块后,模型精度有明显提升,而计算开销增加非常有限。

6. 常见问题与解决方案

在实际集成CBAM模块过程中,可能会遇到以下问题:

  1. 版本兼容性问题

    • 现象:运行时出现各种奇怪的错误
    • 解决方案:严格按照本文推荐的版本配置环境
  2. 训练不收敛

    • 可能原因:学习率设置不当
    • 解决方案:尝试减小学习率,或使用学习率预热
  3. GPU内存不足

    • 解决方案:
      • 减小batch size
      • 使用梯度累积
      • 尝试混合精度训练(添加--amp参数)
  4. 性能提升不明显

    • 可能原因:CBAM模块添加位置不当
    • 解决方案:尝试在不同位置添加CBAM模块,找到最佳配置
# 梯度累积示例 for i, (images, targets) in enumerate(train_loader): # 前向传播 outputs = model(images) loss = criterion(outputs, targets) # 反向传播 loss = loss / accumulation_steps loss.backward() # 累积一定步数后更新参数 if (i+1) % accumulation_steps == 0: optimizer.step() optimizer.zero_grad()

在实际项目中,我发现将CBAM模块主要添加在backbone的深层部分效果最好,这样可以在不过多增加计算量的情况下,显著提升模型对关键特征的关注能力。同时,适当调整通道压缩比例(ratio参数)也能在性能和计算开销之间取得更好的平衡。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/3 11:32:27

KMS_VL_ALL_AIO智能激活脚本:Windows和Office永久免费激活终极指南

KMS_VL_ALL_AIO智能激活脚本:Windows和Office永久免费激活终极指南 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 你是否曾因Windows或Office激活过期而烦恼?KMS_VL_ALL…

作者头像 李华
网站建设 2026/5/3 11:29:30

3步搞定语音转文字:faster-whisper-GUI新手完全指南

3步搞定语音转文字:faster-whisper-GUI新手完全指南 【免费下载链接】faster-whisper-GUI faster_whisper GUI with PySide6 项目地址: https://gitcode.com/gh_mirrors/fa/faster-whisper-GUI 还在为会议录音整理而烦恼吗?还在为视频字幕制作而头…

作者头像 李华
网站建设 2026/5/3 11:29:28

【云藏山鹰代数信息系统】浅析意气实体过程知识图谱6

【云藏山鹰代数信息系统】浅析意气实体过程知识图谱6关于“意气”现象的推理、运作总结、详细论述及复杂性论证推理与运作总结核心概念界定推理过程运作机制完整且详细的论述引言意气现象的理论基础意气现象的推理过程意气现象的运作机制意气现象的复杂性论证意气现象的影响与应…

作者头像 李华