现有即插即用注意力机制多分为通道注意力、空间注意力及混合注意力三类,但普遍存在两大局限:一是未能充分利用特征中固有的多语义空间信息,难以有效引导空间和通道维度的关键特征提取;二是对特征图间多语义信息导致的语义差异和交互问题处理不足,限制了其在检测、分割等细粒度任务中的适配性。为解决这些问题,SCSA 聚焦维度解耦、轻量化多语义引导和语义差异缓解,探索空间与通道注意力的协同关系。
原模型
改进后的模型


1. SCSA原理
SCSA 的核心原理是 "多语义空间引导 + 通道语义差异缓解" 的协同机制。先通过多语义空间注意力提取不同层级的空间先验信息,为通道注意力提供精准引导;再通过通道自注意力机制探索通道间相似性,减轻多语义导致的差异,促进特征融合。同时,采用轻量化设计和渐进式压缩策略,在保证性能的同时控制计算复杂度,实现精度与效率的平衡。

SCSA 由共享多语义空间注意力(SMSA)和渐进式通道自注意力(PCSA)两个模块串联组成。
SMSA 模块:先将输入特征沿高、宽维度解耦为 1D 序列并分割为独立子特征,通过多尺度深度共享 1D 卷积捕捉多语义空间信息;再经组归一化(GN)避免语义干扰,最后通过 Sigmoid 生成空间注意力图,为后续通道校准注入判别性空间先验。
PCSA 模块:接收 SMSA 调制后的特征图,通过渐进式平均池化压缩特征以降低计算成本,再利用通道维度的单头自注意力机制探索通道依赖关系,缓解子特征间的语义差异,最终输出校准后的特征。
2. SCSA习作思路
在目标检测任务中:SCSA 通过多语义空间注意力精准捕捉不同尺度目标的空间结构信息,为通道特征学习提供针对性引导,同时有效缓解多语义差异带来的特征混淆,让模型能更清晰地区分密集场景、遮挡或小目标的特征表示;其协同注意力机制还能扩大有效感受野,增强模型对目标上下文信息的利用能力,提升对复杂场景中各类目标的检测准确性和鲁棒性。
在目标分割 任务中:SCSA 的多语义引导能力可精准捕捉像素级的局部细节与全局语义信息,结合通道自注意力对语义差异的缓解作用,能有效区分语义相邻或重叠的目标;同时,其特征融合机制让模型在像素级分类时获得更连贯、一致的特征表示,提升分割边界的精准度和整体分割效果的完整性。
3. YOLO与 SCSA的结合
将 SCSA 融入 YOLO 中,可增强 YOLO 对多尺度目标的特征提取能力,尤其能提升小目标和遮挡目标的检测精度;同时,其轻量化设计不会显著增加计算负担,能在保证 YOLO 实时性优势的前提下,进一步提升模型的泛化能力和复杂场景适配性。
4. SCSA代码部分
YOLO11|YOLO12|改进| 空间与通道协同注意力模块SCSA,通过空间与通道维度的深度协同,破解传统注意力机制的语义利用不足与差异处理难题_哔哩哔哩_bilibili
YOLOv11模型改进讲解,教您如何修改YOLOv11_哔哩哔哩_bilibili
YOLOv11 原理+代码 详细剖析_哔哩哔哩_bilibili
https://www.bilibili.com/video/BV1HnosYREZJ/?spm_id_from=333.1387.collection.video_card.click
代码获取: YOLOv8_improve/YOLOv11.md at master · tgf123/YOLOv8_improve
5. SCSA到YOLOv11中
第一: 将下面的核心代码复制到D:\model\yolov11\ultralytics\change_model路径下,如下图所示。

第二:在task.py中导入 包

第三:在task.py中的模型配置部分下面代码

第四:将模型配置文件复制到YOLOV11.YAMY文件中

第五:运行代码
python
from ultralytics.models import NAS, RTDETR, SAM, YOLO, FastSAM, YOLOWorld
import torch
if __name__=="__main__":
# 使用自己的YOLOv8.yamy文件搭建模型并加载预训练权重训练模型
model = YOLO("/home/shengtuo/tangfan/YOLO11/ultralytics/cfg/models/11/yolo11_SCSA.yaml")\
# .load(r'E:\Part_time_job_orders\YOLO\YOLOv11\yolo11n.pt') # build from YAML and transfer weights
results = model.train(data="/home/shengtuo/tangfan/YOLO11/ultralytics/cfg/datasets/VOC_my.yaml",
epochs=300,
imgsz=640,
batch=4,
# cache = False,
# single_cls = False, # 是否是单类别检测
# workers = 0,
# resume=r'D:/model/yolov8/runs/detect/train/weights/last.pt',
amp = False
)