基于 Mamba 的图像恢复方法在处理图像时,通常将 2D 图像沿行和列展平为多个 1D 序列,独立处理后再聚合。这种方式存在两个主要问题:一是破坏了自然图像固有的局部关系和空间连续性;二是在聚合处理后的序列时,往往采用逐像素求和的方式,忽略了不同展开方式下序列之间的差异。为解决这些问题,MaIR 模型中提出了序列混洗注意力模块(SSA),旨在更好地聚合不同扫描方向得到的序列,充分利用互补信息。
上面是原模型,下面是改进模型

1. 序列混洗注意力模块SSA介绍
SSA 的核心理论是通过计算不同序列对应通道内的注意力权重,来聚合处理后的序列。这种设计能够捕捉不同序列间的复杂依赖关系。其理论基础源于注意力机制在深度学习中的广泛应用,注意力机制可以让模型更加关注重要的信息。在 SSA 中,通过对不同序列特征的处理和分析,计算出每个序列在不同通道上的重要程度,即注意力权重,然后根据这些权重对序列进行加权求和,从而实现对不同序列信息的有效整合 。
从提供的图片来看,SSA模块主要包含以下几个部分:
序列混洗注意力(SSA)模块是 MaIR 模型的关键组件,主要用于聚合处理后的序列,从而更好地利用不同扫描方向的互补信息。其结构包含以下 4 个关键步骤:
空间平均池化与拼接:先对经过选择性扫描操作(SSO)处理后的多个序列执行空间平均池化,以此降低计算成本。接着,将池化后的序列按通道维度拼接在一起,形成一个新的序列。
序列混洗操作:把拼接后的序列进行重新排列,也就是序列混洗操作。这一步改变了特征的排列顺序,为后续的分组卷积做准备。
分组卷积与权重调整:运用分组卷积对混洗后的序列进行处理,得到通道维度的注意力权重。之后,通过序列反混洗操作,把权重恢复到原始顺序,让权重与原始序列的通道相对应。
权重分块与加权求和:将反混洗后的权重进行分块,得到多个注意力权重。最后,依据这些注意力权重,对原始的各个序列进行加权求和,生成最终的输出序列。
2. YOLOv11与序列混洗注意力模块SSA的结合
SSA 通过计算不同序列对应通道的注意力权重来聚合序列,能有效融合来自不同感受野或不同特征图区域的信息。例如,在检测复杂场景中的多个目标时,可融合目标主体、周围环境等多方面特征,避免关键信息遗漏,提高检测精度。
SSA 可根据注意力权重,对来自不同扫描方向的序列进行自适应聚合,突出目标特征,抑制背景噪声。例如在密集城市街道场景检测车辆时,能减少周围建筑物、行人等背景信息干扰,增强对车辆目标的检测能力。
3. 序列混洗注意力模块SSA代码部分
视频讲解:
YOLOv8_improve/YOLOv11.md at master · tgf123/YOLOv8_improve · GitHub
用一篇论文教您如何使用YOLOv11改进模块写一篇1、2区论文_哔哩哔哩_bilibili
YOLOv11模型改进讲解,教您如何修改YOLOv11_哔哩哔哩_bilibili
YOLOv11全部代码,现有几十种改进机制。
4. 序列混洗注意力模块SSA引入到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_SSAttention.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
)