Skip to content
RobotWorld
返回论文库

PAPER DEEP DIVE

自动驾驶端到端稀疏表示

SparseDrive:稀疏场景表示下的端到端自动驾驶

SparseDrive提出对称稀疏感知模块与并行运动规划器,以稀疏场景表示统一检测、跟踪、建图、预测和规划,并通过碰撞感知重评分选出安全轨迹。

Wenchao Sun, Xuewu Lin, Yining Shi, Chuang Zhang, Haoran Wu, Sifa Zheng2024年5月30日4 分钟阅读
EN

论文元信息

标题:SparseDrive: End-to-End Autonomous Driving via Sparse Scene Representation
作者:Wenchao Sun, Xuewu Lin, Yining Shi, Chuang Zhang, Haoran Wu, Sifa Zheng
发表:ICRA 2025;arXiv:2405.19620v2
论文链接https://arxiv.org/abs/2405.19620
代码github.com/swc-17/SparseDrive(官方开源,模型与权重已发布)

一句话总结

SparseDrive 用“实例特征 + 几何锚点”构成的稀疏场景表示替换昂贵 BEV 特征,将检测、跟踪、在线建图放入对称稀疏感知模块,并把运动预测与规划放进同一个并行运动规划器中,最后用碰撞感知重评分选出安全轨迹。

研究背景与动机

传统自动驾驶系统把感知、预测、规划拆成独立模块。每一层只接收上一层处理后的结果,位置、类别、速度、地图信息在传递过程中被压缩。一旦检测漏掉某个障碍,后续预测和规划都无从补偿。这种串行架构虽然便于解释和定位错误,却天然存在信息损失与误差累积。

端到端自动驾驶把多个任务放进一个可微分模型,理论上可以按规划目标联合优化。UniAD 和 VAD 等前期工作已经证明这一方向有效,但作者观察到两条明显短板:一是 BEV 特征非常昂贵,二是预测与规划的任务设计过于简单。

作者进一步指出预测和规划之间存在三个被忽略的相似性。第一,两者都要预测道路参与者的未来轨迹,都必须建模道路代理之间的高阶、双向交互;顺序执行会让规划看不到自车对周围代理的反作用。第二,两者既需要语义理解,也需要几何信息,但现有方法只为周围代理提取这些信息,自车缺少自己的语义与几何实例。第三,两者本质都是多模态问题,未来存在多条合理路径,但已有规划器通常只输出一条确定性轨迹。

与 BEV-Centric 方法不同,SparseDrive 走 Sparse-Centric 路线:用一组稀疏的 3D 锚点描述动态目标和静态地图元素。锚点经过图像特征采样、实例级交互和迭代精化后,自身就是场景表示。这样既避免维护稠密 BEV,也让检测、跟踪、建图能够共享同一套数据结构。

基于上述设计,SparseDrive 的目标不是单纯提升某一个子任务,而是同时解决端到端模型的性能、效率和安全问题。碰撞率成为论文最重要的评价点:规划器不仅要生成可行驶轨迹,还要让多模态输出能够被安全地选择。

预备知识

Sparse4D 系列把 3D 检测从密集 BEV 转向稀疏锚点。每个锚点携带位置、尺寸、朝向、速度等状态,锚点先投影到多视角图像采样局部特征,再在解码器中逐层精化。SparseDrive 复用这一思想,但把锚点从“检测专属表示”扩展为场景中所有动态实例和静态地图元素的统一表示。

端到端跟踪可以用实例队列实现。当前帧的实例通过特征匹配获得身份,历史特征和锚点进入队列参与时间建模。这样跟踪不再依赖独立的检测后关联流程,而是与检测共享解码器。

运动预测和规划的输入输出在数学上很接近:输入是当前场景状态,输出是一组未来轨迹及对应的置信度。区别主要在于轨迹对应对象不同、时间长度不同、评价目标不同。SparseDrive 的并行运动规划器正是利用这种相似性,让两者共享交互编码器,只在最后细化的分类与回归分支上分流。

方法详解

输入与整体流程

多视角相机输入表示为

$$I=\left\{I_{s}\in\mathbb{R}^{N\times C\times H_{s}\times W_{s}}|1\leq s\leq S\right\},$$

其中 $N$ 是 batch 大小,$C$ 是通道数,$S$ 是相机数量,$H_s$ 和 $W_s$ 是第 $s$ 个视角的分辨率。ResNet 与 FPN 将各视角图像编码成多尺度特征图;检测、建图、预测和规划全部从这些特征图上读取信息。

整体流程可以概括为:图像特征图进入对称稀疏感知模块,产生动态实例和静态地图实例;随后并行运动规划器把自车实例与周围实例拼接,同时输出运动多模态轨迹和规划多模态轨迹;层级选择策略决定最终路径。

flowchart TB
    A["Multi-view images I"] --> B["Multi-scale features"]
    B --> C["Symmetric sparse perception"]
    C --> D["Detection Fd Bd"]
    C --> E["Online mapping Fm Lm"]
    C --> F["Instance queue tracking"]
    D --> G["Ego init Fe Be"]
    F --> H["Parallel motion planner"]
    G --> H
    H --> I["Motion modes tau_m s_m"]
    H --> J["Planning modes tau_p s_p"]
    I --> K["Hierarchical selection"]
    J --> K
    K --> L["Collision-aware rescore"]
    L --> M["Final safe trajectory tau_p*"]

对称稀疏感知:检测

SparseDrive 的检测分支使用 $N_d$ 个可学习实例。检测特征 $F_{d}\in\mathbb{R}^{N_{d}\times C}$ 与检测锚点 $B_{d}\in\mathbb{R}^{N_{d}\times 11}$ 共同描述一个动态目标。11 维锚点包括位置、对数尺寸、朝向以及速度:

$$\left\{x,y,z,\ln w,\ln h,\ln l,\sin{yaw},\cos{yaw},v_x,v_y,v_z\right\}.$$

锚点投影到多视角特征图采样局部信息,再由解码器逐层精化。最后一层输出检测框和分类分数;前 $N_{dec}-1$ 层输出的中间框也参与监督,帮助模型逐步校正。检测头中的实例银行负责提供初始锚点、历史锚点以及时间间隔信息。

代码中检测头由 `Sparse4DHead` 实现,操作序列包含 `temp_gnn`、`gnn`、`deformable`、`ffn`、`refine` 等步骤。`deformable` 指可变形特征聚合,`refine` 指 `SparseBox3DRefinementModule`,它把特征与锚点编码相加后预测残差,再把残差加到锚点上。

对称稀疏感知:在线建图

在线建图分支把地图元素表示成点序列。地图实例特征为 $F_{m}\in\mathbb{R}^{N_{m}\times C}$,对应锚点 $L_{m}\in\mathbb{R}^{N_{m}\times N_{p}\times 2}$,其中 $N_p$ 是每个地图元素的采样点数,每个点只有平面坐标:

$$\left\{x_{0},y_{0},x_{1},y_{1},\ldots,x_{N_{p}-1},y_{N_{p}-1}\right\}.$$

这个分支与检测分支共享解码器结构,只是把 3D 框回归换成点集回归。车道线、路沿、人行横道都作为一组有序点输出,避免在稠密 BEV 分割图上做后处理。

对称稀疏感知:跟踪与实例队列

跟踪由实例队列完成。当前帧检测得到实例 ID 后,队列根据 ID 匹配历史实例;匹配成功的特征和锚点沿时间维加权,再与当前实例一起进入时间交互。官方代码中的 `InstanceBank` 管理 900 个检测锚点,`MotionPlanningHead` 取置信度最高的 50 个动态实例和 10 个地图实例参与规划。

论文没有为跟踪单独设计损失。因为 ID 分配由实例匹配直接完成,身份一致性由队列和特征传播保证。实验中的低 ID Switch 说明这种设计在连续帧上足够稳定。

自车实例初始化

运动预测和规划需要自车信息。SparseDrive 从前视相机的最小尺度特征图上构造自车实例:

$$F_e={\rm AveragePool}(I_{front,S}),$$

其中 $I_{front,S}$ 是前视相机最小尺度特征图。这样得到的 $F_e\in\mathbb{R}^{1\times C}$ 同时携带场景语义上下文,也为稀疏感知可能遗漏的“黑名单障碍”提供密集特征补充。自车锚点 $B_e\in\mathbb{R}^{1\times 11}$ 使用固定车辆尺寸和初始状态。

代码中的 `InstanceQueue.prepare_planning` 用 `ego_feature_encoder` 对前视最底层特征做卷积与平均池化,得到 `ego_feature`;`self.ego_anchor` 则固定为尺寸约 4.08m×1.73m×1.56m 的车辆框。该实现与论文公式一一对应。

并行交互:周围实例与自车实例统一处理

并行运动规划器的核心是把自车作为普通代理加入交互:

$$F_{a}={\rm Concat}(F_{d},F_{e}),\quad B_{a}={\rm Concat}(B_{d},B_{e}).$$

拼接后的 $N_d+1$ 个实例进入时序图网络、实例间图网络和地图交叉注意力。自车不再只作为规划起点,而是参与周围代理的交互推理,因此运动预测能感知自车将来可能的动作。

在官方代码中,这一步骤位于 `motion_planning_head.py` 的 forward 函数:

# projects/mmdet3d_plugin/models/motion/motion_planning_head.py
instance_feature_selected = torch.cat(
    [instance_feature_selected, ego_feature], dim=1)
anchor_embed_selected = torch.cat(
    [anchor_embed_selected, ego_anchor_embed], dim=1)

之后运动查询和规划查询从同一个实例表示上分别建立:

motion_query = motion_mode_query + (
    instance_feature + anchor_embed)[:, :num_anchor].unsqueeze(2)
plan_query = plan_mode_query + (
    instance_feature + anchor_embed)[:, num_anchor:].unsqueeze(2)

这两行直接体现了“并行”:运动分支与规划分支共享编码结果,只是在 refine 阶段加上不同模式查询。

多模态预测与规划

运动模式查询 $MQ_{m}\in\mathbb{R}^{\mathcal{K}_{m}\times C}$ 和规划模式查询 $MQ_{p}\in\mathbb{R}^{N_{cmd}\times\mathcal{K}_{p}\times C}$ 由 k-means 初始化。最后细化层输出:

$$\tau_{m}=MLP(F_{d}+MQ_{m}),\quad s_{m}=MLP(F_{d}+MQ_{m}),$$ $$\tau_{p}=MLP(F_{e}+MQ_{p}),\quad s_{p}=MLP(F_{e}+MQ_{p}).$$

其中 $\tau_m$ 是周围代理的 $\mathcal{K}_{m}$ 条未来轨迹,$s_m$ 是对应分数;$\tau_p$ 是自车在 $N_{cmd}$ 种驾驶命令下的 $\mathcal{K}_{p}$ 条规划轨迹,$s_p$ 是规划分数。模式数由锚点聚类决定,训练采用 winner-takes-all,只让误差最低的轨迹获得正样本监督。

配置中 `fut_mode=6`、`ego_fut_mode=6`、`ego_fut_ts=6`,即周围代理预测 12 帧共 6 种模式,自车规划 6 帧共 6 种模式。共享图网络之后,`MotionPlanningRefinementModule` 用独立分支输出运动分类、运动回归、规划分类、规划回归和自车状态。

层级规划选择与碰撞感知重评分

规划输出首先按驾驶命令分组,再在每个命令内部选择多模态路径。层级选择的第一层是命令选择,第二层是模式选择。为了安全,最后加入碰撞感知重评分模块。

重评分模块利用运动预测中置信度最高的轨迹构造周围障碍框,把每条规划轨迹与这些障碍框逐时刻比较。如果规划框与障碍框发生角点重叠,就在该模式得分上减去很大惩罚。官方代码中的实现是:

# projects/mmdet3d_plugin/models/motion/decoder.py
all_col = col.all(dim=-1)
col[all_col] = False # all modes collide, no need to rescore
score_offset = col.float() * -999
plan_cls = plan_cls + score_offset

这里一个关键细节是“全部模式都碰撞时不重评分”,避免把可用的安全轨迹也全部抹掉。重评分不是不可微的规则后处理,而是作用于最后选择阶段,因此不破坏端到端训练。

实验结果

nuScenes 全任务主结果

SparseDrive 在 nuScenes 验证集上与 UniAD、VAD 等端到端方法比较。SparseDrive-B 在检测、跟踪、建图、预测、规划五项任务上都取得更好结果,尤其碰撞率显著下降。下表汇总核心指标:

方法NDSAMOTA建图 mAPminADEL2 Avg碰撞率 AvgFPS
UniAD0.4980.359-0.710.730.61%1.8
VAD--0.476-0.720.21%4.5
SparseDrive-S0.5250.3860.5510.620.610.08%9.0
SparseDrive-B0.5880.5010.5620.600.580.06%7.3

与 UniAD 相比,SparseDrive-B 的 NDS 从 0.498 提升到 0.588,AMOTA 从 0.359 提升到 0.501,ID Switch 从 906 降到 632。这些提升不是单任务优化,而是共享稀疏表示带来的整体收益。

SparseDrive overview

图:SparseDrive 整体结构,来自论文 Figure 3。

规划安全与详细指标

规划结果按 1s、2s、3s 三个时间点报告 L2 误差和碰撞率。SparseDrive-B 平均 L2 为 0.58m,平均碰撞率 0.06%,明显低于 UniAD 的 0.73m 和 0.61%。详细结果如下:

方法L2 1sL2 2sL2 3sL2 AvgCol 1sCol 2sCol 3sCol Avg
UniAD0.450.701.040.730.62%0.58%0.63%0.61%
VAD0.410.701.050.720.03%0.19%0.43%0.21%
SparseDrive-S0.290.580.960.610.01%0.05%0.18%0.08%
SparseDrive-B0.290.550.910.580.01%0.02%0.13%0.06%

作者还重实现了碰撞率指标:旧实现把障碍物转成 0.5m 网格占用图,小障碍可能产生假碰撞;新实现通过轨迹点估计自车朝向变化,并用自车与障碍的包围框重叠判断碰撞。这个改动让规划安全比较更公平。

Parallel motion planner

图:并行运动规划器,来自论文 Figure 5。

效率对比

SparseDrive-S 在单张 RTX 4090 上达到 9.0 FPS,训练约 20 小时;UniAD 在单张 A100 上为 1.8 FPS,训练约 144 小时。SparseDrive-S 参数量 85.9M,FLOPs 192G,远低于 UniAD 的 125M 参数和 1709G FLOPs。稀疏表示不仅减少计算,也显著降低训练门槛。

消融:并行运动规划器的关键设计

论文以 SparseDrive-S 做消融。下表是四种设计对预测和规划的影响:

IDPALEIIMTMATACARminADEL2 AvgCol Avg
10.6230.610.08%
20.6410.610.10%
30.6210.630.11%
40.6260.690.25%
50.6340.770.16%
60.6230.610.12%

去掉并行设计(PAL)后预测 minADE 从 0.623 升到 0.641,碰撞率从 0.08% 升到 0.10%。去掉自车实例初始化(EII)后 L2 从 0.61 升到 0.63。去掉多模态规划(MTM)后碰撞率升到 0.25%。这些结果共同说明,预测与规划共享交互、自车语义几何信息、多模态输出和安全选择缺一不可。

碰撞感知重评分与后优化对比

UniAD 使用基于感知结果的规则后优化来保证安全。SparseDrive 在同样设置下复现了后优化,发现它把 L2 从 0.61 推到 0.73,碰撞率反而从 0.25% 升到 0.61%。原因是后优化破坏了端到端联合优化的目标一致性。

SparseDrive 的碰撞感知重评分把 L2 保持在 0.61m,碰撞率从 0.12% 降到 0.08%。重评分只改变模式选择,不重写轨迹,因此不会产生与学习目标冲突的大幅几何修正。

Sparse perception architecture

图:对称稀疏感知模块,来自论文 Figure 4。

训练目标与公式

SparseDrive 采用两阶段训练。第一阶段只训练稀疏感知,让检测、跟踪、建图形成稳定的稀疏表示;第二阶段解冻所有权重,把感知与并行运动规划器联合训练。整体损失为:

$$\mathcal{L}=\mathcal{L}_{det}+\mathcal{L}_{map}+\mathcal{L}_{motion}+\mathcal{L}_{plan}+\mathcal{L}_{depth}.$$

检测和建图损失都是分类损失加回归损失:

$$L_{det}=\lambda_{det\_cls}L_{det\_cls}+\lambda_{det\_reg}L_{det\_reg},$$ $$L_{map}=\lambda_{map\_cls}L_{map\_cls}+\lambda_{map\_reg}L_{map\_reg}.$$

深度分支作为辅助监督:

$$L_{depth}=\lambda_{depth}L_{depth}.$$

运动与规划共享一个联合损失,其中包含运动分类、运动回归、规划分类、规划回归和自车状态:

$$L_{motion\_planning}=\lambda_{motion\_cls}L_{motion\_cls}+\lambda_{motion\_reg}L_{motion\_reg}+\lambda_{plan\_cls}L_{plan\_cls}+\lambda_{plan\_reg}L_{plan\_reg}+\lambda_{plan\_status}L_{plan\_status}.$$

配置中的默认权重分别为 $\lambda_{motion\_cls}=0.2$、$\lambda_{motion\_reg}=0.2$、$\lambda_{plan\_cls}=0.5$、$\lambda_{plan\_reg}=1.0$、$\lambda_{plan\_status}=1.0$。规划回归权重最大,体现“以规划为导向”的端到端训练。

局限性

作者在论文中明确承认两点局限。第一,SparseDrive 的端到端模型在在线建图等任务上仍落后于专门的单任务方法。共享表示带来整体一致性,但也可能限制单一任务的上限。第二,nuScenes 数据规模有限,开放环路评估不能完全代表真实驾驶表现;更复杂场景下的闭环安全仍待验证。

从实现角度看,碰撞感知重评分使用角点包含关系做粗略检查,没有完整计算任意朝向矩形相交。对于非常规形状的障碍物或极端尺寸差异,这种近似可能漏判或误判。代码注释也写明这是 rough check。

另一个风险是重评分依赖运动预测的 top-1 模式。如果运动预测把真实碰撞轨迹排在低置信度位置,重评分看到的障碍信息可能不完整。官方后续版本 SparseDriveV2 在表示和训练上继续演进,也从侧面说明第一版仍有提升空间。

总结与展望

SparseDrive 的核心贡献是把端到端自动驾驶的表示从密集 BEV 转向稀疏实例,并重新设计预测与规划的关系。对称稀疏感知让检测、跟踪、建图共享同一套模型结构;并行运动规划器让自车参与场景交互,并用多模态规划建模不确定性;碰撞感知重评分把安全性放进选择阶段而不是外部规则。

实验证明这套设计在性能、效率和安全三项指标上同时取得进步。未来方向包括更强单任务感知、更大规模训练数据、闭环规划评估,以及把稀疏表示扩展到更多传感器和更复杂交互场景。官方代码与权重已公开,后续工作 SparseDriveV2 也已发布,社区可以在此基础上继续验证和改进。

金句

把场景压成稀疏实例,让预测和规划共享同一套交互,再把安全交给可学习的层级选择,SparseDrive 用一条完整可微的路径同时换来了精度、效率与低碰撞率。

相关论文