当前位置: 首页 > article >正文

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

YOLOv5模型集成CBAM注意力模块实战指南在目标检测领域YOLOv5以其出色的速度和精度平衡成为工业界的热门选择。而注意力机制的引入能够进一步提升模型对关键特征的捕捉能力。本文将手把手教你如何为YOLOv5s模型集成CBAMConvolutional Block Attention Module注意力模块从环境配置到最终训练验证提供完整的可操作方案。1. 环境准备与基础配置在开始集成CBAM之前我们需要确保开发环境正确配置。推荐使用Python 3.8和PyTorch 1.7版本这是YOLOv5运行的理想环境。首先创建并激活conda环境conda create -n yolov5_cbam python3.8 conda activate yolov5_cbam安装必要的依赖包pip install torch1.8.1cu111 torchvision0.9.1cu111 -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, ratio16): 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, biasFalse) self.relu nn.ReLU() self.fc2 nn.Conv2d(in_planes // ratio, in_planes, 1, biasFalse) 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 * out2.2 空间注意力实现空间注意力模块通过聚合通道信息来生成空间注意力图重点关注在哪里是有意义的。在同一个文件中继续添加class SpatialAttention(nn.Module): def __init__(self, kernel_size7): 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, paddingpadding, biasFalse) self.sigmoid nn.Sigmoid() def forward(self, x): avg_out torch.mean(x, dim1, keepdimTrue) max_out, _ torch.max(x, dim1, keepdimTrue) x torch.cat([avg_out, max_out], dim1) x self.conv(x) return self.sigmoid(x)2.3 CBAM集成模块将通道注意力和空间注意力组合成完整的CBAM模块class CBAM(nn.Module): def __init__(self, in_planes, ratio16, kernel_size7): 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 x3. 修改YOLOv5网络结构3.1 创建CBAM增强的C3模块在YOLOv5中C3模块是主要的特征提取模块。我们创建一个集成了CBAM的CBAMC3模块class CBAMC3(nn.Module): def __init__(self, c1, c2, n1, shortcutTrue, g1, e0.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, e1.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)), dim1)))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.pt5.3 性能对比下表展示了原始YOLOv5s与集成CBAM后的性能对比基于COCO数据集模型mAP0.5mAP0.5:0.95参数量(M)GFLOPsYOLOv5s37.256.07.216.5YOLOv5sCBAM39.1 (1.9)57.8 (1.8)7.316.7从实验结果可以看出添加CBAM模块后模型精度有明显提升而计算开销增加非常有限。6. 常见问题与解决方案在实际集成CBAM模块过程中可能会遇到以下问题版本兼容性问题现象运行时出现各种奇怪的错误解决方案严格按照本文推荐的版本配置环境训练不收敛可能原因学习率设置不当解决方案尝试减小学习率或使用学习率预热GPU内存不足解决方案减小batch size使用梯度累积尝试混合精度训练添加--amp参数性能提升不明显可能原因CBAM模块添加位置不当解决方案尝试在不同位置添加CBAM模块找到最佳配置# 梯度累积示例 for i, (images, targets) in enumerate(train_loader): # 前向传播 outputs model(images) loss criterion(outputs, targets) # 反向传播 loss loss / accumulation_steps loss.backward() # 累积一定步数后更新参数 if (i1) % accumulation_steps 0: optimizer.step() optimizer.zero_grad()在实际项目中我发现将CBAM模块主要添加在backbone的深层部分效果最好这样可以在不过多增加计算量的情况下显著提升模型对关键特征的关注能力。同时适当调整通道压缩比例(ratio参数)也能在性能和计算开销之间取得更好的平衡。

相关文章:

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

YOLOv5模型集成CBAM注意力模块实战指南 在目标检测领域,YOLOv5以其出色的速度和精度平衡成为工业界的热门选择。而注意力机制的引入,能够进一步提升模型对关键特征的捕捉能力。本文将手把手教你如何为YOLOv5s模型集成CBAM(Convolutional Bloc…...

别再瞎猜了!实测告诉你:双天线GNSS定向,基线到底要多长才够用?

双天线GNSS定向实战指南:基线长度如何影响航向精度? 在无人机航测、农业自动导航或无人船路径规划中,1的航向偏差可能导致任务区域边缘出现数米的定位偏移。去年为某果园巡检无人机选型时,我们对比了30cm、80cm和1.2m三种基线长度…...

手把手教你用阿里云ECS+frp,把家里的Windows电脑变成能外网访问的FTP服务器(附FileZilla Server配置)

家庭Windows电脑变身云端FTP服务器的完整指南 你是否遇到过这样的场景:出差在外急需家里电脑的文件,却只能干着急?或是想和异地同事共享大文件,但网盘限速让人抓狂?今天我要分享的这套方案,能让你用家里那台…...

Android车载双屏互动实战:手把手教你实现应用跨屏拖拽(基于Android 12源码)

Android车载双屏互动开发:从Framework底层到跨屏拖拽实战 在智能座舱系统中,双屏互动已成为提升驾驶体验的关键技术。想象一下这样的场景:主驾正在使用导航应用,副驾乘客可以直接将导航窗口拖拽到中控大屏上,或者将音…...

Unlock-Music:如何快速免费解锁9大音乐平台加密格式的终极指南

Unlock-Music:如何快速免费解锁9大音乐平台加密格式的终极指南 【免费下载链接】unlock-music 在浏览器中解锁加密的音乐文件。原仓库: 1. https://github.com/unlock-music/unlock-music ;2. https://git.unlock-music.dev/um/web 项目地址…...

从实验室到产线:在Ubuntu 22.04上实战ptp4l硬件时间戳,为你的工业物联网设备“对表”

从实验室到产线:在Ubuntu 22.04上实战ptp4l硬件时间戳,为你的工业物联网设备“对表” 工业物联网场景下,毫秒级的时间误差可能导致整个生产线的数据错乱。去年我们为某汽车零部件工厂部署边缘计算节点时,就遇到过传感器数据与PLC动…...

本地AI开发副驾:基于Cursor与Launchd的自动化工作流实践

1. 项目概述:一个运行在你MacBook上的本地AI开发副驾 想象一下这个场景:你正吃着午饭,手机上的Telegram突然弹出一条消息:“Jira上的BUG-123已经分配给你,AI代理正在分析并创建修复分支。” 几分钟后,另一…...

别再被Python的‘+’号坑了!手把手教你用f-string和format优雅拼接字符串与数字

别再被Python的‘’号坑了!手把手教你用f-string和format优雅拼接字符串与数字 刚接触Python时,你一定遇到过这样的报错:TypeError: can only concatenate str (not "int") to str。这个看似简单的错误背后,其实隐藏着P…...

如何解决调用大模型API时遇到的403 forbidden错误

如何解决调用大模型API时遇到的403 forbidden错误 1. 403错误的常见原因 当开发者通过Taotoken平台调用大模型API时,遇到403 forbidden错误通常意味着请求未被授权。这类错误往往由以下几个原因导致: API Key配置错误是最常见的原因之一。可能是Key未…...

告别风扇噪音与高温:FanControl让你的PC散热如丝般顺滑

告别风扇噪音与高温:FanControl让你的PC散热如丝般顺滑 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Trending/f…...

IPXWrapper终极指南:让经典游戏在现代Windows上重获新生

IPXWrapper终极指南:让经典游戏在现代Windows上重获新生 【免费下载链接】ipxwrapper 项目地址: https://gitcode.com/gh_mirrors/ip/ipxwrapper 还在为《红色警戒2》《魔兽争霸2》《星际争霸》等经典游戏无法在Windows 10/11上联机而烦恼吗?IPX…...

别再只会用光敏电阻了!用光敏三极管+运放打造线性度更好的光控LED电路(含恒流源设计)

光敏三极管与运放协同设计:构建高线性度光控LED系统的工程实践 在智能照明和自动化控制领域,光控电路的性能直接影响着系统的响应速度和能耗表现。传统光敏电阻方案虽然成本低廉,但其非线性特性和温度敏感性往往成为精密控制的瓶颈。本文将深…...

移动端原生解析技术突破:Android OTA文件直接提取方案深度解析

移动端原生解析技术突破:Android OTA文件直接提取方案深度解析 【免费下载链接】Payload-Dumper-Android Payload Dumper App for Android. Extract boot.img or any other partitions (images) from OTA.zip or payload.bin without PC 项目地址: https://gitcod…...

QMC加密音频解密技术:qmc-decoder实现无损格式转换解决方案

QMC加密音频解密技术:qmc-decoder实现无损格式转换解决方案 【免费下载链接】qmc-decoder Fastest & best convert qmc 2 mp3 | flac tools 项目地址: https://gitcode.com/gh_mirrors/qm/qmc-decoder 在数字音乐版权保护领域,QMC&#xff08…...

你的手机也能接收太空图片:SSTV解码应用Robot36全解析

你的手机也能接收太空图片:SSTV解码应用Robot36全解析 【免费下载链接】robot36 Decode SSTV encoded audio signals to images 项目地址: https://gitcode.com/gh_mirrors/ro/robot36 想象一下,你正在山区徒步旅行,手机突然收到一段奇…...

终极键盘打字练习指南:Qwerty Learner 免费安装教程

终极键盘打字练习指南:Qwerty Learner 免费安装教程 【免费下载链接】qwerty-learner 为键盘工作者设计的单词记忆与英语肌肉记忆锻炼软件 / Words learning and English muscle memory training software designed for keyboard workers 项目地址: https://gitco…...

构建可复用AI Agent技能库:从工程化思维到实战应用

1. 项目概述:构建可复用的AI Agent技能库如果你和我一样,在过去的两年里深度使用过各种AI Agent平台,从早期的AutoGPT到后来的LangChain,再到现在的OpenClaw和Claude,你一定会遇到一个共同的痛点:那些在某个…...

Git远程仓库配置与开发者激励系统实践

1. 项目背景与核心价值在分布式开发环境中,Git作为版本控制系统的核心地位毋庸置疑。但许多团队在实际操作中常陷入两个典型困境:一是远程仓库配置混乱导致协作效率低下,二是缺乏有效的贡献激励机制影响开发者积极性。这个主题正是针对这两个…...

VSCode集成ChatGPT:AI原生编程助手实战与效率提升指南

1. 项目概述:当ChatGPT遇见VSCode 作为一名在开发一线摸爬滚打了十多年的老码农,我经历过从记事本写代码到IDE百花齐放,再到如今AI辅助编程的整个变迁。最近两年,以ChatGPT为代表的大语言模型彻底改变了我们与代码交互的方式。但…...

中小工厂数字化转型踩坑记:我们是如何从Excel一步步上PLM、ERP和MES的

中小工厂数字化转型踩坑记:从Excel到PLM、ERP和MES的实战路径 三年前,当我们这家200人规模的机械加工厂还在用Excel表格管理订单、用U盘传递图纸时,我从未想过数字化改造会如此艰难又如此必要。作为厂长,我经历了从"表格高手…...

商城直播导购支持展示产品列表详解:从入门到实战全攻略

关于这个问题,很多商家都不太清楚。今天来详细解答。一、问题背景在实际运营小程序商城的过程中,不少商家会遇到:【20200508功能更新】商城直播导购支持展示产品列表二、详细解答使用场景:突出直播间产品展示,帮助客户…...

为Claude Code编程助手配置Taotoken作为模型供应商

为Claude Code编程助手配置Taotoken作为模型供应商 1. 准备工作 在开始配置之前,请确保您已安装Claude Code编程助手并拥有有效的Taotoken API Key。您可以在Taotoken控制台的API Key管理页面创建新的密钥。同时,建议在模型广场查看当前支持的Claude模…...

Python爬虫框架实战:从零构建健壮数据采集系统

1. 项目概述与核心价值最近在折腾一些自动化脚本时,发现了一个挺有意思的项目,叫yuanjl34/copaw-liexiaoyi。乍一看这个仓库名,可能有点摸不着头脑,但点进去研究后,发现它其实是一个围绕“猎小蚁”这个核心概念展开的、…...

别再只用subplots了!Plotly多坐标轴实战:用底层API搞定股票与天气数据同框对比

突破Plotly多坐标轴可视化瓶颈:从股票天气对比到商业决策的底层API实战 当我们需要在同一个图表中展示量纲和数值范围差异巨大的多组数据时,比如同时分析某科技公司股价波动与当地气温变化的关系,或者对比电商促销期间的销售额与网站访问量趋…...

3个实用技巧:如何轻松访问全球最大同人创作平台AO3

3个实用技巧:如何轻松访问全球最大同人创作平台AO3 【免费下载链接】AO3-Mirror-Site 项目地址: https://gitcode.com/gh_mirrors/ao/AO3-Mirror-Site 你是否曾经在深夜灵感迸发,想要寻找同人创作的灵感,却发现无法访问全球最大的同人…...

百度网盘直链解析:三步实现免客户端高速下载完整指南

百度网盘直链解析:三步实现免客户端高速下载完整指南 【免费下载链接】baidu-wangpan-parse 获取百度网盘分享文件的下载地址 项目地址: https://gitcode.com/gh_mirrors/ba/baidu-wangpan-parse 百度网盘直链解析工具(baidu-wangpan-parse&#…...

D3KeyHelper暗黑3技能连点器:5步配置实现游戏操作自动化终极指南

D3KeyHelper暗黑3技能连点器:5步配置实现游戏操作自动化终极指南 【免费下载链接】D3keyHelper D3KeyHelper是一个有图形界面,可自定义配置的暗黑3鼠标宏工具。 项目地址: https://gitcode.com/gh_mirrors/d3/D3keyHelper D3KeyHelper是一款专为《…...

TigerVNC终极指南:如何高效配置跨平台远程桌面连接

TigerVNC终极指南:如何高效配置跨平台远程桌面连接 【免费下载链接】tigervnc High performance, multi-platform VNC client and server 项目地址: https://gitcode.com/gh_mirrors/ti/tigervnc 想要在不同操作系统间实现流畅的远程桌面连接吗?T…...

在 Node.js 项目中配置 Taotoken 作为 OpenAI 兼容服务端

在 Node.js 项目中配置 Taotoken 作为 OpenAI 兼容服务端 1. 准备工作 在开始配置之前,请确保您已完成以下准备工作。首先,访问 Taotoken 控制台创建 API Key,该 Key 将用于后续的身份验证。其次,在模型广场查看并记录您希望使用…...

华为昇腾AIPP配置避坑指南:从Crop/Padding参数配置到模型转换生效全流程

华为昇腾AIPP配置避坑指南:从Crop/Padding参数配置到模型转换生效全流程 在昇腾AI处理器的实际部署中,AIPP(AI Preprocessing)配置往往是模型转换过程中最易出错的环节之一。许多开发者虽然理解AIPP的基本概念,却在具体…...