YOLOv11 改进 - C2PSA C2PSA融合CPIASA跨范式交互与对齐自注意力机制(ACM MM2025) 交互对齐机制破解特征融合难题,提升小目标与遮挡目标判别力

发布时间:2026/7/2 2:10:42
YOLOv11 改进 - C2PSA   C2PSA融合CPIASA跨范式交互与对齐自注意力机制(ACM MM2025)  交互对齐机制破解特征融合难题,提升小目标与遮挡目标判别力 前言文章目录 YOLOv11改进大全卷积层、轻量化、注意力机制、损失函数、Backbone、SPPF、Neck、检测头全方位优化汇总专栏链接: YOLOv11改进专栏介绍摘要基于Transformer的网络通过利用空间或通道维度的自注意力机制在图像去雨等低层视觉任务中取得了优异性能。然而不规则的雨纹模式和复杂的几何重叠对单一范式架构提出了挑战亟需一种统一框架来融合互补的全局-局部与空间-通道表征。为此我们提出了一种新颖的跨范式表征与对齐TransformerCross Paradigm Representation and Alignment Transformer简称CPRAformer。其核心思想是分层表征与对齐充分发挥空间-通道与全局-局部两种范式的优势以辅助图像重建。该方法弥合了范式内部及范式之间的差距通过对齐与协调机制实现特征的深度交互与融合。具体而言我们在Transformer模块中引入了两种自注意力机制稀疏提示通道自注意力Sparse Prompt Channel Self-Attention, SPCSA和空间像素精炼自注意力Spatial Pixel Refinement Self-Attention, SPR-SA。SPCSA通过动态稀疏性增强全局通道依赖关系而SPR-SA则聚焦于空间雨纹分布与细粒度纹理恢复。为解决两者之间存在的特征错位与知识差异问题我们设计了自适应对齐频域模块Adaptive Alignment Frequency Module, AAFM以两阶段渐进方式对特征进行对齐与交互实现自适应引导与互补从而有效缩小范式内部及范式之间的信息鸿沟。借助这一统一的跨范式动态交互框架我们能够从两种范式中提取最具价值的交互融合信息。大量实验表明我们的模型在八个基准数据集上均达到当前最先进的性能并进一步验证了CPRAformer在其他图像复原任务及下游应用中的鲁棒性。文章链接论文地址论文地址代码地址代码地址基本原理# CPIA-SA跨范式交互与对齐自注意力机制技术原理详解 CPIA-SACross-Paradigm Interaction and Alignment Self-Attention是CPRAformer模型的核心组件其设计目标是解决传统图像去雨模型中“单一范式特征提取不全面”的痛点通过协同“空间-通道”与“全局-局部”两种范式实现更精准的雨痕去除与背景细节保留。以下从技术定位、核心构成、工作流程、关键创新四个维度展开详细解析一、技术定位为什么需要CPIA-SA传统去雨模型的特征提取存在明显局限要么仅关注全局通道信息如识别雨痕集中的色彩通道忽略局部像素细节要么仅聚焦局部空间信息如修复小区域纹理缺乏全局雨痕分布的把控。这种“单一范式依赖”导致去雨效果顾此失彼——要么雨痕去不净要么背景磨糊。CPIA-SA的核心定位是“范式协同中枢”它通过两种互补的自注意力机制分别提取“全局-通道”与“局部-空间”特征再通过专门的对齐融合模块消除两种特征的“信息鸿沟”让全局把控与局部修复相互配合最终输出更全面、一致的高质量特征为后续去雨重建提供支撑。二、核心构成三大子模块的分工与协作CPIA-SA由三个功能明确且深度耦合的子模块组成各模块既独立完成特定任务又通过数据流形成协同闭环具体结构如图2文档架构图所示子模块名称核心功能对应范式解决的关键问题SPC-SA稀疏提示通道自注意力提取全局通道依赖动态过滤无效噪声全局-通道传统通道注意力计算冗余、易受非雨噪声干扰SPR-SA空间像素细化自注意力建模局部空间关系修复细粒度纹理局部-空间传统空间注意力计算成本高、局部细节捕捉弱AAFM自适应对齐频率模块对齐两种特征的“信息维度”实现深度融合跨范式协同SPC-SA与SPR-SA的特征错位、知识差异三、工作流程从特征提取到融合的四步闭环CPIA-SA的工作流程可分为“双路提取→动态过滤→空间细化→对齐融合”四个关键步骤全程围绕“全局不丢、局部不漏”的目标展开步骤1SPC-SA——全局通道特征的“精准筛选”SPC-SA的核心是“在通道维度上抓全局、去冗余”通过动态稀疏机制只保留对去雨有用的通道信息具体操作如下 1.特征投影将输入特征图(F \in \mathbb{R}^{H×W×C})H高度、W宽度、C通道数通过“点卷积PWConv3×3深度卷积DWConv”转换为查询矩阵Q、键矩阵K、值矩阵VTransformer自注意力的标准三矩阵其中Q/K/V均沿通道维度排列形状为(\mathbb{R}^{C×C})。 2.动态稀疏过滤核心创新传统通道注意力会计算所有通道间的依赖关系即稠密注意力矩阵但很多通道间的关联与“去雨”无关如纯色背景的通道反而引入噪声。SPC-SA通过两个机制解决这一问题 -Top-k筛选对注意力矩阵每行代表一个通道的依赖关系只保留前k%的高注意力值即与当前通道最相关的其他通道其余值设为0减少冗余计算 -EPGO高效提示引导算子k值并非固定如传统方法固定k80%而是由输入特征动态生成——通过两层线性网络Sigmoid激活生成“提示特征”再结合通道数C计算出适配当前雨况的k值如雨后天空区域k值更小优先保留蓝色通道雨后树叶区域k值更大兼顾绿色与灰度通道。数学上k值通过公式算法1计算(Dynamic\ K C \times p)p为提示特征的全局平均值确保稀疏筛选“随雨况变、按需调整”。 3.注意力计算将筛选后的稀疏注意力矩阵与值矩阵V相乘得到全局通道特征(F_{SPC})该特征能清晰反映“哪些通道雨痕多、哪些通道是干净背景”。步骤2SPR-SA——局部空间特征的“精细修复”SPR-SA的核心是“在空间维度上补细节、降成本”通过CNN轻量化架构近似自注意力高效捕捉局部像素关系 1.局部特征压缩对输入特征图F先通过线性层投影再用3×3深度卷积DWConv捕捉局部像素关联得到局部特征图(F_L)形状不变但融入周边像素信息 2.空间权重生成对(F_L)做全局平均池化GAP得到每个通道的“空间重要性权重”(F_{SP})再通过点卷积PWConv和GELU激活函数生成与原特征图尺寸一致的空间权重图 3.细节增强将空间权重图与(F_L)逐元素相乘对雨痕覆盖的局部区域如文字边缘、树叶纹理进行权重强化最终输出局部空间特征(F_{SPR})该特征能精准修复被雨痕遮挡的细粒度细节。步骤3AAFM——两种特征的“维度对齐”此时(F_{SPC})全局通道与(F_{SPR})局部空间的“信息维度”不一致前者关注“通道间的全局关联”后者关注“像素间的局部关联”直接拼接会导致信息冲突。AAFM通过两阶段策略实现对齐与融合 1.第一阶段特征权重对齐空间/通道适配根据两种特征的属性动态调整权重 - 对(F_{SPC})全局通道特征沿空间维度生成权重图(Map_C)强化雨痕集中区域的通道信息 - 对(F_{SPR})局部空间特征沿通道维度生成权重图(Map_S)突出干净背景区域的空间细节 - 通过“特征×权重图”的逐元素相乘让两种特征在“空间-通道”维度上达成一致。 2.第二阶段频率域融合深层信息交互传统空间域融合易丢失高频细节如边缘纹理AAFM引入傅里叶变换FFT在频率域实现更细腻的融合 - 将对齐后的特征(\hat{F})(F_{SPC} \odot Map_C F_{SPR} \odot Map_S)通过线性层投影放大高频信号对应雨痕边缘、背景纹理 - 对投影后的特征做FFT分解为实部R和虚部I捕捉全局频率分布如大面积雨痕的低频特征、细节纹理的高频特征 - 将R和I沿通道拼接再通过逆FFTIFFT转换回空间域得到跨范式融合特征F该特征同时包含全局雨痕分布与局部细节信息。步骤4特征输出与反馈融合后的特征F将传入CPRAformer的下一级模块如MSGN多尺度门控网络进一步优化多尺度雨痕处理同时F的部分信息会反馈给SPC-SA的EPGO为下一轮动态k值调整提供参考形成“自适应迭代”。核心代码class Attention(nn.Module): def __init__(self, dim, num_heads, bias): super(Attention, self).__init__() self.num_heads num_heads self.temperature nn.Parameter(torch.ones(num_heads, 1, 1)) self.spr_saspr_sa(dim//2,2) self.linear_0 nn.Conv2d(dim, dim , 1, 1, 0) self.linear_2 nn.Conv2d(dim, dim, 1, 1, 0) self.qkv nn.Conv2d(dim//2, dim//2 * 3, kernel_size1, biasbias) self.qkv_dwconv nn.Conv2d(dim//2 * 3, dim//2 * 3, kernel_size3, stride1, padding1, groupsdim//2 * 3, biasbias) self.project_out nn.Conv2d(dim, dim, kernel_size1, biasbias) self.attn_drop nn.Dropout(0.) self.attn1 torch.nn.Parameter(torch.tensor([0.2]), requires_gradTrue) self.attn2 torch.nn.Parameter(torch.tensor([0.2]), requires_gradTrue) self.attn3 torch.nn.Parameter(torch.tensor([0.2]), requires_gradTrue) self.attn4 torch.nn.Parameter(torch.tensor([0.2]), requires_gradTrue) self.channel_interaction nn.Sequential( nn.AdaptiveAvgPool2d(1), nn.Conv2d(dim//2, dim // 8, kernel_size1), nn.BatchNorm2d(dim // 8), nn.GELU(), nn.Conv2d(dim // 8, dim//2, kernel_size1), ) self.spatial_interaction nn.Sequential( nn.Conv2d(dim//2, dim // 16, kernel_size1), nn.BatchNorm2d(dim // 16), nn.GELU(), nn.Conv2d(dim // 16, 1, kernel_size1) ) self.fftStage2_fft(in_channelsdim) self.gate nn.Sequential( nn.Conv2d(dim//2, dim // 4, kernel_size1), nn.ReLU(), nn.Conv2d(dim // 4, 1, kernel_size1), # 输出动态 K nn.Sigmoid() ) def forward(self, x): b, c, h, w x.shape y, x self.linear_0(x).chunk(2, dim1) y_d self.spr_sa(y) qkv self.qkv_dwconv(self.qkv(x)) q, k, v qkv.chunk(3, dim1) q rearrange(q, b (head c) h w - b head c (h w), headself.num_heads) k rearrange(k, b (head c) h w - b head c (h w), headself.num_heads) v rearrange(v, b (head c) h w - b head c (h w), headself.num_heads) q torch.nn.functional.normalize(q, dim-1) k torch.nn.functional.normalize(k, dim-1) _, _, C, _ q.shape dynamic_k int(C * self.gate(x).view(b, -1).mean()) attn (q k.transpose(-2, -1)) * self.temperature mask torch.zeros(b, self.num_heads, C, C, devicex.device, requires_gradFalse) index torch.topk(attn, kdynamic_k, dim-1, largestTrue)[1] mask.scatter_(-1, index, 1.) attn torch.where(mask 0, attn, torch.full_like(attn, float(-inf))) attn attn.softmax(dim-1) out1 (attn v) out2 (attn v) out3 (attn v) out4 (attn v) out out1 * self.attn1 out2 * self.attn2 out3 * self.attn3 out4 * self.attn4 out_att rearrange(out, b head c (h w) - b (head c) h w, headself.num_heads, hh, ww) # Frequency Adaptive Interaction Module (FAIM) # stage1 # C-Map (before sigmoid) channel_map self.channel_interaction(out_att) # S-Map (before sigmoid) spatial_map self.spatial_interaction(y_d) # S-I attened_x out_att * torch.sigmoid(spatial_map) # C-I conv_x y_d * torch.sigmoid(channel_map) x torch.cat([attened_x, conv_x], dim1) out self.project_out(x) # stage 2 outself.fft(out) return out实验脚本import warnings warnings.filterwarnings(ignore) from ultralytics import YOLO # if __name__ __main__: # 修改为自己的配置文件地址 model YOLO(./ultralytics/cfg/models/11/yolov11-C2PSA_CPIASA.yaml) # 修改为自己的数据集地址 model.train(data./ultralytics/cfg/datasets/coco8.yaml, cacheFalse, imgsz640, epochs10, single_clsFalse, # 是否是单类别检测 batch8, close_mosaic10, workers0, optimizerSGD, ampTrue, projectruns/train, nameC2PSA_CPIASA, )结果