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

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


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

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基础上添加SE模块,如果要对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.hqwc.cn/news/689613.html

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

相关文章

Python经典案例爬取豆瓣Top250电影数据

随着网络数据的日益丰富,如何从海量的信息中快速、准确地提取出有价值的数据,成为了许多开发者和技术爱好者关注的焦点。在这个过程中,网络爬虫技术凭借其强大的数据获取能力,成为了数据分析和挖掘的重要工具。本文将通过一个经典…

ECharts系列文章汇总(持续更新中)

ECharts介绍 ECharts是一款基于JavaScript的数据可视化图表库,提供了直观、生动、可交互、可个性化定制的数据可视化图表。以下是关于ECharts的详细介绍: 发展历程: ECharts最初由百度团队开源,并在2018年初捐赠给Apache基金会&…

Agisoft Metashape Pro for Mac/win:开启三维建模新视界

在当今数字化的时代,三维建模技术正发挥着越来越重要的作用。而 Agisoft Metashape Pro for Mac/win 无疑是该领域的一颗璀璨明星。 这款强大的三维建模软件为专业人士和爱好者提供了无与伦比的工具和功能。无论你是从事建筑设计、考古研究、影视特效制作还是地理信…

进程间通信(二)

共享内存 当进程A和进程B有一块共享的内存空间时,这两个进程之间的数据交互就会变的很简单,只需要像读取自己内存空间中的元素一样去读取数据即可。实现共享内存进行数据交互的一般步骤: 创建/打开共享内存内存映射数据交换断开与共享内存的…

[Markdown]是时候该学学使用markdown写文章了

💕💕💕欢迎各位来到我的博客,今天我们的主题是markdown,你将在这里学习到最全的markdown知识💕💕💕 你还在使用富文本编辑器写文档或文章吗? 你还在用word一点一点地进行…

LOTO示波器动作编程功能(命令批处理)

动作编程功能是为了方便客户根据自己的应用场景,做到一个按键就连续做多个示波器操作,从而降低了对操作人员的技术要求,做到傻瓜式操作。之前LOTO有个类似的功能,是把示波器的基础设置根据不同的测试场景存成不同的设置文件&#…

颍川诞生了两个帝王的仲父

伯、仲、叔、季是古代兄弟的长幼排行顺序,《释名释亲属》载:“父之弟曰仲父……仲父之弟曰叔父”。也就是古代称父亲的兄弟为仲父,多用于帝王对宰相重臣的尊称。 历史上最有名的、有正史记载的帝王“仲父”有两位,而且都出自颍川…

【Delphi 爬虫库 6】使用正则表达式提取猫眼电影排行榜top100

正则表达式库的简单介绍 正则表达式易于使用,功能强大,可用于复杂的搜索和替换以及基于模板的文本检查。这对于输入形式的用户输入验证特别有用-验证电子邮件地址等。您还可以从网页或文档中提取电话号码,邮政编码等,在日志文件中…

ROS2 工作空间

文章目录 ROS2 工作空间创建工作空间自动安装依赖编译工作空间设置环境变量参考链接 ROS2 工作空间 工作空间可以简单理解为工程目录。 ROS 系统中一个典型的工作空间结构如图所示: dev_ws: 根目录,里面会有四个子目录(子空间&a…

Coursera吴恩达深度学习专项课程01: Neural Networks and Deep Learning 学习笔记 Week 03

Neural Networks and Deep Learning Course Certificate 本文是学习 https://www.coursera.org/learn/neural-networks-deep-learning 这门课的笔记 Course Intro 文章目录 Neural Networks and Deep LearningWeek 03: Shallow Neural NetworksLearning Objectives Neural Ne…

共享云桌面如何助力企业信息化和数字化?

随着科技的飞速发展,信息化和数字化已经成为企业转型的重要方向。共享云桌面作为一种新兴的信息化工具,正以其独特的优势助力企业实现信息化和数字化的目标。本文将详细探讨共享云桌面如何助力企业信息化和数字化的过程,以及它所带来的效益。…

词令蚂蚁新村今日答案:微信小程序怎么查看蚂蚁新村今天问题的正确答案?

微信小程序怎么查看蚂蚁新村今天问题的正确答案? 1、打开微信,点击搜索框; 2、打开搜索页面,选择小程序搜索; 3、在搜索框,输入词令搜索点击进入词令微信小程序; 4、打开词令微信小程序关键词口…