首页 > 其他分享 >爆改YOLOv8 | yolov8添加GAM注意力机制

爆改YOLOv8 | yolov8添加GAM注意力机制

时间:2024-08-17 10:58:48浏览次数:7  
标签:__ nn 爆改 self yolov8 channels GAM C2f

1,本文介绍

GAM(Global Attention Mechanism)旨在改进传统注意力机制的不足,特别是在通道和空间维度上的信息保留问题。它通过顺序的通道-空间注意力机制来解决这些问题。以下是GAM的关键设计和实现细节:

  1. 通道注意力子模块

    • 3D排列:使用3D排列来在三个维度上保留信息,这种方法有助于捕捉更多维度的特征。
    • 两层MLP:通过一个两层的多层感知机(MLP)增强跨维度的通道-空间依赖性,提升了模型对复杂特征的学习能力。
  2. 空间注意力子模块

    • 两个卷积层:采用两个卷积层融合空间信息,增强空间特征的学习,而不是使用最大池化操作,避免了可能导致信息损失的操作。
    • 分组卷积与通道混洗:通过分组卷积和通道混洗,GAM在ResNet50中避免了显著的参数增加,这有助于减少计算开销和内存占用。
  3. 性能提升

    • 在不同网络架构上的应用:GAM在多种神经网络架构上都展示了稳定的性能提升,尤其在ResNet18上,GAM在参数更少的情况下展现了比ABN(Adaptive Bottleneck Network)更好的性能和效率。

GAM通过这些设计增强了对全局信息的捕捉能力,并在保持高效性的同时,显著提高了模型的表现。

以下为GAM模型结构图

关于GAM的详细介绍可以看论文:https://arxiv.org/pdf/2112.05561v1.pdf

本文将讲解如何将GAM融合进yolov8

话不多说,上代码!

2,将GAM融合进YOLOv8

2.1 步骤一

首先找到如下的目录'ultralytics/nn/modules',然后在这个目录下创建一个attention.py文件,文件名字可以根据你自己的习惯起,然后将GAM的核心代码复制进去。

# gam核心代码
import torch
import torch.nn as nn
 
'''
https://arxiv.org/abs/2112.05561
'''
__all__ = (
    "GAM",
)
class GAM(nn.Module):
    def __init__(self, in_channels, rate=4):
        super().__init__()
        out_channels = in_channels
        in_channels = int(in_channels)
        out_channels = int(out_channels)
        inchannel_rate = int(in_channels/rate)
 
 
        self.linear1 = nn.Linear(in_channels, inchannel_rate)
        self.relu = nn.ReLU(inplace=True)
        self.linear2 = nn.Linear(inchannel_rate, in_channels)
        
 
        self.conv1=nn.Conv2d(in_channels, inchannel_rate,kernel_size=7,padding=3,padding_mode='replicate')
 
        self.conv2=nn.Conv2d(inchannel_rate, out_channels,kernel_size=7,padding=3,padding_mode='replicate')
 
        self.norm1 = nn.BatchNorm2d(inchannel_rate)
        self.norm2 = nn.BatchNorm2d(out_channels)
        self.sigmoid = nn.Sigmoid()
 
    def forward(self,x):
        b, c, h, w = x.shape
        # B,C,H,W ==> B,H*W,C
        x_permute = x.permute(0, 2, 3, 1).view(b, -1, c)
        
        # B,H*W,C ==> B,H,W,C
        x_att_permute = self.linear2(self.relu(self.linear1(x_permute))).view(b, h, w, c)
 
        # B,H,W,C ==> B,C,H,W
        x_channel_att = x_att_permute.permute(0, 3, 1, 2)
 
        x = x * x_channel_att
 
        x_spatial_att = self.relu(self.norm1(self.conv1(x)))
        x_spatial_att = self.sigmoid(self.norm2(self.conv2(x_spatial_att)))
        
        out = x * x_spatial_att
 
        return out
 
if __name__ == '__main__':
    img = torch.rand(1,64,32,48)
    b, c, h, w = img.shape
    net = GAM(in_channels=c, out_channels=c)
    output = net(img)
    print(output.shape)

2.2 步骤二

首先找到如下的目录'ultralytics/nn/modules',然后在这个目录下找到init文件,在init中添加如下代码.

from .attention import (
    GAM,
)

同时在init.py中的如下位置添加GAM

2.3 步骤三

在task.py中导入GAM

 2.3 步骤四

在task.py中添加如下代码.

到此注册成功,复制后面的yaml文件直接运行即可

yaml文件

# Ultralytics YOLO 

标签:__,nn,爆改,self,yolov8,channels,GAM,C2f
From: https://blog.csdn.net/weixin_43986124/article/details/141205799

相关文章

  • 爆改YOLOv8 || 利用Gold-YOLO提高YOLOv8对小目标检测精度
    1,本文介绍Gold-YOLO通过一种创新的 聚合-分发(Gather-and-Distribute,GD)机制 来提高信息融合效率。这一机制利用卷积和自注意力操作来处理来自网络不同层的信息。通过这种方式,Gold-YOLO能够更有效地融合多尺度特征,实现低延迟和高准确性之间的理想平衡.关于GOLD-YOLO的详细......
  • YOLOv8改进:独家创新篇 - 给YOLOv8增加辅助可逆分支结构(PGI,1:1改进)
    鱼弦:公众号【红尘灯塔】,CSDN博客专家、内容合伙人、新星导师、全栈领域优质创作者、51CTO(Top红人+专家博主)、github开源爱好者(go-zero源码二次开发、游戏后端架构https://github.com/Peakchen)YOLOv8改进:独家创新篇-给YOLOv8增加辅助可逆分支结构(PGI,1:1改进)简介YOL......
  • pygame开发小游戏
    代码:#coding=utf-8importos,sys,re,timeimportpygameimportrandomfromwin32apiimportGetSystemMetricsfromtkinterimportmessageboxfromsqlparse.filtersimportright_margin#pyinstaller-F-wdaziyan.pypygame.init()pygame.display.set_caption(&......
  • HDU 2873 Bomb Game
    题目链接:HDU2873【BombGame】思路    数据范围较小,直接暴力求所有状态的SG值,然后将棋盘上所有炸弹的对应位置的SG值异或起来就可以得到当前局面的结果。对于相同位置的上有两个炸弹会自动爆炸,本来他们的SG值的异或和就为0,所以可以不用管。代码intn,m,vis[N*N......
  • [AGC064C] Erase and Divide Game
    link感觉题解说的都很不清晰,这里只谈个人理解。考虑操作的本质是什么,两人从低到高确定二进制下的每一位填的数,并且场上只保留对应后缀的数字,当场上没有数字时当前操作者输。设\(f[i,S]\)表示确定了前\(i\)位,填的数为\(S\),接下来先手是否能赢,那么有\(f[i,S]=\neg(f[i......
  • HDU 2999 Stone Game, Why are you always there?
    题目链接:HDU2999【StoneGame,Whyareyoualwaysthere?】思路    由于只能取连续的一段石子,当取出的石子是这段石子的中间一部分时就相当于将一段石子分成两段石子,简单异或一下求SG值就行了代码intsg[N],vis[N],a[N];intn,m,k;voidgetsg(){memset......
  • 基于MonoGame重制《俄罗斯方块》游戏
    两年前,我使用C#基于MonoGame编写了一款《俄罗斯方块》游戏,相关介绍可以参考【这篇文章】。最近,使用业余时间将之前的基于MonoGame的游戏开发框架重构了一下,于是,也就趁此机会将之前的《俄罗斯方块》游戏也重制一次,加入了许多我一直打算加入的功能,甚至包括提供跨平台的版本。先说说......
  • 爆改YOLOv8 | yolov8添加CBAM注意力机制
    1,.本文介绍CBAM的主要思想是通过关注重要的特征并抑制不必要的特征来增强网络的表示能力。模块首先应用通道注意力,关注"重要的"特征,然后应用空间注意力,关注这些特征的"重要位置"。通过这种方式,CBAM有效地帮助网络聚焦于图像中的关键信息,提高了特征的表示力度.以下为CBAM结构......
  • windows下yolov8训练环境配置
    安装anaconda3condacreate-nyolov8python=3.8##进入yolov8虚拟环境activateyolov8pipinstallultralyticscondainstallchardet安装pytorch、cudahttps://pytorch.org/get-started/locally/condainstallpytorchtorchvisiontorchaudiopytorch-cuda=11.......
  • [NSSCTF 2022 Spring Recruit]ezgame
    首先查看本题描述:js分析,源码泄露,信息收集,大致了解了题的解法方向,进入题目页面查看一下,是一个射击游戏,查看源码发现要获得65分才能拿到成绩,一般来说这种游戏基本不可能拿到给定的分数,通常是对源码进行分析然后用bp抓包改包以此来进行分数获得。 结合前面题解的描述,我们先对js文......