【YOLOv11改进 - 注意力机制】EMA(Efficient Multi-Scale Attention):基于跨空间学习的高效多尺度注意力

介绍

image-20240523225118657

摘要

通道或空间注意力机制在许多计算机视觉任务中表现出显著的效果,可以生成更清晰的特征表示。然而,通过通道维度缩减来建模跨通道关系可能会对提取深度视觉表示带来副作用。本文提出了一种新颖高效的多尺度注意力(EMA)模块。该模块着重于保留每个通道的信息并减少计算开销,我们将部分通道重新调整为批次维度,并将通道维度分组为多个子特征,使空间语义特征在每个特征组内分布均匀。具体来说,除了在每个并行分支中对全局信息进行编码以重新校准通道权重外,这两个并行分支的输出特征还通过跨维度交互进一步聚合,以捕捉像素级的成对关系。我们在图像分类和目标检测任务上进行了广泛的消融研究和实验,使用流行的基准数据集(如CIFAR-100、ImageNet-1k、MS COCO和VisDrone2019)来评估其性能。

YOLOv11目标检测创新改进与实战案例专栏

点击查看文章目录: YOLOv11创新改进系列及项目实战目录 包含卷积,主干 注意力,检测头等创新机制 以及 各种目标检测分割项目实战案例

点击查看专栏链接: YOLOv11目标检测创新改进与实战案例

在这里插入图片描述

文章链接

论文地址:论文地址

代码地址:代码地址

基本原理

EMA(Efficient Multi-Scale Attention)模块是一种新颖的高效多尺度注意力机制,旨在提高计算机视觉任务中的特征表示效果。 EMA注意力模块通过结合通道和空间信息、采用多尺度并行子网络结构以及优化坐标注意力机制,实现了更加高效和有效的特征表示,为计算机视觉任务的性能提升提供了重要的技术支持。

  1. 通道和空间注意力的结合:EMA模块通过将通道和空间信息相结合,实现了通道维度的信息保留和降低计算负担。这种结合有助于在特征表示中捕捉跨通道关系,同时避免了通道维度的削减,从而提高了模型的表现效果。

  2. 多尺度并行子网络:EMA模块采用多尺度并行子网络结构,其中包括一个处理1x1卷积核和一个处理3x3卷积核的并行子网络。这种结构有助于有效捕获跨维度交互作用,建立不同维度之间的依赖关系,从而提高特征表示的能力。

  3. 坐标注意力(CA)的再审视:EMA模块在坐标注意力(CA)的基础上进行了改进和优化。CA模块通过将位置信息嵌入通道注意力图中,实现了跨通道和空间信息的融合。EMA模块在此基础上进一步发展,通过并行子网络块有效捕获跨维度交互作用,建立不同维度之间的依赖关系。

  4. 特征聚合和交互:EMA模块通过并行子网络的设计,有助于实现特征的聚合和交互,从而提高模型对长距离依赖关系的建模能力。这种设计避免了更多的顺序处理和大规模深度,使模型更加高效和有效。

下图是结构,其中包括输入、特征重组、通道注意力和输出步骤。

image-20240523230431626

核心代码

import torch
from torch import nnclass EMA(nn.Module):def __init__(self, channels, c2=None, factor=32):super(EMA, self).__init__()self.groups = factor  # 分组数,默认为32assert channels // self.groups > 0  # 确保通道数能够被分组数整除self.softmax = nn.Softmax(-1)  # 定义 Softmax 层,用于最后一维度的归一化self.agp = nn.AdaptiveAvgPool2d((1, 1))  # 自适应平均池化,将特征图缩小为1x1self.pool_h = nn.AdaptiveAvgPool2d((None, 1))  # 自适应平均池化,保留高度维度,将宽度压缩为1self.pool_w = nn.AdaptiveAvgPool2d((1, None))  # 自适应平均池化,保留宽度维度,将高度压缩为1self.gn = nn.GroupNorm(channels // self.groups, channels // self.groups)  # 分组归一化self.conv1x1 = nn.Conv2d(channels // self.groups, channels // self.groups, kernel_size=1, stride=1, padding=0)  # 1x1卷积self.conv3x3 = nn.Conv2d(channels // self.groups, channels // self.groups, kernel_size=3, stride=1, padding=1)  # 3x3卷积def forward(self, x):b, c, h, w = x.size()  # 获取输入张量的尺寸:批次、通道、高度、宽度group_x = x.reshape(b * self.groups, -1, h, w)  # 将张量按组重构:批次*组数, 通道/组数, 高度, 宽度x_h = self.pool_h(group_x)  # 对高度方向进行池化,结果形状为 (b*groups, c//groups, h, 1)x_w = self.pool_w(group_x).permute(0, 1, 3, 2)  # 对宽度方向进行池化,并转置结果形状为 (b*groups, c//groups, 1, w)hw = self.conv1x1(torch.cat([x_h, x_w], dim=2))  # 将池化后的特征在高度方向拼接后进行1x1卷积x_h, x_w = torch.split(hw, [h, w], dim=2)  # 将卷积后的特征分为高度特征和宽度特征x1 = self.gn(group_x * x_h.sigmoid() * x_w.permute(0, 1, 3, 2).sigmoid())  # 结合高度和宽度特征,应用分组归一化x2 = self.conv3x3(group_x)  # 对重构后的张量应用3x3卷积x11 = self.softmax(self.agp(x1).reshape(b * self.groups, -1, 1).permute(0, 2, 1))  # 对 x1 进行自适应平均池化并应用Softmaxx12 = x2.reshape(b * self.groups, c // self.groups, -1)  # 重构 x2 的形状为 (b*groups, c//groups, h*w)x21 = self.softmax(self.agp(x2).reshape(b * self.groups, -1, 1).permute(0, 2, 1))  # 对 x2 进行自适应平均池化并应用Softmaxx22 = x1.reshape(b * self.groups, c // self.groups, -1)  # 重构 x1 的形状为 (b*groups, c//groups, h*w)weights = (torch.matmul(x11, x12) + torch.matmul(x21, x22)).reshape(b * self.groups, 1, h, w)  # 计算权重,并重构为 (b*groups, 1, h, w)return (group_x * weights.sigmoid()).reshape(b, c, h, w)  # 将权重应用于原始张量,并重构为原始输入形状

YOLOv11引入代码

在根目录下的ultralytics/nn/目录,新建一个attention目录,然后新建一个以 EMA_attention为文件名的py文件, 把代码拷贝进去。

task与yaml配置

详见:https://blog.csdn.net/shangyanaf/article/details/143041421

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

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

相关文章

UIAbility组件生命周期

当用户打开、切换和返回到对应应用时,应用中的UIAbility实例会在其生命周期的不同状态之间转换。UIAbility类提供了一系列回调,通过这些回调可以知道当前UIAbility实例的某个状态发生改变,会经过UIAbility实例的创建和销毁,或者UIAbility实例发生了前后台的状态切换。 UIAb…

quartz集群增强版

quartz集群增强版😘转载请著名出处https://www.cnblogs.com/funnyzpc/p/18534034 这是除了mee_admin之外,投入时间精力最多的一次开源了,quartz集群增强版前前后后花费了我四月有余的时间精力开发而来,实属不易~ 先简要的说下:quartz集群增强版由quartz的 2.3.2 版本改…

数据结构_链表_双向循环链表 栈 的初始化、插入、删除、修改、查询打印(基于C语言实现)

一、双向循环链表的原理与应用 双向循环链表与双向链表的区别:指的是双向循环链表的首结点中的prev指针成员指向链表的尾结点,并且双向循环链表的尾结点里的next指针成员指向链表的首结点,所以双向循环链表也属于环形结构。由于带头结点更加方便用户进行数据访问,所以本次创…

[63] (多校联训) A层冲刺NOIP2024模拟赛19

lhx 对 \((\ln n)^{\ln n}\) 求导求出一个形如 \(\frac{1}{n\ln n\ln\ln n}\) 的东西A.图书管理 说一种很好玩的 \(n^2\log n\) 做法(因为动态中位数我只会这个) 对顶堆: 就是你开一个大根堆和一个小根堆,然后把它们怼在一起,钦定比中位数大的放小根堆,小的放大根堆,这样…

基于Java+SpringBoot心理测评心理测试系统功能实现六

三、部分系统功能试卷试题信息业务逻辑层Service、试卷试题题型信息业务逻辑层Service、角色信息业务逻辑层Service、用户信息业务逻辑层Service、前台用户信息业务逻辑层Service一、前言介绍: 1.1 项目摘要 心理测评和心理测试系统在当代社会中扮演着越来越重要的角色。随着心…

基于Java+SpringBoot心理测评心理测试系统功能实现五

技术点:SpringBoot+SpringDataJPA+Mysql+HTML+Freemaker+Bootstrap 三、部分系统功能 关于我们信息业务逻辑层Service、封面图信息业务逻辑层Service、留言信息业务逻辑层Service、公告信息业务逻辑层Service、心理测试业务逻辑层Service一、前言介绍: 1.1 项目摘要 心理测评…

鸿蒙开发案例:七巧板

【1】引言(完整代码在最后面) 本文介绍的拖动七巧板游戏是一个简单的益智游戏,用户可以通过拖动和旋转不同形状的七巧板块来完成拼图任务。整个游戏使用鸿蒙Next框架开发,利用其强大的UI构建能力和数据响应机制,实现了流畅的用户体验。 【2】环境准备 电脑系统:windows 1…

windows MacBook 下载视频网站视频

下载yt-dlp github地址:https://github.com/yt-dlp/yt-dlp 下载:https://github.com/yt-dlp/yt-dlp/releases下载ffmpeg 官网:https://ffmpeg.org/解压后,只有bin下的这2个文件放C盘目录下 将下面这3个程序,挪到:C:\Windows\System32下载视频 在任意路径:cmd命令:yt-dl…

聊聊接口测试用例设计规范

1、通过性验证: 先按照接口文档传入所有必填字段并且字段值在正确范围内,预期返回正确结果 2、参数验证(正向/逆向):必填参数:针对每个必填参数,都设计一条参数为空的测试用例,接口错误信息返回正确 非必填参数:设计一条用例所有非必填的参数都传入值,非必填参数(类…

2287: 【例28.3】 数列分段

include <bits/stdc++.h> using namespace std; int n, m, sum, num; int main( ) { cin >> n >> m; for (int i=1;i<=n;i++) { int e; cin >> e; if (num+e>m) { sum++; num=e; } else { num+=e; } } cout << sum+1; return 0; } 反思:这…

CRM系统主要是干什么的?

什么是CRM 系统?CRM系统到底是干什么的?不同的企业人员该如何利用CRM去解决他们的问题等等,问题太多了,我想着就就专门出一期内容,来为大家详细介绍。 干货满满,建议收藏!! 首先第一个问题,什么是CRM系统? CRM是Customer Relationship Management 的缩写,就是客户关…

11月7日 NOIP模拟(难题math、矩阵游戏matrix、括号序列seq、道路road) - 模拟赛记录

Preface T1 试图找规律失败,正经推反而几分钟就出来了。以后应该少想这些歪门邪道(除非实在闲的蛋疼或者没有一点头绪,且必须要打完所有能打的子任务比如暴力或特殊性质;而且必须在用常规方法思考过后,才能够用一些稍微不那么常规的方法) 至于 T2、T3、T4,因为知道 T1 浪…