【YOLO11改进trick】Attention引入,含创新点MSCAA模块代码,方便发论文
创新模块MSCAAttention模块引入YOLO系列,并附python代码
目录
🔔🔔5.如何添加MSCAA模块到YOLO11工程(含代码修改)
需要全套改进代码请私信留言。
🐸🐸1.MSCAA模块简介
主要观点:卷积注意力比transform中的自注意力更能有效的编码上下文信息
设计动机:采用大尺度的便宜卷积替换自注意机制的昂贵卷积
多尺度卷积自注意力机制(multi-scale convolutional attention (MSCA))。MSCAAttention模块包含三个部分:总计局部信息的深度可分离卷积、获取多尺度上下文信息的多分支深度条带卷积、以及可联通不同通道之间信息的1*1卷积。
公式表示如下:
公式中,i={0,1,2,3}代表不同分支,在每个分支中,我们使用两个深度条带卷积来近似标准具有大内核的深度卷积。 这里,每个分支的内核大小分别设置为 7、11 和 21。(为了模拟内核大小为 7 × 7 的标准 2D 卷积,我们只需要一对 7×1 和 1×7 卷积),这种条带卷积的优势主要有两个:一方面可以有效减少计算量,另一方面可以对窄长型的目标进行有效表征。
🙋🙋2.MSCAA模块优点
MSCAA模块是一种用于语义分割的新型卷积注意力模块,其主要优点是:
👍1. 高效的空间信息编码
-
MSCA模块通过多尺度卷积特征来引导空间注意力,利用简单的逐元素乘法操作对输入特征进行加权。这种设计比传统的卷积操作和Transformer中的自注意力机制在空间信息编码上更高效。
-
多尺度卷积特征的提取使得模型能够更好地处理不同尺度的物体,这对于语义分割任务中常见的多尺度目标非常关键。
👍2. 低计算复杂度
-
MSCAA模块的计算复杂度为线性(O(n)),相比Transformer中的自注意力机制(O(n²)),在处理高分辨率图像时具有显著的效率优势。这使得MSCA模块在计算资源受限的情况下仍能保持高性能。
👍3. 多尺度特征聚合
-
MSCAA模块通过多分支深度可分离卷积(depth-wise convolution)提取多尺度特征,这些特征被用作注意力权重来重新加权输入特征。这种多尺度特征聚合方式能够更好地捕捉物体的细节和上下文信息。
-
例如,MSCA模块中包含7×7、11×11和21×21等不同尺度的卷积分支,这些分支能够捕捉从细粒度到粗粒度的特征。
👍4. 轻量级设计
-
MSCAA模块采用了轻量级的深度可分离卷积来近似大核卷积,这不仅减少了计算量,还保持了模型的性能。例如,为了模拟一个标准的7×7卷积,MSCA模块仅使用一对7×1和1×7的卷积。
-
这种轻量级设计使得MSCA模块在不增加过多计算负担的情况下,能够有效提升模型的性能。
👍5. 适应性强
-
MSCA模块通过逐元素乘法操作引入了自适应能力,使得模型能够根据输入特征动态调整注意力权重。这种自适应机制使得模型在处理不同场景和物体时更加灵活。
👍6. 对条带状物体的友好性
-
MSCA模块中的条带卷积(strip convolution)设计能够更好地捕捉条带状物体的特征,这对于语义分割中常见的条带状目标(如电线杆、道路边缘等)非常有帮助。
MSCAA模块通过多尺度卷积特征聚合和轻量级设计,在保持低计算复杂度的同时,显著提升了语义分割模型的性能。它不仅能够高效地编码空间信息,还能适应不同尺度和形状的目标,是模型取得优异性能的关键因素之一。
💖💖3.MSCAA模块的适用场景
MSCAA模块是一种多尺度卷积注意力机制,具有高效提取上下文信息和处理多尺度目标的能力。虽然其是在语义分割任务中被提出,但是MSCAA模块的适用场景主要非常广泛,包括以下几个方面:
🌷1. 语义分割任务
MSCA模块最初是为语义分割任务设计的,能够显著提升分割模型的性能。它通过多尺度卷积特征聚合和注意力机制,有效处理不同尺度的目标,同时保持较低的计算复杂度。
🌷2. 目标检测任务
MSCA模块也可应用于目标检测任务,例如在YOLOv11模型中,MSCAA模块被加入到Backbone、Neck和Detect部分,显著提升了模型的性能(如mAP50指标)。这表明MSCA模块在处理多尺度目标和复杂场景时具有优势。
🌷3. 医学影像分析
MSCAA模块适用于医学影像分析,尤其是在需要高精度分割和检测的场景中。其多尺度特征提取能力能够帮助模型更好地识别和分割医学影像中的不同组织和病变。
🌷4. 工业缺陷检测
在工业缺陷检测中,MSCAA模块能够有效提取上下文信息,帮助模型更好地识别和定位缺陷区域。
🌷5. 遥感目标检测
MSCAA模块适用于遥感图像处理,尤其是在处理低对比度场景和小目标检测时表现出色。其多尺度卷积设计能够捕捉不同尺度的目标,提升检测和分割的准确性。
🌷6. 低对比度场景
MSCAA模块在低对比度场景中表现出色,能够通过多尺度卷积特征提取和注意力机制增强模型对细节的感知能力。
🌷7. 多任务学习
MSCAA模块不仅适用于分割和检测任务,还可以应用于姿态估计、分类等多任务学习场景。其即插即用的设计使其能够灵活集成到不同的网络架构中。
🍌🍌4.创新点MSCAA模块python代码
MSCAA模块python代码定义如下:
class MSCAAttention(nn.Module):
def __init__(self, dim):
super().__init__()
self.conv0 = nn.Conv2d(dim, dim, 5, padding=2, groups=dim)
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)
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)
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)
self.conv3 = nn.Conv2d(dim, dim, 1)
def forward(self, x):
u = x.clone()
attn = self.conv0(x)
attn_0 = self.conv0_1(attn)
attn_0 = self.conv0_2(attn_0)
attn_1 = self.conv1_1(attn)
attn_1 = self.conv1_2(attn_1)
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)
return attn * u
🔔🔔5.如何添加MSCAA模块到YOLO11工程(含代码修改)
- 新增MSCAA.py文件
MSCAA.py内容如下:
import torch
import torch.nn as nn
from torch.nn import functional as F
from ultralytics.nn.modules.conv import Conv
class MSCAAttention(nn.Module):
def __init__(self, dim):
super().__init__()
self.conv0 = nn.Conv2d(dim, dim, 5, padding=2, groups=dim)
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)
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)
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)
self.conv3 = nn.Conv2d(dim, dim, 1)
def forward(self, x):
u = x.clone()
attn = self.conv0(x)
attn_0 = self.conv0_1(attn)
attn_0 = self.conv0_2(attn_0)
attn_1 = self.conv1_1(attn)
attn_1 = self.conv1_2(attn_1)
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)
return attn * u
- 修改ultralytics/nn/tasks.py
新增定义引入,python代码如下:
from ultralytics.nn.MSCAA import MSCAAttention
然后,修改def parse_model(d,ch,verbose=True)函数,在1040行新增条件判断,修改后python代码如下:
if m in base_modules:
c1, c2 = ch[f], args[0]
if c2 != nc: # if c2 not equal to number of classes (i.e. for Classify() output)
c2 = make_divisible(min(c2, max_channels) * width, 8)
if m is C2fAttn: # set 1) embed channels and 2) num heads
args[1] = make_divisible(min(args[1], max_channels // 2) * width, 8)
args[2] = int(max(round(min(args[2], max_channels // 2 // 32)) * width, 1) if args[2] > 1 else args[2])
args = [c1, c2, *args[1:]]
if m in repeat_modules:
args.insert(2, n) # number of repeats
n = 1
if m is C3k2: # for M/L/X sizes
legacy = False
if scale in "mlx":
args[3] = True
elif m is AIFI:
args = [ch[f], *args]
###### attention ######
elif m is MSCAAttention:
c2 = ch[f]
args = [c2, *args]
###### attention ######
最后三行为新增代码
- 修改模型定义yaml文件
例如,在YOLO11的backbone的最后一个环节C2PSA之后添加MSCAA模块,yolo_MSCAAttention.yaml的示例如下:
# Ultralytics 🚀 AGPL-3.0 License - https://ultralytics.com/license
# Parameters
nc: 2 # 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, 2, C2PSA, [1024]] # 10
- [-1, 1, MSCAAttention, []] # 11
# 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, 13], 1, Concat, [1]] # cat head P4
- [-1, 2, C3k2, [512, False]] # 19 (P4/16-medium)
- [-1, 1, Conv, [512, 3, 2]]
- [[-1, 10], 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)
其他位置添加MSCAAttention模块的用法也是一样的,只需在模型定义yaml文件中新增模块就行了。
至此YOLO11工程修改就完成了,可以愉快的开始你的炼丹之旅了。
整理不易,欢迎一键三连!!!
送你们一条美丽的--分割线--
🌷🌷🍀🍀🌾🌾🍓🍓🍂🍂🙋🙋🐸🐸🙋🙋💖💖🍌🍌🔔🔔🍉🍉🍭🍭🍋🍋🍇🍇🏆🏆📸📸⛵⛵⭐⭐🍎🍎👍👍🌷🌷

GitCode 天启AI是一款由 GitCode 团队打造的智能助手,基于先进的LLM(大语言模型)与多智能体 Agent 技术构建,致力于为用户提供高效、智能、多模态的创作与开发支持。它不仅支持自然语言对话,还具备处理文件、生成 PPT、撰写分析报告、开发 Web 应用等多项能力,真正做到“一句话,让 Al帮你完成复杂任务”。
更多推荐
所有评论(0)