YOLO11 改进 – 注意力机制 _ GAM全局注意力机制:通道与空间注意力协同抑制背景干扰,强化目标关键特征

前言

本文介绍了全局注意力机制(Global Attention Mechanism)及其在YOLOv11中的结合应用。该机制旨在增强深度神经网络在计算机视觉任务中的性能,通过保留通道和空间信息来增强跨维度交互。它结合3D置换与多层感知器实现通道注意力,同时包含卷积空间注意力子模块,减少信息损失并放大全局维度交互特征。通过元素级乘法,通道和空间注意力图与输入特征图交互。

文章目录: YOLOv11改进大全:卷积层、轻量化、注意力机制、损失函数、Backbone、SPPF、Neck、检测头全方位优化汇总

专栏链接: YOLOv11改进专栏

文章目录

[TOC]

介绍

摘要

为提升计算机视觉任务的性能表现,现有研究已探索了多种注意力机制,然而当前方法普遍忽视了同时保留通道与空间维度信息对于增强跨维度交互的重要性。针对此问题,本研究提出了一种全局注意力机制,通过有效减少信息损失并强化全局交互表征来优化深度神经网络性能。具体而言,我们引入了基于多层感知器的三维排列结构用于通道注意力建模,同时整合了卷积空间注意力子模块。在CIFAR-100和ImageNet-1K图像分类任务的系统性评估中,实验结果表明所提出的方法在ResNet架构及轻量级MobileNet网络上均稳定优于多种最新注意力机制,验证了该全局注意力机制在提升模型性能方面的有效性和优越性。

文章链接

论文地址: 论文地址

代码地址: 代码地址

基本原理

全局注意力机制(Global Attention Mechanism)是一种用于增强深度神经网络性能的技术,特别是在计算机视觉任务中。该机制的技术原理在于通过保留通道和空间方面的信息,以增强跨维度的交互作用。相较于以往方法,全局注意力机制着重于在处理通道和空间信息时保持全局交互的重要性。

该机制采用了一种全新的方法来处理通道和空间信息,以提高深度神经网络的性能。具体而言,全局注意力机制结合了3D置换与多层感知器用于通道注意力,同时还包括一个卷积空间注意力子模块。这些组件共同作用,旨在减少信息损失并放大全局维度交互特征。

在技术实现上,全局注意力机制通过对输入特征图进行处理,得到中间状态和输出状态。其中,通道注意力图和空间注意力图分别用于捕获通道和空间维度的重要特征。通过元素级乘法操作,这些注意力图与输入特征图进行交互,从而实现全局跨维度的信息交互。

核心代码

import torch
import torch.nn as nn

class GAM(nn.Module):
    def __init__(self, in_channels, out_channels, rate=4):
        super().__init__()
        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)

实验

脚本

import warnings
warnings.filterwarnings('ignore')
from ultralytics import YOLO

if __name__ == '__main__':
#     修改为自己的配置文件地址
    model = YOLO('/root/ultralytics-main/ultralytics/cfg/models/11/yolov11-GAM.yaml')
#     修改为自己的数据集地址
    model.train(data='/root/ultralytics-main/ultralytics/cfg/datasets/coco8.yaml',
                cache=False,
                imgsz=640,
                epochs=10,
                single_cls=False,  # 是否是单类别检测
                batch=8,
                close_mosaic=10,
                workers=0,
                optimizer='SGD',
                amp=True,
                project='runs/train',
                name='GAM',
                )

结果

THE END