即插即用系列 | AAAI 2026 | CAFR:跨光谱注意力特征细化!对象感知引导多光谱增强,轻量化实现小目标精准定位! | 代码分享
0. 前言本文介绍了CAFRCross-spectral Attention Feature Refinement跨光谱注意力特征细化模块其通过双向交叉注意力机制与显式对象感知引导策略首次在多光谱目标检测领域实现了光谱特征与空间对象先验的协同精细化增强有效破解了传统特征融合中光谱偏差累积与背景噪声干扰导致的特征判别性退化难题。将其作为即插即用模块可无缝嵌入YOLO、CNN、Transformer等主流检测架构在几乎零额外计算开销的前提下显著增强模型对多光谱图像中低对比度与小尺度目标的感知能力让模型在面对弱光环境、遮挡场景或高密度小目标聚集等挑战性工况时依然能够保持锐利的特征判别边界与鲁棒的检测精度。专栏链接即插即用系列专栏链接可点击跳转免费订阅目录0. 前言1. CAFR注意力简介2. CAFR注意力原理与创新点 CAFR注意力基本原理 CAFR注意力创新点3. 适用范围与模块效果适用范围⚡模块效果表1消融实验4. CAFR模块代码实现1.CAFR注意力简介多光谱图像MSIs通过捕获多个波段的光谱信息为目标检测提供了补充性的判别线索然而现有方法在利用光谱-空间信息时面临三大挑战一是现有的多光谱目标检测方法通过PCA降维或波段选择等方式解耦光谱与空间信息采用双流网络独立处理带来高昂的计算成本和光谱信息损失二是现有航空目标检测方法主要利用空间特征光谱线索未被充分利用三是复杂场景中广泛的背景干扰会稀释目标特征削弱模型注意力并影响目标光谱-空间特征学习导致检测器性能下降。为解决上述问题本文提出SACF模块通过自适应聚合光谱相关特征来增强目标内相关性在保留空间纹理细节的同时抵抗噪声干扰最小化跨层融合过程中的信息损失。原始论文https://arxiv.org/pdf/2512.09489原始代码https://github.com/shuaihao-han/MODA2.CAFR注意力原理与创新点CAFR注意力基本原理CAFR模块的核心设计理念是通过“由粗到细”的分层交互策略实现异构模态特征的自适应对齐与增强。在深度多模态网络中来自不同传感器或不同光谱波段的数据往往呈现出显著的特征分布差异——例如可见光图像富含纹理细节但易受光照影响而热红外或多光谱图像对光照不敏感却缺乏语义信息。传统的特征融合方法通常采用简单的拼接或逐元素相加忽略了模态间特征分布的不一致性导致融合后的特征难以充分发挥互补优势。CAFR模块从两个关键阶段实现特征的精细化融合第一步双向跨模态交互Bidirectional Cross-modality Interaction, BCI。在这一阶段CAFR首先通过1×1卷积对来自两个不同模态或不同层级的特征进行激活预处理生成更利于后续交互的特征表示。随后BCI计算全局注意力图——通过像素级乘法生成跨模态的空间-通道联合注意力权重实现从全局到局部的信息桥接。这一过程使得每个模态的特征都能获得来自另一模态的“引导信号”从而初步对齐模态间的特征分布缓解模态不平衡问题。第二步双重自适应特征精炼Two-fold Adaptive Feature Refinement, TAFR。在完成初始的模态交互后TAFR部分进一步通过特征统计方法对特征进行精细化对齐。具体来说该模块借鉴了风格迁移领域的思想通过对齐两个模态特征在通道维度上的均值与方差使来自不同源的特征映射到更统一的特征空间。这种统计层面的对齐有效消除了模态间的分布差异增强了模型的表征能力。融合后的特征随后被送入特征金字塔网络FPN以强化多尺度表达能力最终通过检测头完成分类与定位预测。CAFR模块的整体设计遵循“交互-对齐-精炼”的递进逻辑确保异构特征在保持各自优势的同时实现深度协同。CAFR注意力创新点双向跨模态交互机制首次在特征融合中引入双向信息桥接策略通过全局注意力图实现双模态间的空间-通道联合引导突破了传统单向增强方法的局限性。统计特征对齐策略创新性地将风格迁移中的特征统计对齐思想引入多模态融合领域通过对齐通道级均值与方差有效消除模态间的特征分布差异。极致轻量化设计BCI与TAFR两部分均仅涉及少量卷积与统计运算参数量与计算开销极低可在不显著增加推理负担的前提下实现显著的性能提升。3. 适用范围与模块效果适用范围CAFR模块适用于通用多模态或多光谱视觉任务特别是需要跨模态/跨层级特征深度交互与自适应对齐的应用场景。适用性分析多光谱目标检测CAFR能够有效对齐可见光与热红外/多光谱特征解决光照变化下的模态不平衡问题。事件-帧融合检测在高速运动或极端光照条件下CAFR可桥接事件流与帧图像间的特征鸿沟。跨分辨率特征融合CAFR的双向交互机制同样适用于深层语义特征与浅层空间特征的跨层融合场景。鲁棒性要求高的应用实验表明CAFR在面对图像噪声干扰时表现出显著优于传统方法的鲁棒性。⚡模块效果表1消融实验论文展示了应用CAFR模块前后的特征图可视化对比在日间场景中原始事件特征难以有效捕捉远处车辆在夜间场景中原始RGB特征因光照不足而失效。应用CAFR模块后融合特征同时保留了模态互补信息目标区域激活显著增强。总结CAFR的消融实验与对比实验充分验证了其核心设计的有效性——双向跨模态交互与统计特征对齐的协同作用使模型在标准基准上实现8.0%的显著性能提升并在15种噪声干扰下展现出近两倍的鲁棒性增益69.5% vs 38.7%证实了“由粗到细”分层融合策略在多模态特征对齐与增强任务中的关键价值。4. CAFR模块代码实现以下为CAFR模块的官方pytorch实现代码import torch import torch.nn as nn import torch.nn.functional as F class CrossAttentionFeatureRefinement(nn.Module): 跨谱注意力特征精修模块CAFR核心实现 核心通过通道级交叉注意力建模低/高分辨率特征的跨通道交互结合全局描述符调制特征最终融合增强 Args: channels: 输入特征通道数低/高分辨率特征通道数需一致 downsample_first: 是否对第一个输入进行下采样默认为True保持原始CAFR行为 *args: 可变位置参数兼容YOLO解析器 **kwargs: 可变关键字参数兼容YOLO解析器 Inputs: feat_low: 低层级高分辨率特征 [B, C, H, W] 或 [B, N, C] feat_high: 高层级低分辨率特征 [B, C, H, W] 或 [B, N, C]尺寸应相同 H: 输出特征图高度序列模式使用 W: 输出特征图宽度序列模式使用 Output: 融合增强后的特征 [B, C, H, W]与输入尺寸一致 def __init__(self, channels: int, downsample_first: bool False, *args, **kwargs): 初始化函数支持接收额外参数兼容YOLO的解析器 :param channels: 输入特征通道数 :param downsample_first: 是否对第一个输入进行下采样用于高低分辨率特征融合 :param args: 可变位置参数YOLO可能会传入这里忽略 :param kwargs: 可变关键字参数YOLO可能会传入这里忽略 super().__init__() self.channels channels self.downsample_first downsample_first # 可选的第一个输入下采样 if downsample_first: self.downsample nn.Conv2d( channels, channels, kernel_size3, stride2, padding1, biasFalse ) # 可选的特征对齐卷积当尺寸不匹配时使用 self.align_conv nn.Conv2d( channels, channels, kernel_size1, biasFalse ) # 全局平均池化提取通道级全局描述符捕捉全局特征统计信息 self.global_pool nn.AdaptiveAvgPool2d(1) # 通道投影对全局描述符做线性变换增强表达能力 self.fc_low nn.Conv2d(channels, channels, kernel_size1, biasFalse) self.fc_high nn.Conv2d(channels, channels, kernel_size1, biasFalse) # 融合卷积对调制后的特征做进一步精修保证融合特征的一致性 self.fuse nn.Sequential( nn.Conv2d(channels, channels, kernel_size3, padding1, biasFalse), nn.BatchNorm2d(channels), nn.ReLU(inplaceTrue), ) # 添加用于序列格式的投影层 self.seq_proj nn.Linear(channels, channels) def _channel_cross_attention(self, low_desc: torch.Tensor, high_desc: torch.Tensor): 计算通道级交叉注意力建模低/高特征通道间的依赖关系生成通道调制权重 Args: low_desc: 低层级特征全局描述符 [B, C, 1, 1] high_desc: 高层级特征全局描述符 [B, C, 1, 1] Returns: low_refined: 低层级特征通道调制权重 [B, C, 1, 1] high_refined: 高层级特征通道调制权重 [B, C, 1, 1] B, C, _, _ low_desc.shape # 重塑为向量形式适配矩阵乘法计算交叉注意力 low_vec low_desc.reshape(B, C, 1) high_vec high_desc.reshape(B, C, 1) # 计算通道交叉相似度矩阵衡量低/高特征各通道间的相关性 [B, C, C] weight torch.matmul(low_vec, high_vec.transpose(1, 2)) weight F.softmax(weight, dim-1) # 对列归一化得到注意力权重 # 基于交叉注意力精炼通道描述符生成最终调制权重 low_refined torch.matmul(weight, low_vec).reshape(B, C, 1, 1) high_refined torch.matmul(weight.transpose(1, 2), high_vec).reshape(B, C, 1, 1) return low_refined, high_refined def forward_img(self, feat_low: torch.Tensor, feat_high: torch.Tensor) - torch.Tensor: 图像格式的前向传播 :param feat_low: 低层级特征 [B, C, H, W] :param feat_high: 高层级特征 [B, C, H, W]尺寸应与feat_low相同 :return: 融合增强后的特征 [B, C, H, W] # 确保两个特征尺寸一致 if feat_low.shape[2:] ! feat_high.shape[2:]: # 如果尺寸不一致使用插值对齐 feat_low F.interpolate(feat_low, sizefeat_high.shape[2:], modebilinear, align_cornersTrue) # 可选对第一个输入进行下采样 if self.downsample_first: feat_low self.downsample(feat_low) # 提取低/高特征的全局通道描述符全局池化通道投影 low_desc self.fc_low(self.global_pool(feat_low)) high_desc self.fc_high(self.global_pool(feat_high)) # 计算通道交叉注意力生成通道调制权重 low_weight, high_weight self._channel_cross_attention(low_desc, high_desc) # 通道权重调制特征强化有效通道抑制冗余通道 feat_low_modulated feat_low * low_weight feat_high_modulated feat_high * high_weight # 特征相加融合卷积精修输出增强特征 out self.fuse(feat_low_modulated feat_high_modulated) return out def forward_seq(self, feat_low: torch.Tensor, feat_high: torch.Tensor, H: int, W: int) - torch.Tensor: 序列格式的前向传播兼容CGTA接口 :param feat_low: 低层级特征 [B, N, C] :param feat_high: 高层级特征 [B, N, C] :param H: 特征图高度 :param W: 特征图宽度 :return: 融合特征 [B, N, C] B, N, C feat_low.shape # 将序列转换为图像格式 [B, C, H, W] feat_low_img feat_low.transpose(1, 2).view(B, C, H, W).contiguous() feat_high_img feat_high.transpose(1, 2).view(B, C, H, W).contiguous() # 调用图像格式的前向传播 out_img self.forward_img(feat_low_img, feat_high_img) # 转换回序列格式 [B, N, C] out_seq out_img.view(B, C, -1).transpose(1, 2).contiguous() return out_seq def forward(self, feat_low, feat_highNone, HNone, WNone): 前向主流程支持两种调用模式 1. 独立测试模式传入H和W参数序列格式输入 2. Ultralytics框架模式图像格式输入 :param feat_low: 低层级特征 [B, C, H, W] 或 [B, N, C] :param feat_high: 高层级特征可选如果不提供则使用feat_low自身 :param H: 特征图高度序列模式使用 :param W: 特征图宽度序列模式使用 :return: 融合增强后的特征 # 序列模式 if H is not None and W is not None: if feat_high is None: feat_high feat_low return self.forward_seq(feat_low, feat_high, H, W) # 如果只提供一个输入则使用feat_low作为两个输入自融合模式 if feat_high is None: feat_high feat_low # 图像模式 return self.forward_img(feat_low, feat_high) class CAFR(nn.Module): CAFR (Cross Attention Feature Refinement) 的封装类 提供统一的接口兼容YOLO的解析器 注意此模块不会改变输入特征图的尺寸适合作为YOLO中的即插即用模块 def __init__(self, c1, c2None, downsample_firstFalse, *args, **kwargs): 初始化函数兼容YOLO的解析器 :param c1: 输入通道数第一个输入特征 :param c2: 第二个输入通道数可选如果不提供则使用c1 :param downsample_first: 是否对第一个输入进行下采样用于高低分辨率特征融合 :param args: 可变位置参数YOLO可能会传入这里忽略 :param kwargs: 可变关键字参数YOLO可能会传入这里忽略 super().__init__() # 如果c2未提供则使用c1 if c2 is None: c2 c1 # 确保输入通道一致 assert c1 c2, fCAFR expects same input channels, but got c1{c1}, c2{c2} self.in_channels c1 self.cafr CrossAttentionFeatureRefinement(c1, downsample_first, *args, **kwargs) def forward(self, x, yNone, HNone, WNone): 前向传播 :param x: 主特征 [B, C, H, W] 或 [B, N, C] :param y: 辅助特征可选如果不提供则使用x自身 :param H: 特征图高度序列模式 :param W: 特征图宽度序列模式 :return: 融合后的特征尺寸与输入相同 # 序列模式 if H is not None and W is not None: if y is None: y x return self.cafr(x, y, H, W) # 图像模式 if y is None: y x return self.cafr(x, y) # 模块测试代码 if __name__ __main__: # 根据CUDA可用性设置设备 device torch.device(cuda if torch.cuda.is_available() else cpu) print(f使用设备: {device}) print( * 60) print(测试模式1YOLO兼容性测试保持尺寸不变) print( * 60) # 测试YOLO解析器的调用方式 model CAFR(64, 64).to(device) print(CAFR模块初始化成功) print(f输入通道数: {model.in_channels}) print() print( * 60) print(测试模式2图像格式 - 相同尺寸特征融合) print( * 60) # 测试相同尺寸的特征融合 f1 torch.randn(1, 64, 32, 32).to(device) f2 torch.randn(1, 64, 32, 32).to(device) y_img model(f1, f2) print(输入特征1维度, f1.shape) print(输入特征2维度, f2.shape) print(输出特征维度, y_img.shape) print(f尺寸是否保持不变: {y_img.shape f1.shape}) print() print( * 60) print(测试模式3图像格式 - 自融合模式) print( * 60) # 测试自融合模式 f_single torch.randn(1, 64, 32, 32).to(device) y_self model(f_single) print(输入特征维度, f_single.shape) print(输出特征维度自融合, y_self.shape) print(f尺寸是否保持不变: {y_self.shape f_single.shape}) print() print( * 60) print(测试模式4序列格式兼容CGTA接口) print( * 60) # 测试序列格式输入 H, W 32, 32 N H * W f_seq1 torch.randn(1, N, 64).to(device) f_seq2 torch.randn(1, N, 64).to(device) y_seq model(f_seq1, f_seq2, HH, WW) print(输入特征维度1序列, f_seq1.shape) print(输入特征维度2序列, f_seq2.shape) print(输出特征维度序列, y_seq.shape) print(f序列长度是否保持不变: {y_seq.shape[1] N}) print() print( * 60) print(测试模式5批量处理测试) print( * 60) # 测试批量处理 batch_size 4 f_batch1 torch.randn(batch_size, 64, 32, 32).to(device) f_batch2 torch.randn(batch_size, 64, 32, 32).to(device) y_batch model(f_batch1, f_batch2) print(批量输入特征1维度, f_batch1.shape) print(批量输入特征2维度, f_batch2.shape) print(批量输出特征维度, y_batch.shape) print(f尺寸是否保持不变: {y_batch.shape f_batch1.shape}) print() print( * 60) print(测试模式6不同尺寸特征融合自动对齐) print( * 60) # 测试不同尺寸的特征融合会自动对齐 f_large torch.randn(1, 64, 32, 32).to(device) f_small torch.randn(1, 64, 16, 16).to(device) y_diff model(f_large, f_small) print(输入大尺寸特征维度, f_large.shape) print(输入小尺寸特征维度, f_small.shape) print(输出特征维度, y_diff.shape) print(f输出尺寸与小尺寸特征一致: {y_diff.shape f_small.shape}) print() print( * 60) print(测试通过) print( * 60)结合自己的思路可将其即插即用至任何模型做结构创新设计该模块博主已成功嵌入至YOLO26模型中可订阅博主YOLO系列算法改进或YOLO26自研改进专栏YOLO系列算法改进专栏链接、YOLO26自研改进系列专栏