在单图像去雨(SID)等低层次视觉任务中,现有方法多聚焦于空间 - 通道或全局 - 局部单一范式的特征建模,缺乏能有效整合两种范式的框架,导致不同范式的特征存在知识差异和错位,简单的拼接或相加易造成信息丢失,难以显著提升性能。此外,自注意力机制中低注意力值或无关 token 会干扰密集注意力矩阵,影响特征质量,需要一种能同时利用多范式信息并实现特征对齐聚合的机制,CPIA-SA 由此被提出。
1.CPIA-SA原理
CPIA-SA(Cross-Paradigm Interaction and Alignment Self-Attention)的核心原理是通过两种互补的自注意力机制分别提取不同范式的特征,并通过专门模块实现跨范式的特征对齐与深度交互。具体而言,稀疏提示通道自注意力(SPC-SA)沿通道维度计算注意力,利用提示信息动态过滤密集注意力矩阵中的冗余信息,保留关键全局 - 通道特征;空间像素细化自注意力(SPR-SA)通过基于 CNN 的高效结构近似自注意力,建模局部空间像素间的关系,捕捉细粒度局部 - 空间特征。同时,自适应对齐频率模块(AAFM)通过两阶段渐进策略,先基于自适应加权对齐对应分支特征,再通过频域交互增强特征间的作用,缩小范式内和范式间的信息差距。
CPIA-SA 由三个关键组件构成:
稀疏提示通道自注意力(SPC-SA):通过点卷积(PWConv)和 3×3 深度卷积(DWConv)生成查询(Q)、键(K)、值(V),计算通道维度的密集注意力矩阵后,利用高效提示引导算子(EPGO)动态生成提示信息,结合 Top-k 机制过滤冗余注意力值,保留有价值的全局 - 通道特征。
空间像素细化自注意力(SPR-SA):通过线性层、3×3 深度卷积和点卷积处理输入特征,结合全局平均池化(GAP)和 GELU 函数,增强对局部空间像素关系的建模,捕捉细粒度局部 - 空间特征。
自适应对齐频率模块(AAFM):先通过空间对齐和通道对齐生成注意力图,对 SPC-SA 和 SPR-SA 的输出特征进行加权调整以实现空间 - 通道范式对齐;再将特征映射至频域,通过傅里叶变换增强全局 - 局部范式的特征交互,最终通过逆傅里叶变换返回空间域完成融合。
2. CPIA-SA在不同领域论文中的描述
CPIA-SA 在目标检测中的优点
CPIA-SA 中 SPC-SA 对全局通道依赖的捕捉,能有效聚合跨区域的目标语义信息,帮助模型识别不同位置的同类目标;SPR-SA 对局部空间细节的建模,可强化目标边缘、遮挡区域等关键局部特征的表达;AAFM 的跨范式对齐与融合则减少了全局语义与局部细节间的信息差距,使模型在复杂场景下仍能准确区分目标与背景,提升检测的鲁棒性。
CPIA-SA 在图像分割中的优点
SPR-SA 对局部空间像素关系的精细建模,有助于捕捉物体边缘的细微变化,提升分割边界的精准度;SPC-SA 对全局通道特征的整合,能保证同一语义区域内特征的一致性,避免局部过分割;AAFM 通过频域交互促进全局语义与局部结构的深度融合,使分割结果在保留细节的同时,维持良好的语义连贯性。
3. YOLO与CPIA-SA的结合
CPIA-SA 的 SPC-SA 通过动态稀疏注意力减少冗余计算,适配 YOLO 对实时性的需求;其跨范式特征融合能力可增强 YOLO 对多尺度目标(尤其是小目标)的特征表达,提升复杂场景下的检测精度。
4. CPIA-SA代码部分
跨范式交互与对齐自注意力CPIA-SA,通过整合空间 - 通道和全局 - 局部两种范式的特征,实现跨范式的动态对齐与深度交互,提升特征表示质量。_哔哩哔哩_bilibili
YOLOv11模型改进讲解,教您如何根据自己的数据集选择最优的模块提升精度_哔哩哔哩_bilibili
代码获取:https://github.com/tgf123/YOLOv8_improve
5. CPIA-SA到YOLOv11中
第一: 将下面的核心代码复制到D:\model\yolov11\ultralytics\change_model路径下,如下图所示。
第二:在task.py中导入包
第三:在task.py中的模型配置部分下面代码
第四:将模型配置文件复制到YOLOV11.YAMY文件中
第五:运行代码
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_CPIASA.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
)