
1. 自动驾驶感知里的多目标跟踪到底在解决什么问题做自动驾驶感知的人都有一个共识单帧检测再准也撑不起下游的规划控制。你想想一辆车在路上跑每一帧都只告诉你“这一瞬间有这些目标”但下一帧目标去哪了、哪个是刚才那辆车、哪个是新出现的全靠跟踪模块来回答。3D多目标跟踪要干的事就是在三维空间里给每个目标分配一个稳定的身份ID并且持续输出它们的位置、速度、朝向和尺寸。这件事听起来简单做起来极其折磨人。激光雷达点云稀疏、遮挡频繁、远处目标只有几个点相机视角受光照和天气影响大毫米波雷达虽然测速准但角分辨率低。单靠任何一种传感器跟踪链路都容易断。所以“多模态”就成了绕不开的选择——把激光点云、图像、雷达甚至高精地图的信息融合起来用概率的方式去估计目标状态而不是硬性地做“是或不是”的判断。我接触这个方向有几年了从最早的纯激光雷达跟踪到后来做相机-激光雷达前融合再到最近尝试概率性多模态框架踩过的坑比写过的代码还多。这篇文章想聊的就是“用于自动驾驶的概率性3D多模态多目标跟踪”这个题目背后一个从业者真正需要关心的技术点、实操细节和避坑经验。不管你是刚入门的研究生还是正在做量产感知的工程师应该都能从中找到一些能直接抄作业的东西。2. 概率性多模态跟踪的整体设计思路2.1 为什么是“概率性”而不是“确定性”传统的3D多目标跟踪很多方案走的是“检测-关联-滤波”的确定性路线检测器输出框用匈牙利算法做数据关联再用卡尔曼滤波更新状态。这套流程在理想条件下能跑但一旦遇到遮挡、漏检、误检关联就容易出错ID switch身份切换会突然飙升。概率性方法的核心区别在于它不把目标状态当成一个确定的值而是当成一个概率分布。每个目标的位置、速度、尺寸都不是一个点而是一个高斯分布或者混合分布。这样做的好处是当观测不确定时系统不会强行做一个“非黑即白”的关联决策而是保留多种可能性用概率权重去表达“这个观测有70%概率属于目标A30%概率属于目标B”。我实测下来概率性框架在遮挡场景下的ID保持能力明显优于确定性方法。原因很简单确定性方法在遮挡时如果强行关联错了误差会一直累积而概率性方法会保留一个“不确定”的状态等目标重新出现时还能接上。2.2 多模态融合的层次选择多模态融合不是把数据堆在一起就行融合的层次决定了整个系统的上限。常见的有三种前融合数据级把激光点云和图像像素在原始数据层面做对齐和融合。优点是信息保留最完整缺点是对标定精度要求极高而且计算量大。中融合特征级各自提取特征后再融合。比如用PointPillars提取点云特征用ResNet提取图像特征然后在BEV空间做注意力融合。这是目前主流方案。后融合决策级每个传感器单独做检测和跟踪最后把跟踪结果做关联融合。优点是鲁棒性好缺点是信息损失多融合逻辑复杂。对于概率性3D多目标跟踪我建议走中融合路线。原因是前融合对时间同步和空间标定的容错太低量产车上很难保证后融合又浪费了多模态的互补性。中融合可以在特征层面做概率建模比如用贝叶斯神经网络输出特征的不确定性再把这个不确定性传递到跟踪模块。2.3 系统架构的模块拆解一个完整的概率性多模态3D多目标跟踪系统通常包含这几个模块多模态检测前端激光点云分支、图像分支、雷达分支各自输出带不确定性的检测结果。概率数据关联用概率模型计算检测与轨迹的关联概率而不是硬匹配。状态估计与滤波用粒子滤波或高斯混合滤波更新目标状态分布。轨迹管理包括轨迹初始化、确认、删除、合并。多模态融合跟踪把不同传感器得到的轨迹做概率融合输出最终结果。这个架构里最核心也最难的是第2和第5步。数据关联做不好后面全白搭多模态轨迹融合做不好融合反而会引入噪声。3. 核心细节解析与实操要点3.1 激光点云分支的关键处理激光点云是3D跟踪的主力传感器但原始点云不能直接喂给跟踪模块。我一般会做这几步处理地面分割用RANSAC或者Patchwork把地面点去掉。地面点不参与跟踪但会影响聚类和特征提取。点云聚类用DBSCAN或者欧式聚类把点云分成一个个目标簇。这里有个坑聚类半径不能设死远处目标点少半径要放大近处目标点密半径要缩小。我通常用自适应半径根据距离做线性插值。特征提取对每个簇提取几何特征比如长宽高、朝向、点密度、反射强度均值。这些特征会用于后续的关联概率计算。注意激光点云的反射强度对材质敏感黑色车和白色车的强度差异很大。如果你用强度做关联特征一定要做归一化否则会把同一辆车在不同光照下的观测当成两个目标。3.2 图像分支的不确定性建模图像检测器比如YOLO系列或者DETR输出的框通常只有一个置信度分数。但在概率性跟踪里这个分数不够用你需要的是位置的不确定性。我的做法是用检测头的输出方差作为位置不确定性的估计。比如预测框的中心点坐标(x, y)和方差(σx, σy)。对于深度估计单目图像的不确定性很大我一般会用激光点云做深度补全或者用双目视差。把图像检测结果投影到3D空间时要传递不确定性。投影后的3D位置协方差矩阵可以通过雅可比矩阵从2D协方差变换得到。这里有个实操技巧图像检测的方差不要直接用网络输出的原始值要做温度标定temperature scaling。我试过用验证集做Platt scaling把过置信的检测分数校准一下跟踪效果会稳很多。3.3 概率数据关联的实现细节数据关联是跟踪的灵魂。概率性方法里我常用的是JPDA联合概率数据关联或者它的变体。核心思想是对于每一个检测计算它属于每一条轨迹的概率然后对所有可能的关联组合做加权。具体实现时有几个关键点门限设置用马氏距离做门限把不可能关联的检测-轨迹对排除掉。门限值一般取卡方分布的95%分位数自由度是观测维度。关联概率计算用贝叶斯公式结合运动模型预测的似然和检测的似然。运动模型似然来自卡尔曼滤波的预测残差检测似然来自检测器的不确定性。归一化所有关联概率要归一化保证每个检测的关联概率之和为1。我踩过的一个坑是当两个目标靠得很近时JPDA的计算量会爆炸。因为关联组合数随目标数指数增长。解决办法是用Murty算法做k-best关联只保留概率最高的前k个组合k一般取3到5就够了。3.4 多模态轨迹融合的概率方法不同传感器得到的轨迹怎么融合我试过两种方法协方差交叉Covariance Intersection不需要知道传感器之间的相关性直接融合两个高斯分布。优点是简单鲁棒缺点是融合结果偏保守。贝叶斯融合假设传感器独立直接相乘两个似然。优点是融合结果更锐利缺点是如果传感器实际相关会过置信。我的经验是激光雷达和相机之间用协方差交叉因为它们的误差来源有重叠比如标定误差雷达和激光雷达之间可以用贝叶斯融合因为它们的物理原理差异大相关性低。融合后的轨迹状态我会再做一个一致性检验如果融合后的协方差比单个传感器的协方差还大说明融合出了问题这时候回退到置信度更高的单传感器轨迹。4. 实操过程与核心环节实现4.1 数据准备与预处理我用的数据集是nuScenes和Waymo Open Dataset。nuScenes有激光雷达、相机、雷达的多模态数据标注也比较全适合做多模态跟踪。Waymo的点云质量更高但雷达数据少一些。预处理流程时间同步把不同传感器的数据对齐到同一时间戳。nuScenes的关键帧是2Hz但激光雷达是20Hz相机是12Hz。我一般用线性插值把IMU和轮速计的数据插值到激光雷达时间戳。空间标定用数据集提供的标定参数把点云投影到图像或者把图像特征投影到BEV。标定误差要控制在0.1度以内否则融合会出问题。数据增强训练检测器时我会做点云随机旋转、缩放、翻转图像做颜色抖动和裁剪。但做跟踪时增强要谨慎因为会破坏时序一致性。4.2 检测前端的不确定性输出以PointPillars为例原始网络只输出框和类别分数。我改了检测头让它额外输出位置方差和尺寸方差。具体做法是在回归分支加两个额外的通道分别预测log(σx)和log(σy)用高斯NLL损失训练。对于朝向角用von Mises分布建模输出两个参数κ和μ。训练时NLL损失和原始的回归损失加权求和权重我一般设0.1和1.0。图像分支我用的是YOLOX同样改了检测头输出位置方差。这里有个细节图像检测的方差要用Laplace近似做校准否则网络会倾向于输出很小的方差导致跟踪时过度自信。4.3 跟踪器的初始化与生命周期管理轨迹初始化我一般用“两帧确认”策略一个新轨迹连续两帧都有检测关联才确认它为真实目标。这样可以过滤掉大部分误检。轨迹删除用“N帧丢失”策略如果连续N帧没有检测关联就删除轨迹。N一般取3到5。但这里有个坑如果目标被遮挡N太小会丢轨迹N太大会保留幽灵轨迹。我的做法是用概率方式计算轨迹“存活”的概率如果存活概率低于阈值就删除。存活概率的更新用贝叶斯滤波P(alive | no detection) P(no detection | alive) * P(alive) / P(no detection)其中P(no detection | alive)就是漏检率可以从检测器的召回率估计。4.4 多模态融合跟踪的完整流程整个跟踪流程我按以下步骤跑单模态跟踪激光雷达、相机、雷达各自跑一遍概率跟踪得到各自的轨迹集。轨迹关联把不同模态的轨迹做关联用轨迹之间的马氏距离和外观特征相似度。概率融合对关联上的轨迹用协方差交叉或贝叶斯融合更新状态。轨迹管理融合后的轨迹统一做生命周期管理输出最终结果。这里的关键是第2步的轨迹关联。我用的特征包括位置、速度、尺寸、朝向、以及一个用PointNet提取的轨迹级外观特征。外观特征对区分相似目标很有用比如两辆同型号的车。提示轨迹关联时不要只用当前帧的特征要用轨迹的历史特征做平均。我试过用指数移动平均衰减系数0.9效果比单帧特征稳很多。4.5 参数调优与验证方法参数调优我一般分两步先在验证集上做粗调再用贝叶斯优化做细调。关键参数包括参数含义推荐范围调优方法关联门限马氏距离阈值卡方95%分位数网格搜索过程噪声运动模型不确定性0.1-1.0贝叶斯优化观测噪声检测不确定性缩放0.5-2.0贝叶斯优化存活阈值轨迹删除概率0.1-0.3网格搜索融合权重多模态融合权重0.3-0.7交叉验证验证指标我用AMOTA平均多目标跟踪精度和AMOTP平均多目标跟踪精度还有ID switch数和轨迹碎片化数。AMOTA是综合指标但ID switch对下游规划影响更大所以我会重点看ID switch。5. 常见问题与排查技巧实录5.1 ID Switch频繁发生怎么办ID switch是跟踪里最烦人的问题。我排查下来原因通常有这几个检测不稳定检测器在遮挡时漏检目标重新出现时被当成新目标。解决办法是提高检测召回率或者用轨迹预测补帧。关联特征不够只靠位置关联两个目标靠近时就容易混。解决办法是加外观特征和运动特征。过程噪声太大运动模型太松预测位置不准。解决办法是调小过程噪声或者用交互式多模型IMM滤波。我实测下来加一个轻量级的ReID特征ID switch能降30%左右。ReID特征不用太复杂一个3层的MLP就够了。5.2 多模态融合后轨迹抖动融合后轨迹抖动通常是融合权重没调好。如果激光雷达和相机的轨迹在位置上有偏差融合后就会来回跳。解决办法检查标定参数确保空间对齐。用协方差交叉代替贝叶斯融合融合结果会更平滑。对融合后的轨迹做低通滤波但要注意不要引入太大延迟。我踩过的一个坑是相机轨迹的深度估计有系统性偏差融合后把激光雷达的准确深度带偏了。后来我给相机轨迹的深度方差设了一个下限不让它过度影响融合结果。5.3 计算资源不够怎么优化概率性跟踪的计算量比确定性方法大不少尤其是JPDA和粒子滤波。优化手段用k-best关联代替全关联只保留概率最高的几个关联组合。用高斯混合代替粒子滤波高斯混合滤波的计算量小很多精度损失有限。并行化把不同传感器的跟踪放到不同线程用GPU做特征提取。降采样点云做体素降采样图像做ROI裁剪。我在Orin上跑过完整的多模态跟踪优化后能到15Hz左右基本满足实时性。5.4 常见问题速查表问题可能原因排查方法解决方案ID switch多检测漏检看检测召回率提高召回或补帧轨迹抖动融合权重不当看单模态轨迹差异调融合权重或协方差交叉轨迹碎片化轨迹删除太激进看存活概率曲线调低删除阈值计算超时关联组合爆炸看关联耗时用k-best关联远处目标丢失点云太稀疏看远处点云密度自适应聚类半径朝向估计不准观测不足看朝向方差用运动模型约束5.5 独家避坑经验最后分享几个我踩过的坑不要用检测分数直接做关联权重检测分数是分类置信度不是位置置信度。我试过直接用分数加权结果过置信的误检把轨迹带偏了。正确做法是用位置方差。时间同步误差要补偿不同传感器的时间戳差几毫秒高速场景下位置差几十厘米。我一般用运动模型做时间补偿。轨迹合并要谨慎两个轨迹靠得近时不要急着合并。我试过合并后目标消失后来改成先关联再融合不合并轨迹。验证集要覆盖极端场景雨天、夜晚、隧道、拥堵这些场景的跟踪表现和晴天差很多。我一般会单独做场景切片验证。这个方向还在快速演进概率性方法和多模态融合的结合还有很多可以挖的点。我最近在尝试用Transformer做端到端的概率跟踪把检测、关联、滤波放到一个网络里初步结果还不错但实时性还需要优化。如果你也在做类似的东西欢迎交流。