轨迹预测这个活儿,放在整个智能驾驶链路里看,位置很特别。它前面吃的是感知输出(历史轨迹、目标分类、地图拓扑),后面喂的是决策规划(变道、超车、刹停的决策依据)。说白了,检测让你知道“现在有什么”,跟踪让你知道“它从哪来”,而轨迹预测是回答“它要去哪、怎么去”。标题里点名的VectorNet和MultiPath,正好代表了这两年业界解决这个问题的两条核心思路:一个主打矢量地图交互建模,一个主打多模态轨迹分布输出。我在实际项目里把这两个模型都从论文拉到了实车上,这篇就完整拆一遍。
这篇内容适合三类人:一是刚入行做感知算法、想系统理解轨迹预测模块的工程师,二是已经在跑检测跟踪、想给系统加预测能力的团队,三是准备做算法选型、需要对比模型利弊的架构师。我默认你懂基础的深度学习概念,但不会用晦涩的数学,重点讲清楚设计动机、工程实现细节和实测中踩过的坑。
1. 问题定义与整体设计思路
轨迹预测的任务描述看起来一句话就说完——“给定过去和当前轨迹,预测未来位置、速度、方向”,但真正落地时会发现,这个定义里藏着三个需要掰开揉碎的问题。
1.1 输入到底指什么
所谓“目标过去和当前运动轨迹”,在实车上是一个时间窗口内的序列数据。常见做法是取过去3到5秒的轨迹,采样频率10Hz到20Hz,也就是30到100个历史点。每个点的信息不只是x、y坐标,至少还要包含速度、航向角,有的方案会把加速度、朝向变化率也一并编码进去。
但仅仅有目标自己的轨迹远远不够。一个路口左转的车辆,它未来怎么走,取决于车道线怎么拐、旁边有没有行人、对面有没有直行车。所以现代轨迹预测的输入,实际上是一个异构组合:目标历史轨迹、目标类别与尺寸、周围其他交通参与者的轨迹、高清地图的局部拓扑结构。VectorNet这类模型设计的核心,就是把“地图要素”和“目标轨迹”放进同一个表征空间里做交互。
1.2 输出为什么必须是分布而不是单点
如果你是第一次接触轨迹预测,最容易犯的思维惯性是:这不就是个回归问题吗?输入一串坐标,输出未来坐标,训练一个L2损失完事。
这个思路在高速公路直线巡航场景勉强能用,一到了城市复杂场景就露馅。同一个路口,左转、直行、靠边停车都是合法行为,历史轨迹几乎一模一样,但未来完全分叉。如果你只输出一条确定的轨迹,模型只能给出一个“平均解”——一条哪边都不靠的诡异弧线,这在规划模块看来是完全不可用的。
所以业界的主流做法,是把轨迹预测建模成多模态分布估计问题。模型输出K条候选轨迹和对应的置信度,每条轨迹代表一种可能的驾驶意图。MultiPath就是这类方法的代表。而VectorNet虽然本身是一个编码器结构,不是专门做多模态输出的,但它的编码结果可以很自然地接到多模态解码器上,两者实际上是互补关系。
1.3 为什么需要专门的模型结构
有个很自然的疑问:我有目标历史轨迹,也有地图,能不能用规则方法预测?比如沿着车道中心线外推,或者用恒定速度模型(CV)、恒定加速度模型(CA)?
能,而且这些方法在工程上从未被淘汰,它们作为基线依然在跑。但规则方法有两个硬伤:一是无法建模交互,两车同时向一个路口汇聚,规则方法默认各走各的,不会“商量”出谁先谁后;二是对长尾场景无能为力,前车急刹、行人折返这类突发行为,恒定模型永远慢半拍。深度学习模型能通过大规模数据学到交互模式和典型驾驶行为,即便面对没见过的场景组合,也能给出一组概率上合理的候选轨迹。
从工程架构上,现在做轨迹预测基本逃不开“编码器-交互模块-解码器”三段式。编码器负责把异构输入变成向量,交互模块负责让目标与地图、目标与目标之间交换信息,解码器输出多模态轨迹和概率。VectorNet解决的是前两段,MultiPath解决的是后一段,这也是我把它们放在一起讲的原因。
2. VectorNet:矢量地图与层级图注意力
VectorNet是某团队在2020年提出的方案,全称是Hierarchical Graph Attention Network for Vectorized Map and Trajectory。它最核心的贡献,是把“地图栅格化”这个惯用做法换成了“矢量化建图”,然后用层级图注意力做交互编码。
2.1 为什么抛弃栅格地图
在我接触过的早期方案里,地图和轨迹交互最常用的做法是把局部地图渲染成栅格图像,比如把车道线、路沿画成一个256x256的RGB图,再和目标轨迹一起喂给卷积神经网络。这个方法看起来直觉,但问题是:
第一,分辨率与感受野的矛盾。栅格分辨率要足够高才能分辨车道级细节,但分辨率一高,图像尺寸就大,计算量直线上升。而轨迹预测需要的是“看到”前方一百多米的拓扑结构,栅格化之后相当于在一个很大的稀疏图上做卷积,大量算力花在空白区域上。
第二,精度损失。车道线的几何信息在栅格化过程中被离散化了,弯道的曲率、车道宽度这些对预测至关重要的细节,经过像素化之后会产生不可忽视的误差。坐标从连续空间扔到像素空间,再映射回来,精度可能已经丢了十几厘米。
第三,交互感受野受限。卷积核的交互范围受限于感受野大小,目标车辆和它前方200米处的车道出口之间的拓扑关系,需要很多层卷积才能关联上,深层网络的梯度传播又容易出问题。
VectorNet直接把这些矢量几何(车道中心线、边界线、人行横道等)作为折线(Polyline)处理,每条折线由若干个点组成。点与点之间天然有序,可以用一个子图编码。这样地图的几何精度完整保留,计算量只和要素数量相关,和空间范围无关,感受野天然就是全局的。
2.2 图的构建细节
VectorNet把整个场景表示成一个图 G=(V,E)。节点有两类:
第一类是轨迹节点。目标的过去轨迹被处理成一条折线,折线上的每个采样点作为一个节点。这里有个关键细节:点与点之间不仅按顺序连接成边,还会给每条边加上“时间间隔”作为边属性。因为不同目标的采样频率可能不一致,时间间隔属性让模型能显式感知运动快慢。
第二类是地图节点。车道中心线按固定间距采样成点,每个点代表一个节点。车道中心线的采样间距一般取1米到2米,太密了计算量太大,太疏了弯道信息会丢失。我实测下来,城市快速路的弯道半径最小能到30米左右,2米采样勉强够用,再保守一点取1.5米更稳。
边的构建有两个层次。底层是折线内部的顺序连接,上层是不同折线之间的交互连接。如何判断两个节点要连边,是决定模型效果的关键一环。粗暴做法是距离阈值,比如半径50米内的节点全连上,但这样图会非常稠密。常规做法是:轨迹节点和地图节点之间按距离连边,地图节点之间只在拓扑相邻的车道之间连边,轨迹节点之间在距离阈值内连边。
2.3 层级注意力编码的前向过程
搞清楚图的构建之后,编码过程就顺理成章了。VectorNet的编码分两阶段,这也是它名字里“Hierarchical”的由来。
第一阶段:子图内编码。每条折线内部的节点,通过一个子图注意力网络做信息传递。每一步,每个节点聚合它相邻节点的信息,更新自己的表征。论文里这里用的是自注意力加MLP的形式。经过若干层迭代,一条折线内部的几何和运动信息就充分融合了。然后对这条折线的所有节点表征做最大池化,得到这条折线的整体向量。以车道中心线为例,这个向量就浓缩了“这条车道从哪到哪、什么曲率、多长”的语义。
第二阶段:全局图交互。现在每个对象(一个目标,或者一段地图要素)都对应一个向量。再把所有向量放进一个全局图里,根据它们之间的拓扑关系(这是第一阶段构建的边),再做一次图注意力。这次交互,让目标车辆的轨迹向量能“看到”它所在车道的向量、相邻车道的向量、周边其他目标车辆的向量。经过这一层,每个节点的表征就不再是孤立的,而是包含整个场景上下文的。
为什么这个设计比直接把所有点做全局注意力更优?从语义粒度上讲,折线本身就是有意义的基本单元。一条车道中心线是一个整体语义,一个目标的轨迹是一个整体语义。在第一阶段内部做精细的逐点建模,在第二阶段做粗粒度的对象间交互,计算效率和语义清晰度都更好。全连接注意力在点级别做,一方面复杂度太高,另一方面点级别交互很难学到“整条车道”这种高层次的抽象。
2.4 解码与训练中的实测经验
VectorNet原论文的解码器比较朴素,直接接一个MLP输出未来轨迹的坐标序列。但在实际工程里,我强烈建议不要只接MLP。原因是MLP输出的轨迹是确定性的,等于把多模态问题硬切成单模态。正确姿势是:VectorNet输出的目标特征向量,作为多模态解码器的输入,和MultiPath一类的输出头结合。
在训练上有一个细节值得关注:节点特征怎么初始化。轨迹节点的初始特征除了坐标,还要拼接上时间戳、速度、类别嵌入。车道节点的初始特征则要拼接车道类型(实线、虚线、路沿)、车道朝向等属性。这些看起来不起眼的特征,对模型收敛速度和最终精度的影响非常显著。我在一次消融实验里,去掉速度特征后,ADE直接涨了8%。
另外,图注意力层数不是越深越好。VectorNet原实现用了3层子图编码和3层全局交互,我在项目里试过加深到5层,精度提升不到1%,但训练时间增加了将近40%。对于车载算力来说,这个性价比不划算。实践中,子图编码2到3层、全局交互1到2层是一个比较甜点的配置。
2.5 VectorNet的适用边界
需要清醒认识的是,VectorNet并不是万能的。它的强项是结构化地图场景,也就是车道线清晰、拓扑完整的道路,比如城市快速路、高速公路、规划良好的城市道路。但如果你的场景是封闭园区、停车场这种几乎没有车道线约束的地方,矢量地图本身就不成立,VectorNet的效果会大打折扣。
另一个弱点是动态交互的时序建模。VectorNet对目标之间的交互只做了一次空间上的全局注意力,没有显式的时间维度。两辆车彼此的博弈是动态变化的,比如A车在减速让B车,B车也在观察A车是否让行,这种随时间演进的交互,单靠一次空间注意力是不够的。实际工程中,通常会把VectorNet输出的交互特征拼上时序编码器(比如LSTM或Transformer的时序层)再来做最终预测。
3. MultiPath:多模态分布预测的标准范式
如果说VectorNet解决的是“怎么编码场景”,那么MultiPath解决的就是“怎么输出未来”。它的核心思想很直接:与其让模型绞尽脑汁想出唯一正确的轨迹,不如让它从一堆预设的“驾驶模式”里做选择。
3.1 锚点机制的理解方式
MultiPath这个名字,直译就是“多条路径”。它的核心组件是锚点(Anchor)。锚点是预先定义好的K条未来轨迹模板,每一条代表一种驾驶模式。怎么得到这些模板?一个直接的办法是从训练集里做聚类,把大量真实的人类驾驶轨迹聚类成K类,每一类的中心轨迹就是一个锚点。
用生活类比解释:假设你要预测一个从校门口出来的学生会往哪走。不需要预测他每一步的精确坐标,只需要预设有“沿着主干道向北走”“穿过操场向西走”“在门口等家长原地不动”这几种典型行为模式,然后判断每种行为模式的概率,并在此基础上微调出精确轨迹。
MultiPath的锚点就是这几种“典型行为模式”。模型的任务变成两件事:一是为每个锚点预测一个偏移量(Offset),把模板轨迹微调到符合当前场景的精确轨迹;二是为每个锚点预测一个概率分数,表示这条轨迹在当前场景下有多合理。
3.2 网络结构与特征编码
MultiPath的整体结构分三块:目标特征编码器、锚点特征生成、轨迹解码。
目标特征编码器负责把目标的历史轨迹转换成一个特征向量。原始版本用的是一层LSTM或者1D卷积网络,把过去几秒的轨迹编码成一个固定维度的向量。
锚点特征生成是关键一步。每个锚点不是简单地给一个ID,而是需要通过一个可学习的网络,把锚点自身的坐标序列编码成特征向量。这样模型在处理当前目标时,可以做“特征匹配”——目标特征和每个锚点特征做过注意力或点积,得到相似度分数。相似度高的锚点,说明这个目标当前的意图和这个锚点模式接近。
轨迹解码相对轻量,每个锚点对应一个MLP,输入是“目标特征拼接锚点特征”,输出是该锚点下的轨迹偏移。偏移量加到锚点坐标上,得到最终预测轨迹。
3.3 损失函数的设计逻辑
MultiPath的损失函数值得细说,因为它体现了一个多模态预测训练的关键矛盾:模型输出K条轨迹,但只有一个真实未来,拿哪条轨迹去和真实值算损失?
常规想法是对K条轨迹都算损失再取平均,但这会导致“模态坍缩”——模型为了让所有轨迹都能覆盖真实值,把每条轨迹都往平均值上靠,最后输出K条几乎一样的轨迹,多模态名存实亡。
MultiPath的做法是:先为每条轨迹算一个损失,选出损失最小的那条(也就是预测最准的那条),只对这条轨迹反传梯度。其他轨迹不参与梯度更新。这样每条轨迹就各司其职,专注于自己最擅长的场景。置信度分数用交叉熵损失来优化,目标是让真实轨迹对应的那个锚点的置信度尽量接近1。
这个“最小损失”机制听起来简单,但它有个细思极恐的副作用:选损失最小的轨迹这个操作本身是不可微的。所以MultiPath原始实现里用了“软最小”的近似,或者借助强化学习的技巧。工程上更常用的做法是:先正常训练几轮,让模型收敛到一个比较稳定的表征空间后,再用“只优化最优轨迹”的硬策略做微调。实操经验是,硬切太早会导致训练震荡,损失会忽高忽低,我一般建议前30%的epoch用全轨迹平均损失,后面再切到min损失。
3.4 后处理与置信度校准
模型输出的置信度分数,直接喂给下游规划是不行的,因为模型天然倾向于保守——它会把概率分散到多条相似轨迹上,而不是集中到一条。这就导致置信度排序失真。
我在项目里加了两个后处理步骤:
第一个是NMS去重。对输出的K条轨迹两两计算终点距离,如果终点距离小于一个阈值(比如3米),就认为这两条轨迹代表同一个驾驶模式,只保留置信度高的那条。这个操作能让最终输出的轨迹列表里,每条轨迹的模式差异足够大,避免一堆几乎一模一样的轨迹去干扰规划。
第二个是置信度温度缩放。用一个标定数据集,对模型输出的置信度做温度缩放的校准。具体做法是:把预测轨迹和真实轨迹的匹配情况做成标签,然后用最大似然估计温度参数。我实测下来,不校准之前,模型给的置信度和真实命中率偏差很大,校准之后相关性有明显改善。
3.5 和场景编码器的结合方式
MultiPath原始版本有个明显短板:它只用了目标自己的历史轨迹做编码,没有地图信息,也没有周围其他目标的信息。这意味着两个完全不同的场景(一个直道,一个路口),如果目标历史轨迹一样,MultiPath给出的预测也会一样。这在实车上是不可接受的。
所以实际落地的MultiPath变体,几乎都会把场景编码器加进来。最典型的接法有两种:
一种是把VectorNet的对象特征向量拼接到MultiPath的目标特征中。VectorNet输出每个目标的交互特征,MultiPath拿这个特征去做锚点匹配和轨迹偏移。这个组合在很多自动驾驶数据集上都取得了很好的效果,也是我在项目里最终采用的方案。
另一种是用一个全局注意力编码器(比如Transformer Encoder),把地图要素、目标轨迹放在一起做编码,提取目标特征后接MultiPath解码头。这种方案表达能力强,但计算量也更大,对车载算力不那么友好。
4. 实操过程:从数据到指标全流程落地
理论讲了这么多,落到工程上,有几个环节如果没做好,模型再先进都白搭。我按实操顺序把关键步骤和踩过的坑整理一遍。
4.1 数据准备与坐标系
轨迹预测的数据集,不是随便拿目标检测的标注就能用的。你需要的是时序关联的数据:同一个目标在连续多帧中的轨迹,以及对应的地图数据。
这里的第一个坑是坐标系。感知模块输出的目标轨迹,通常在自车坐标系下;高清地图的坐标,通常是在一个全局坐标系下。做训练之前,必须把两类数据统一到同一个坐标系。我建议统一到自车坐标系,因为推理时地图也是从全局坐标变换到自车坐标后再输入模型的,训练和推理保持一致,可以减少坐标系变换引入的分布偏移。
采样方面,输入窗口我取的是3秒,输出窗口是5秒,采样频率10Hz。这两个窗口长度不是随便定的:3秒足够捕捉到一个目标最近的意图变化,比如切入、减速;5秒是下游规划模块能够有效利用的预测范围,再远预测误差太大,规划也不会采纳。
4.2 评测指标选择
轨迹预测的评测指标,行业里最常用的是下面这几个:
| 指标 | 全称 | 计算方式 | 适用场景 |
|---|---|---|---|
| ADE | Average Displacement Error | 预测轨迹与真实轨迹每个时间步位置误差的平均 | 衡量整体轨迹贴合度 |
| FDE | Final Displacement Error | 预测终点与真实终点的距离 | 衡量终点准确性 |
| minADE | minADE over K | 取K条预测中ADE最小的一条 | 衡量模型的最佳预测能力 |
| minFDE | minFDE over K | 取K条预测中FDE最小的一条 | 衡量模型的最佳终点能力 |
| Miss Rate | 漏检率 | 所有预测轨迹中离真实值都超过阈值的比例 | 衡量安全兜底能力 |
注意minADE和ADE的区别。在多模态预测里,如果不看min指标,模型会很难看——因为模型输出的“平均轨迹”代表的是所有可能性的折中,而真实的未来只落在一个分支上,肯定偏差大。所以业界报告指标时,往往同时报告K=1时的ADE和K=6时的minADE。前者代表确定性预测能力,后者代表多模态覆盖能力。
有一个经常被忽略的细节:FDE比ADE更能反映规划安全性。因为轨迹预测下游的规划模块,最关心的是目标终点在哪里、会不会和自车路径冲突。一个模型可能整体轨迹预测得一般,但终点很稳,这已经能让规划做出安全决策;反过来,如果FDE误差很大,哪怕中间时刻误差小,规划也会因为没有足够的安全裕度而被频繁触发紧急制动。
4.3 训练与调参记录
数据方面,我用的训练集大约有120万条目标轨迹片段,从高速、城市快速路、城区道路混合采集。为了保证场景多样性,做了简单的分桶采样:按自车车速分成低速、中速、高速三类,按目标类型分成车辆、行人、骑行者。每一批数据从各个桶里按比例抽取。
模型架构上,最终落地版本是VectorNet编码器 + MultiPath解码头的组合。VectorNet部分用了2层子图编码、3层全局交互编码,节点隐藏维度256。MultiPath部分用了64个锚点,输出轨迹长度对应5秒共50个未来点。
训练超参数方面,初始学习率1e-3,batch size 128,Adam优化器,cosine learning rate schedule。训练到第30个epoch时切断了min损失的hard模式。显存方面,一个batch的图数据大概占12GB,A100可以跑起来,但如果是训练车辆上常用的那块消费级显卡,batch size可能要降到32。
有一个训练细节很容易被忽视:损失权重平衡。轨迹坐标损失和置信度交叉熵损失在数值尺度上差很多,如果不做平衡,模型会只顾坐标回归,置信度基本是瞎猜。我代码里把坐标损失乘以1.0,置信度损失乘以0.1,收敛会更稳定。
4.4 可视化调试方法
轨迹预测模型经常出现“指标还行但行为诡异”的情况,这时候光看指标远远不够,必须上可视化。我的做法是写一个简单的可视化工具,把下面的内容叠加渲染出来:
- 感知到的目标历史轨迹(点序列)
- 高清地图的车道线、路沿
- 模型预测的K条轨迹,不同置信度用不同透明度画
- 目标的真实未来轨迹(延迟标注,用于离线分析)
这个可视化工具帮我在很短时间里发现了大量问题。比如有一次看渲染结果,发现模型在十字路口左转场景下,有两条预测轨迹往逆向车道里钻。查了之后发现是训练数据里左转轨迹和逆行轨迹混在一起,标注本身就有问题。如果没有可视化,这种错标可能到模型上线都不会被发现。
4.5 从离线到实车的算力与时延适配
离线模型跑得再好,上了车都得看算力脸色。轨迹预测模块通常部署在自动驾驶计算平台的某个CPU/GPU核上,时延预算大约在30到50毫秒。
VectorNet的图构建环节,如果直接做完整场景图,在车流量大的城市场景里,节点数可能上万,图注意力计算会超预算。我的优化手段有两条:
第一,空间裁剪。只保留自车前方100米、后方50米、左右30米范围内的目标和地图要素,超出范围的一律不进图。这个范围覆盖了绝大多数驾驶决策需求,再远的目标短期不会产生交互。
第二,图稀疏化。上文中提到的距离阈值连边,阈值从50米缩到30米。实测显示精度损失很小,但建图耗时能降一半以上。因为远处节点的交互对当前目标预测的贡献本来就很小。
5. 常见问题与排查技巧实录
最后这部分,是我在项目里和各种朋友交流时,被问到最多的几个问题,以及对应的排查经验。直接看表:
| 问题现象 | 可能原因 | 排查手段与对策 |
|---|---|---|
| 静止目标预测成高速轨迹 | 历史轨迹里混入跳变点,或采样频率不一致 | 检查输入轨迹的平滑度,加入速度一致性约束,对静止目标做门控 |
| 多模态轨迹坍缩成单模态 | min损失切换过早,或锚点数太少 | 前30% epoch用全轨迹平均损失,锚点数从32加到64 |
| 预测轨迹穿过路沿或侵入对向车道 | 地图拓扑中车道连通关系错误 | 可视化检查地图数据,修正车道级连接关系,必要时在解码输出加地图约束损失 |
| 换道场景预测滞后,总是慢半拍 | 输入窗口过短,意图变化无法体现 | 输入窗口从2秒加到4秒,并在特征中加入目标横向速度 |
| 置信度分数与实际命中率不匹配 | 缺少置信度校准 | 用独立的验证集做温度缩放标定 |
5.1 静止目标被预测成动态轨迹的根因
这个问题的根源,我追查下来通常是输入轨迹序列里有跳变。感知模块对同一个目标的跟踪偶尔会跳帧或者ID切换,导致轨迹里出现一个突兀的大位移。模型看到这个位移,就往“目标在快速移动”的方向预测了。
排查方法:离线抽检预测误差大的样本,把历史轨迹和预测轨迹画在一起,如果历史轨迹末端有异常跳跃,基本就是感知跟踪的问题。对策有两个层面:感知层修跳变;预测层加一个防抖动机制,如果历史轨迹的最后N个点的位移方差低于阈值,直接把目标判定为静止,预测输出零速度轨迹。
5.2 长直行场景预测震荡
还有一个有意思的现象:在高速公路直线巡航场景,模型预测的横向位置会小幅度震荡,1米到2米级别的来回摆。从ADE指标看不太明显,但下游规划会被干扰。
原因是纯数据驱动模型在直线场景缺少强约束。直线行驶在训练集里占绝大多数,模型学到的轨迹分布是宽泛的,稍微有点输入扰动,输出就会在横向漂移。对策是给损失函数加一个平滑性正则项:计算预测轨迹相邻时间步的位移变化量,把它作为惩罚加到总损失里。这个改动立竿见影,横向震荡问题基本消失,对弯道场景也没有副作用。
5.3 对地图拓扑错标的高敏感度
VectorNet类模型对地图的依赖很高,也意味着对地图错标非常敏感。我遇到过一个案例:一段车道中心线在路口处错误地和对向车道连通了,模型在这个路口预测的轨迹大量涌入对向车道。
排查这类问题,只靠指标很难,必须结合可视化。我的经验是,每一轮训练后在验证集上随机采样200个样本做可视化检查,重点看“预测轨迹与地图约束是否冲突”。如果冲突比例超过5%,那大概率是地图数据有问题,而不是模型问题。
5.4 混合交通场景的类别均衡问题
行人、骑行者、车辆的动力学差异很大。车辆受车道约束强,行人在开放空间几乎可以任意方向移动。如果训练数据里车辆占比过高,模型会对行人的预测偏向“保守直线”,导致行人在路口转弯时预测滞后。
处理方式:训练时对行人样本做上采样,同时在特征编码里给不同目标类型加独立的Embedding,让模型能区分不同类型目标的不同运动模式。
写在最后的实操体会
回头看得话,做轨迹预测模型,真正的门槛其实不在模型结构本身。VectorNet和MultiPath的结构,论文里写得清清楚楚,复现也不难。难的是对“问题本质”的理解——轨迹预测不是单纯做坐标回归,而是要在不确定性里做概率建模,要在场景约束里做意图推断。模型的每一个设计选择,都对应着实际驾驶里的一种行为合理性。
如果你正准备在自己的系统里接入轨迹预测,我的建议是:不要一上来就追最新的模型结构。先把恒定速度模型、车道中心线外推这种规则基线跑通,建立一个评测流程和可视化工具。基线的意义不只是让深度学习模型赢它几个百分点,更重要的是让你理解场景的难点分布在哪里。然后再上VectorNet编码器,感受地图建模带来的提升;再上多模态输出头,体会不确定性建模的威力。每一步都能看到可解释的提升,而不是一把梭哈、黑盒调参。
还要多说一句:轨迹预测的评测没有终点。你在一个数据集上刷到很好的ADE指标,不代表在实车上表现好。我见过太多指标漂亮但行为诡异的模型了——最有价值的不是指标数字本身,而是你建立的可视化+判错理由+数据反馈修正这套闭环。保留好你的可视化工具和错误样本库,它们比模型权重珍贵得多。