当前位置: 首页 > news >正文

精读双模态检测论文十七|法国 ONERA 宇航院原创!CVPRW CAFF-DINO !通用跨注意力融合范式,弱对齐 / 低光场景全场景 SOTA!

🔥 本文定位:CSDN 原创 干货 | CVPRW 2024 顶会成果 | 法国 ONERA 宇航院原创通用型多模态融合范式 | RGB-IR 双模态检测必看 SOTA 方案

🎯 核心收益:彻底解决多模态融合与检测器强绑定、对齐误差鲁棒性差、跨模态互补信息挖掘不足三大行业痛点!基于分层跨注意力打造CAFF 通用融合模块,搭配 SOTA 级 DINO 检测器,LLVIP 低光数据集 mAP50 高达 98.1%,FLIR-aligned 数据集 mAP50 85.5%,超同期 SOTA ICA-Fusion 9.1%;200 像素模态错位下精度仅下降 13%,完美适配低光安防、自动驾驶、全天候监控、弱对齐多模态感知等落地场景。

📌 核心创新矩阵:

  1. CAFF 模块:跨注意力特征融合单元,多尺度分层交叉注意力 + 模态关联特征增强,实现 IR 与可见光双向互补信息深度挖掘
  2. 通用型架构:不修改单模态骨干、不绑定特定检测器,DETR/Deformable DETR/DINO 全兼容,COCO 预训练权重直接用,零成本迁移
  3. 超强错位鲁棒性:对模态间系统性平移错位有极强抗性,10 像素错位下精度几乎无损失,200 像素错位依然远超同类方案
  4. 全场景 SOTA 性能:LLVIP、FLIR 两大权威数据集全线刷新 SOTA,低光 / 夜间 / 白天全场景适配,小目标检测精度显著提升

✅ 适配场景:RGB-IR 可见光 - 红外双模态检测、低光 / 夜间行人检测、自动驾驶全天候多模态感知、城市安防监控、无人机遥感目标检测、弱校准 / 无校准多模态感知


全文包含可直接运行的核心模块代码,建议点赞 + 收藏 + 关注,后续持续更新双模态检测改进创新系列内容。

前言

可见光 - 红外(RGB-IR)双模态检测是全天候智能感知的核心技术,但行业至今被三大工程化难题卡脖子:

  1. 方法与检测器强绑定:现有融合方案大多为 YOLO、Cascade R-CNN 等特定检测器定制,换个检测器就要重新设计、重新训练,迁移成本极高
  2. 对齐误差鲁棒性极差:绝大多数方法默认图像对完美配准,但实际场景中,相机标定误差、视场差异、运动物体位移带来的像素错位,会直接让检测精度暴跌
  3. 跨模态融合效率低:大多方法用简单 concat、相加或自注意力做融合,没有针对性挖掘模态间的关联信息,不仅挖不出互补性,还会引入特征冲突

法国宇航院 ONERA 团队在CVPRW提出的CAFF-DINO,直接把这三大难题一次性解决!它首次提出通用型跨注意力特征融合(CAFF)模块,不修改单模态骨干、不绑定任何检测器,用分层多尺度交叉注意力深度挖掘模态间关联,搭配 DINO 检测器实现了双模态检测 SOTA,更关键的是:对模态错位的鲁棒性直接拉满,实际工程落地价值拉满

本文全程论文 1:1 对齐 + 可运行完整代码 + DETR/DINO/YOLO 全适配教程 + 实验全解读,CSDN 最细最干货版本,直接拿去发论文、改毕设、打比赛、做工程都能暴力涨点!


一、CAFF-DINO 整体架构(一句话看懂)

CAFF-DINO 采用 **「双骨干并行提取 + 多尺度层级融合 + Transformer 检测器统一解码」** 的完全解耦式架构,核心流程极简且通用:

  1. 双模态特征提取:两个完全独立的单模态骨干(ResNet/Swin-T/Swin-L 均可),分别提取 RGB 和 IR 图像的多尺度特征,骨干全程冻结,COCO 预训练权重直接用,无需额外预训练
  2. CAFF 层级融合:对骨干输出的每一层特征对,送入 CAFF 融合模块,先通过多尺度交叉注意力挖掘模态间的关联特征,再将原始 RGB、IR 特征与关联特征拼接,最后用 1×1 卷积压缩通道,输出适配检测器的融合特征
  3. 统一检测解码:所有层级的融合特征,直接送入任意 Transformer 检测器(DETR/Deformable DETR/DINO 均可)的编码器 - 解码器,输出最终的检测结果

核心设计亮点:融合模块与骨干、检测器完全解耦,骨干和检测器可以随便换,真正实现即插即用,零成本适配任意 Transformer 检测框架。


二、核心模块逐行拆解(原理 + 公式 + 设计逻辑)

CAFF 跨注意力特征融合模块(论文灵魂,通用融合的核心)

解决的核心问题:

  • 自注意力只能挖掘单模态内的特征关联,无法针对性提取跨模态的互补信息

  • 单尺度注意力无法适配不同大小的目标,多尺度场景下融合效果差

  • 融合模块与检测器强绑定,无法通用迁移

核心设计(三大步完成高质量通用融合):

CAFF 模块的完整流程如下图所示,核心分为多尺度分层交叉注意力、特征拼接增强、通道适配输出三个阶段:

1. 多尺度分层交叉注意力

这是论文的核心创新:用 IR 模态做 Key 和 Value,可见光模态做 Query,做多尺度交叉注意力计算,精准挖掘两个模态间的关联信息,自动对齐互补特征。针对骨干输出的第 i 层 RGB 特征Fivisible​和 IR 特征Fithermal​,用不同卷积核(1/5/7)生成 Q、K、V,计算分层交叉注意力。

其中 k 代表不同的卷积核尺寸,通过多尺度卷积,让模型同时捕捉不同大小目标的跨模态关联,适配小目标、大目标全场景。得到多尺度交叉注意力矩阵后,通过卷积层堆叠压缩,再经过自注意力块增强,最终输出 64 通道的模态关联特征FiCorrelations​。

2. 特征拼接与增强

将原始 RGB 特征、IR 特征,与交叉注意力输出的关联特征进行拼接,让融合特征同时包含:

  • 可见光的纹理、颜色细节

  • IR 的热辐射、轮廓结构信息

  • 跨模态的关联互补信息math

3. 通道压缩与检测器适配

最后用 1×1 卷积,将拼接后的特征压缩到检测器编码器需要的通道维度,输出最终的融合特征,实现与任意 Transformer 检测器的无缝适配:

论文针对不同骨干做了定制优化:

  • CAFF:适配 Swin Transformer 骨干,交叉注意力卷积核 k={1,5,7},搭配 2 个自注意力块

  • CAFF*:适配 ResNet 骨干,交叉注意力卷积核 k=1,搭配 3 个自注意力块


三、完整可运行 PyTorch 复现代码(论文 1:1 对齐,可直接复制运行)

import math import torch import torch.nn as nn import torch.nn.functional as F # ============================================================================ # 基础 Conv 和 自注意力模块 (保留你的原始设计) # ============================================================================ class Conv(nn.Module): def __init__(self, c1, c2, k=1, s=1, padding=None, g=1, act=True): super().__init__() if padding is None: padding = k // 2 self.conv = nn.Conv2d(c1, c2, k, s, padding, groups=g, bias=False) self.bn = nn.BatchNorm2d(c2) self.act = nn.ReLU(inplace=True) if act is True else (act if isinstance(act, nn.Module) else nn.Identity()) def forward(self, x): return self.act(self.bn(self.conv(x))) class SelfAttentionBlock(nn.Module): def __init__(self, dim, num_heads=8): super().__init__() self.num_heads = num_heads self.head_dim = dim // num_heads self.scale = self.head_dim ** -0.5 self.norm = nn.LayerNorm(dim) self.qkv = nn.Conv2d(dim, dim * 3, kernel_size=1, bias=False) self.proj = nn.Conv2d(dim, dim, kernel_size=1, bias=False) def forward(self, x): B, C, H, W = x.shape x_norm = self.norm(x.permute(0, 2, 3, 1)).permute(0, 3, 1, 2) qkv = self.qkv(x_norm).reshape(B, 3, self.num_heads, self.head_dim, H * W).permute(1, 0, 2, 4, 3) q, k, v = qkv.unbind(0) attn = (q @ k.transpose(-2, -1)) * self.scale attn = attn.softmax(dim=-1) out = (attn @ v).transpose(2, 3).reshape(B, C, H, W) out = self.proj(out) return out + x # ============================================================================ # 论文对齐:YOLO 平替 Concat 版 CAFF # ============================================================================ class CAFF(nn.Module): def __init__(self, c1, c2): """ c1: YOLO 自动传入的输入通道列表 [ch_vis, ch_ir] c2: YOLO 自动传入的期望输出通道数 """ super().__init__() # 提取并验证输入分支 assert isinstance(c1, list) and len(c1) == 2, "CAFF requires exactly two input streams." # 1. 鲁棒性对齐:以第一路(Vis)通道为基准,强行对齐第二路(IR) self.in_dim = c1[0] self.align_ir = Conv(c1[1], self.in_dim, k=1) if c1[1] != self.in_dim else nn.Identity() self.kernel_sizes = [1, 5, 7] self.num_attn_blocks = 2 self.corr_dim = 64 # -------------------- 公式(1):多尺度QKV生成 -------------------- self.q_convs = nn.ModuleList() self.k_convs = nn.ModuleList() self.v_convs = nn.ModuleList() for k in self.kernel_sizes: self.q_convs.append(Conv(self.in_dim, self.in_dim, k=k)) self.k_convs.append(Conv(self.in_dim, self.in_dim, k=k)) self.v_convs.append(Conv(self.in_dim, self.in_dim, k=k)) # -------------------- 压缩与自注意力增强 -------------------- self.compress_conv = Conv(len(self.kernel_sizes) * self.in_dim, 256, k=1) self.attn_blocks = nn.Sequential( *[SelfAttentionBlock(256) for _ in range(self.num_attn_blocks)] ) self.corr_conv = Conv(256, self.corr_dim, k=1) # -------------------- 公式(3):融合并对齐到 YOLO 的输出通道 c2 -------------------- self.fusion_conv = Conv(2 * self.in_dim + self.corr_dim, c2, k=1) def forward(self, x): """ YOLO 接口标准化:x 为列表 [x_vis, x_ir] """ # 拦截双路输入并对齐通道 x_vis, x_ir = x[0], self.align_ir(x[1]) B, C, H, W = x_vis.shape cross_attn_outputs = [] # ==================== 1. 多尺度分层交叉注意力 ==================== for q_conv, k_conv, v_conv in zip(self.q_convs, self.k_convs, self.v_convs): q = q_conv(x_vis).flatten(2).transpose(1, 2) k = k_conv(x_ir).flatten(2).transpose(1, 2) v = v_conv(x_ir).flatten(2).transpose(1, 2) scale = math.sqrt(C) # 注意:此处矩阵乘法将产生 (B, H*W, H*W) 的注意力图 attn_matrix = (q @ k.transpose(-2, -1)) / scale attn_matrix = attn_matrix.softmax(dim=-1) cross_feat = (attn_matrix @ v).transpose(1, 2).reshape(B, C, H, W) cross_attn_outputs.append(cross_feat) # ==================== 2. 压缩+自注意力增强 ==================== cross_feat_stacked = torch.cat(cross_attn_outputs, dim=1) cross_feat_compressed = self.compress_conv(cross_feat_stacked) cross_feat_enhanced = self.attn_blocks(cross_feat_compressed) # ==================== 3. 生成64通道关联特征 ==================== corr_feat = self.corr_conv(cross_feat_enhanced) # ==================== 4. 论文公式(2)特征拼接与最终融合 ==================== stacked_feat = torch.cat([x_vis, x_ir, corr_feat], dim=1) # 映射到下一层需要的通道数 c2 return self.fusion_conv(stacked_feat)

四、实验结果全解析:全线 SOTA,鲁棒性拉满

论文在 **LLVIP(低光行人检测)FLIR-aligned(自动驾驶全天候检测)** 两大权威数据集上做了全面验证,结果直接刷新 SOTA。

4.1 LLVIP 低光行人数据集

该数据集是低光双模态检测的黄金基准,包含 16836 组严格对齐的 RGB-IR 图像对,绝大多数为夜间低光场景,评估指标为 mAP50、mAP75、mAP。

模型模态mAP50(%)mAP75(%)mAP(%)
CFT-YOLOv5RGB+IR97.572.963.6
CSSARGB+IR94.366.659.2
GAFFRGB+IR94.060.255.8
Swin-Large DINO(单模态 IR)IR97.379.067.5
CAFF-DINO(Ours)RGB+IR98.179.068.5

✅ 核心亮点:

  • mAP50 高达 98.1%,超之前 SOTA CFT-YOLOv5 0.6%,低光场景行人检测天花板
  • 相比单模态 IR 模型,融合后 mAP 提升 1%,完美挖掘了可见光的互补信息
  • 对夜间低光、远距离小目标行人,检测召回率显著提升

4.2 FLIR-aligned 自动驾驶数据集

该数据集是自动驾驶场景的权威基准,包含 5142 组对齐的 RGB-IR 图像对,覆盖白天 / 夜间交通场景,包含人、车、自行车三类目标。

模型模态mAP50(%)mAP75(%)mAP(%)
YOLOv5(单模态 RGB)RGB67.825.931.8
YOLOv5(单模态 IR)IR74.432.537.6
ICA-FusionRGB+IR76.4--
Swin-Large DINO(单模态 IR)IR77.241.343.6
CAFF-DINO(Ours)RGB+IR85.551.650.5

✅ 核心亮点:

  • mAP50 高达 85.5%,超同期 SOTA ICA-Fusion 9.1%,提升幅度堪称炸裂
  • 相比单模态 IR 模型,mAP 提升 6.9%,白天 / 夜间全场景性能暴涨
  • 对车辆、小目标自行车的检测精度,远超所有同类方案

4.3 模态错位鲁棒性实验(工程化核心价值)

论文模拟了实际场景中相机标定误差带来的系统性平移错位,测试了 10/50/100/200 像素错位下的模型性能,对比 CFT-YOLOv5,结果如下:

FLIR-aligned 数据集 错位鲁棒性对比(mAP,相对下降幅度)

模型0px(对齐)10px50px100px200px
CFT-YOLOv539.934.7 (-13%)28.7 (-28%)28.7 (-28%)29.0 (-27%)
CAFF-DINO50.549.8 (-1%)37.2 (-26%)39.4 (-22%)43.7 (-13%)

✅ 核心结论:

  • 10 像素轻微错位下,CAFF-DINO 精度几乎无损失(仅下降 1%),而 CFT-YOLOv5 直接下降 13%
  • 200 像素极端错位下,CAFF-DINO 精度仅下降 13%,依然比 CFT-YOLOv5 对齐状态下的精度高 10%
  • 交叉注意力机制让模型自动学习模态间的对齐关系,对实际工程中的标定误差、视场差有极强的抗性,落地价值拉满

4.4 消融实验:每个设计都在精准涨点

4.4.1 不同 Transformer 检测器的通用性验证

基于 ResNet50+CAFF*,测试了不同检测器的性能,验证了方案的通用性:

检测器LLVIP mAPFLIR-aligned mAP
DETR58.915.7
Deformable-DETR61.138.3
H-Deformable-DETR65.034.6
Lite-DINO65.736.8
DINO67.037.9

✅ 结论:CAFF 模块对所有 Transformer 检测器都有显著的性能提升,检测器越先进,融合效果越好,完全通用。

4.4.2 不同融合方式的对比

对比了 CAFF 与简单 concat、余弦相似度融合的性能,验证了跨注意力的有效性:

融合方式LLVIP mAPFLIR-aligned mAP
简单 Concat66.938.9
余弦相似度融合66.536.6
CAFF*(Ours)67.037.9
CAFF(Swin-L)68.550.5

✅ 结论:CAFF 跨注意力融合,相比简单融合方式,能更精准地挖掘模态间的互补信息,在复杂场景下优势极其明显。


五、YOLO 一键适配教程

5.1 步骤 1:放入模块
将代码复制到ultralytics/nn/modules/block.py,并且CAFF添加至__all__里面。

5.2 步骤 2:注册模块1
在同目录下的_init_.py中from .block import添加CAFF

5.3 步骤 3:注册模块2
在ultralytics/nn/tasks.py完成注册,首先在from ultralytics.nn.modules import添加你的模块名LWFM, SA_WFM, DGFM。然后再在parse_model中下图的下面添加下面的代码。

elif m is CAFF: # 获取传入该层的各分支输出通道数列表 c1 = [ch[x] for x in f] # 判断 YAML 中是否指定了输出通道 if len(args) == 0 or args[0] == 1: c2 = sum(c1) # 如果没指定,默认和 Concat 一样取总和 else: # 如果指定了输出通道,通过 gw 缩放因子进行深度/宽度对齐 c2 = make_divisible(args[0] * gw, 8) if 'gw' in locals() else args[0] # 将 [c1, c2] 重新打包给 CAFF 的 __init__ args = [c1, c2]

最后修改yaml文件里面的concat即可。完整yaml可以参考:
基础篇--RGB-IR 双模态目标检测系列|手把手地教你利用YOLO训练双模态图像数据集_rgb ir-CSDN博客


六、总结

CVPRW 2024 提出的CAFF-DINO,是 RGB-IR 双模态检测领域工程化价值极高的里程碑工作:

  1. 首次实现了完全通用的双模态融合范式,不修改骨干、不绑定检测器,任意 Transformer 框架都能即插即用
  2. CAFF 模块用多尺度分层交叉注意力,精准挖掘模态间的互补信息,融合效率远超简单 concat、自注意力等方案
  3. 对模态错位的鲁棒性直接拉满,解决了实际工程中相机标定误差的核心痛点,落地性远超同类学术方案
  4. 两大权威数据集全线刷新 SOTA,低光 / 白天 / 夜间全场景适配,学术研究和工程落地都能用

💬需要完整 训练工程、论文原版 PDF、预训练权重的同学,评论区扣「CAFF-DINO」,留下邮箱,我直接发你全套资料!

🔖 收藏本文,双模态检测、毕设、科研、竞赛、工程落地直接起飞!

📌 标签:# 双模态检测 #RGBIR #CAFF-DINO #跨注意力融合 #CVPR2024 #DINO #DETR #YOLO 改进 #低光检测 #自动驾驶感知

http://www.cnnetsun.cn/news/2050095.html

相关文章:

  • 告别高斯模糊:用Python+NumPy手把手实现各向异性扩散,让边缘检测更精准
  • 安装 Detectron2 时遇到 RuntimeError: Error compiling objects for extension
  • OpenCore Legacy Patcher图形界面解决方案:让老旧Mac重获现代macOS显示能力
  • 3分钟学会在Obsidian中直接播放B站视频:Media Extended B站插件完全指南
  • 别再只调sklearn的SVM参数了!用鸢尾花数据集手把手教你可视化调参全过程
  • SmokePing插件开发终极指南:快速打造你的网络监控利器
  • Zotero Better Notes:如何用智能笔记系统彻底改变你的文献管理体验
  • SAP HCM 薪酬回溯逻辑二 非周期Correction accounting功能
  • SpringBoot项目里时间总对不上?手把手教你用@JsonFormat搞定时区和格式化(附完整代码)
  • C++26反射驱动的泛型工厂实现(附可运行最小复现代码+Clang 19/MSVC 19.40兼容补丁)
  • 3分钟快速定位Windows热键冲突:Hotkey Detective终极解决方案
  • 白帽子必备修养!Web 安全入门级笔记,带你彻底搞懂什么是 Web 安全!
  • 从真值表到电路板:用74LS系列与非门亲手搭建一个智能交通灯
  • 最强生图模型GPT image2,一手深度测评,附使用教程+生成案例
  • Elasticsearch高阶聚合实战:Pipeline Aggregation 用法详解与典型场景全攻略
  • Vivado FFT IP核配置避坑指南:从参数选择到ModelSim仿真的完整流程
  • 存量红区光伏四可装置改造实战指南
  • 如何在GitHub上完美显示数学公式:终极MathJax插件完全指南
  • 「解锁 Android 数据共享新姿势!ContentProvider 跨应用交互全攻略」
  • 保姆级教程:在Mac M1/M2芯片上手动安装PyTorch全家桶(附版本对照表)
  • 三步搞定Windows网络测速:iperf3-win-builds终极指南
  • ESP32开发终极指南:从零开始构建物联网项目的完整教程
  • [特殊字符] 斜齿轮时变啮合刚度计算模型:基于势能法与切片法的 MATLAB 实现
  • 别只换电阻了!从失效数据看,线绕电阻90%的故障都是这个原因
  • 告别LabVIEW!用Python+PyVISA搞定示波器自动化(附Keysight IO库配置避坑指南)
  • 红菱vs焦玉芹,被张逗逗饰演的两个“坏女人”惊到了!
  • 【C++26合约编程权威指南】:20年专家亲授生产级契约建模、编译器适配与错误拦截实战
  • VSCode金融编码环境安全升级指南:2026新版TLS 1.3+静态扫描+密钥隔离三重防护落地手册
  • 英雄联盟Akari助手:3分钟快速上手的终极游戏辅助工具包
  • Yolo 多任务推理,摄像头+视频实时推理,实现关键点、分割、检测等模型推理部署