在医学图像分割领域,传统的卷积神经网络(CNNs)难以捕捉长距离依赖关系,而基于 Transformer 的模型则面临较高的计算开销。近年来,状态空间模型(SSMs)因其在处理长序列时的高效性而受到关注,例如 Mamba 模型通过选择性机制和硬件优化提升了性能。Vision Mamba(VMamba)作为一种视觉状态空间模型,引入了 Cross Scan Module(CSM),进一步提高了在计算机视觉任务中的适用性。VSS Block 作为 VMamba 的核心模块,旨在通过多方向扫描策略有效提取二维图像的全局和局部特征,解决传统模型在长距离依赖建模和计算效率上的不足。
上面是原模型,下面是改进模型
1. 视觉状态空间模块VSS Block介绍
VSS Block 基于状态空间模型(SSM)的理论,特别是结构化状态空间序列模型(S4)和 Mamba 的扩展。SSM 通过线性常微分方程(ODE)建模连续时间动态系统,将输入序列映射为输出序列,其离散化形式支持线性递归和全局卷积两种计算方式,确保了线性计算复杂度。VSS Block 在此基础上引入 2D 选择性扫描模块(SS2D),通过多方向扫描(如水平、垂直、对角线)提取图像特征,结合选择性机制动态聚焦关键区域,实现对全局上下文和局部细节的高效建模。
VSS Block 的结构如图 2.c 所示,主要包含以下组件:
线性嵌入层(Initial Linear Embedding)
输入图像首先通过线性变换转换为特征向量 E=Linear(x),作为后续处理的基础。
双分支处理
主分支:1. 输入至 SS2D 模块进行多方向扫描,提取全局和局部特征,经层归一化(LayerNorm)后得到 S1=LayerNorm(SS2D(E1))。
2. 特征向量 E 经过 3×3 深度卷积(Depth-wise Conv)和 SiLU 激活函数,生成 E1=SiLU(Conv3×3(E))。
副分支:特征向量 E 直接通过 SiLU 激活函数,生成 S2=SiLU(E)。
特征融合
主分支和副分支的输出通过逐元素相乘(Hadamard Product)融合,得到最终的 VSS Block 输出 Y=S1⊙S2。该操作结合了 SS2D 提取的结构化特征和原始特征的非线性响应,增强了特征表达的丰富性。
2. YOLOv11与VSS Block的结合
将 VSS Block 插入到 YOLO11 的 Backbone 和 Neck 中,可凭借双向状态空间模型与多方向扫描机制,高效捕捉图像全局上下文与局部细节,增强对小目标、复杂背景下物体的特征表达能力;结合线性计算特性与动态注意力机制,在轻量化的同时提升特征融合效率,助力 YOLO11 实现更精准的多尺度目标检测与定位。
3. 空间增强前馈网络VSS Block代码部分
视频讲解:
YOLOv8_improve/YOLOv11.md at master · tgf123/YOLOv8_improve · GitHub
YOLO11改进-Mamba篇 如何使用Manba发一篇三四区论文_哔哩哔哩_bilibili
YOLOv11模型改进讲解,教您如何修改YOLOv11_哔哩哔哩_bilibili
YOLOv11全部代码,现有一百多种改进机制。
4. VSS Block引入到YOLOv11中
第一: 将下面的核心代码复制到D:\model\yolov11\ultralytics\change_model路径下,如下图所示。
第二:在task.py中导入包
第三:在YOLOv11\ultralytics\nn\tasks.py中的模型配置部分下面代码
第四:将模型配置文件复制到YOLOV11.YAMY文件中
第五:运行成功
from sympy import false
from ultralytics.models import NAS, RTDETR, SAM, YOLO, FastSAM, YOLOWorld
if __name__=="__main__":
# 使用自己的YOLOv8.yamy文件搭建模型并加载预训练权重训练模型
model = YOLO(r"E:\Part_time_job_orders\YOLO\YOLOv11\ultralytics\cfg\models\11\yolo11_VMKLA.yamy")\
.load(r'E:\Part_time_job_orders\YOLO\YOLOv11\yolo11n.pt') # build from YAML and transfer weights
results = model.train(data=r'E:\Part_time_job_orders\YOLO\YOLOv11\ultralytics\cfg\datasets\VOC_my.yaml',
epochs=300,
imgsz=640,
batch=64,
# cache = False,
# single_cls = False, # 是否是单类别检测
# workers = 0,
# resume=r'D:/model/yolov8/runs/detect/train/weights/last.pt',
amp = True
)