做自动驾驶感知的朋友,对“检测、跟踪、预测”这三个词应该再熟悉不过了。过去几年大家习惯的做法是把它拆成三个独立模块:先做3D目标检测,再按帧关联做多目标跟踪,最后在轨迹基础上预测未来运动。这套流程本身没问题,问题在于每一级都在增加延迟和误差,传感器数据从输入到出结果,可能要经过三四个网络的串行处理。而“Fast and Furious: 单个卷积网络进行实时端到端3D检测、跟踪和运动预测”这个项目,思路直接砍掉中间环节——用单个卷积网络,同时输出检测框、跟踪关联信息和未来运动轨迹,端到端一次搞定。
这套方案解决的核心痛点很明确:实时性、一致性和工程复杂度。它对传感器原始数据进行单次前向推理,直接得到“当前有哪些目标、上一个时刻的同目标是谁、未来1到3秒会运动到哪里”,整套流程跑在一块消费级GPU上也能达到实时的帧率。适合正在做自动驾驶感知系统架构、多任务模型设计或者想了解端到端感知方案的技术人员参考,尤其适合那些受够了模块级联带来的延迟累积和数据对齐头疼问题的朋友。
1. 为什么敢把检测、跟踪、预测压进一个网络
1.1 级联管线:延迟和误差的放大器
先回顾传统方案的问题。典型的三级架构是:3D检测网络输出当前帧所有目标的三维框,跟踪模块(无论是基于检测结果的匈牙利匹配还是卡尔曼滤波)将框关联到历史轨迹,然后预测模块基于轨迹历史预测未来位置。每一级都有独立的输入输出和独立的数据表示。
我实际调试过这样的系统,最让人头疼的不是单个模块的效果,而是模块之间的“接口协议”。跟踪模块必须知道检测框的置信度怎么过滤,预测模块要等跟踪模块确认轨迹ID才敢开工,一个环节抖动,后面全跟着抖。更关键的是,整个pipeline推理时间是可加的:检测V100上跑12ms,跟踪加预测再跑8ms,看起来20ms还好,但加上前后处理、数据拷贝、多帧缓存,实际端到端轻松超过30ms。对于高速场景下需要5Hz到10Hz输出频率的规控模块,这套东西经常成为瓶颈。
1.2 单网络结构:从“接力赛”到“团体赛”
“Fast and Furious”这个项目选择用单个网络完成全局任务,本质上就是把接力赛变成团体赛。团队里的每个成员(任务头)共享同一个骨干网络的感知特征。检测、跟踪、预测看到的是同一份特征图,而不是各自处理一份中间结果。
这么做带来两个直接好处。第一,特征复用极大降低了计算开销,一个骨干网加三个轻量级任务头,单帧前向推理时间可以控制在10ms到15ms量级。第二,任务之间天然共享语义信息——网络在提取特征时就知道“这个位置有一个正在运动的目标”,检测分支和预测分支不再需要从零开始,协同效率远高于级联。
选择卷积网络而不是时下流行的Transformer,是这个项目一个很有意的权衡。Transformer结构在长距离特征建模上有优势,但计算复杂度高、部署门槛高,在追求实时性的场景里,卷积网络配合恰当的局部感受野设计,能在精度和速度之间拿到一个更好的平衡点。
2. 核心设计思路:一个网络如何同时干三件事
2.1 中间表示:把3D世界压进鸟瞰图
要让单个网络同时处理3D检测、跟踪和预测,首先要解决“用哪种中间表示”的问题。在这个项目里,选择的是鸟瞰图(BEV,Bird's Eye View)特征——把3D空间的点云数据投射到地平面上,用2D的网格特征图表达3D世界。
为什么选BEV而不直接处理原始点云?主要是效率和感受野的平衡。点云本身是无序的稀疏数据,直接上3D卷积计算量极大;而BEV把它二维化之后,可以用非常成熟的2D卷积骨干网络做特征提取。同时,BEV是“站在上帝视角”看场景,目标和目标之间的几何关系清晰,道路边界、车道线这些结构化信息也能自然融合进来——这对后续的跟踪关联和运动预测非常有帮助。
具体做法上,网络会对每一帧输入的稀疏点云做体素化,通过一个轻量级的稀疏卷积编码器把稀疏的3D体素逐步聚合成稠密的BEV特征图。这一步输出的BEV特征图分辨率一般取0.1米到0.2米每像素,感知范围覆盖前方100米、左右各25米左右,相当于把物理空间规整成一张“可学习的矢量地图”,后续所有任务头都在这张图上工作。
这里有个实操细节:BEV图不是随便投影的。如果只做简单的Z轴压缩,小目标和垂直方向上的重叠信息会丢失。我建议在构建BEV时保留高度方向上的多通道特征堆叠,让网络自己学会“哪个高度的特征对当前任务更重要”,实测下来对远处行人和卡车边缘的检测准确率有明显改善。
2.2 3D检测头:回归框的同时做目标中心提取
检测头的设计遵循了主流中心点检测的思路:要在BEV特征图上为每个可能的目标位置预测热度图(heatmap)、目标尺寸和朝向角。
热度图的作用是回答“哪里大概率有目标”,网络在空间维度上做softmax分类,每个像素的输出值表示该位置是目标中心的概率。这个过程很像语义分割,但目标是区分前景物体和背景,而不是逐像素分类。检测头最终会在热度图上做局部极大值提取,这一步相当于NMS(非极大值抑制),但因为是在特征图上直接做,省去了传统检测方案中大量的候选框后处理,推理速度明显更快。
3D框回归包含三个核心分量:
- 中心点坐标(x, y, z),其中z代表目标距离地面的高度,可帮助区分目标类型和遮挡关系
- 尺寸(长、宽、高),直接用L1损失回归相对预定义类别先验的偏差
- 朝向角,使用多模态角度分类加回归的方式,避免角度突变带来的损失不收敛问题
这几个量在训练时都做了残差回归处理,降低网络的学习难度。实际训练中大量实验证明,把朝向角做2维嵌入编码(sin、cos)比直接回归一个角度值要稳定得多,这是实操中容易被忽略但特别影响最终精度的一个点。
2.3 跟踪与预测:时间维度的“捆绑销售”
单帧网络好做,难的是把时间维度融合进去。这个项目处理跟踪的思路,不是像传统方法那样单独建立运动模型做关联,而是把历史信息直接作为输入注入网络,让网络“看到”目标是怎么过来的。
做法是这样的:不是只输入当前帧的点云,而是把最近10帧的感知结果按时间顺序拼接成一个时间维度上的点云序列,然后通过3D稀疏卷积在“空间+时间”维度上同时做特征提取。这样一来,BEV特征图的每一个位置都携带了这个小区域在过去一秒里的动态信息。目标当前帧在哪里、上一帧在哪里、运动方向是什么,全部被编码在特征里。
跟踪分支基于这些时序特征,直接预测每个目标的ID嵌入向量。实际关联时不需要像传统方法那样新建卡尔曼滤波器,而是在特征空间做最近邻匹配,用余弦相似度判断两帧目标是否属于同一个对象,速度和稳定性都更好。
运动预测分支则基于同样的时序特征,直接输出目标在未来1到3秒内的多条候选轨迹。每条轨迹包含若干个连续的航点,用于描述时间序上的运动趋势。轨迹不只输出一条,而是同时预测多条轨迹及其对应概率,让下游规控模块能够对多种驾驶策略进行预期判断。因为是端到端训练,预测分支能够自然地理解“运动片段是由什么驾驶行为产生的”,训练时不会出现类似“车辆急刹车”这种物理上不合理的预测结果。
3. 从训练到部署:实操层面的关键环节
3.1 训练数据组织:单帧标注怎样变成时序目标
训练这样的端到端模型,首要难题是数据。传统3D检测数据集通常只有单帧的3D框标注,而“Fast and Furious”的跟踪和预测分支要求知道跨帧的ID对应关系和未来轨迹。所以训练数据的组织策略就成了项目的关键竞争点。
我的经验是两步走。第一步,在原始数据集中跟踪已知的帧间ID来生成时序片段,按时间窗口截取10帧左右为一个训练样本。第二步,对每一个目标,使用最后几帧的真实位移来拟合运动趋势,作为预测分支的监督目标。这样操作下来,原本只有检测框的数据集也能训练出靠谱的跟踪和预测能力,不需要额外大规模标注成本。
训练时对每个样本要做统一的坐标系对齐,把历史帧的点云数据全部变换到当前帧的坐标系下。这一步看似不起眼,实际上很关键——如果坐标系没对齐,网络从历史帧学到的是“目标在漂移”而不是“目标在移动”,跟踪和预测效果都会崩。
3.2 损失函数组合:三类任务如何平衡
这是整个项目里我认为最值得展开的部分。多任务网络最怕的不是单个任务训不好,而是任务之间互相打架。检测、跟踪、预测三个分支的损失量级和收敛速度差异非常大,直接相加求和,模型一定会变成“只顾预测、不顾检测”的偏科状态。
我用的损失组合方式是这样:
- 检测分支:分类用Focal Loss抑制背景样本,回归用Smooth L1 Loss
- 跟踪分支:用三元组损失拉近同一ID的嵌入、推远不同ID的嵌入,辅助用分类式ID预测做兜底
- 预测分支:对每条预测轨迹,先计算和真实轨迹的终点误差,选择最接近的一条作为监督对象,其他轨迹不参与梯度更新,只做概率监督
任务权重上,检测分类和回归的总权重要占到六成以上,跟踪和预测压到三到四成。这个比例根据我的调参经验,训练初期检测任务收敛速度最快,随着训练推进再逐步提高跟踪和预测分支的权重,让网络精修细化的空间更多。
训练中另外一个非常重要的小技巧是“分阶段调整学习率”。我建议把训练过程分成两段:前段用正常学习率训练整个网络,末端把跟踪分支和预测分支的学习率降到全局的十分之一,防止后面阶段大步长再次打乱前面收敛好的特征空间。做过几次对比实验,这个策略能稳定提升最终跟踪准确率3到5个百分点。
3.3 实时性优化:在GPU上跑满帧率的落地策略
这个项目名叫“Fast and Furious”,实时性是它的核心标签。单网络架构在计算量上已经占了便宜,但要把理论上的实时性能真正落到处GPU上,还有几个关键的工程优化要做。
第一,稀疏卷积是不可跳过的选项。点云数据天然稀疏,如果把它当作密集数据做传统卷积,90%以上的计算都在处理空体素,浪费极大。子流形稀疏卷积(submanifold sparse convolution)能只对有效的体素位置做计算,可以在保持特征质量的同时把FLOPs下降一个数量级。
第二,任务头的参数要轻量化。3D检测头只有几十个通道的卷积,跟踪和预测头更是全连接加少量卷积层,总参数占比不到整个网络的十分之一。这样,前向推理的绝大部分时间都花在骨干网络上,梯度计算和推理任务也更聚焦。
第三,工程部署阶段建议采用TensorRT做FP16推理,实测下来,在我的测试平台上,单帧推理时间能从15ms降到9ms左右。如果想进一步压榨性能,可以做INT8量化,但要仔细校准,因为量化对检测的回归精度影响比较敏感,如果没有足够样本,不建议直接上。
4. 踩坑记录:一些看似不起眼却很致命的细节
4.1 多任务头之间的梯度冲突
项目中遇到过的最大坑,是检测分支和预测分支在训练一定阶段后开始在空间特征上产生冲突。检测分支关注目标边缘的锐利特征,而预测分支则需要更加平滑和全局的运动特征。两者共享骨干网络的底层卷积时,一定程度会存在梯度方向不一致的情况,导致网络反复震荡。
解决思路有两个层面。第一层,网络结构上给不同任务头引入一定的“独立性”:共享Block和专用Block分离,让跟踪和预测分支在骨干网络的中后段开始有自己的支路,减少梯度传播的相互干扰。第二层,训练策略上,采用“交替优化”的思路——每个batch训练时只让一个任务头反传梯度,其余任务头保持不动,这样每轮迭代的梯度目标单一且明确,收敛更稳定。我后来干脆直接用梯度裁剪加局部梯度反向更新,实测在多种数据集上都有明显的稳定性和精度提升。
4.2 小目标与远距离目标的漏检
BEV图上每个像素映射到物理空间有一个固定的分辨率,目标太小或者距离太远时,在BEV特征图上可能只占据一两个像素,检测头很难抓到有效特征。这个缺陷在纯点云方案的车型上有一定普遍性。
我针对这个项目总结的优化路数有这么几条:
- 在BEV编码器侧做一个轻量级的多尺度融合模块,把高层语义信息回灌到低层空间分辨率特征上,增强小目标特征表达。
- 增加点云原始高分辨率特征的旁路连接,让检测头除了BEV特征外还直接感知目标的原始几何结构。
- 训练策略上用数据增强时,刻意多生成一些远距离目标样本,平衡网络对不同距离段的注意力。
几招组合下来,50米以上的目标召回率能维持在一个很高的水平,这在纯视觉方案里很难做到。
4.3 运动预测“静态魔怔”问题
训练运动预测分支时会遇到一个特有的现象:网络学“滑水”。因为训练数据里大部分目标在绝大部分时间都是静止的(停着的车、静止的行人),预测几条轨迹全部输出“原地不动”也能在平均误差上拿到比较低的损失值。最后得到的是一个只会预测静止、一到复杂场景就抓瞎的模型。
要破这个局,我的经验是两个方向并重。第一,训练时对样本做运动类型平衡,确保包含足够多的直行、转弯、起步和刹停片段,按运动幅度过采样。第二,损失函数给运动目标的误差更高权重,让“该动却预测不动”的代价远大于“不该动却多动了”的代价。模型在持续调整后,才能逐步形成基于目标运动意图进行真实轨迹预测的能力。
除了训练策略,推理阶段我也会加一个轻量级的运动合理性校验,如果预测轨迹分布和目标历史运动趋势差异过大,自动回退到一个基于历史位移的简单外推结果。这个兜底逻辑在处理场景切换或点云丢失时效果非常好。
5. 传感器配置适配与后续扩展方向
5.1 不同的传感器,不同的特征入口
这套端到端方案在设计时以点云为主要输入,但架构本身对传感器配置有比较好的兼容性。如果车内只有摄像头,可以把图像输入改造成伪点云或者直接用2D卷积做BEV投影,跟踪和预测分支的流程不需要大改,只是检测精度会受深度估计精度的影响,整体性能会有一个档位下降。
如果传感器配置是激光雷达加摄像头,融合策略我建议在BEV特征层面做早融合:图像通过一个透视到BEV的变换模块变成图像BEV特征,再和点云BEV特征逐元素相加或做通道拼接,送入同一个骨干网络。这个做法能利用图像的语义信息补全远处稀疏区域的感知,同时不影响前面介绍的实时性设计。
需要留意的是,多传感器融合意味着系统的标定误差门槛更高——几个毫弧度的位姿偏差在50米外就会被放大成明显的几何错位。端到端训练对这样的错位具备一定的容错性,但校准工作仍然不可跳过。
5.2 从Demo到产品:补哪些课才能上车
单一网络跑通容易,真正上车的难点在于系统的可解释性和安全冗余。项目目前的输出是目标框、ID和一组未来的轨迹点,信号固然丰富,但对于自动驾驶的规控模块来说,还需要有置信度、遮挡状态、目标的运动意图属性,甚至目标分类的细分(轿车、卡车、骑行者、行人),这些属于产品化必须补充的数据维度。
另外一个从Demo到产品的关键问题是鲁棒验证。端到端网络虽然部署简单,但训练数据覆盖不到的长尾场景——比如浓雾天气、极端逆光和异形车辆——处理起来比模块级联更棘手。模块化系统可以单独替换检测模块做针对性优化,单网络方案里一个参数动全身,所以必须要建立体系化的场景库测试和持续数据回流机制,用真实路采的罕见场景数据定期微调模型。
即便如此,我认为单网络端到端仍然是未来感知架构的趋势。它让系统更简单、延迟更低、时序一致性更好,工程维护的点也更少——这些在实际量产项目里的价值非常大。
6. 实际使用的补充心得
最后补一些个人使用过程中的小经验。用这套架构做项目,不要一上来就追求最强的精度指标,先搭通pipeline、跑通实时性验证,再逐步替换模块和调整训练策略,更容易稳步推进。多任务权重、特征尺寸这类超参数,建议每次只改一个维度,方便定位性能变化的真实来源。
对于刚接触这个项目的朋友,我建议先在已有的检测数据集上把检测分支跑稳,再引入跟踪和预测分支。一上来直接训练三任务,网络的设计和调参难度会翻很多倍,很难定位问题到底出在哪一个环节。先单任务、后多任务、再联合调优,这个顺序能帮你少走不少弯路。
这个方向后续值得探索的扩展点也不少。比如把高精地图或者车道线信息作为先验输入注入BEV特征,让预测分支能“看懂”道路结构对运动的影响;比如在时间序列建模上引入更高效的时序注意力模块,替代目前简单的点云序列拼接操作;再比如把端到端的检测-跟踪-预测结果直接连接到规划模块做联合优化训练,让感知和规控的边界也进一步模糊。这些探索都有很好的工程和应用价值,值得持续投入时间。