首页 > 其他分享 >【YOLOv8改进】EMA(Efficient Multi-Scale Attention):基于跨空间学习的高效多尺度注意力 (论文笔记+引入代码)

【YOLOv8改进】EMA(Efficient Multi-Scale Attention):基于跨空间学习的高效多尺度注意力 (论文笔记+引入代码)

时间:2024-06-10 22:12:40浏览次数:11  
标签:Multi Scale EMA self channels 池化 groups 维度

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

专栏目录: YOLO有效改进系列及项目实战目录 包含卷积,主干 注意力,检测头等创新机制 以及 各种目标检测分割项目实战案例

专栏链接: YOLO基础解析+创新改进+实战案例

摘要

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

创新点

  1. 高效的多尺度注意力机制:EMA模块提出了一种高效的多尺度注意力机制,能够同时捕获通道和空间信息,并在不增加太多参数和计算成本的情况下有效地提高特征表示能力。

  2. 通道维度重塑:EMA模块通过将部分通道重塑为批量维度,将通道维度分组为多个子特征,从而使空间语义特征在每个特征组内得到良好分布,提高了特征的表达能力。

  3. 并行子网络设计:EMA模块采用了并行子网络设计,有助于捕获跨维度的交互作用和建立维度间的依赖关系,提高了模型对长距离依赖关系的建模能力。

  4. 性能优越:EMA模块在目标检测任务中表现出色,相较于传统的注意力模块(如CA和CBAM),EMA在保持模型尺寸和计算效率的同时,取得了更好的性能表现,证明了其在提升模型性能方面的有效性和高效性。

  5. 适用性广泛:EMA模块的模型尺寸适中,适合在移动终端上部署,并且在各种计算机视觉任务中都表现出色,具有广泛的应用前景和实际意义。

yolov8 引入

class EMA(nn.Module):
   def __init__(self, channels, c2=None, factor=32):
       super(EMA, self).__init__()
       self.groups = factor  # 分组数,默认为32
       assert channels // self.groups > 0  # 确保通道数能够被分组数整除
       self.softmax = nn.Softmax(-1)  # 定义 Softmax 层,用于最后一维度的归一化
       self.agp = nn.AdaptiveAvgPool2d((1, 1))  # 自适应平均池化,将特征图缩小为1x1
       self.pool_h = nn.AdaptiveAvgPool2d((None, 1))  # 自适应平均池化,保留高度维度,将宽度压缩为1
       self.pool_w = nn.AdaptiveAvgPool2d((1, None))  # 自适应平均池化,保留宽度维度,将高度压缩为1
       self.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 进行自适应平均池化并应用Softmax
       x12 = 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 进行自适应平均池化并应用Softmax
       x22 = 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)  # 将权重应用于原始张量,并重构为原始输入形状

task与yaml配置

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

标签:Multi,Scale,EMA,self,channels,池化,groups,维度
From: https://www.cnblogs.com/banxia-frontend/p/18241122

相关文章

  • Mathematica Partial Fraction Decomposition
    遇到的问题Mathematica中有一个自带的部分分式分解函数Apart。In:=Apart[(-3+x)/((-1+x)(1+x))]Out:=-(1/(-1+x))+2/(1+x)但是Apart遇到分解结果中带无理数的就会摆烂:In:=Apart[x/(1-x-x^2)]Out:=-(x/(-1+x+x^2))解决方案1我们有一个......
  • ResourceManager unable to find resou
    哈喽,大家好,我是木头左,AI改变生活!一、问题描述在使用Mybatis自定义模板引擎时,可能会遇到一些问题。本文将介绍一个常见的报错信息:org.apache.velocity.exception.ResourceManagerException:Unabletofindresource。这个错误通常表示Velocity引擎无法找到指定的资源文件。本......
  • 【Pytorch】一文向您详细介绍 nn.MultiheadAttention() 的作用和用法
    【Pytorch】一文向您详细介绍nn.MultiheadAttention()的作用和用法 下滑查看解决方法......
  • Multisim555定时器电路设计仿真
       最近在完成数电课设,需要用到555定时器产生一个秒脉冲,虽然网上有很多关于555的资料,但是按照他们的进行仿真波形一直不对。自己设计的占空比有不太准确,但是其实Multisim有提供555定时器电路设计向导,填好参数会自动生成电路。下面是仿真步骤:电路的R1和R2有参数要求,需要......
  • 腾讯冷启动论文阅读《Enhancing User Interest based on Stream Clustering and Memor
    背景用户冷启动一直是推荐系统中的一个难题,新用户(或非活跃用户)由于缺少行为数据,模型预估不准确。为了改善用户冷启动,腾讯提出了UserInterestEnhancement(UIE)模型(论文中提到也可以用于item的冷启动)。基本思想是先对用户聚类,然后用userembedding检索最相似的k个聚类中心来表示......
  • sqli-labs 靶场 less-1、2、3、4 第一关至第四关: 判断闭合方式,order by判断字段数,是否
    SQLi-Labs是一个用于学习和练习SQL注入漏洞的开源应用程序。通过它,我们可以学习如何识别和利用不同类型的SQL注入漏洞,并了解如何修复和防范这些漏洞。Less1SQLIDUMBSERIES-11.判断闭合方式:在参数后面加\的方法判断闭合,\后面的符号就是闭合符号。在第一关,闭合方式通......
  • GLaMM : Pixel Grounding Large Multimodal Model
    郑重声明:原文参见标题,如有侵权,请联系作者,将会撤销发布! Abstract大型多模态模型(LMM)将大语言模型扩展到视觉领域。最初的LMM使用整体图像和文本提示词来生成无定位的文本响应。最近,区域级LMM已被用于生成视觉定位响应。然而,它们仅限于一次仅引用单个目标类别,要求用户指定......
  • Sentiment Knowledge Enhanced Self-supervised Learning for Multimodal Sentiment A
    文章目录SKESL:多模态情感分析中的情感知识增强型自监督学习文章信息研究目的研究内容研究方法1.SentimentWordMasking2.Textrepresentationlearning3.Non-verbalinformationinjection(multimodalfusion)4.SentimentIntensityPrediction5.LossFunction6.Fine-tuni......
  • Codeforces Round 949 (Div. 2)D. Turtle and Multiplication(欧拉路径、线性筛、思维
    Problem-D-Codeforces  按照官方正解做即可,顺带存个jiangly板子。1#include<bits/stdc++.h>23usingi64=longlong;4std::vector<int>minp,primes;56voidsieve(intn){7minp.assign(n+1,0);8primes.clear();910......
  • java 常用的辅助类:CountDownLatch,CyclicBarrier,Semaphore
    java常用的辅助类:1.CountDownLatch减法计数器2.CyclicBarrier加法计数器3.Semaphore同一时刻只允许固定(3)个线程执行,完成后另外固定(3)个线程再继续执行1.CountDownLatch:减法计数器.等待所有的执行完成CountDownLatchcountDownLatch=newCountDownLatch(5);//减法计数......