目录
- 一、【MSCA】注意力机制
- 1.1【MSCA】注意力介绍
- 1.2【MSCA】核心代码
- 二、添加【MSCA】注意力机制
- 2.1STEP1
- 2.2STEP2
- 2.3STEP3
- 2.4STEP4
- 三、yaml文件与运行
- 3.1yaml文件
- 3.2运行成功截图
一、【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】核心代码
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文件,大家可以注释自行调节,效果以自己的数据集结果为准
# 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】注意力机制的全部过程了,后续将持续更新尽情期待