YOLO11改进|注意力机制篇|引入MSCA注意力机制

目录

一、【MSCA】注意力机制

1.1【MSCA】注意力介绍

下图是【MSCA】的结构图,让我们简单分析一下运行过程和优势

  • 处理过程:
  • 多尺度卷积(Multi-Scale Convolution):MSCA 模块的核心是多尺度卷积,它使用不同尺寸的卷积核(如 7×1、11×1、21×1 等)来提取特征。这些不同尺寸的卷积核能够捕捉到不同感受野中的信息,从而增强模型对不同大小目标的检测能力。图中的多个卷积核(d.7x1、d.11x1 等)从不同尺度上提取空间特征,获取从局部到全局的多尺度信息。
  • 通道混合(Channel Mixing):在多尺度卷积操作后,所有尺度的特征会通过通道混合操作进行融合。这个步骤通过 1x1 卷积对不同通道的信息进行整合,提升了特征间的相关性。
  • 卷积注意力(Convolutional Attention):MSCA 最后一步是卷积注意力机制,它利用卷积操作捕捉图像中的关键区域,并对不同位置的特征进行加权,以强调重要的特征区域。这个过程可以使模型更关注关键信息,抑制背景噪声。
  • 优势:
  • 多尺度感知能力:通过多种不同尺寸的卷积核,MSCA 可以捕捉到不同尺度的特征,无论是大目标还是小目标,都能够被有效检测到。这种多尺度特征提取能力特别适合处理复杂场景和具有多样性尺寸的目标。
  • 局部与全局信息的有效结合:MSCA 模块不仅能提取局部细节信息,还能够通过较大感受野的卷积捕获全局上下文信息。这种局部和全局信息的结合提高了检测的精度和鲁棒性。
  • 轻量化与高效性:通过 1x1 卷积进行通道混合,可以有效减少参数量和计算量,使得模型在保证高效检测的同时也具备轻量化的特性,适用于资源有限的应用场景。
  • 注意力机制增强:引入卷积注意力机制后,模型能够自适应地调整对不同区域的关注度,从而提高了对关键信息的捕捉能力,减少了背景干扰的影响。

1.2【MSCA】核心代码

python 复制代码
import torch
import torch.nn as nn
from torch.nn import functional as F



class MSCA(nn.Module):
    def __init__(self, dim):
        super().__init__()
        # 使用5x5核的卷积层,应用深度卷积
        self.conv0 = nn.Conv2d(dim, dim, 5, padding=2, groups=dim)

        # 两组卷积层,分别使用1x7和7x1核,用于跨度不同的特征提取,均应用深度卷积
        self.conv0_1 = nn.Conv2d(dim, dim, (1, 7), padding=(0, 3), groups=dim)
        self.conv0_2 = nn.Conv2d(dim, dim, (7, 1), padding=(3, 0), groups=dim)

        # 另外两组卷积层,使用更大的核进行特征提取,分别为1x11和11x1,也是深度卷积
        self.conv1_1 = nn.Conv2d(dim, dim, (1, 11), padding=(0, 5), groups=dim)
        self.conv1_2 = nn.Conv2d(dim, dim, (11, 1), padding=(5, 0), groups=dim)

        # 使用最大尺寸的核进行特征提取,为1x21和21x1,深度卷积
        self.conv2_1 = nn.Conv2d(dim, dim, (1, 21), padding=(0, 10), groups=dim)
        self.conv2_2 = nn.Conv2d(dim, dim, (21, 1), padding=(10, 0), groups=dim)

        # 最后一个1x1卷积层,用于整合上述所有特征提取的结果
        self.conv3 = nn.Conv2d(dim, dim, 1)

    def forward(self, x):
        u = x.clone() # 克隆输入x,以便之后与注意力加权的特征进行相乘
        attn = self.conv0(x) # 应用初始的5x5卷积

        # 应用1x7和7x1卷积,进一步提取特征
        attn_0 = self.conv0_1(attn)
        attn_0 = self.conv0_2(attn_0)

        # 应用1x11和11x1卷积,进一步提取特征
        attn_1 = self.conv1_1(attn)
        attn_1 = self.conv1_2(attn_1)

        # 应用1x21和21x1卷积,进一步提取特征
        attn_2 = self.conv2_1(attn)
        attn_2 = self.conv2_2(attn_2)
        attn = attn + attn_0 + attn_1 + attn_2 # 将所有特征提取的结果相加

        attn = self.conv3(attn) # 应用最后的1x1卷积层整合特征

        return attn * u # 将原始输入和注意力加权的特征相乘,返回最终结果

if __name__ == "__main__":
    # 创建 AttentionModule 实例,这里以64个通道为例
    attention_module = MSCA(dim=64)

    # 创建一个假的输入数据,维度为 [batch_size, channels, height, width]
    # 例如,1个样本,64个通道,64x64的图像
    input_tensor = torch.rand(1, 64, 64, 64)

    # 通过AttentionModule处理输入
    output_tensor = attention_module(input_tensor)

    # 打印输出张量的形状
    print(output_tensor.shape)

二、添加【MSCA】注意力机制

2.1STEP1

首先找到ultralytics/nn文件路径下新建一个Add-module的python文件包【这里注意一定是python文件包,新建后会自动生成_init_.py】,如果已经跟着我的教程建立过一次了可以省略此步骤 ,随后新建一个MSCA.py文件并将上文中提到的注意力机制的代码全部粘贴到此文件中,如下图所示

2.2STEP2

在STEP1中新建的_init_.py文件中导入增加改进模块的代码包如下图所示

2.3STEP3

找到ultralytics/nn文件夹中的task.py文件,在其中按照下图添加

2.4STEP4

定位到ultralytics/nn文件夹中的task.py文件中的def parse_model(d, ch, verbose=True): # model_dict, input_channels(3)函数添加如图代码,【如果不好定位可以直接ctrl+f搜索定位】

三、yaml文件与运行

3.1yaml文件

以下是添加【MSCA】注意力机制在Backbone中的yaml文件,大家可以注释自行调节,效果以自己的数据集结果为准

python 复制代码
# Ultralytics YOLO 🚀, AGPL-3.0 license
# YOLO11 object detection model with P3-P5 outputs. For Usage examples see https://docs.ultralytics.com/tasks/detect

# Parameters
nc: 80 # number of classes
scales: # model compound scaling constants, i.e. 'model=yolo11n.yaml' will call yolo11.yaml with scale 'n'
  # [depth, width, max_channels]
  n: [0.50, 0.25, 1024] # summary: 319 layers, 2624080 parameters, 2624064 gradients, 6.6 GFLOPs
  s: [0.50, 0.50, 1024] # summary: 319 layers, 9458752 parameters, 9458736 gradients, 21.7 GFLOPs
  m: [0.50, 1.00, 512] # summary: 409 layers, 20114688 parameters, 20114672 gradients, 68.5 GFLOPs
  l: [1.00, 1.00, 512] # summary: 631 layers, 25372160 parameters, 25372144 gradients, 87.6 GFLOPs
  x: [1.00, 1.50, 512] # summary: 631 layers, 56966176 parameters, 56966160 gradients, 196.0 GFLOPs

# YOLO11n backbone
backbone:
  # [from, repeats, module, args]
  - [-1, 1, Conv, [64, 3, 2]] # 0-P1/2
  - [-1, 1, Conv, [128, 3, 2]] # 1-P2/4
  - [-1, 2, C3k2, [256, False, 0.25]]
  - [-1, 1, Conv, [256, 3, 2]] # 3-P3/8
  - [-1, 2, C3k2, [512, False, 0.25]]
  - [-1, 1, Conv, [512, 3, 2]] # 5-P4/16
  - [-1, 2, C3k2, [512, True]]
  - [-1, 1, Conv, [1024, 3, 2]] # 7-P5/32
  - [-1, 2, C3k2, [1024, True]]
  - [-1, 1, SPPF, [1024, 5]] # 9
  - [-1, 1, MSCA,[]]
  - [-1, 2, C2PSA, [1024]] # 10

# YOLO11n head
head:
  - [-1, 1, nn.Upsample, [None, 2, "nearest"]]
  - [[-1, 6], 1, Concat, [1]] # cat backbone P4
  - [-1, 2, C3k2, [512, False]] # 13

  - [-1, 1, nn.Upsample, [None, 2, "nearest"]]
  - [[-1, 4], 1, Concat, [1]] # cat backbone P3
  - [-1, 2, C3k2, [256, False]] # 16 (P3/8-small)

  - [-1, 1, Conv, [256, 3, 2]]
  - [[-1, 14], 1, Concat, [1]] # cat head P4
  - [-1, 2, C3k2, [512, False]] # 19 (P4/16-medium)

  - [-1, 1, Conv, [512, 3, 2]]
  - [[-1, 11], 1, Concat, [1]] # cat head P5
  - [-1, 2, C3k2, [1024, True]] # 22 (P5/32-large)

  - [[17, 20, 23], 1, Detect, [nc]] # Detect(P3, P4, P5)

以上添加位置仅供参考,具体添加位置以及模块效果以自己的数据集结果为准

3.2运行成功截图

OK 以上就是添加【MSCA】注意力机制的全部过程了,后续将持续更新尽情期待

相关推荐
scan7247 分钟前
LILAC采样算法
人工智能·算法·机器学习
leaf_leaves_leaf10 分钟前
win11用一条命令给anaconda环境安装GPU版本pytorch,并检查是否为GPU版本
人工智能·pytorch·python
夜雨飘零115 分钟前
基于Pytorch实现的说话人日志(说话人分离)
人工智能·pytorch·python·声纹识别·说话人分离·说话人日志
爱喝热水的呀哈喽30 分钟前
《机器学习》支持向量机
人工智能·决策树·机器学习
minstbe34 分钟前
AI开发:使用支持向量机(SVM)进行文本情感分析训练 - Python
人工智能·python·支持向量机
月眠老师37 分钟前
AI在生活各处的利与弊
人工智能
四口鲸鱼爱吃盐1 小时前
Pytorch | 从零构建MobileNet对CIFAR10进行分类
人工智能·pytorch·分类
苏言の狗1 小时前
Pytorch中关于Tensor的操作
人工智能·pytorch·python·深度学习·机器学习
bastgia2 小时前
Tokenformer: 下一代Transformer架构
人工智能·机器学习·llm
菜狗woc2 小时前
opencv-python的简单练习
人工智能·python·opencv