1. 项目拆解:多模态融合到底在“融”什么
先给一个直接结论:Transformer在自动驾驶和机器人感知里的应用,不是用一个大模型把所有传感器数据“倒进一个锅里乱炖”,而是解决一个非常现实的问题——摄像头、激光雷达、毫米波雷达各自看到的世界,尺度不同、语义不同、置信度不同,怎么让它们在对齐之后,还能协同决策。
我最早接触这个课题时,也被“多模态融合”这个名字唬住了。以为准备了三种传感器,把点云、图像、雷达频谱往模型里一拼,就能输出一个完美的3D检测框。真正动手之后才发现,难点根本不在网络结构,而在于“模态之间的对齐”和“信息冲突时的信任策略”。说得通俗一点:激光雷达告诉你前方5米有障碍物,摄像头告诉你前方5米是一面白色墙壁,毫米波雷达告诉你前方5米有一个静止目标——三个信号都对,但物理意义完全不同。融合系统要做的,不是选一个“看起来最可信”的,而是把三种证据组织成一幅统一的时空图,让后续的规划模块能在这个图上做判断。
这个项目,正是沿着这一思路展开的:用Transformer作为融合底座,完成跨模态的特征对齐、时序关联和置信度生成。它的核心价值在于,把过去依赖人工设计规则的特征拼接,变成了可学习的跨模态注意力交互。
适合谁看?如果你是做自动驾驶感知、机器人导航、多传感器系统的工程师或研究生,这篇文章能帮你少踩几个坑。即使你主要做单模态视觉,这里面的“对齐崩溃”“注意力坍缩”这些问题,也会在某种程度上启发你对特征融合的理解。
2. 为什么选Transformer而不是传统融合结构
在Transformer被大规模应用之前,多传感器融合的主流做法基本分成两派:
- 一派是“早融合”,把图像特征、点云体素特征、雷达特征直接拼接到同一维度上,再喂给一个后端网络。问题在于,三种模态的空间分辨率差异巨大,直接拼接等于让网络硬学一套映射关系,训起来很吃力。
- 另一派是“晚融合”,每个模态先独立出检测结果,再用规则或轻量网络做结果级融合。问题在于,各模态独立预测时已经损失了大量原始信息,融合只能做“妥协”,没法做“互补”。
Transformer在这种局面下,优势非常明显。它的注意力机制天然是一个“信息路由器”——每个位置的token都可以向其他位置的token查询关联,跨模态关系不再靠手工指定框体匹配,而是靠可学习的内在关联权重。这就让“摄像头看到纹理、激光雷达看到距离、毫米波雷达看到速度”这三类截然不同的信息,能够在同一个特征空间里相互补充。
以典型的BEV(Bird’s Eye View)融合为例。摄像头图像通过2D特征提取之后,投影到BEV网格;激光雷达点云通过体素化或者直接编码成BEV特征;毫米波雷达的目标点也投影到同一张BEV平面上。过去做BEV融合,最常见的方法是通道拼接,然后加几层卷积。但这样做的问题是:不同模态在BEV网格上的分布密度完全不同——摄像头特征几乎是稠密的,激光雷达特征相对稀疏,毫米波雷达可能只有少量离散点。卷积操作在处理这种异构稀疏性时,效率很低,而且容易把稀疏的雷达信息淹没在稠密的视觉特征里。
Transformer的BEV融合则不一样。我们可以把整个BEV网格当作一组可学习的query,让每个网格单元通过交叉注意力,向各模态的特征去“问询”信息。摄像头特征以原生的2D形式提供语义和纹理证据,激光雷达特征提供精确的距离和几何结构证据,毫米波雷达特征提供多普勒速度和长距离探测证据。Transformer在每一层解码中反复让网格query吸收这些证据,最后再输出一个稠密或稀疏的目标结构。
这里有一个很关键的设计细节:不同模态的token,并不需要在送入Transformer之前强行对齐到同一分辨率。注意力机制允许“查询”和“键值”不在同一个坐标系下。也就是说,我们可以让2D图像特征维持原图分辨率,让点云维持3D体素结构,而BEV query通过可变形注意力或采样方式,从这些模态中抽取信息。这一点是传统卷积拼接做不到的。
3. 三种传感器数据的“性格”差异与预处理策略
要把融合做好,第一步不是调网络,而是摸清每一种数据的特点。我见过太多项目,一上来就训练大模型,结果loss降不下去,回头查才发现——输入数据的坐标系都没统一。
3.1 摄像头:稠密、语义丰富,但缺深度
摄像头图像是稠密的二维网格,每个像素都有颜色和纹理,语义信息最丰富。但它的致命弱点是尺度模糊:一个小的近处物体和一个大的远处物体,在图像上可能看起来一模一样。所以,图像特征送入融合模块前,通常需要做内部校准和畸变校正。
常用做法是先用预训练模型(比如基于视觉的语义分割或目标检测模型)提取特征,然后通过相机内参外参,把特征投影到某个统一坐标系(通常是车身坐标系或BEV网格)。这里要注意,图像特征投影到3D空间时,深度方向存在天然的一维不确定性。我们在项目里通常会为图像特征生成“深度分布”而不是“深度单点”——即让网络预测每个像素在多个深度区间上的概率,再投影到BEV。这一步虽然增加了计算量,但能大幅缓解“图像上看不出来距离”的问题,属于值得投入的预处理。
3.2 激光雷达:精确、稀疏,无纹理信息
激光雷达点云提供了精确的三维坐标和反射强度,几何结构非常可靠。但它是稀疏的,远距离处点更稀疏,而且没有颜色和纹理。我们项目里用的方案是先做体素化,把点云划分成三维网格,在每个非空体素内编码该体素内点的均值、数量、法向量等统计量。
体素大小是一个需要调参的点。体素过小,计算量爆炸,且体素内点数太少,统计不稳定;体素过大,几何细节被平滑掉。我们最终用了一个动态体素的方案:近处体素小一些,远处体素大一些,这样既保住了近处的精度,又控制了整体计算量。这个细节在实际效果上提升很明显。
3.3 毫米波雷达:速度强项、量测稀疏,角度分辨率低
毫米波雷达和激光雷达有点像,都能测距离,但它的核心优势是多普勒速度——能在恶劣天气下直接测出目标的径向速度。缺点是角度分辨率低,往往一个目标只对应几个散射点,而且杂波较多。
处理毫米波雷达数据时,第一步是聚类和跟踪。我们在项目中用了经典的点云聚类算法,把同一目标的散射点合并,然后通过卡尔曼滤波做多目标跟踪。这里有一个常被忽略的细节:毫米波雷达的量测噪声模型和激光雷达差异很大。雷达的测距噪声通常是几厘米到几十厘米,测角噪声可能高达1度以上,对应在远距离上的横向误差可以达到1到2米。所以,在融合模块里,我们必须显式地告诉Transformer每个雷达token的不确定性——把噪声协方差作为辅助特征输入,否则网络会把雷达数据的定位误差当作真实几何信息去学习,很容易学出一个不稳定的映射。
预处理完成后,数据之间依然存在量纲、密度上的巨大差异。这个问题我会在后续融合模块的设计里详细展开。
4. 融合网络架构:BEV Query + 跨模态可变形注意力
4.1 设计整体结构
在架构选型上,我们用了一个比较标准的“视觉骨干 + 跨模态编码器 + BEV Transformer解码器”结构。骨干部分,摄像头用普通视觉特征网络,激光雷达体素网络负责点云特征,毫米波雷达因为目标数目有限,直接用多层感知机或轻量图网络编码即可。
核心模块是跨模态注意力层。输入包括:
- BEV query:形状是 H x W x D,H和W对应BEV网格的分辨率,D是特征维度;
- 图像特征图:从视觉骨干输出的多尺度特征;
- 点云体素特征:从体素网络输出的稀疏特征,通常用稀疏卷积处理;
- 雷达目标特征:经过聚类和跟踪后的目标级特征集。
注意力层的工作流程如下:
- 对每个BEV query,先通过一组可学习的锚点,计算每个模态在BEV上的参考位置。例如,图像特征通过相机投影得到每个query对应的图像像素采样位置;点云体素通过体素坐标映射得到对应的3D空间范围;雷达目标直接按位置索引。
- 对每个模态,采样该参考位置附近的K个关键点(K一般取4或8),利用可变形注意力提取局部特征。
- 三个模态的注意力输出加权融合,权重来自一个跨模态交互网络。
这个流程在每层Transformer解码器中重复若干次,最后输出的BEV特征直接用于3D目标检测或语义占用预测。
4.2 可变形注意力的作用
可变形注意力可以理解为“动态采样”。它不需要在整张图上做全局注意力,而是根据当前query的内容,预测一组采样偏移,再根据偏移采样特征。这在多模态融合中有两个好处:
- 计算量大幅降低。全局注意力是O(N^2)的,BEV网格通常有几百上千个单元,和图像像素全连接的话,计算开销不可接受。可变形注意力把每个query的注意力限制在K个采样点上,复杂度变成O(NK)。
- 它能主动学习“在哪看”。当模型观察到图像区域有明显纹理且对应的点云位置有几何突变时,注意力会自动把采样点集中在边界或目标中心附近。
4.3 多尺度时序对齐
时序是融合中最容易忽略的问题。摄像头帧率30fps,激光雷达10fps,毫米波雷达20fps,三者的时间戳很难完全对齐。如果直接用各自当前帧的特征做融合,运动目标可能会出现“重影”——雷达已经报告了目标当前位置,而图像还是几十毫秒前的位置。
我们在项目里加了一个时序编码层:每个模态传入近几帧的序列特征,通过一个轻量的时序Transformer做对齐,然后投影到统一时间戳下。具体做法是,把每个模态的特征按时间顺序送入一个序列编码器,在编码时加入时间位置编码,再通过插值或查询的方式得到指定时刻的特征。这一步不需要额外的雷达设备或高精度同步硬件,纯粹靠数据层面的时间戳插值就能大幅缓解不同帧率带来的错位。
经验补充:如果你的系统允许在不影响部署成本的前提下,尽量让数据采集端做硬件时间同步,哪怕只有几十毫秒级别的同步,也能明显减少时序对齐负担。
5. 训练策略与损失函数设计
融合模型的训练比单模态训练更容易出问题。最典型的是“模态坍缩”——网络发现某个模态(通常是摄像头)的特征足够完成任务,就自动忽略了其他模态信号。到最后,融合模型的效果几乎等同于“单模态模型 + 少量干扰信息”。
5.1 缓解模态坍缩的几种手段
- 模态随机失活(Modality Dropout):训练时以一定概率随机屏蔽某个模态的全部输入,强制模型在缺失某一模态时,依然能利用其他模态完成任务。这样能防止网络过度依赖某一个模态。
- 跨模态一致性约束:在特征空间中,要求不同模态对同一物理目标的特征的均值和方差在一定距离内。可以用简单的对比损失或蒸馏损失来实现。
- 渐进式融合:训练初期让网络先以单模态为主要信号源,然后逐步提高其他模态的权重,类似于课程学习。
我们试验下来,模态随机失活最直接有效,而且不增加推理时的复杂度。在训练时,摄像头特征、雷达特征、点云特征各自以约20%的概率整体屏蔽,模型最终在任意模态缺失时的表现都明显优于不加随机失活的版本。
5.2 检测头的监督
检测头的设计没有太多特殊之处,沿用常见的预测格式,包含目标的中心位置偏移、尺寸、朝向角、速度以及类别。关键点是,速度的监督信号要同时借用毫米波雷达的多普勒测量和前后帧位置差分。多普勒测的是径向速度,和目标的整体速度矢量不同,需要让网络学会把二者结合起来。
这里还涉及一个真实项目里常见的偏置问题:标注数据集往往主要来自激光雷达真值,而毫米波雷达的探测点在多目标场景下会发生“鬼影”或漏检,直接用真值监督所有预测会造成误罚。我们的做法是在监督时,给雷达模态的匹配损失加一个软化系数,允许雷达的预测中心在径向方向有更大容忍度。
5.3 损失权重调参经验
损失函数主要由分类损失、回归损失、跨模态约束损失三部分组成。默认权重会先把分类和回归按常见经验值设定,再手动调节跨模态约束的权重,建议从0.1开始逐步增加。如果把跨模态权重设得过高,模型会牺牲单模态自身的精度,只为把特征拉到一致,反而得不偿失。
6. 实操过程:从数据预处理到模型部署的完整流程
项目整体跑通,前后经过三个阶段。我把每个阶段的重点操作记录如下,可以直接作为一份“抄作业”清单。
6.1 数据准备与同步
第一步,建立统一坐标系。车身坐标系以车辆中心为原点,x轴向前,y轴向左,z轴向上。摄像头通过外参标定得到旋转和平移矩阵;激光雷达也是同样的流程。至于毫米波雷达,它的坐标系通常以雷达安装位置为原点,安装角度和位置要从标定文件里读取。
第二步,时间戳同步。所有传感器消息都带有时间戳,我们以最高频率的摄像头为准,对其他模态做线性插值或最近邻匹配。如果时间戳精度不够,需要在消息队列中做相邻事件对齐。
我在第一次做同步时,直接把激光雷达的最新一帧和摄像头的最新一帧组合了,结果两者相差了接近100毫秒,车辆转弯时融合结果出现明显拖影。后来才意识到,每个话题的发布时间戳和实际采集时间并不是一回事,中间还有传输延迟。所以,应该在消息总线里记录传感器的采集时间戳,而不是接收时间戳,否则后续的时序对齐会全盘皆输。
第三步,数据增强。对多模态数据做增强需要特别小心,不同模态的增强必须保持几何一致性。比如,旋转和翻转坐标时,图像、点云、雷达点都必须执行相同的变换矩阵。我们实现了统一的3D空间变换函数,任何增强动作都通过同一个矩阵作用于所有模态。
6.2 模型构建
用开源深度学习框架实现模型时,我用了一个平时习惯的代码组织结构:模型构建、数据加载、训练、评估四个模块分开。数据加载部分最耗时,因为需要同时读取多模态数据并完成坐标系转换。
跨模态注意力层是模型的C位,我当时用常见的开源Transformer库来实现。细节提醒:可变形注意力的采样点数不要一上来就设得很大。我们试过把K从4调到8,提升很有限,但显存占用却几乎翻倍。用K=4,采样偏移预测头用一个简单的3层卷积网络即可。
6.3 训练与调优
训练数据集用开源自动驾驶数据集的一部分,滤掉简单场景,保留包含夜间、雨天和多干扰物的样本。这是为了让模型充分接触毫米波雷达的优势场景——恶劣天气下视觉和点云都可能退化,剩余信号的大部分来自雷达。
训练过程中,需要重点监控三块指标:
- 每个模态单独输入的检测精度(作为基线);
- 融合模型的检测精度;
- 各模态注意力权重的分布情况。
第二项指标这部分很重要。如果融合模型的精度没有比最好的单模态模型显著提升,说明融合并没有在学习有效互补,多半是模态坍缩了。此时重新打开模态随机失活,并适当加强跨模态一致性约束的权重。
我还记录了一个稳定的收敛经验:学习率用标准的3D检测训练直觉即可,优化器选AdamW。Batch size在显存允许范围内尽量大,多模态特征占用显存较大,单卡通常只能放下较小的批大小。如果显存告急,优先裁剪图像分辨率或降低BEV网格分辨率,而不是减少批大小,因为批大小过小会导致训练抖动。
6.4 部署与推理优化
部署时,模型转换到TensorRT或ONNX Runtime。有一个容易踩的坑是:可变形注意力的采样偏移预测中包含了一些动态形状操作,标准框架在导出到推理引擎时可能报错。建议把采样坐标计算写成朴素的循环或使用固定的最大采样点数,并提前在目标框架上验证算子支持度。
推理性能上,BEV网格大小对延时有决定性影响。我们最终用了0.4米分辨率的BEV,在保证检测精度的前提下把延时控制在可接受范围。若把分辨率提升到0.2米,精度提升不到2%,但推理延时暴增了一倍,这个性价比不划算。
7. 常见问题与排查技巧实录
项目推进过程中,踩过不少坑,我按故障类型整理了一份速查表,算是给后来人尽量多留一点前人经验。
| 现象 | 可能原因 | 排查与解决 |
|---|---|---|
| 融合精度比单模态差 | 模态坍缩 | 增加模态随机失活,降低跨模态约束的初始权重 |
| 目标在图像与点云间出现重影 | 时间戳同步不准 | 确认使用采集时间戳,统一传感器时钟 |
| 远距离目标漏检 | 图像深度分布预测不准 | 增加深度监督或改进深度编码的查询方式 |
| 雷达点被误判为背景 | 雷达噪声模型未引入 | 在特征中加入量测噪声方差或置信度 |
| BEV特征图中出现“空洞” | 点云体素化导致稀疏 | 用稀疏卷积正确编码,或用动态体素提升远距离密度 |
| 训练振荡剧烈 | 多模态损失配比不当 | 先固定分类和回归权重,只调跨模态约束项 |
| 模型导出失败 | 动态采样算子不兼容 | 改写为固定采样数,或先用CPU推理验证 |
这里我想特别展开讲两个问题。
第一个是“雷达点被误判为背景”的问题。你单看雷达数据,它有很多稀疏点,看起来像是噪声,但其中有一部分是真目标的强反射点。如果不把噪声特征传进网络,Transformer的注意力就会根据“局部是否稠密”来决定是否关注某个位置,这种做法对雷达点很不友好。解决方式是,在雷达特征编码时,将其空域聚集度、多普勒一致性、RCS(雷达散射截面积)等物理量一并送入网络,让模型区分“这是一个由目标产生的致密散射簇”和“这是一个孤立杂波”。我们在加入这些物理量后,远距离小目标的召回率提升很明显。
第二个是“训练振荡剧烈”的问题。多模态融合模型的损失函数中,每一项的梯度尺度可能差异很大。分类损失相对平滑,而回归损失尤其是角度回归,在朝向角接近π时会出现数值突变。如果不做角度损失归一化或者用sin/cos形式编码,训练过程会反复波动。我们最后把角度回归改为用向量的sin和cos两个分量预测,彻底解决了振荡问题。这一点即使不做多模态融合,在做单目3D检测时也同样适用。
8. 经验分享:把这次项目落地后的几点个人体会
项目做完后,我对多模态融合这件事有了更实际的理解。想分享几段真实经验,可能比前面的技术细节更有参考价值。
第一,多模态融合不是“越复杂越好”。Transformer给了我们很大的模型容量弹性,但容量大不代表可以用足了。当你发现训练集上loss下降很好,验证集上却出现严重的模态选择性依赖,就要回归到“是否引入了不必要的复杂结构”这个问题上。很多情况下,简化掉一部分跨模态交互层,反而让模型学得更朴素也更鲁棒。我们最终部署的模型比初始试验版本少了两层注意力,精度反而更高。
第二,数据的质量和同步问题,永远比模型结构更能决定最终效果。有一次我们排查一个夜间场景下的性能劣化,怀疑是模型结构有问题,调了两周。最后发现,其实是红外滤光片导致摄像头在低照度下的色彩通道分布发生了偏移,而数据增强没覆盖这种情况。这个问题的根不在融合网络,而在于上游传感器的光学链路。多模态系统的边界是传感器本身。
第三,毫米波雷达这块,值得投入更多注意力。它的名声这几年被“极简硬件方案”搞坏了一些,但它在恶劣天气下的价值是其他传感器替代不了的。在融合系统中,我给雷达特征设计了更高的最低权重,它的目的是在任何情况下保证一个基础的感知能力,而不是和其他模态争抢精度。这个“保底角色”的定位很重要。
第四,评估指标要换一个思路。传统检测只看mAP,但多模态融合系统更应该在“模态缺失评估”下测性能。我们专门做了仿真实验:分别屏蔽摄像头、激光雷达、毫米波雷达,看模型的检测性能降低多少。如果屏蔽某个模态对结果影响不大,说明这个模态在整个系统里可有可无,那还浪费算力采集它做什么?这个指标能直接反映融合系统的冗余度和真实互补性。
9. 下一步可以怎么扩展
这个项目的终点不是部署一个模型,而是打开了一些以后可以继续深入的方向。
一是“矢量化融合”方向。现在BEV网格是规则的矩形网格,移动物体和车道结构其实更适合用矢量化表示(比如用点集合表示物体轮廓、用折线表示车道),这样能避免采样离散化带来的信息损失。Transformer在3D矢量化场景建模上已经有了一些可用方案,多模态融合完全可以基于这个思路做。
二是“端到端可学习时间同步”。目前我们用的是线性插值做时间对齐,误差在小范围内可控,但遇到传感器时钟漂移较明显的场景,会留下不小的残余误差。如果能把时间戳校准参数也做成可学习的,和融合网络联合优化,可能会让整个系统适应更复杂的数据链路。
三是“多智能体协同融合”。每辆车既是感知终端,也是数据源。车与车之间共享局部特征图,让Transformer的注意力在不同车辆之间交互,这个概念在车路协同场景里已经有很多变形。做这套项目时,我们虽然只解决单车感知,但思考的框架已经可以投射到多车联动上。
回到最初的标题——“让摄像头、激光雷达和毫米波雷达真正理解彼此”。我现在觉得,答案不在于让它们的特征对齐得多完美,而是让系统学会在每一种模态“各有各的局限性”时,依然能给出一个稳健的整体判断。这正是Transformer给多模态融合带来的最大价值,也是这个项目让我觉得最有收获的地方。
如果你正准备上手类似的项目,我的建议是:先别急着搭大网络,花一半时间把传感器数据拿到手、对齐、画出来、看几遍,很多问题的答案在数据里已经写好了。融合最关键的功夫,在数据上,也在工程细节里。