YOLOv8改进 - 注意力机制 | GAM(Global Attention Mechanism):全局注意力机制,减少信息损失并放大全局维度交互特征

YOLOv8改进 - 注意力机制 | GAM(Global Attention Mechanism):全局注意力机制,减少信息损失并放大全局维度交互特征
前言本文介绍了全局注意力机制——GAM通过同时保留通道与空间两个维度的信息增强深度网络中的跨维度特征交互能力。该方法利用多层感知器构建通道注意力并结合卷积空间注意力子模块对输入特征进行逐级加权从而减少信息损失、放大全局关键特征表达。我们将 GAM 成功集成进 YOLOv8在骨干网络高层特征后引入全局注意力增强模块使模型能够更充分地捕获目标的通道依赖与空间位置信息实现更有效的特征筛选与检测性能提升。文章目录 YOLOv8改进大全卷积层、轻量化、注意力机制、损失函数、Backbone、SPPF、Neck、检测头全方位优化汇总专栏链接: YOLOv8改进专栏文章目录前言介绍文章链接基本原理核心代码引入代码tasks注册步骤1:步骤2配置yolov8-GAM.yaml实验脚本结果介绍为了提高各种计算机视觉任务的性能研究了多种注意力机制。然而现有方法忽视了保留通道和空间两个方面信息的重要性以增强跨维度的交互。因此我们提出了一种全局注意力机制通过减少信息损失和放大全局交互表示来提升深度神经网络的性能。我们引入了带有多层感知器的3D排列用于通道注意力同时结合了卷积空间注意力子模块。在CIFAR-100和ImageNet-1K上的图像分类任务评估中表明我们的方法在ResNet和轻量级MobileNet上稳定地优于几种最新的注意力机制。文章链接论文地址论文地址代码地址代码地址基本原理全局注意力机制Global Attention Mechanism是一种用于增强深度神经网络性能的技术特别是在计算机视觉任务中。该机制的技术原理在于通过保留通道和空间方面的信息以增强跨维度的交互作用。相较于以往方法全局注意力机制着重于在处理通道和空间信息时保持全局交互的重要性。该机制采用了一种全新的方法来处理通道和空间信息以提高深度神经网络的性能。具体而言全局注意力机制结合了3D置换与多层感知器用于通道注意力同时还包括一个卷积空间注意力子模块。这些组件共同作用旨在减少信息损失并放大全局维度交互特征。在技术实现上全局注意力机制通过对输入特征图进行处理得到中间状态和输出状态。其中通道注意力图和空间注意力图分别用于捕获通道和空间维度的重要特征。通过元素级乘法操作这些注意力图与输入特征图进行交互从而实现全局跨维度的信息交互。核心代码classGAM(nn.Module):def__init__(self,in_channels,out_channels,rate4):super().__init__()in_channelsint(in_channels)out_channelsint(out_channels)inchannel_rateint(in_channels/rate)self.linear1nn.Linear(in_channels,inchannel_rate)self.relunn.ReLU(inplaceTrue)self.linear2nn.Linear(inchannel_rate,in_channels)self.conv1nn.Conv2d(in_channels,inchannel_rate,kernel_size7,padding3,padding_modereplicate)self.conv2nn.Conv2d(inchannel_rate,out_channels,kernel_size7,padding3,padding_modereplicate)self.norm1nn.BatchNorm2d(inchannel_rate)self.norm2nn.BatchNorm2d(out_channels)self.sigmoidnn.Sigmoid()defforward(self,x):b,c,h,wx.shape# B,C,H,W B,H*W,Cx_permutex.permute(0,2,3,1).view(b,-1,c)# B,H*W,C B,H,W,Cx_att_permuteself.linear2(self.relu(self.linear1(x_permute))).view(b,h,w,c)# B,H,W,C B,C,H,Wx_channel_attx_att_permute.permute(0,3,1,2)xx*x_channel_att x_spatial_attself.relu(self.norm1(self.conv1(x)))x_spatial_attself.sigmoid(self.norm2(self.conv2(x_spatial_att)))outx*x_spatial_attreturnout引入代码在根目录下的ultralytics/nn/目录新建一个attention目录然后新建一个以GAM为文件名的py文件 把代码拷贝进去。importtorchimporttorch.nnasnnclassGAM(nn.Module):def__init__(self,in_channels,rate4):super().__init__()out_channelsin_channels in_channelsint(in_channels)out_channelsint(out_channels)inchannel_rateint(in_channels/rate)self.linear1nn.Linear(in_channels,inchannel_rate)self.relunn.ReLU(inplaceTrue)self.linear2nn.Linear(inchannel_rate,in_channels)self.conv1nn.Conv2d(in_channels,inchannel_rate,kernel_size7,padding3,padding_modereplicate)self.conv2nn.Conv2d(inchannel_rate,out_channels,kernel_size7,padding3,padding_modereplicate)self.norm1nn.BatchNorm2d(inchannel_rate)self.norm2nn.BatchNorm2d(out_channels)self.sigmoidnn.Sigmoid()defforward(self,x):b,c,h,wx.shape# B,C,H,W B,H*W,Cx_permutex.permute(0,2,3,1).view(b,-1,c)# B,H*W,C B,H,W,Cx_att_permuteself.linear2(self.relu(self.linear1(x_permute))).view(b,h,w,c)# B,H,W,C B,C,H,Wx_channel_attx_att_permute.permute(0,3,1,2)xx*x_channel_att x_spatial_attself.relu(self.norm1(self.conv1(x)))x_spatial_attself.sigmoid(self.norm2(self.conv2(x_spatial_att)))outx*x_spatial_attreturnouttasks注册在ultralytics/nn/tasks.py中进行如下操作步骤1:fromultralytics.nn.attention.GAMimportGAM步骤2修改def parse_model(d, ch, verboseTrue):elifmisGAM:c2ch[f]args[c2,*args]配置yolov8-GAM.yaml# Ultralytics YOLO , AGPL-3.0 license# YOLOv8 object detection model with P3-P5 outputs. For Usage examples see https://docs.ultralytics.com/tasks/detect# Parametersnc:80# number of classesscales:# model compound scaling constants, i.e. modelyolov8n.yaml will call yolov8.yaml with scale n# [depth, width, max_channels]n:[0.33,0.25,1024]# YOLOv8n summary: 225 layers, 3157200 parameters, 3157184 gradients, 8.9 GFLOPss:[0.33,0.50,1024]# YOLOv8s summary: 225 layers, 11166560 parameters, 11166544 gradients, 28.8 GFLOPsm:[0.67,0.75,768]# YOLOv8m summary: 295 layers, 25902640 parameters, 25902624 gradients, 79.3 GFLOPsl:[1.00,1.00,512]# YOLOv8l summary: 365 layers, 43691520 parameters, 43691504 gradients, 165.7 GFLOPsx:[1.00,1.25,512]# YOLOv8x summary: 365 layers, 68229648 parameters, 68229632 gradients, 258.5 GFLOPs# YOLOv8.0n backbonebackbone:# [from, repeats, module, args]-[-1,1,Conv,[64,3,2]]# 0-P1/2-[-1,1,Conv,[128,3,2]]# 1-P2/4-[-1,3,C2f,[128,True]]-[-1,1,Conv,[256,3,2]]# 3-P3/8-[-1,6,C2f,[256,True]]-[-1,1,Conv,[512,3,2]]# 5-P4/16-[-1,6,C2f,[512,True]]-[-1,1,Conv,[1024,3,2]]# 7-P5/32-[-1,3,C2f,[1024,True]]-[-1,1,GAM,[]]# 9-[-1,1,SPPF,[1024,5]]# 10# YOLOv8.0n headhead:-[-1,1,nn.Upsample,[None,2,nearest]]-[[-1,6],1,Concat,[1]]# cat backbone P4-[-1,3,C2f,[512]]# 13-[-1,1,nn.Upsample,[None,2,nearest]]-[[-1,4],1,Concat,[1]]# cat backbone P3-[-1,3,C2f,[256]]# 16 (P3/8-small)-[-1,1,Conv,[256,3,2]]-[[-1,13],1,Concat,[1]]# cat head P4-[-1,3,C2f,[512]]# 19 (P4/16-medium)-[-1,1,Conv,[512,3,2]]-[[-1,10],1,Concat,[1]]# cat head P5-[-1,3,C2f,[1024]]# 22 (P5/32-large)-[[16,19,22],1,Detect,[nc]]# Detect(P3, P4, P5)实验脚本importosfromultralyticsimportYOLO yamlultralytics/cfg/models/v8/yolov8-GAM.yamlmodelYOLO(yaml)model.info()if__name____main__:resultsmodel.train(data./ultralytics/cfg/datasets/coco8.yaml,nameGAM,epochs10,ampFalse,workers8,batch1)结果