一、解决了什么问题?
当前的自动驾驶方案大致由感知(检测、跟踪、建图)、预测(motion、occupancy)和规划三个模块构成。
为了实现各种功能,智驾方案大致包括两种路线。一种是针对每个任务都部署一个模型,该范式能降低各团队间的研发困难度,但由于各个优化目标是孤立的,会引发模块之间信息丢失、错误累加和特征不对齐的问题。另一种是多任务的设计路线,多个任务 heads 共享一个特征提取器,该范式能节省边缘计算平台的资源消耗,并且扩展性强,但会带来“负迁移”的问题。
二、提出了什么方法?
本文认为应该围绕着规划这一最终的目标来设计整体架构,于是提出了 UniAD。UniAD 在一个网络中包括了全栈的自动驾驶任务,它能充分利用各模块的优势,从全局的角度为各 agents 之间的交流提供互补的特征抽象,并且它以统一的 query 接口来连接所有的模块,推动各模块向规划这一目标对齐。
UniAD 遵循一切为规划服务的原则,核心构成就是 query-based 的接口设计,连接各个模块。与经典的边框表征相比,queries 得益于更大的感受野,能减轻上游任务预测所带来的复合错误的影响,而且能灵活地编码和建模 agents 之间的交流。
概览
UniAD 包括四个基于 transformer decoder 的感知与预测模块,以及一个 planner。Queries Q Q Q 将整个流程串联起来,建模驾驶场景中各实例间的不同关系。下图展示了 UniAD 的流程,设计上非常精妙,遵循规划导向的思想。作者探索了感知和预测各模块的作用,充分发挥节点协同优化的优势。
-
首先,将多相机图像输入特征提取器,通过 BEVFormer 的 BEV 编码器将透视视角的特征变换为 BEV 特征 B B B。
-
然后在 TrackFormer 中,track queries 从 B B B 中查询各 agents 的信息,进行检测和跟踪。
-
在 MapFormer 中,map queries 作为道路元素(车道线、间隔物)的语义抽象,并进行 maps 的全景分割。
-
MotionFormer 获取各 agents 和 maps 之间的关系,预测每个 agent 未来的轨迹。在场景里面,各 agent 的行为会彼此影响,所以 MotionFormer 对所有的 agents 做联合预测。
-
OccFormer 以 BEV 特征 B B B 作为 queries,将 agent 的信息作为 keys 和 values,预测未来多步的占用网格图(保留 agents 的 IDs)。
-
最终,Planner 利用 MotionFormer 给出的自车 query 来预测出规划结果,并让自车远离 OccFormer 预测的被占用区域,以防碰撞发生。
1. 感知:跟踪和建图
TrackFormer
它协同完成检测和多目标跟踪任务,没有不可微的后处理操作。除了目标检测任务用到的检测 queries,它还包含了跟踪用的 track queries。在每一时刻,新初始化的检测 queries 负责检测首次被感知到的 agents,而 track queries 则对之前帧检测到的 agents 持续建模。检测 queries 和 track queies 都是通过关注 BEV 特征 B B B 来获取各 agents 的信息。随着场景的变化,当前时刻的 track queries 通过一个自注意力模块与之前时刻的 queries 进行交流,聚合时域信息,直到相应的 agents 完全消失在画面中。TrackFormer 包括 N N N 层,最终的输出 Q A Q_A QA 提供 N a N_a Na 个有效 agents 的信息,供下游任务使用。除了编码自车周围 agents 的 queries,作者还增加了一个自车 query,显式地建模自车本身,规划模块会用到。
MapFormer
作者基于 2D 全景分割方法 Panoptic SegFormer 设计 MapFormer。将道路元素稀疏地表征为 map queries,编码了位置和结构信息,从而帮助下游的运动预测。本文将车道线、间隔物和人行横道设为 things
,将可行驶区域设为 stuff
。MapFormer 也有
N
N
N 层,最后一层的 queries
Q
M
Q_M
QM 会输入 MotionFormer 做 agent-map 交流。
2. 预测:运动预测
有了 TrackFormer 和 MapFormer 分别提供的动态 agents 的 queries Q A Q_A QA 和静态图 Q M Q_M QM,MotionFormer 就可以预测所有 agents 未来的多模态运动了,即 top-k 个可能的轨迹。同时,作者将 TrackFormer 中的自车 query 传入 MotionFormer,让自车和其它 agents 产生交流。输出的运动状态表示为 { x ^ i , k ∈ R T × 2 ∣ i = 1 , . . . , N a ; k = 1 , . . . , K } \{\hat{\mathbf{x}}_{i,k} \in \mathbb{R}^{T\times 2}| i=1,...,N_a; k=1,..., \mathcal{K}\} {x^i,k∈RT×2∣i=1,...,Na;k=1,...,K},其中 i i i 表示 agent 的索引, k k k 表示轨迹模态的索引, T T T 是预测的长度。
MotionFormer
包括 N N N 层,每层都获取到三种交互关系:agent-agent, agent-map, agent-goal point。对于每个 motion query Q i , k Q_{i,k} Qi,k,它和其它 agents Q A Q_A QA 或地图元素 Q M Q_M QM 的关系可以表示如下:
Q a / m = MHCA ( MHSA ( Q ) , Q A / Q M ) Q_{a/m}=\text{MHCA}(\text{MHSA}(Q), Q_A/Q_M) Qa/m=MHCA(MHSA(Q),QA/QM)
上面的 MHCA \text{MHCA} MHCA 和 MHSA \text{MHSA} MHSA 表示多头跨注意力和多头自注意力。同时,我们也要关注目标点(goal point),优化预测轨迹,本文基于可变形注意力设计了一个 agent-goal point 注意力:
Q g = DeformAttn ( Q , x ^ T l − 1 , B ) Q_g = \text{DeformAttn}(Q, \hat{\mathbf{x}}_T^{l-1}, B) Qg=DeformAttn(Q,x^Tl−1,B)
其中 x ^ T l − 1 \hat{\mathbf{x}}_T^{l-1} x^Tl−1 是上一层预测轨迹的路径点。 DeformAttn ( q , r , x ) \text{DeformAttn}(q,r,x) DeformAttn(q,r,x) 是可变形注意力,输入为 query q q q、参考点 r r r 和空间特征 x x x。它对参考点周围的空间特征应用稀疏注意力。这样,预测轨迹能进一步感知到路径点周围的环境。
这三种交互关系的建模是同时进行的,然后将生成的 Q a , Q m , Q g Q_a, Q_m, Q_g Qa,Qm,Qg concat 到一起,输入一个 MLP,得到 query context Q c t x Q_{ctx} Qctx。然后将 Q c t x Q_{ctx} Qctx 输入后续的层做优化,或者在最后一层就解码为预测结果。
Motion queries
MotionFormer 每一层的输入 queries 记作 motion queries,包括两个部分:前一层输出的 query context Q c t x Q_{ctx} Qctx 和 query position Q p o s Q_{pos} Qpos。 Q p o s Q_{pos} Qpos 整合了四重的位置信息:
- 场景级 anchor I s I^s Is 的位置;
- agent 级 anchor I a I^a Ia 的位置;
- 第 i i i 个 agent 的当前位置;
- 预测的 goal point。
Q p o s = MLP ( PE ( I s ) ) + MLP ( PE ( I a ) ) + MLP ( PE ( x ^ 0 ) ) + MLP ( PE ( x ^ T l − 1 ) ) Q_{pos}=\text{MLP}(\text{PE}(I^s)) + \text{MLP}(\text{PE}(I^a)) + \text{MLP}(\text{PE}(\hat{\mathbf{x}}_0)) + \text{MLP}(\text{PE}(\hat{\mathbf{x}}_T^{l-1})) Qpos=MLP(PE(Is))+MLP(PE(Ia))+MLP(PE(x^0))+MLP(PE(x^Tl−1))
这里的正弦位置编码 P E ( ⋅ ) PE(\cdot) PE(⋅) 后跟着一个 MLP 用于编码位置点,第一层的 I s I^s Is 设为 x ^ T 0 \hat{\mathbf{x}}_T^0 x^T0。场景级 anchor 代表了全局视角下之前时刻的运动统计,agent 级 anchor 则在局部坐标捕捉可能的意图。它们都通过 k-means 算法对 ground-truth 轨迹的路径点做聚类,从而缩小预测结果的搜索空间。起始点提供每个 agent 的位置编码,而预测出的路径点则作为动态 anchor,逐层不断地优化。
非线性优化
直接从一个不准确的检测位置或偏航角回归 ground-truth 的路径点会产生不真实的轨迹预测,曲率和加速度可能会非常大。于是作者采用了一个非线性平滑方法,来调节目标的轨迹,使它们更加合理。该过程如下:
x ~ ∗ = arg min x c ( x , x ~ ) \tilde{\mathbf{x}}^\ast = \argmin_{\mathbf{x}}{c(\mathbf{x}, \tilde{\mathbf{x}})} x~∗=xargminc(x,x~)
其中 x ~ \tilde{\mathbf{x}} x~ 和 x ~ ∗ \tilde{\mathbf{x}}^\ast x~∗ 表示 ground-truth 和平滑后的轨迹, x \mathbf{x} x 通过 multiple-shooting 产生,代价函数为:
c ( x , x ~ ) = λ x y ∥ x , x ~ ∥ 2 + λ g o a l ∥ x T , x ~ T ∥ 2 + ∑ ϕ ∈ Φ ϕ ( x ) c(\mathbf{x}, \tilde{\mathbf{x}})=\lambda_{xy}\left\| \mathbf{x}, \tilde{\mathbf{x}} \right\|_2 + \lambda_{goal} \left\| \mathbf{x}_T, \tilde{\mathbf{x}}_T \right\|_2 + \sum_{\phi\in \Phi}{\phi(\mathbf{x})} c(x,x~)=λxy∥x,x~∥2+λgoal∥xT,x~T∥2+ϕ∈Φ∑ϕ(x)
其中, λ x y \lambda_{xy} λxy 和 λ g o a l \lambda_{goal} λgoal 是超参数,动力学函数集合 Φ \Phi Φ 有五项,包括 jerk, curvature, curvature rate, acceleration, lateral acceleration。这个代价函数对目标轨迹起到正则的作用,使其遵守动力学约束条件。目标轨迹优化只在训练时进行,不影响推理。
3. 预测:占用预测
占用网格图是离散化的 BEV 表征,每个格子都有一个置信度,表示该格子是否被占用。占用预测任务用于预测网格图在未来是如何变化的。OccFormer 从两个方面融合了场景级和 agent 级的语义信息:
- 通过一个精心设计的注意力模块,从密集场景特征学到 agent 级的特征;
- 对 agent 级特征和密集场景特征做矩阵乘法,输出实例占用。
OccFormer 由 T o T_o To 个序列模块组成, T o T_o To 表示预测的长度。由于占用网格图过于密集,这里的 T o T_o To 通常要小于运动任务中的预测长度 T T T。每个模块的输入包括丰富的 agent 特征 G t G^t Gt 和前一层的状态(密集特征) F t − 1 F^{t-1} Ft−1,然后输出 t t t 时刻的状态 F t F^t Ft。为了得到 agent 特征 G t G^t Gt,我们在模态维度对 MotionFormer 的 motion queries 做最大池化,记作 Q X ∈ R N a × D Q_X \in \mathbb{R}^{N_a\times D} QX∈RNa×D, D D D 是特征维度。然后通过一个时域 MLP 将它与上游的 track query Q A Q_A QA 及当前位置编码 P A P_A PA 融合:
G t = MLP ( [ Q A , P A , Q X ] ) , t = 1 , . . . , T o G^t = \text{MLP}([Q_A, P_A, Q_X]), t=1,..., T_o Gt=MLP([QA,PA,QX]),t=1,...,To
[ ⋅ ] [\cdot] [⋅] 表示 concat 操作。对于场景级信息,出于计算效率考虑,BEV 特征 B B B 会缩小到 1 / 4 1/4 1/4 分辨率,作为第一个模块的输入 F 0 F^0 F0。为了进一步节约训练时内存占用,每个模块都遵循下采样-上采样的方式,在中间有一个注意力模块,在 1 / 8 1/8 1/8 大小的特征(记作 F d s t F_{ds}^t Fdst)上进行 pixel-agent 交流。
Pixel-agent 交流
在预测未来占用网格图时,Pixel-agent 交流用于统一对场景和 agents 的理解。将密集特征 F d s t F_{ds}^t Fdst 作为 queries,实例级特征作为 keys 和 values 不断更新密集特征。 F d s t F_{ds}^t Fdst 输入一个自注意力层,建模网格间的响应,然后用一个跨注意力层建模 agent 特征 G t G^t Gt 和各网格的特征之间的关系。为了对齐 pixel-agent 的对应关系,作者用一个注意力 mask 来约束跨注意力,每个像素只关注于 t t t 时刻占据它的 agent。密集特征的更新过程如下:
D d s t = MHCA ( MHSA ( F d s t ) , G t , attn_mask = O m t ) D_{ds}^t = \text{MHCA}(\text{MHSA}(F_{ds}^t), G^t, \text{attn\_mask}=O_m^t) Ddst=MHCA(MHSA(Fdst),Gt,attn_mask=Omt)
注意力 mask O m t O^t_m Omt 语义上类似于占用网格图,用一个额外的 agent 级特征和密集特征 F d s t F_{ds}^t Fdst 相乘得到,我们将这个 agent 级特征叫做 mask 特征 M t = MLP ( G t ) M^t = \text{MLP}(G^t) Mt=MLP(Gt)。经过上述交流过程, D d s t D_{ds}^t Ddst 就上采样到了 B B B 的 1 / 4 1/4 1/4 大小。我们将 D d s t D_{ds}^t Ddst 通过残差连接加到模块输入 F t − 1 F^{t-1} Ft−1 上,得到的结果 F t F^t Ft 再输入进下一模块。
实例级占用
它表示的是保留了每个 agent ID 的占用网格图。它可以通过简单的矩阵乘法提取。为了得到 BEV 特征 B (原始大小为 H × W H\times W H×W )的预测占用,场景级特征 F t F^t Ft 通过一个卷积解码器上采样为 F d e c t ∈ R C × H × W F_{dec}^t \in \mathbb{R}^{C\times H\times W} Fdect∈RC×H×W,其中 C C C 是通道维度。
对于 agent 级特征,我们通过另一个 MLP 进一步将粗糙的 mask 特征 M t M^t Mt 更新为占用特征 U t ∈ R N a × C U^t \in \mathbb{R}^{N_a\times C} Ut∈RNa×C。实验表明, U t U^t Ut 要比 G t G^t Gt 带来更优的表现。最终 t t t 时刻的实例级占用表示为:
O ^ A t = U t ⋅ F d e c t \hat{O}_A^t = U^t \cdot F_{dec}^t O^At=Ut⋅Fdect
4. 规划
不带高精地图的规划一般需要高层级的指令来表示往哪个方向走。作者将原始的导航信号(左转、右转、保持前进)转换为三个可学习的 embeddings,叫做 command embeddings。由于 MotionFormer 的自车 query 已经表达了多模态意图,作者用 command embeddings 补充它,得到 plan query。然后将 plan query 关注到 BEV 特征 B B B,使它感知周围环境,然后将其解码,得到未来的路径点 τ ^ \hat{\tau} τ^。
为了避免碰撞,只在推理时基于牛顿法来优化 τ ^ \hat{\tau} τ^:
τ ∗ = arg min τ f ( τ , τ ^ , O ^ ) \tau^\ast = \argmin_{\tau}{f(\tau, \hat{\tau}, \hat{O})} τ∗=τargminf(τ,τ^,O^)
其中, τ ^ \hat{\tau} τ^ 是原始的规划预测, τ ∗ \tau^\ast τ∗ 表示优化后的规划,最小化代价函数 f ( ⋅ ) f(\cdot) f(⋅) 得到。 O ^ \hat{O} O^ 是经典的二值占用网格图,从 OccFormer 的实例占用预测融合得到。代价函数如下:
f ( τ , τ ^ , O ^ ) = λ c o o r d ∥ τ , τ ^ ∥ 2 + λ o b s ∑ t D ( τ t , O ^ t ) f(\tau, \hat{\tau}, \hat{O}) = \lambda_{coord}\left\| \tau, \hat{\tau} \right\|_2 + \lambda_{obs}\sum_t \mathcal{D}(\tau_t, \hat{O}^t) f(τ,τ^,O^)=λcoord∥τ,τ^∥2+λobst∑D(τt,O^t)
D ( τ t , O ^ t ) = ∑ ( x , y ) ∈ S 1 σ 2 π exp ( − ∥ τ t − ( x , y ) ∥ 2 2 2 σ 2 ) \mathcal{D}(\tau_t, \hat{O}^t)=\sum_{(x,y)\in \mathcal{S}} \frac{1}{\sigma \sqrt{2\pi}}\exp(-\frac{\left\| \tau_t - (x,y) \right\|_2^2}{2\sigma^2}) D(τt,O^t)=(x,y)∈S∑σ2π1exp(−2σ2∥τt−(x,y)∥22)
这里, λ c o o r d , λ o b s \lambda_{coord}, \lambda_{obs} λcoord,λobs 和 σ \sigma σ 是超参数, t t t 是未来时刻的索引。考虑到周围的位置受到 S = { ( x , y ) ∣ ∥ ( x , y ) − τ t ∥ 2 < d , O ^ x , y t = 1 } \mathcal{S}=\left\{ (x,y) | \left\| (x,y)-\tau_t \right\|_2 < d, \hat{O}_{x,y}^t=1 \right\} S={(x,y)∣∥(x,y)−τt∥2<d,O^x,yt=1} 的限制, l 2 l_2 l2 代价函数将轨迹拉向原来预测的位置,而碰撞项 D \mathcal{D} D 则将其推离开被占用的网格。
5. 学习
UniAD 训练包括两个阶段。首先协同训练感知部分,即跟踪和建图模块,训练 6 6 6 个 epochs。然后端到端训练感知、预测和规划模块共 20 20 20 个 epochs。
共享匹配
UniAD 包括实例建模,所以在感知和预测任务上,需要将预测结果和 ground-truths 配对。与 DETR 相似,在跟踪和在线建图阶段它使用了二分匹配算法。至于跟踪,检测 queries 的候选框会和新出现的 ground-truth 物体做配对,track queries 的预测则会继承之前帧的配对结果。跟踪模块的匹配结果会在运动和占用节点复用,从而持续地对历史跟踪的 agents 和未来的运动之间做建模。