全文包含可直接运行的代码,建议点赞+收藏 + 关注,后续持续更新双模态检测改进创新系列内容。本文是双模态系列的第10篇,收藏文集持续跟进顶刊创新思路。
跨模态特征融合主要面向可见光 - 红外、RGB - 多光谱、雷达 - 图像等互补数据,核心流程为特征对齐、模态交互、自适应融合与精炼。首先采用双分支结构,利用 CNN 或 Transformer 分别对不同模态进行独立特征提取,在保留红外抗干扰、RGB 纹理细节等独有信息的同时,输出空间尺寸相近的特征图。随后通过 1×1 卷积实现通道维度统一,完成特征空间对齐,为后续交互奠定基础。
融合核心在于跨模态注意力交互:通过通道注意力筛选关键特征通道,借助空间注意力强化目标区域并抑制背景干扰,结合查询 - 键值机制实现模态间信息互补与自适应加权。特征融合常采用通道拼接、逐元素相加或门控加权等方式,动态分配不同模态的贡献度。最后利用 3×1 卷积或残差结构对融合特征进行精炼,降低信息混叠与噪声干扰,输出鲁棒性更强的联合特征,用于后续目标检测任务。
下面的模块可以用来取代特征级融合中简单的Concat操作:
1.Dual-Dynamic Cross-Modal Interaction Network for Multimodal Remote Sensing Object Detection
import torch import torch.nn as nn import torch.nn.functional as F class DynamicFeatureFusion(nn.Module): """ 【YOLO适配版】严格复现DDCINet论文 Dynamic Feature Fusion (DFF) 模块 完全对齐:公式、维度、操作、符号、流程 输入:x -> [X', Y'] (双模态遥感特征列表) 输出:Z -> [B, C, H, W] (动态融合特征) """ # 🚀 接口适配 1:接收 YOLO 标准参数 c1, c2 def __init__(self, c1, c2, reduction_ratio: int = 16): super().__init__() # c1 在 YAML 中传入的是双路通道列表,如 [512, 512] self.C = c1[0] if isinstance(c1, list) else c1 self.r = reduction_ratio # 论文:Conv1×1 C → 1,提取模态全局上下文 self.conv_g = nn.Conv2d(in_channels=self.C, out_channels=1, kernel_size=1, bias=False) # 论文:生成融合因子a的两层1×1卷积 self.conv_reduce = nn.Conv2d(self.C, self.C // self.r, kernel_size=1, bias=False) self.conv_restore = nn.Conv2d(self.C // self.r, self.C, kernel_size=1, bias=False) self.relu = nn.ReLU(inplace=True) self.sigmoid = nn.Sigmoid() # 🚀 接口适配 2:增加一个可选的维度对齐层,确保输出能够匹配下游网络的期望 c2 self.proj = nn.Conv2d(self.C, c2, kernel_size=1) if self.C != c2 else nn.Identity() # 🚀 接口适配 3:接收单参数 x,并在内部解包 def forward(self, x): X_prime, Y_prime = x[0], x[1] B, C, H, W = X_prime.shape HW = H * W # ===================== 1. 计算 Gx, Gy 严格对齐论文Reshape3 ===================== # Conv1×1^{C→1} gx = self.conv_g(X_prime) # [B, 1, H, W] gy = self.conv_g(Y_prime) # [B, 1, H, W] # 空间维度Softmax(全局空间归一化) gx = F.softmax(gx.flatten(2), dim=-1) # [B, 1, HW] gy = F.softmax(gy.flatten(2), dim=-1) # [B, 1, HW] # Reshape3:1×H×W → HW×1×1 Gx = gx.permute(0, 2, 1).unsqueeze(-1) # [B, HW, 1, 1] Gy = gy.permute(0, 2, 1).unsqueeze(-1) # [B, HW, 1, 1] # ===================== 2. 计算 S 严格对齐论文Reshape4+矩阵乘 ===================== # Reshape4:C×H×W → C×HW X_seq = X_prime.flatten(2) # [B, C, HW] Y_seq = Y_prime.flatten(2) # [B, C, HW] # 矩阵乘法:Reshape4(X')·Gx + Reshape4(Y')·Gy → [B, C, 1] S_x = torch.bmm(X_seq, Gx.squeeze(-1)) S_y = torch.bmm(Y_seq, Gy.squeeze(-1)) S = S_x + S_y # [B, C, 1] # 恢复为 [B, C, 1, 1] 适配卷积输入 S = S.unsqueeze(-1) # [B, C, 1, 1] # ===================== 3. 计算融合因子 a 严格对齐论文卷积流程 ===================== a = self.conv_reduce(S) # [B, C//r, 1, 1] a = self.relu(a) a = self.conv_restore(a) # [B, C, 1, 1] a = self.sigmoid(a) # ===================== 4. 最终融合 Z = a·X' + (1-a)·Y' ===================== Z = a * X_prime + (1 - a) * Y_prime # 🚀 接口适配 4:输出维度对齐 return self.proj(Z)DFF 模块通过全局空间注意力与动态融合因子实现跨模态特征的自适应加权,摒弃了简单拼接仅做通道堆叠的粗糙方式,能够依据场景自动学习并分配 RGB 与红外特征的贡献比例,有效突出目标关键信息并抑制冗余背景,让融合特征更具针对性与判别性。
该模块利用全局上下文建模与矩阵变换完成特征聚合,可捕捉长距离空间依赖关系,而简单拼接仅做局部特征叠加,无法感知全局语义关联,因此 DFF 在复杂环境、目标遮挡及尺度变化场景下能生成更鲁棒的融合表征。
模块通过动态权重 α 实现端到端的模态均衡融合,避免了拼接带来的通道数翻倍、参数量与计算量激增的问题,同时保持特征维度一致且兼容性强,在不显著增加计算负担的前提下大幅提升检测稳定性,更适配轻量化目标检测框架。
2.CCSFuse: Collaborative Compensation and Selective
Fusion for UAV-based RGB-IR Object Detection
import torch import torch.nn as nn import torch.nn.functional as F class AFSF(nn.Module): """ 修正版:自适应特征选择融合模块 (Adaptive Feature-Selection Fusion) 100%对齐CCSFuse论文公式+结构,无多余算子,无逻辑错误 Args: in_channels (int): 单模态输入特征通道数(RGB/IR特征通道一致) reduction (int): MLP通道压缩比例,论文默认16 """ def __init__(self, in_channels: int, reduction: int = 16): super().__init__() self.in_channels = in_channels # 1. 全局平均池化(论文唯一池化算子) self.gap = nn.AdaptiveAvgPool2d(1) # 2. 跨模态MLP(严格对齐论文:Linear → GELU → Linear,无末尾激活) # 输入:拼接RGB+IR权重 → 2*in_channels self.mlp = nn.Sequential( nn.Linear(2 * in_channels, in_channels // reduction), nn.GELU(), nn.Linear(in_channels // reduction, 2 * in_channels) ) # 3. 权重归一化(论文必须:Sigmoid将权重压缩到[0,1]) self.sigmoid = nn.Sigmoid() # 4. 自适应特征融合(1×1卷积降维,对齐论文) self.fuse_conv = nn.Conv2d(2 * in_channels, in_channels, kernel_size=1) def forward(self, x): """ 前向传播 (YOLO 适配版) Args: x (list): 包含双路特征的列表 [f_rgb_cmfc, f_ir_cmfc] """ # 🚀 核心修复:在这里对 YOLO 传进来的列表 x 进行解包 f_rgb_cmfc, f_ir_cmfc = x[0], x[1] B, C, H, W = f_rgb_cmfc.shape # ==================== Step1:单模态通道描述符 ==================== feat_rgb_gap = self.gap(f_rgb_cmfc).flatten(1) # [B, C] feat_ir_gap = self.gap(f_ir_cmfc).flatten(1) # [B, C] # ==================== Step2:跨模态权重学习 ==================== weight_cat = torch.cat([feat_rgb_gap, feat_ir_gap], dim=1) # [B, 2C] weight_cross = self.mlp(weight_cat) # [B, 2C] # ==================== Step3:权重拆分+归一化 ==================== weight_rgb = weight_cross[:, :C].view(B, C, 1, 1) # [B, C, 1, 1] weight_ir = weight_cross[:, C:].view(B, C, 1, 1) # [B, C, 1, 1] weight_rgb = self.sigmoid(weight_rgb) weight_ir = self.sigmoid(weight_ir) # ==================== Step4:通道校准+特征融合 ==================== f_rgb_cal = f_rgb_cmfc * weight_rgb f_ir_cal = f_ir_cmfc * weight_ir fused_feat = torch.cat([f_rgb_cal, f_ir_cal], dim=1) fused_feat = self.fuse_conv(fused_feat) return fused_featAFSF 模块通过跨模态自适应权重学习实现精准特征增强,利用全局平均池化与 MLP 网络自动学习 RGB 与红外特征的重要性权重,对不同模态特征进行独立通道校准,而非简单拼接的无差别堆叠,可有效强化目标关键特征、抑制背景噪声,大幅提升融合特征的判别性与表达能力。
该模块采用先加权校准再融合的策略,让每个模态特征在融合前完成优化增强,避免了简单拼接带来的信息冗余与通道混杂问题,通过 1×1 卷积实现维度统一,保留模态互补特性的同时减少无效信息干扰,使输出特征更纯净、更适配后续检测任务。
模块整体结构轻量化、计算高效,仅通过池化、MLP 与卷积实现自适应融合,无需复杂空间操作即可完成高质量跨模态聚合,相比拼接导致的通道数翻倍、计算量增加的问题,AFSF 在保持低开销的同时显著提升检测鲁棒性,更适合嵌入式与实时检测场景。
3.Complementary Advantages: Exploiting Cross-Field Frequency Correlation for NIR-Assisted Image Denoising
import torch import torch.nn as nn import torch.fft class FEFM(nn.Module): """ 【YOLO 完美适配版】Frequency Exhaustive Fusion Mechanism (FEFM) 具备 AMP 混合精度防溢出保护,接口无缝对接 YOLO11。 """ def __init__(self, c1, c2, reduction=8): super().__init__() # 🚀 接口适配:YOLO 传入的 c1 是双路通道列表 in_channels1 = c1[0] in_channels2 = c1[1] out_channels = c2 # YOLO 期望的输出通道数 # 通道调整层,将不同通道数的输入调整到统一的中间通道数 mid_channels = max(in_channels1, in_channels2) self.conv_r = nn.Conv2d(in_channels1, mid_channels, kernel_size=1) self.conv_n = nn.Conv2d(in_channels2, mid_channels, kernel_size=1) # 点卷积和深度卷积层定义 self.point_conv_Q = nn.Conv2d(mid_channels, mid_channels, kernel_size=1) self.depth_conv_Q = nn.Conv2d(mid_channels, mid_channels, kernel_size=3, padding=1, groups=mid_channels) self.point_conv_K = nn.Conv2d(mid_channels, mid_channels, kernel_size=1) self.depth_conv_K = nn.Conv2d(mid_channels, mid_channels, kernel_size=3, padding=1, groups=mid_channels) self.point_conv_V = nn.Conv2d(mid_channels, mid_channels, kernel_size=1) self.depth_conv_V = nn.Conv2d(mid_channels, mid_channels, kernel_size=3, padding=1, groups=mid_channels) # 最终输出层,调整通道数到out_channels self.out_conv = nn.Conv2d(mid_channels, out_channels, kernel_size=1) # 注意力机制与自适应参数 self.alpha = nn.Parameter(torch.tensor(1.0)) # CFR缩放因子 self.lambd = nn.Parameter(torch.tensor(0.5)) # DFR权重因子 self.beta = nn.Parameter(torch.tensor(0.5)) # 频域与空间融合的平衡因子 # 通道注意力机制 (SK-Net Style) self.avg_pool = nn.AdaptiveAvgPool2d(1) d = max(int(mid_channels / reduction), 4) self.mlp = nn.Sequential( nn.Conv2d(mid_channels, d, 1, bias=False), nn.ReLU(inplace=True), nn.Conv2d(d, mid_channels * 2, 1, bias=False) ) self.softmax = nn.Softmax(dim=1) def forward(self, x): # 🚀 接口适配:解包 YOLO 传进来的双流特征列表 F_R, F_N = x[0], x[1] orig_dtype = F_R.dtype # 记录原始数据类型 (通常是 float16) F_R = self.conv_r(F_R) F_N = self.conv_n(F_N) # ===== 1. 特征拼接 ===== F_concat = torch.cat([F_R, F_N], dim=1) B, C_total, H, W = F_concat.shape # ===== 2. 通道注意力,自适应融合 ===== F_concat_reshaped = F_concat.view(B, 2, C_total // 2, H, W) feats_sum = torch.sum(F_concat_reshaped, dim=1) attn = self.mlp(self.avg_pool(feats_sum)) attn = self.softmax(attn.view(B, 2, C_total // 2, 1, 1)) F_weighted = torch.sum(F_concat_reshaped * attn, dim=1) # ===== 3. 特征编码 ===== Q = self.depth_conv_Q(self.point_conv_Q(F_weighted)) K = self.depth_conv_K(self.point_conv_K(F_weighted)) V = self.depth_conv_V(self.point_conv_V(F_weighted)) # 🚀🚀🚀 AMP 绝密防御:强制转为 FP32 避开 ComplexHalf 报错 🚀🚀🚀 Q_fp32 = Q.to(torch.float32) K_fp32 = K.to(torch.float32) # ===== 4. 频域转换 (安全模式) ===== F_Q = torch.fft.fft2(Q_fp32, dim=(-2, -1)) F_K = torch.fft.fft2(K_fp32, dim=(-2, -1)) # ===== 5. Common Feature Reinforcement (CFR) ===== elem_product = F_Q * F_K B, C, H, W = F_Q.shape F_Q_flat = F_Q.view(B, C, -1) F_K_flat = F_K.view(B, C, -1) # 在 FP32 下安全执行复数点乘与绝对值计算 attn_matrix = torch.matmul(F_Q_flat, F_K_flat.transpose(1, 2)) attn_weights = torch.softmax(attn_matrix.abs() / self.alpha, dim=-1) attn_weights_complex = torch.complex(attn_weights, torch.zeros_like(attn_weights)) elem_product_flat = elem_product.view(B, C, -1) F_CFR_flat = torch.matmul(attn_weights_complex, elem_product_flat) F_CFR = F_CFR_flat.view(B, C, H, W) # 逆FFT转换回空间域,并取实部 cfr_spatial = torch.fft.ifft2(F_CFR, dim=(-2, -1)).real # 🚀 降级回原始精度 (float16),安全交还给 YOLO 网络 🚀 cfr_spatial = cfr_spatial.to(orig_dtype) # ===== 6. Differential Feature Reinforcement (DFR) ===== F_DFR = V - self.lambd * V * cfr_spatial # ===== 7. 最终融合 ===== freq_output = Q * cfr_spatial + F_DFR output = self.beta * freq_output + (1 - self.beta) * F_weighted # 调整输出通道数到 YOLO Head 期望的 out_channels output = self.out_conv(output) return output(注意:代码计算量很大,需要关闭AMP,否则会梯度爆炸NAN)
FEFM 模块创新性地结合空间与频域双域特征建模,通过傅里叶变换捕捉跨模态特征的全局频域信息,实现公共特征增强与差异特征补偿,相比简单拼接仅在空间维度堆叠特征,能够挖掘更深层的模态互补信息,显著提升融合特征的完整性与表达能力。
该模块嵌入自适应通道注意力与可学习参数,自动加权优化 RGB 与红外模态的贡献比重,配合深度分离卷积实现高效特征编码,避免了拼接带来的信息冗余与通道混杂问题,让目标相关特征得到精准强化,有效提升复杂场景下的检测鲁棒性。
模块通过公共特征强化与差异特征补偿机制实现精细化融合,保留模态共性与独有信息,相比简单拼接的无差别融合方式,可有效抑制噪声干扰,同时保持轻量化计算效率,更适配 YOLO 系列实时检测框架的工程化部署需求。
总结与反思
三个模块均采用自适应加权融合思路,通过注意力、MLP 或频域建模自主学习模态权重,摒弃简单拼接的无差别堆叠,能精准强化目标特征、抑制背景噪声,大幅提升跨模态特征的判别性与鲁棒性。
它们分别从动态权重分配、通道自适应校准、空间 - 频域联合建模实现深度跨模态交互,充分挖掘 RGB 与红外的互补信息,解决了拼接无法建模模态关联的缺陷,对小目标、遮挡目标检测提升明显。
所有模块均轻量化且兼容 YOLO 检测框架,通过维度对齐、1×1 卷积与可学习参数控制计算量,避免拼接带来的通道剧增问题,在保证实时性的同时显著提升检测精度,更适合实际工程部署。
后续将进行更新!!!!以及进行二次创新,发顶刊必备。。。敬请关注!!!
笔者整理双模态检测的专属论文资料,免费分享给粉丝,需要关注后领取。