YOLOv5改进 | 注意力机制 | 用于移动端的高效坐标CA注意力机制

 在深度学习目标检测领域,YOLOv5成为了备受关注的模型之一。本文给大家带来的是能用于移动端的高效坐标CA注意力机制。文章在介绍主要的原理后,将手把手教学如何进行模块的代码添加和修改,并将修改后的完整代码放在文章的最后,方便大家一键运行,小白也可轻松上手实践。以帮助您更好地学习深度学习目标检测YOLO系列的挑战。


专栏地址YOLOv5改进+入门——持续更新各种有效涨点方法 

目录

1.原理

2.YOLOv5添加CA注意力机制

2.1 CA注意力机制代码

2.2新增yaml文件

2.3 注册模块

2.4 执行程序

3.总结 


1.原理

论文地址Coordinate Attention for Efficient Mobile Network Design点击即可跳转

官方代码CoordAttention官方代码仓库点击即可跳转

CA 机制是注意力机制的一种变体,常用于神经网络架构中,特别是在与计算机视觉和自然语言处理相关的任务中。CA 机制将卷积操作与注意力机制相结合,以有效捕捉空间依赖性。

在传统的注意力机制中,如 transformer 中的自注意力机制,序列中的每个标记都会关注到序列中的其他每个标记,导致计算复杂度为二次方。这对于长序列来说变得不切实际。另一方面,卷积操作在计算上是高效的,并且能有效捕捉局部模式。

CA 机制旨在融合卷积层和注意力机制的优点。它通常按以下方式操作:

1. 卷积操作:输入序列与可学习的滤波器进行卷积,捕捉局部信息并生成特征图。

2. 注意力机制:然后将特征图输入到注意力机制中,该机制计算每个特征图的注意力权重。这些权重表示每个局部特征图相对于其他特征图的重要性。

3. 加权聚合:最后,根据它们的注意力权重对特征图进行聚合,生成一个强调相关局部信息同时减少噪声和不相关细节的输入序列表示。

CA 机制已被证明在各种任务中有效,如图像分类、目标检测和自然语言理解。通过结合卷积操作和注意力机制,CA 模型能够高效地捕捉局部和全局依赖关系,从而在复杂任务中提高性能。

CA注意力机制结构简图

2.YOLOv5添加CA注意力机制

2.1 CA注意力机制代码

关键步骤一:将下面代码添加到 yolov5/models/common.py中任意位置

class h_sigmoid(nn.Module):def __init__(self, inplace=True):super(h_sigmoid, self).__init__()self.relu = nn.ReLU6(inplace=inplace)def forward(self, x):return self.relu(x + 3) / 6class h_swish(nn.Module):def __init__(self, inplace=True):super(h_swish, self).__init__()self.sigmoid = h_sigmoid(inplace=inplace)def forward(self, x):return x * self.sigmoid(x)class CoordAtt(nn.Module):def __init__(self, inp, oup, reduction=32):super(CoordAtt, self).__init__()self.pool_h = nn.AdaptiveAvgPool2d((None, 1))self.pool_w = nn.AdaptiveAvgPool2d((1, None))mip = max(8, inp // reduction)self.conv1 = nn.Conv2d(inp, mip, kernel_size=1, stride=1, padding=0)self.bn1 = nn.BatchNorm2d(mip)self.act = h_swish()self.conv_h = nn.Conv2d(mip, oup, kernel_size=1, stride=1, padding=0)self.conv_w = nn.Conv2d(mip, oup, kernel_size=1, stride=1, padding=0)def forward(self, x):identity = xn, c, h, w = x.size()# c*1*Wx_h = self.pool_h(x)# c*H*1# C*1*hx_w = self.pool_w(x).permute(0, 1, 3, 2)y = torch.cat([x_h, x_w], dim=2)# C*1*(h+w)y = self.conv1(y)y = self.bn1(y)y = self.act(y)x_h, x_w = torch.split(y, [h, w], dim=2)x_w = x_w.permute(0, 1, 3, 2)a_h = self.conv_h(x_h).sigmoid()a_w = self.conv_w(x_w).sigmoid()out = identity * a_w * a_hreturn out

CA注意力机制是一种结合了卷积操作和注意力机制的变体,通常用于处理序列数据,尤其在计算机视觉和自然语言处理任务中表现出色。首先,CA机制利用卷积操作来从输入序列中提取局部特征信息,这些卷积滤波器可以有效地捕获输入数据中的空间局部结构。然后,得到的特征图被送入注意力机制中,其中每个特征图都被赋予一个注意力权重,表示其相对于其他特征图的重要性。这种加权过程能够使得模型更加关注重要的局部特征,并且降低对无关信息的敏感度。最终,通过将注意力权重与特征图相乘并进行池化或者求和操作,可以得到一个整体的序列表示,其中包含了局部和全局的信息。总的来说,CA注意力机制能够在保持计算效率的同时,有效地捕获序列数据中的重要信息,从而提高了模型的性能和泛化能力。

CA注意力机制的流程如下:

1. 输入序列:首先,输入序列被表示为一个特征图集合或张量,例如,在自然语言处理中,可以是词嵌入序列;在计算机视觉中,可以是图像的特征图。

2. 卷积操作:输入序列经过一系列卷积操作,这些卷积操作可以捕获输入数据中的局部特征信息。这些卷积核或滤波器通常具有不同的大小和深度,以捕获不同尺度和层次的特征。

3. 特征图生成:每个卷积操作生成一个特征图,这些特征图捕获了输入序列中的局部信息,但可能忽略了全局关系。

4. 注意力机制:生成的特征图被输入到一个注意力机制中。在注意力机制中,每个特征图都被赋予一个权重,该权重表示该特征图相对于其他特征图的重要性。这些权重可以通过各种方式计算,如点乘、加性注意力等。

5. 加权汇聚:将特征图与其对应的注意力权重相乘,然后进行池化或求和操作,以将局部信息与全局信息结合起来。这样,得到的加权特征表示同时包含了局部和全局的重要信息。

6. 输出:最终,通过对加权特征表示进行后续处理(如全连接层),模型可以输出最终的预测结果或特征表示。

整个流程中,CA注意力机制通过结合卷积操作和注意力机制,能够高效地捕获序列数据中的局部和全局信息,从而提高了模型的性能和泛化能力。

2.2新增yaml文件

关键步骤二:在 /yolov5/models/ 下新建文件 yolov5_ca.yaml文件并将下面代码复制进去

# 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, C3, [128]],[-1, 1, Conv, [256, 3, 2]],  # 3-P3/8[-1, 6, C3, [256]],[-1, 1, Conv, [512, 3, 2]],  # 5-P4/16[-1, 9, C3, [512]],[-1, 1, Conv, [1024, 3, 2]],  # 7-P5/32[-1, 3, C3, [1024]],[-1, 1, CoordAtt, [1024]],[-1, 1, SPPF, [1024, 5]],  # 10]# 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]],  # 14[-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]],  # 18 (P3/8-small)[-1, 1, Conv, [256, 3, 2]],[[-1, 15], 1, Concat, [1]],  # cat head P4[-1, 3, C3, [512, False]],  # 21 (P4/16-medium)[-1, 1, Conv, [512, 3, 2]],[[-1, 11], 1, Concat, [1]],  # cat head P5[-1, 3, C3, [1024, False]],  # 24 (P5/32-large)[[18, 21, 24], 1, Detect, [nc, anchors]],  # Detect(P3, P4, P5)]

温馨提示:因为本文只是对yolov5s基础上添加CA模块,如果要对yolov5n/l/m/x进行添加则只需要修改对应的depth_multiple 和 width_multiple。


2.3 注册模块

关键步骤三:在yolov5/models/yolo.py中注册,大概在250行左右添加 ‘CoordAtt’

2.4 执行程序

在train.py中,将cfg的参数路径设置为yolov5_ca.yaml的路径,如下图所示

建议大家写绝对路径,确保一定能找到

 运行程序,如果出现下面的内容则说明添加成功🚀

我修改后的代码:链接: https://pan.baidu.com/s/1d2KfzR1iDF1Nlf2o7LqoKA?pwd=5re5 提取码: 5re5

3.总结 

CA注意力机制是一种融合了卷积操作和注意力机制的变体,主要应用于处理序列数据,特别是在计算机视觉和自然语言处理任务中。其流程如下:

首先,输入序列被表示为特征图或张量,并经过一系列卷积操作,以提取输入序列的局部特征信息,生成相应的特征图。每个卷积操作都产生一个特征图,这些特征图捕获了输入序列的局部信息。

接下来,这些特征图被送入注意力机制中,注意力机制计算每个特征图的注意力权重,表示其相对于其他特征图的重要性。通过注意力权重,模型能够集中关注对当前任务最相关的特征图。

然后,将每个特征图与其对应的注意力权重相乘,并进行汇聚操作,以整合局部和全局信息。这一步骤使得模型能够有效地结合局部特征和全局关系,生成更丰富的特征表示。

最后,通过对加权特征表示进行后续处理(如全连接层),生成最终的预测结果或特征表示。这样的加权特征表示包含了输入序列中的局部和全局信息,使得模型能够更好地理解和处理序列数据,从而提高了模型的性能和泛化能力。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/326549.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

打破地域界限,HubSpot海外获客系统引领企业走向国际化

在全球化的浪潮中,企业如何精准把握海外市场、高效获取并转化目标客户,已成为决定其市场地位与未来发展的关键因素。HubSpot海外获客系统以其独特的视角、强大的功能和卓越的性能,正在引领全球营销进入一个新的时代。今天运营坛将深入剖析Hub…

交易复盘-20240513

仅用于记录当天的市场情况,用于统计交易策略的适用情况,以便程序回测 短线核心:不参与任何级别的调整,采用龙空龙模式 一支股票 10%的时候可以操作, 90%的时间适合空仓等待 双成药业 (1)|[9:30]|[3566万]|0.34 中通客车 (1)|[9:43]|[7678万]|0.15 嘉华股份 (2)|[9:30]|[36…

基于Springboot的大学生平时成绩量化管理系统(有报告)。Javaee项目,springboot项目。

演示视频: 基于Springboot的大学生平时成绩量化管理系统(有报告)。Javaee项目,springboot项目。 项目介绍: 采用M(model)V(view)C(controller)三…

Spring Boot日志

目录 一、日志概述 1、为什么要学习日志? 2、日志的用途 (1)系统监控 (2)数据采集 (3)日志审计 二、日志使用 1、打印日志 (1)在程序中得到日志对象 &#xf…

WebView基础知识以及Androidx-WebKit的使用

文章目录 摘要WebView基础一、启动调整模式二、WebChromeClient三、WebViewClient四、WebSettings五、WebView和Native交互 Androidx-WebKit一、启动安全浏览服务二、设置代理三、安全的 WebView 和 Native 通信支持四、文件传递五、深色主题的支持六、JavaScript and WebAssem…

自主实现Telnet流量抓取

自主实现Telnet流量抓取 根据测试需求,需要抓取Telnet流量包,使用wireshark Python(socket、telnetlib库)实现 实现代码 主要此处有坑, 根据协议规则,wireshark 默认端口为23 的是Telnet协议&#xff0…

3D模型实时变形算法

最近,在尝试渲染一些奇怪的形状后,我陷入了计算机图形学的困境。事实证明,对于我试图解决的具体问题,没有现有的选项完全适合我想要做的事情。几周后,我终于带着一些答案再次浮出水面,写了很多行代码&#…

DS:顺序表、单链表的相关OJ题训练(2)

欢迎各位来到 Harper.Lee 的学习世界! 博主主页传送门:Harper.Lee的博客主页 想要一起进步的uu欢迎来后台找我哦! 一、力扣--141. 环形链表 题目描述:给你一个链表的头节点 head ,判断链表中是否有环。如果链表中有某个…

HTML学习|网页基本信息、网页基本标签、图像标签、超链接标签、列表标签、表格标签、媒体元素、页面结构分析、iframe内联框架

网页基本信息 DOCTYPE是设置使用什么规范,网页整个信息都在html标签中,head标签里包含字符集设置,网页介绍等信息,title标签是网页的名称,网页的主干都在body标签中 网页基本标签 标题标签 h1~h6都是标题标签&#x…

2024数维杯数学建模A题B题C题思路+模型+代码(开赛后第一时间更新)

2024数维杯数学建模A题B题C题思路模型代码(开赛后第一时间更新) https://mbd.pub/o/bread/ZpWakpdq https://mbd.pub/o/bread/ZpWakpdq 2024年第九届数维杯大学生数学建模挑战赛参赛规则 竞赛要求及论文提交方式; ①本次参赛作品统一在线提交到竞赛…

软件需求工程复习——知识点

一,单选题(20分) 二,判断题(10分) 三,简答题(20分) 四,分析与设计题(50分) 一、导论 1、应用型软件的模拟特性 应用型软件在“模拟”…

基于无监督学习算法的滑坡易发性评价的实施(k聚类、谱聚类、Hier聚类)

基于无监督学习算法的滑坡易发性评价的实施 1. k均值聚类2. 谱聚类3. Hier聚类4. 基于上述聚类方法的易发性实施本研究中的数据集和代码可从以下链接下载: 数据集实施代码1. k均值聚类 K-Means 聚类是一种矢量量化方法,最初来自信号处理,旨在将 N 个观测值划分为 K 个聚类,…

Web 安全漏洞之文件上传

目录 文件上传漏洞及危害 文件名 HTML 和 SVG 软链 服务器磁盘 防御方法 网络安全学习路线 (2024最新整理) 学习资料的推荐 1.视频教程 2.SRC技术文档&PDF书籍 3.大厂面试题 特别声明: 文件上传漏洞及危害 文件上传漏洞…

基于百川大语言模型的RSS新闻过滤应用【云服务器+公网网页,随时随地看自己DIY订阅的新闻内容】

背景 目前从公众号、新闻媒体上获得的新闻信息,都是经过算法过滤推荐的,很多时候会感到内容的重复性和低质量,因为他们也要考虑到自己的利益,并非完全考虑用户想要的、对用户有价值的信息。这时,如果要获取自己认为重要的信息,定制化开发自己的筛选算法更好。 效果 素材…

计算机网络(第八版 谢希仁 编著) 期末复习大纲

一.每章总结 第一章:分组交换,计网定义、范围划分,性能指标,五层体系结构,TCP/IP体系结构 第二章:物理层,码元,基带调制(数字信号->数字信号,也叫编码),带…

本来还挺喜欢……

前阵子买了个天空星开发板,到手之后发觉不对劲。 之前我们玩玩开发板都是用的面包板的,就算是ESP那种比较宽的板子用两个面包板拼一下也勉强可以用。 但是天空星它的引脚是分为两组,每组有两排,如果我们还是直接使用面包板的话&a…

浅析安全用电监控系统在工厂的研究与应用论述

摘 要:随着社会时代的发展,人们的安全意识越来越强烈,在人们生活和工作中离不开各种用电设备,用电设备的安全使用是保障人们生命安全的重要内容。工厂因自身厂内工作环境的特殊性,用电设备的种类多且复杂,如…

Meilisearch vs Elasticsearch

2个搜索引擎的比较(官方说法):Meilisearch vs Elasticsearch Elasticsearch 做为老牌搜索引擎,功能基本满足,但复杂,重量级,适合大数据量。 MeiliSearch 设计目标针对数据在 500GB 左右的搜索需…

【知识碎片】2024_05_13

本文记录了两道代码题【自除数】和【除自身以外数组的乘积】(利用了前缀积和后缀积,值得再看),第二部分记录了关于指针数组和逗号表达式的两道选择题。 每日代码 自除数 . - 力扣(LeetCode) /*** Note: T…

软件2班20240513

第三次作业 package com.yanyu;import java.sql.*; import java.util.ResourceBundle;public class JDBCTest01 {public static void main(String[] args) {ResourceBundle bundle ResourceBundle.getBundle("com/resources/db");// ctrl alt vString driver …