
💡💡💡问题点:基于CNN的方法由于卷积操作的固有局限性,难以有效捕捉全局上下文信息;而基于Transformer的方法则存在局部特征建模不足的问题,同时面临自注意力机制带来的高计算复杂度挑战。

💡💡💡引入多尺度线性注意力机制,旨在以低计算复杂度高效提取图像中的多尺度特征,同时建模长程依赖关系;
多尺度线性注意力机制(MSLA)包含两个主要操作流程:多尺度特征提取和线性注意力计算。前者通过捕获多尺度局部结构细节来提升分割性能,后者利用具有近似全局感受野的线性注意力机制(其感受野与Softmax注意力机制相近)来建模长程依赖关系,同时显著提升计算效率
💡💡💡如何与YOLO11结合:①C3k2与MSLA创新性结合;②C2PSA与MSLA创新性结合;

《YOLOv11魔术师专栏》将从以下各个方向进行创新:

【原创自研模块】【多组合点优化】【注意力机制】【卷积魔改】【block&多尺度融合结合】【损失&IOU优化】【上下采样优化 】【小目标性能提升】【前沿论文分享】【训练实战篇】
订阅者通过添加WX: AI_CV_0624,入群沟通,提供改进结构图等一系列定制化服务。
定期向订阅者提供源码工程,配合博客使用。
订阅者可以申请发票,便于报销
💡💡💡为本专栏订阅者提供创新点改进代码,改进网络结构图,方便paper写作!!!
💡💡💡适用场景:红外、小目标检测、工业缺陷检测、医学影像、遥感目标检测、低对比度场景
💡💡💡适用任务:所有改进点适用【检测】、【分割】、【pose】、【分类】等
💡💡💡全网独家首发创新,【自研多个自研模块】,【多创新点组合适合paper 】!!!
☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️ ☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️
包含注意力机制魔改、卷积魔改、检测头创新、损失&IOU优化、block优化&多层特征融合、 轻量级网络设计、24年最新顶会改进思路、原创自研paper级创新等
🚀🚀🚀 本项目持续更新 | 更新完结保底≥80+ ,冲刺100+ 🚀🚀🚀
🍉🍉🍉 联系WX: AI_CV_0624 欢迎交流!🍉🍉🍉
⭐⭐⭐专栏涨价趋势 159 ->199->259->299,越早订阅越划算⭐⭐⭐
💡💡💡 2024年计算机视觉顶会创新点适用于Yolov5、Yolov7、Yolov8、Yolov9等各个Yolo系列,专栏文章提供每一步步骤和源码,轻松带你上手魔改网络 !!!
💡💡💡重点:通过本专栏的阅读,后续你也可以设计魔改网络,在网络不同位置(Backbone、head、detect、loss等)进行魔改,实现创新!!!
☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️ ☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️
Ultralytics YOLO11是一款尖端的、最先进的模型,它在之前YOLO版本成功的基础上进行了构建,并引入了新功能和改进,以进一步提升性能和灵活性。YOLO11设计快速、准确且易于使用,使其成为各种物体检测和跟踪、实例分割、图像分类以及姿态估计任务的绝佳选择。


结构图如下:

C3k2,结构图如下

C3k2,继承自类C2f,其中通过c3k设置False或者Ture来决定选择使用C3k还是Bottleneck

实现代码ultralytics/nn/modules/block.py
借鉴V10 PSA结构,实现了C2PSA和C2fPSA,最终选择了基于C2的C2PSA(可能涨点更好?)

实现代码ultralytics/nn/modules/block.py
分类检测头引入了DWConv(更加轻量级,为后续二次创新提供了改进点),结构图如下(和V8的区别):

实现代码ultralytics/nn/modules/head.py

论文:MSLAU-Net: A Hybird CNN-Transformer Network for Medical Image Segmentation
摘要:准确的医学图像分割能够实现对解剖结构和病理区域的精确勾画,这对于治疗计划制定、手术导航和疾病监测至关重要。基于CNN和基于Transformer的方法在医学图像分割任务中均已取得显著成功。然而,基于CNN的方法由于卷积操作的固有局限性,难以有效捕捉全局上下文信息;而基于Transformer的方法则存在局部特征建模不足的问题,同时面临自注意力机制带来的高计算复杂度挑战。为克服这些局限性,我们提出了一种新颖的CNN-Transformer混合架构——MSLAU-Net,该架构融合了两种范式的优势。提出的MSLAU-Net包含两个核心创新:首先,引入多尺度线性注意力机制,旨在以低计算复杂度高效提取医学图像中的多尺度特征,同时建模长程依赖关系;其次,采用自上而下的特征聚合机制,通过轻量级结构实现多层次特征融合并恢复空间分辨率。在涵盖三种成像模式的基准数据集上进行的大量实验表明,所提出的MSLAU-Net在几乎所有评估指标上都优于其他最先进方法,验证了我们方法的优越性、有效性和鲁棒性。

2.1 Multi-Scale Linear Attention(多尺度线性注意力机制)
我们的多尺度线性注意力机制(MSLA)包含两个主要操作流程:多尺度特征提取和线性注意力计算。前者通过捕获多尺度局部结构细节来提升分割性能,后者利用具有近似全局感受野的线性注意力机制(其感受野与Softmax注意力机制相近)来建模长程依赖关系,同时显著提升计算效率。下文将进行详细阐述。

图1 多尺度线性注意力机制详解。MSLA模块采用并行化设计,以充分发挥CNN在捕获多尺度特征方面的优势以及线性注意力在建模长程依赖关系方面的能力。该模块首先将输入特征图沿通道维度划分为四个部分,随后每个部分分别通过不同卷积核尺寸(3×3、5×5、7×7和9×9)的深度卷积进行多尺度特征提取。接着对提取的多尺度特征应用线性注意力(即高效注意力机制)以建模长程依赖关系。最后使用1×1卷积将处理后的输出特征进行融合。
import torch
import torch.nn as nn
import torch.nn.functional as F
from ultralytics.nn.modules.block import C2PSA, PSABlock, C3k,Bottleneck,C3k2
class LinearAttention(nn.Module):
def __init__(self, dim, num_heads):
super().__init__()
self.dim = dim
self.num_heads = num_heads
self.qkv = nn.Linear(dim, 3 * dim, bias=False)
self.proj = nn.Linear(dim, dim)
def forward(self, x):
b, c, h, w = x.shape
x = x.view(b, c, h * w).permute(0, 2, 1) # (b, h*w, c)
qkv = self.qkv(x).reshape(b, h * w, 3, self.num_heads, self.dim // self.num_heads).permute(2, 0, 3, 1, 4)
q, k, v = qkv[0], qkv[1], qkv[2]
key = F.softmax(k, dim=-1)
query = F.softmax(q, dim=-2)
context = key.transpose(-2, -1) @ v
x = (query @ context).reshape(b, h * w, c)
x = self.proj(x)
x = x.permute(0, 2, 1).view(b, c, h, w)
return x
class DepthwiseConv(nn.Module):
def __init__(self, in_channels, kernel_size):
super(DepthwiseConv, self).__init__()
self.depthwise = nn.Conv2d(in_channels, in_channels, kernel_size=kernel_size, groups=in_channels,
padding=kernel_size // 2)
self.relu = nn.ReLU()
def forward(self, x):
residual = x
x = self.depthwise(x)
x = x + residual
x = self.relu(x)
return x
class MSLA(nn.Module):
def __init__(self, dim, num_heads):
super().__init__()
self.dim = dim
self.num_heads = num_heads
self.dw_conv_3x3 = DepthwiseConv(dim // 4, kernel_size=3)
self.dw_conv_5x5 = DepthwiseConv(dim // 4, kernel_size=5)
self.dw_conv_7x7 = DepthwiseConv(dim // 4, kernel_size=7)
self.dw_conv_9x9 = DepthwiseConv(dim // 4, kernel_size=9)
self.linear_attention = LinearAttention(dim=dim // 4, num_heads=num_heads)
self.final_conv = nn.Conv2d(dim, dim, 1)
self.scale_weights = nn.Parameter(torch.ones(4), requires_grad=True)
def forward(self, input_):
b, n, c = input_.shape
h = int(n ** 0.5)
w = int(n ** 0.5)
input_reshaped = input_.reshape([b, c, h, w])
split_size = c // 4
x_3x3 = input_reshaped[:, :split_size, :, :]
x_5x5 = input_reshaped[:, split_size:2 * split_size, :, :]
x_7x7 = input_reshaped[:, 2 * split_size:3 * split_size:, :, :]
x_9x9 = input_reshaped[:, 3 * split_size:, :, :]
x_3x3 = self.dw_conv_3x3(x_3x3)
x_5x5 = self.dw_conv_5x5(x_5x5)
x_7x7 = self.dw_conv_7x7(x_7x7)
x_9x9 = self.dw_conv_9x9(x_9x9)
att_3x3 = self.linear_attention(x_3x3)
att_5x5 = self.linear_attention(x_5x5)
att_7x7 = self.linear_attention(x_7x7)
att_9x9 = self.linear_attention(x_9x9)
processed_input = torch.cat([
att_3x3 * self.scale_weights[0],
att_5x5 * self.scale_weights[1],
att_7x7 * self.scale_weights[2],
att_9x9 * self.scale_weights[3]
], dim=1)
final_output = self.final_conv(processed_input)
output_reshaped = final_output.reshape(b, n, self.dim)
return output_reshaped
# Ultralytics 🚀 AGPL-3.0 License - https://ultralytics.com/license
# Ultralytics YOLO11 object detection model with P3/8 - P5/32 outputs
# Model docs: https://docs.ultralytics.com/models/yolo11
# Task docs: 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_MSLA, [256, False, 0.25]]
- [-1, 1, Conv, [256, 3, 2]] # 3-P3/8
- [-1, 2, C3k2_MSLA, [512, False, 0.25]]
- [-1, 1, Conv, [512, 3, 2]] # 5-P4/16
- [-1, 2, C3k2_MSLA, [512, True]]
- [-1, 1, Conv, [1024, 3, 2]] # 7-P5/32
- [-1, 2, C3k2_MSLA, [1024, True]]
- [-1, 1, SPPF, [1024, 5]] # 9
- [-1, 2, C2MSLA, [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, 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)
- [[16, 19, 22], 1, Detect, [nc]] # Detect(P3, P4, P5)

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。