想象你是一名经验丰富的篮球防守队员。比赛最后十秒,对手持球向你冲来——你不会傻站着猜他会往哪走,也不会像新手一样提前扑向一个方向。你会先回忆他刚才几次进攻的走位习惯(历史轨迹),用余光扫一眼队友和挡拆的位置(交互图网络),再读他压低重心、眼神飘向篮筐的小动作(意图推断),最后压低重心、留出半步距离,随时准备向左右滑步(不确定性量化)。赛后,教练用防守效率数据评价你的表现(评估指标);平时训练,则把这种个人直觉变成全队统一的防守体系(工程落地)。这就是自动驾驶中“行为预测与意图推断”的全部智慧:让车不再被动地等障碍出现才刹车,而是像一个老练的防守者,提前半拍读懂路上每个行人、每辆车的下一个动作。

岗位关联

对 AI 从业者而言,掌握行为预测与意图推断是进入自动驾驶核心算法岗的必修课——它连接感知与规划,直接决定车辆能否安全、舒适、合规地在真实道路上行驶。

目录
  1. 可视化演示
  2. 行为预测基础
  3. 历史轨迹建模
  4. 交互图网络
  5. 意图推断方法
  6. 不确定性量化
  7. 效果评估指标
  8. 量产工程实践
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

本节配有交互动效(进入视口后自动加载,约 3KB)。

轨迹预测 ——历史轨迹+未来预测 历史:过去3s观测序列 预测:未来3s轨迹 编码:LSTM/Transformer时序 输出:(x,y)坐标序列 ŷ_t = f(x_{t-T:t}), ADE=mean(||ŷ-ŷ*||)

行为预测基础

赛场上,一个成熟的防守球员绝不会等对方启动才反应。他会提前站位、压低重心、用余光锁死对方持球手——因为篮球对抗的本质是“预判的对抗”。真正的高手,在对手出手之前就已经在半空中等着了。

自动驾驶面临的局面如出一辙。当一辆车以 80 km/h 行驶时,如果它只在碰撞前 0.5 秒才侦测到前车急刹,再强大的制动系统也无济于事。行为预测要解决的就是“抢先半步”的问题:基于目标过去几秒的运动轨迹、道路结构以及周围环境,推断它在未来 3-8 秒内最可能做什么。

规范地说,行为预测被建模为一个条件概率估计问题:给定历史观测 \(X\) 和上下文 \(C\),估计未来轨迹 \(Y\) 的分布。这里的 \(Y\) 不是单点,而是一段时间内的位置序列;\(C\) 则包括车道线、红绿灯、其他参与者的位置等社会上下文。预测目标既包括车辆(变道、跟车、超车),也包括行人(站立、行走、奔跑、突然折返)。时间跨度的选择是工程权衡:预测太短,规划来不及反应;预测太长,误差快速累积、可信度急剧下降。

就像防守者永远无法 100% 确定对手的下一步,行为预测也不追求“确定无疑”,而是输出一个分布。守住这个“概率思维”的底线,是后面所有方法的地基。

P⁡(Yt+1:T∣X1:t, C)\operatorname{P}\left(Y_{t+1:T} \mid X_{1:t},\, C\right)
这个公式是整个行为预测的“总纲”:它告诉我们,预测的本质不是猜一个点,而是估计一个条件概率分布——在已知历史和环境的条件下,未来可能发生什么、各自有多大可能。
  1. 历史观测 \(X\)\(X_{1:t} = (x_1, x_2, \ldots, x_t)\) 是目标从时刻 1 到 t 的位置序列,相当于防守者记在心里的对手前几个回合的走位。
    X1:t=(x1,x2,…,xt)X_{1:t} = (x_1, x_2, \ldots, x_t)
  2. 未来轨迹 \(Y\)\(Y_{t+1:T} = (y_{t+1}, \ldots, y_T)\) 是要预测的未来位置序列,对应对手即将迈出的每一步。
    Yt+1:T=(yt+1,yt+2,…,yT)Y_{t+1:T} = (y_{t+1}, y_{t+2}, \ldots, y_T)
  3. 上下文 \(C\)\(C\) 是地图、信号灯、邻车位置等环境与社会信息,就像防守者余光里队友和篮筐的位置。
    C={地图,信号灯,邻车位置,…}C = \{ \text{地图}, \text{信号灯}, \text{邻车位置}, \ldots \}
  4. 条件概率语义\(P(A \mid B)\) 读作“在 B 发生的条件下 A 发生的概率”,整体表示未来轨迹服从一个由历史与上下文决定的分布。
    P(A∣B)=P(A,B)P(B)P(A \mid B) = \frac{P(A, B)}{P(B)}

历史轨迹建模

老练的防守者会在心里回放对手刚才的几次进攻:他总爱从左侧切入,急停跳投前会先做一个交叉步……这些“历史轨迹”是判断下一招最有价值的信息。

对自动驾驶来说,历史轨迹来自感知模块输出的跟踪序列——每一帧的位置、速度、航向角。这条序列隐含了目标的运动模式和驾驶风格,比如一个人是稳重跟车还是频繁变道。

循环网络(LSTM/GRU)是最经典的时序编码器,它把每个时间步的观测依次输入,用一个隐藏状态压缩全部历史信息。注意力机制进一步改进:并非所有历史帧都同等重要,模型通过学习权重聚焦关键帧,比如刹车前的减速点、变道前的横向偏移点。工程上还会显式构造一阶、二阶差分特征——速度、加速度、加加速度——让模型更容易捕捉运动突变。

防守者“记住该记住的,忽略该忽略的”,注意力机制让模型同样学会从纷繁的轨迹里挑出真正预示变招的瞬间。

αi=softmax⁡(q⊤kid)=exp⁡(q⊤ki/d)∑j=1texp⁡(q⊤kj/d)\alpha_i = \operatorname{softmax}\left(\frac{q^\top k_i}{\sqrt{d}}\right) = \frac{\exp\left(q^\top k_i / \sqrt{d}\right)}{\sum_{j=1}^{t} \exp\left(q^\top k_j / \sqrt{d}\right)}
注意力公式像是给历史轨迹“打分”:每一帧有多重要,由当前状态与那一帧的相似度决定,最后把所有历史帧按重要程度汇总,完成“记住该记住的”。
  1. 查询与键\(q\) 是当前时刻的“查询”向量,\(k_i\) 是第 i 帧的“键”向量,点积 \(q^\top k_i\) 衡量“当前状态与第 i 帧有多相关”。
    q⊤ki=∑m=1dqm⋅ki,mq^\top k_i = \sum_{m=1}^{d} q_m \cdot k_{i,m}
  2. 缩放因子\(d\) 是向量维度,除以 \(\sqrt{d}\) 防止点积数值过大导致 softmax 饱和,让训练更稳定。
    q⊤kid\frac{q^\top k_i}{\sqrt{d}}
  3. 归一化权重softmax 把一组相关度分数变成和为 1 的权重,\(\alpha_i\) 越大代表第 i 帧越值得关注。
    ∑i=1tαi=1,αi≥0\sum_{i=1}^{t} \alpha_i = 1, \quad \alpha_i \ge 0
  4. 加权聚合最终历史信息等于各帧值向量的加权和,相当于把“注意力”花在最关键的几个历史时刻上。
    h=∑i=1tαi vih = \sum_{i=1}^{t} \alpha_i \, v_i

交互图网络

篮球是五个人的运动。防守者判断对手要不要突破,不仅要看他本人,还要看队友是否被挡拆拖住、弱侧是否有人协防——空间里的每个人都在互相影响。

道路同样是一张动态的“关系网”:前车刹车会带动后车减速,行人驻足会让来车减速等待,并行的两辆车会在相邻车道相互试探。如果只对每个目标单独建模,就会错过这些社会互动,预测自然失真。

交互图网络把每个道路参与者看作图中的一个节点,节点之间的边编码空间关系——距离、相对速度、是否在同一车道。然后通过多轮“消息传递”让信息在图中扩散:每一轮,每个节点聚合邻居传来的特征,更新自己的表示。若干轮之后,节点的隐藏特征就“看见”了整幅交通图,这就是社会上下文的聚合。

防守者“眼观六路、耳听八方”的能力被图网络翻译成了精确的数学语言——每个节点都长出了“触角”,能感知整片球场的呼吸。

hi(l+1)=σ(Wh hi(l)+∑j∈N(i)We hj(l))h_i^{(l+1)} = \sigma\left( W_h\, h_i^{(l)} + \sum_{j \in \mathcal{N}(i)} W_e\, h_j^{(l)} \right)
这个公式描述“一次消息传递”:每个人把自己的状态加上周围所有人的影响,再经过激活函数刷新。层数越多,影响传播得越远,节点就越“眼观六路”。
  1. 节点特征\(h_i^{(l)}\) 是第 l 层中节点 i 的特征向量,代表“这个参与者的当前状态被压缩后的表示”。
    hi(l)∈Rdh_i^{(l)} \in \mathbb{R}^{d}
  2. 邻域集合\(\mathcal{N}(i)\) 是节点 i 的邻居集合,即空间上与该参与者相互影响的车辆和行人。
    N(i)={j:节点 j 与 i 存在空间交互}\mathcal{N}(i) = \{ j : \text{节点 } j \text{ 与 } i \text{ 存在空间交互} \}
  3. 消息聚合\(\sum_{j \in \mathcal{N}(i)} W_e h_j^{(l)}\) 把邻居的特征经线性变换后求和,是“收集周围人传来的信息”。
    mi(l)=∑j∈N(i)We hj(l)m_i^{(l)} = \sum_{j \in \mathcal{N}(i)} W_e\, h_j^{(l)}
  4. 自更新\(\sigma(\cdot)\) 是激活函数,把“自己的旧状态加上邻居的讯息”融合成新状态;层数越多,信息传递范围越广。
    hi(l+1)=σ(Wh hi(l)+mi(l))h_i^{(l+1)} = \sigma\left( W_h\, h_i^{(l)} + m_i^{(l)} \right)

意图推断方法

高手对决,胜负常在一瞬间的判断:对手眼神瞄向篮筐、肩膀下沉、球往右胯一收——这些细微线索暴露了他要突破还是投篮。篮球术语叫“阅读比赛”,AI 术语叫意图推断。

轨迹是连续的运动描述,意图则是离散的语义标签:这辆车要变道还是保持车道?要在路口左转还是直行?这个行人要过马路还是站在路边等待?意图推断就是给轨迹“贴语义标签”,让机器知道“他想干什么”。

工程上常用分类头完成意图推断:把时序或图网络提取的特征 \(h\) 经过线性层映射到各类别得分,再用 softmax 转成概率。为了提升准确率,模型会融合多源语义线索:转向灯状态、刹车灯、行人的头部朝向与姿态、道路结构(导流线、路口渠化)等。实践中意图推断与轨迹预测常常联合训练——意图分支提供语义约束,轨迹分支提供精细运动,二者互相正则、互为补充。

就像防守者不会等对手完全做完动作才反应,意图推断让车在“变道意图”刚萌芽时就有所准备——先松油门、微调方向,而不是等对方压线才急刹。

P(z=c∣X,C)=exp⁡((Wh+b)c)∑c′=1Kexp⁡((Wh+b)c′)P(z = c \mid X, C) = \frac{\exp\left( (W h + b)_c \right)}{\sum_{c'=1}^{K} \exp\left( (W h + b)_{c'} \right)}
softmax 公式把网络输出的“原始得分”翻译成“各类意图的概率”,既允许模型给出最有把握的判断,也保留其他可能性,避免把话说死。
  1. 意图类别\(z \in \{1, 2, \ldots, K\}\) 是离散意图标签,比如 \(K=4\) 对应 {左变道,保持车道,右变道,减速停车}。
    z∈{左变道,保持车道,右变道,减速停车}z \in \{\text{左变道}, \text{保持车道}, \text{右变道}, \text{减速停车}\}
  2. 得分向量\(W h + b\) 是把高维特征 \(h\) 线性投影成 K 个“意图得分”,下标 \((\cdot)_c\) 取第 c 类的得分。
    s=Wh+b,s∈RKs = W h + b, \quad s \in \mathbb{R}^{K}
  3. 指数放大\(\exp(s_c)\) 把得分映射为正数并放大差异,得分越高的类,指数越大。
    exp⁡(sc)=esc\exp(s_c) = e^{s_c}
  4. 概率归一分母对全部 K 个类别求和,使分子除以分母后得到一个总和为 1 的概率分布。
    P(z=c∣X,C)=esc∑c′=1Kesc′P(z = c \mid X, C) = \frac{e^{s_c}}{\sum_{c'=1}^{K} e^{s_{c'}}}

不确定性量化

顶尖防守者从不把全部赌注押在左边或右边——他留出半步距离、重心微微下压,这样无论对手往哪边突破都能跟上。这种“有保留的全神贯注”,正是不确定性量化的精髓。

预测模型如果只输出一条“最可能轨迹”,相当于防守者提前把重心完全压向一侧——一旦对手变向,就是灾难。真实交通充满随机性:行人可能随时回头、车辆可能临时变道,模型必须诚实地说出“我不确定”。

数学上,不确定性分为两类:偶然不确定性(aleatoric)是数据本身固有的随机性,比如行人散步的路径天然随意;认知不确定性(epistemic)是模型知识不足导致的,比如没见过雪地工况。工程实现上,一种常见做法是让模型输出混合高斯分布:K 个高斯分量的均值代表 K 种候选走法,协方差代表每种走法的发散程度,权重代表每种走法的概率。规划模块拿到这些“带概率的假设”,就能做出保守而不过度激进的安全决策。

不确定性不是模型的失败,而是模型对真实世界的诚实。会“诚实地说不知道”的车,才敢在拥挤的城市里安全穿梭。

p(y)=∑k=1Kπk N(y; μk, Σk),∑k=1Kπk=1p(y) = \sum_{k=1}^{K} \pi_k\, \mathcal{N}\left(y;\, \mu_k,\, \Sigma_k\right), \qquad \sum_{k=1}^{K} \pi_k = 1
混合高斯把“未来”描述成一束带权重的轨迹带,而不是一根细线。哪条路更宽、哪条路更可能,一目了然。
  1. 混合分布\(p(y)\) 是未来轨迹 y 的概率密度,由 K 个高斯分布加权叠加,对应“多种可能的未来”。
    p(y)=∑k=1Kπk N(y;μk,Σk)p(y) = \sum_{k=1}^{K} \pi_k\, \mathcal{N}(y; \mu_k, \Sigma_k)
  2. 高斯分量\(\mathcal{N}(y; \mu_k, \Sigma_k)\) 是以 \(\mu_k\) 为中心、\(\Sigma_k\) 为方差的第 k 种走法;\(\Sigma_k\) 越大,这种走法越“飘忽”。
    N(y;μk,Σk)=1(2π)d∣Σk∣exp⁡(−12(y−μk)⊤Σk−1(y−μk))\mathcal{N}(y; \mu_k, \Sigma_k) = \frac{1}{\sqrt{(2\pi)^d |\Sigma_k|}} \exp\left( -\tfrac{1}{2}(y-\mu_k)^\top \Sigma_k^{-1} (y-\mu_k) \right)
  3. 混合权重\(\pi_k\) 是第 k 种走法的权重,\(\sum \pi_k = 1\) 保证总概率为 1,\(\pi_k\) 越大代表该走法越可信。
    ∑k=1Kπk=1,πk≥0\sum_{k=1}^{K} \pi_k = 1, \quad \pi_k \ge 0
  4. 整体含义整个式子描述“未来不是一条线,而是一束带概率的轨迹带”,恰如防守者眼中对手的突破路线是一片“可能区域”。
    y∼∑k=1Kπk N(μk,Σk)y \sim \sum_{k=1}^{K} \pi_k\, \mathcal{N}(\mu_k, \Sigma_k)

效果评估指标

衡量一个防守球员,教练不会只看抢断数。真正重要的是他是否压低了对手的命中率、是否让对手远离了危险区。同样,预测模型好不好,要看专门的量化指标。

行为预测的评测有两大任务:预测整条轨迹和预测终点。公开数据集(如 nuScenes、Argoverse)建立了统一的评测协议,常用指标包括平均位移误差(ADE)、终点位移误差(FDE)、负对数似然(NLL)。

ADE 是预测轨迹与真实轨迹在每一时刻距离的平均值;FDE 只比较最终位置的距离。由于模型输出多条候选轨迹,评测时通常取与真实轨迹最接近的那条来计算,即 minADE / minFDE,衡量“最好的假设有多好”;NLL 则评估概率分布对真实轨迹的拟合质量,能惩罚过于自信的错误预测。工程团队还会关注预测时域设定、真值采样频率等协议细节,保证指标可比。

就像防守数据要结合对手强度来解读,评估指标也要配套多样性和分布质量指标一起看,才能全面衡量一台“防守机器”的真实水平。

ADE=1T∑t=1T∥y^t−yt∥2\mathrm{ADE} = \frac{1}{T} \sum_{t=1}^{T} \left\| \hat{y}_t - y_t \right\|_2
ADE 像“防守者的平均失位距离”:每一时刻你离对手该在的位置差多远,全程平均下来就是你的防守质量。
  1. 逐时刻误差\(\hat{y}_t\) 是预测轨迹在时刻 t 的位置,\(y_t\) 是真实位置,二者之差的二范数 \(\|\cdot\|_2\) 是平面欧氏距离。
    ∥y^t−yt∥2=(x^t−xt)2+(y^t−yt)2\left\| \hat{y}_t - y_t \right\|_2 = \sqrt{(\hat{x}_t - x_t)^2 + (\hat{y}_t - y_t)^2}
  2. 全程累计\(\sum_{t=1}^{T}\) 把从第 1 到第 T 个时刻的误差累加,T 是预测时域内的采样步数。
    ∑t=1T∥y^t−yt∥2\sum_{t=1}^{T} \left\| \hat{y}_t - y_t \right\|_2
  3. 取平均\(\frac{1}{T}\) 除以步数得到平均误差,单位是米,数值越小代表预测越贴近真实。
    ADE=1T∑t=1Tet\mathrm{ADE} = \frac{1}{T} \sum_{t=1}^{T} e_t
  4. 与 FDE 的差别FDE 只取 \(t = T\) 那一项,即只看终点偏差;ADE 则审查全程每一个时刻。
    FDE=∥y^T−yT∥2\mathrm{FDE} = \left\| \hat{y}_T - y_T \right\|_2

量产工程实践

个人防守直觉再强,也只是一个人的本事;要赢总冠军,得把直觉变成全队统一的防守体系——训练、跑位、沟通、轮换,每个环节都流程化。行为预测从论文走进量产车,同样是这个“体系化”的过程。

实验室里跑通的 PyTorch 模型,距离车上稳定运行还有很长的路:数据从哪来?算力够不够?预测错了怎么办?谁来为安全负责?

量产要过四道关。其一是数据闭环:采集真实路采数据,挖掘典型场景(鬼探头、加塞、大车并行),标注关键目标的意图与轨迹。其二是实时推理:预测模块通常被分配 10-30 ms 的算力预算,需要模型量化、TensorRT 加速、C++ 部署,保证每一帧都在预算内完成。其三是安全冗余:预测模块要输出置信度与失效标志,异常时降级为保守策略(如提前减速、扩大安全距离),与规划、控制构成多重防线。其四是合规验证:遵循功能安全标准(ISO 26262)和数据合规要求,通过大规模仿真加实车测试积累证据,向监管方证明系统安全性。

冠军球队靠体系赢球,量产智能车靠工程体系赢得用户信任。行为预测在其中扮演的,正是那个“提前半拍读懂对手”的关键角色。

Tresponse=Tperception+Tprediction+Tplanning+Tactuation≤TrequiredT_{\text{response}} = T_{\text{perception}} + T_{\text{prediction}} + T_{\text{planning}} + T_{\text{actuation}} \le T_{\text{required}}
这条不等式是量产的“总时间预算”:从传感器看到危险到车辆真正执行避险,整条链路的耗时必须小于安全允许的反应窗口。
  1. 响应总链路\(T_{\text{response}}\) 是从传感器看到危险到车辆真正执行避险的完整链路耗时。
    Tresponse=Tperception+Tprediction+Tplanning+TactuationT_{\text{response}} = T_{\text{perception}} + T_{\text{prediction}} + T_{\text{planning}} + T_{\text{actuation}}
  2. 各环节耗时感知、预测、规划、执行四段耗时相加构成总耗时,预测模块只是其中一环。
    Tperception,  Tprediction,  Tplanning,  TactuationT_{\text{perception}}, \; T_{\text{prediction}}, \; T_{\text{planning}}, \; T_{\text{actuation}}
  3. 安全预算\(T_{\text{required}}\) 是由碰撞时间、法规要求和舒适性共同决定的时限,比如前车急停时留给系统的反应窗口。
    Trequired=可用制动距离相对速度×安全系数T_{\text{required}} = \frac{\text{可用制动距离}}{\text{相对速度}} \times \text{安全系数}
  4. 工程权衡不等式 \(T_{\text{response}} \le T_{\text{required}}\) 是量产的硬约束——预测模块慢了,就要从其他环节补回来,这是全系统协同优化的目标。
    Tprediction≤Trequired−Tperception−Tplanning−TactuationT_{\text{prediction}} \le T_{\text{required}} - T_{\text{perception}} - T_{\text{planning}} - T_{\text{actuation}}

AI 应用场景

高速领航辅助的自动变道决策

阶段:预测与规划

解决的问题:传统自适应巡航只跟车、不变道,变道依赖驾驶员手动操作。AI 预测相邻车道车辆的未来轨迹与变道意图,判断变道窗口是否安全,从而在高速上自主完成超越慢车,提升通行效率。

具体案例:高速前方有一辆 70 km/h 的慢车,系统预测左后方目标车未来 3 秒保持直行且距离足够,判断当前是安全变道窗口,随即打灯、变道、超越,再平稳回到原车道。

城市道路“鬼探头”主动防护

阶段:安全决策

解决的问题:行人被路边停放的车辆遮挡时,传统紧急制动只能在行人出现的瞬间触发,往往来不及。预测模型结合行人的摇摆姿态、头部朝向和历史轨迹,推断其“即将横穿”的意图,提前减速。

具体案例:路口斑马线旁,一位行人反复伸头张望、身体重心前移,模型给出“5 秒内可能横穿”的高概率警告,车辆提前松油门、轻点刹车,行人出现时已降到安全速度。

自动驾驶仿真测试的场景生成

阶段:测试与验证

解决的问题:真实路测里程有限、极端场景难遇到。把行为预测模型嵌入仿真器作为“虚拟交通流”,让虚拟车辆具备变道、避让、礼让等真实交互行为,自动生成海量逼真测试场景。

具体案例:仿真平台中,虚拟车辆会突然产生变道意图,或在前方拥堵时减速让行,自动生成千万公里级测试里程,验证规划算法在罕见交互下的稳定性与舒适性。

Python 演示

python62 行
"""行为预测与意图推断演示:基于历史轨迹外推与横向速度判意图"""  class SimplePredictor:    """用最近几帧的历史轨迹预测未来并推断变道意图"""     def __init__(self, lane_y=0.0):        self.lane_y = lane_y      # 车道中心线横向坐标        self.hist = []            # 历史轨迹点列表 [(x, y), ...]        self.limit = 10           # 最多保留的历史帧数        self.lat_vel = 0.0        # 平滑横向速度(右为正)     def update(self, x, y):        """每帧输入一个新的观测坐标"""        if self.hist:            prev = self.hist[-1]            self.lat_vel = 0.7 * self.lat_vel + 0.3 * (y - prev[1])        self.hist.append((x, y))        if len(self.hist) > self.limit:            self.hist.pop(0)     def infer_intent(self):        """根据横向速度和横向偏移推断离散意图"""        if len(self.hist) < 3:            return "信息不足"        offset = self.hist[-1][1] - self.lane_y        if abs(self.lat_vel) < 0.03 and abs(offset) < 0.5:            return "保持车道"        if self.lat_vel > 0.03 and offset > 0.5:            return "向右变道"        if self.lat_vel < -0.03 and offset < -0.5:            return "向左变道"        return "轻微偏移"     def predict_path(self, steps=8):        """用恒定速度假设外推未来路径"""        if len(self.hist) < 2:            return []        dx = self.hist[-1][0] - self.hist[-2][0]        dy = self.hist[-1][1] - self.hist[-2][1]        x0, y0 = self.hist[-1]        return [(x0 + dx * t, y0 + dy * t) for t in range(1, steps + 1)]  def main():    pred = SimplePredictor(lane_y=0.0)    frames = []    for x in range(0, 6):          # 前 6 帧直行        frames.append((float(x), 0.0))    for x in range(6, 14):         # 后 8 帧向右偏移        frames.append((float(x), 0.12 * (x - 6)))     for x, y in frames:        pred.update(x, y)        path = pred.predict_path(4)        tip = path[0] if path else None        print("x={:5.1f} y={:5.2f} 意图={} 预测首点={}".format(            x, y, pred.infer_intent(), tip))  if __name__ == "__main__":    main()
目的:用一段极简的“历史轨迹 + 横向速度”逻辑,演示意图推断(保持车道/向右变道)与轨迹外推的完整流水线。
  1. self.lat_vel = 0.7 * self.lat_vel + 0.3 * (y - prev[1])对横向速度做滑动平均,抑制单帧抖动造成的误判
  2. if len(self.hist) > self.limit: self.hist.pop(0)维护固定长度历史窗口,模型只依赖最近若干帧
  3. offset = self.hist[-1][1] - self.lane_y计算目标相对车道中心的横向偏移
  4. if self.lat_vel > 0.03 and offset > 0.5:横向速度与偏移同时朝右才判“右变道”,双重条件降低误报
  5. dx = self.hist[-1][0] - self.hist[-2][0]用最近两帧位置差估计速度,按恒定速度外推未来路径

常见误区

误区我以为行为预测就是要精准算出“那辆车 3 秒后一定在哪个点”,误差越小越好,就像解一道物理题。

正解真实交通充满随机性与多解性,一个成熟的行为预测模型输出的是概率分布和多条假设轨迹(如混合高斯分布),而不是单点答案。强迫模型输出唯一答案,只会让它把多种可能的走法平均成一条“谁都不像”的轨迹,反而更危险。

为何常见:我们习惯了确定性思维——考试有标准答案、物理有精确解,很难接受“未来本身是开放的”。

误区我最初以为预测某辆车,只需要盯着这辆车的速度和方向就行,周围的车都只是干扰信息。

正解道路是高度耦合的系统:前车刹车、邻车压线、行人驻足都会改变目标行为。交互图网络正是把“周围人”纳入模型,通过图节点与消息传递让目标“看见”社会上下文。忽略交互的模型在简单场景尚可,一到拥堵和路口就明显退化。

为何常见:单目标跟踪的先验知识和“各扫门前雪”的直觉,让人低估了交通参与者之间的互相影响。

误区我常把“意图推断”和“轨迹预测”混为一谈,以为预测出轨迹就等于知道了意图。

正解二者层次不同:意图是离散语义标签(变道/直行/过街),轨迹是连续位置序列;意图刻画“想做什么”,轨迹刻画“具体怎么做”。实践中二者联合训练、互相约束:意图提供先验,轨迹提供细节。

为何常见:语义和连续量都来自同一段历史,输出上也常常出自同一个模型,容易混淆边界。

误区我以为模型在测试集上 ADE 达到 0.3 米,装到车上就一定能安全避让一切危险。

正解离线指标反映的是“平均意义上与真值多接近”,无法覆盖长尾场景,也无法衡量不确定性质量与实时性。量产前还要做仿真压力测试、实车路测、功能安全分析,并给预测模块加上置信度与降级机制。指标好只是入场券,不是免死金牌。

为何常见:论文的 benchmark 文化让人习惯用单一数字判断好坏,忽略了工程系统的复杂性。

面试题

Q1. 行为预测模型最核心的输入是?

单选题 · easy

  • A.高清地图的栅格图像数据
  • B.历史轨迹与社会上下文信息← 正确答案
  • C.车辆传感器的标定参数表
  • D.驾驶员个人偏好调查问卷

答案:B。行为预测的核心是“看历史、看环境,猜未来”,历史轨迹与社会上下文是决定性输入。A 只是辅助信息,C 属于标定参数与预测无关,D 不是量产场景可获取的信号。

Q2. 处理轨迹序列最常用的网络结构是?

单选题 · easy

  • A.多层感知机的全连接结构
  • B.循环网络或注意力机制← 正确答案
  • C.决策树与随机森林集成
  • D.k 近邻聚类与密度估计

答案:B。轨迹是典型时序数据,循环网络(LSTM/GRU)与注意力机制专为序列建模设计,能捕捉时间依赖。MLP 难以建模长程时序关系,决策树与 k 近邻也不适合序列外推。

Q3. 意图推断与轨迹预测的关系是?

单选题 · easy

  • A.二者完全相同可以互相替代
  • B.意图是离散语义轨迹是连续动作← 正确答案
  • C.轨迹预测必须先于意图推断完成
  • D.意图推断只适用于行人不适用车辆

答案:B。意图是“想做什么”的离散语义标签,轨迹是“具体怎么走”的连续位置序列,二者互补而非等价。实践中常联合训练互相约束,顺序并不绝对,且意图推断同样适用于车辆变道等场景。

Q4. 交互图网络中节点通常表示什么?

单选题 · mid

  • A.每个道路路段的曲率采样点
  • B.每个交通信号灯的实时状态
  • C.每个道路参与者的对象实例← 正确答案
  • D.每个相机成像的像素坐标

答案:C。交互图网络把每个道路参与者(车、行人、骑行者)建模为节点,边编码空间关系。A、B 属于可选的上下文而非节点,D 把图像像素当节点属于另一类方法,不是交互图网络的常规设定。

Q5. 交互图网络通过边传递信息,能帮助模型:

多选题 · mid

  • A.感知被遮挡车辆的潜在意图← 正确答案
  • B.编码参与者间的空间相对关系← 正确答案
  • C.让决策建模周围环境的互动← 正确答案
  • D.直接替代高清地图的生成流程

答案:ABC。图网络让信息在节点间传播,既能借助邻车行为推断被遮挡目标,也能编码空间关系与互动。D 错误,图网络不生成高清地图,地图只是上下文输入之一。

Q6. 多模式预测主要指模型能够?

单选题 · mid

  • A.输出多条合理未来轨迹并带概率← 正确答案
  • B.同时匹配多种传感器采集的数据
  • C.在多个城市之间灵活切换模型
  • D.并行运行多种网络结构再取平均

答案:A。交通充满多解性,多模式预测输出多条“都合理”的未来假设并配概率,正是这种多解性的数学表达。B、C、D 是对“多模式”字面的错误联想,与预测建模无关。

Q7. 平均位移误差 ADE 度量的是?

单选题 · mid

  • A.预测终点与真实终点位置的差距
  • B.预测轨迹与真实轨迹逐点平均距离← 正确答案
  • C.模型从输入到输出的运行延迟
  • D.训练集中全部样本的数量规模

答案:B。ADE 是预测轨迹与真值轨迹逐时刻欧氏距离的平均。A 描述的是终点位移误差 FDE,C 是延迟,D 是数据量统计,均与 ADE 定义不符。

Q8. 只使用 ADE/FDE 评估预测模型可能存在的问题是?

单选题 · mid

  • A.无法反映多模式预测的分布合理性← 正确答案
  • B.计算复杂度太高导致无法量产部署
  • C.指标与损失函数设计完全相互独立
  • D.只适合用来评估行人的运动轨迹

答案:A。ADE/FDE 只衡量距离,无法判断概率分布是否合理、多模式是否有效,模型可能输出“平均轨迹”在数值上取巧。B 属于实现问题,C 说法错误,指标与损失通常配套设计,D 也明显不符合事实。

Q9. 自动驾驶量产中,行为预测模块需要满足?

多选题 · hard

  • A.在固定时间内完成实时推理响应← 正确答案
  • B.为规划模块提供置信度与风险信息← 正确答案
  • C.覆盖人流量大的罕见长尾交通场景← 正确答案
  • D.完全摆脱对感知模块的输入依赖

答案:ABC。量产要求预测在算力预算内实时完成,并向规划输出置信度,同时要通过数据闭环覆盖长尾场景。D 错误,预测模块依赖感知输出的目标跟踪结果,不可能脱离感知。

Q10. 下列属于认知不确定性来源的是?

多选题 · hard

  • A.训练数据未覆盖的罕见交通场景← 正确答案
  • B.模型结构表达能力不足以模拟真实← 正确答案
  • C.行人随机改变行走方向的天然随机
  • D.传感器测量噪声导致的位置抖动

答案:AB。认知不确定性源于模型知识与数据覆盖不足,A 与 B 属于这一类。C 是行人行为的固有随机性,D 是传感器噪声,二者属于偶然不确定性,即使增加数据也无法消除。