Task: Online Vectorized HD Map Construction
Method: Permutation-Equivalent Modeling, Hierarchical Query, Bipartite Matching
Venue: ICLR 2023 Spotlight / IJCV 2024
Year: 2022-2024
Paper: https://arxiv.org/abs/2208.14437 (MapTR) / https://arxiv.org/abs/2308.05736 (MapTRv2)
Code: https://github.com/hustvl/MapTR
摘要
高精地图(HD Map)为自动驾驶提供了丰富且精确的静态环境信息,是运动规划不可或缺的基础组件。传统高精地图依赖 SLAM 离线构建,流程复杂、维护成本高。本文提出 MapTR(Map TRansformer),一个结构化的端到端 Transformer 框架,用于高效的在线矢量化高精地图构建。核心创新在于提出了置换等价建模(Permutation-Equivalent Modeling),将地图元素建模为带有一组等价置换的点集,精确描述地图元素的几何形状并稳定训练过程。框架采用分层查询嵌入灵活编码实例级和点级信息,通过分层二部匹配完成地图元素学习。MapTR-nano 在 RTX 3090 上达到实时推理速度(25.1 FPS),比当时最优纯视觉方法快 8 倍且 mAP 高 5.0;MapTR-tiny 比多模态最优方法高 13.5 mAP 且快 3 倍。
MapTRv2 在此基础上引入解耦自注意力降低显存消耗、辅助一对多匹配加速收敛、辅助密集监督(深度/PV 分割/BEV 分割)提升精度,并扩展支持 centerline 学习和 3D 地图构建。MapTRv2-R50 在 nuScenes 上以 24 epoch 训练即达 61.5 mAP(比 MapTR +11.2),110 epoch 达 68.7 mAP;V2-99 backbone 更达 73.4 mAP,均为同期最优。
核心论点:矢量化高精地图构建的关键在于如何建模”形状歧义”——MapTR 通过置换等价建模消除了多线/多边形点序的固有模糊性,结合分层查询和分层匹配,首次实现了实时、端到端、高精度的在线矢量化地图构建,开创了该领域的 DETR-like 范式。
问题与动机
自动驾驶需要高精地图提供车道线、人行横道、道路边界等语义信息。传统方法依赖 SLAM 离线构建,存在流程复杂、更新滞后、与自车不对齐等问题。在线高精地图构建因此成为热门方向。
| 方法类型 | 代表作 | 核心问题 | mAP |
|---|---|---|---|
| BEV 语义分割 | HDMapNet | 栅格化表示缺乏实例级矢量信息,需复杂后处理聚类 | 23.0 |
| 自回归序列预测 | VectorMapNet | 逐点串行预测,推理慢(2.9 FPS),且存在点序歧义 | 40.9(C) |
| 前视图车道检测 | PersFormer, LSTR | 仅限单视图、单类型元素,无法处理全景多类地图元素 | — |
| SLAM 离线构建 | LOAM, LIO-SAM | 流程复杂,实时性差,维护成本高 | — |
核心痛点:矢量化地图元素(车道线、人行横道等)具有动态形状,无法像目标检测那样用 bounding box 简单抽象。更关键的是,同一个几何形状存在多种等价的点序排列,例如:多线可以从两端出发遍历、多边形可以从任意顶点以两种方向遍历。将某一固定点序强行指定为监督标签,会与其他等价点序产生矛盾,导致训练不稳定。
核心洞察
洞察 1:置换等价建模——消除形状表示的点序歧义
传统做法:将地图元素表示为固定顺序的有序点列 $V_F = [v_0, v_1, \ldots, v_{N_v-1}]$,隐含地规定了唯一的遍历方向和起点。
MapTR 做法:将每个地图元素建模为 $\mathcal{V} = (V, \Gamma)$,其中 $V$ 是点集,$\Gamma$ 是一组等价置换(覆盖所有产生相同几何形状的排列方式)。
对于多线(polyline,如车道线):两个端点均可作为起点,遍历方向有两种:
$$\Gamma_{\text{polyline}} = \{\gamma_0, \gamma_1\}, \quad \gamma_0(j) = j \bmod N_v, \quad \gamma_1(j) = (N_v - 1 - j) \bmod N_v$$对于多边形(polygon,如人行横道):任意顶点可做起点,方向有顺/逆时针两种,共 $2 \times N_v$ 种等价置换:
$$\Gamma_{\text{polygon}} = \{\gamma_0, \gamma_1, \ldots, \gamma_{2N_v - 1}\}$$为什么更好:固定序标签方法在 nuScenes 上仅 44.4 mAP,引入置换等价建模后提升至 50.3 mAP(**+5.9 mAP),其中人行横道提升最大(+11.9 AP**),因为多边形的等价置换数最多($2 \times 20 = 40$ 种),消除歧义带来的收益最显著。MapTRv2 中该提升仍达 +4.1 mAP。
洞察 2:分层查询与分层匹配——结构化编码地图元素
传统做法(DETR 式):每个查询对应一个实例的整体信息,难以编码地图元素内部的”多点结构”。
MapTR 做法:设计分层查询嵌入,分别定义 $N$ 个实例级查询 $\{q_i^{\text{ins}}\}$ 和 $N_v$ 个点级查询 $\{q_j^{\text{pt}}\}$(所有实例共享),通过加法组合得到每个点的分层查询:
$$q_{ij}^{\text{hie}} = q_i^{\text{ins}} + q_j^{\text{pt}}$$匹配也分两层:先做实例级匈牙利匹配找到预测-GT 的最优对应 $\hat{\pi}$,再对每个正样本实例做点级匹配,从置换组 $\Gamma$ 中选出最优点序 $\hat{\gamma}$:
$$\hat{\gamma} = \arg\min_{\gamma \in \Gamma} \sum_{j=0}^{N_v - 1} D_{\text{Manhattan}}(\hat{v}_j, v_{\gamma(j)})$$为什么更好:分层查询让每个参考点可以自适应地分布在地图元素的各个位置上,天然适配不规则形状;分层匹配将实例关联和点序对齐解耦,避免了联合优化的困难。
洞察 3:MapTRv2 三把斧——解耦注意力、一对多匹配、密集监督
MapTRv2 在 MapTR 基础上引入三项关键改进:
解耦自注意力:MapTR 使用全局自注意力,复杂度为 $O((N \times N_v)^2)$,显存需求高。MapTRv2 将其解耦为实例间注意力 + 点间注意力,复杂度降至 $O(N^2 + N_v^2)$,显存减少约 2000M(8458M vs. 10443M),且 mAP 反而提升 0.5。
辅助一对多匹配:训练时增加一组辅助实例查询,将 GT 重复 $K$ 倍(默认 $K=6$)进行一对多匹配,正样本比例大幅增加,加速收敛约 4 倍。该分支与主分支共享解码器,仅在训练阶段使用。
辅助密集监督:在 PV 特征上加深度预测损失(LiDAR 渲染 GT)、PV 前景分割损失、BEV 前景分割损失,三者互补,共带来 +4.9 mAP 提升。
要记住的 3 个数字:
- 61.5 mAP:MapTRv2-R50 在 nuScenes 上 24 epoch 的成绩,比 MapTR 同条件高 +11.2 mAP
- 25.1 FPS:MapTR-nano 的实时推理速度,比 VectorMapNet 快 8 倍
- 73.4 mAP:MapTRv2-V2-99 在 nuScenes 上 110 epoch 的最佳成绩
方法设计
整体架构
MapTR/MapTRv2 的核心流程可概括为:
$$\text{多视图图像} \xrightarrow{\text{Backbone}} \text{PV 特征} \xrightarrow{\text{PV2BEV}} \text{BEV 特征} \xrightarrow{\text{分层查询解码器}} \text{矢量化地图}$$PV(Perspective View)特征:Backbone 在相机原始透视视角下提取的 2D 图像特征,保留了相机投影的空间关系。PV2BEV 模块(MapTR 默认 GKT、MapTRv2 默认 BEVPoolv2、也兼容 BEVFormer 的可变形注意力)负责将 PV 特征投影/查询到 BEV 平面坐标系。
多视图 6 cam(1600×900)
│
▼
┌─────────────┐
│ Backbone │ ResNet-18/50/V2-99
│ (PV 特征) │ 输出:6×C×H×W
└─────┬───────┘
│
▼
┌─────────────┐
│ PV → BEV │ GKT(MapTR) / BEVPoolv2(MapTRv2)
│ Transform │ 输出:BEV 特征 H_bev×W_bev×C
└─────┬───────┘
│ ┌──────────────────────┐
▼ │ 分层查询嵌入 │
┌─────────────┐ │ q_ij = q_i^ins │
│ Map Decoder │◄── │ + q_j^pt │
│ (6 层) │ │ N=50 实例, Nv=20 点 │
└─────┬───────┘ └──────────────────────┘
│
├──► 分类头 → 实例类别分数
│
└──► 回归头 → 点集坐标 (N×Nv×2)
关键组件
| 模块 | MapTR | MapTRv2 | 作用 |
|---|---|---|---|
| PV2BEV | GKT(默认) | BEVPoolv2(LSS-based) | 2D→BEV 特征变换 |
| 自注意力 | 全局 $O((N \cdot N_v)^2)$ | 解耦 $O(N^2 + N_v^2)$ | 查询间信息交互 |
| 交叉注意力 | BEV-based Deformable Attn | BEV/PV/Hybrid | 查询与特征交互 |
| 匹配策略 | 一对一匈牙利匹配 | 一对一 + 辅助一对多 | 标签分配 |
| 辅助监督 | 无 | 深度 + PV 分割 + BEV 分割 | 密集几何/语义监督 |
| Centerline | 不支持 | 支持(路径式建模) | 下游规划所需 |
损失函数:
MapTR 的总损失包含三项:
$$\mathcal{L} = \lambda_c \mathcal{L}_{\text{cls}} + \lambda_p \mathcal{L}_{\text{p2p}} + \lambda_d \mathcal{L}_{\text{dir}}$$ 其中 $\lambda_c = 2$、$\lambda_p = 5$、$\lambda_d = 0.005$。- 分类损失 $\mathcal{L}_{\text{cls}}$:Focal Loss
- Point-to-Point 损失 $\mathcal{L}_{\text{p2p}}$:预测点与 GT 点之间的 Manhattan 距离
- 边方向损失 $\mathcal{L}_{\text{dir}}$:相邻点构成的边的余弦相似度
MapTRv2 的总损失扩展为:
$$\mathcal{L} = \beta_o \mathcal{L}_{\text{one2one}} + \beta_m \mathcal{L}_{\text{one2many}} + \beta_d \mathcal{L}_{\text{dense}}$$ 其中 $\mathcal{L}_{\text{dense}} = \alpha_d \mathcal{L}_{\text{depth}} + \alpha_b \mathcal{L}_{\text{BEVSeg}} + \alpha_p \mathcal{L}_{\text{PVSeg}}$。关键代码
MapTR 的分层查询通过实例嵌入与点级嵌入相加构成:
(来源:maptr_head.py)
# 分层查询嵌入:实例级 + 点级 |
分类分支:对同一实例的所有点特征取均值后预测类别;回归分支:每个查询独立预测 2D 坐标。
(来源:maptr_head.py)
# 分类:将同一实例的 Nv 个点特征取均值 |
📄 点击展开 置换等价匹配(shift_fixed_num_sampled_points)代码
点级匹配的核心:对每个 GT 实例生成所有等价置换的点序,在匹配阶段选择 Manhattan 距离最小的那个。
(来源:maptr_head.py)
# 在 _get_target_single 中,根据 assigner 返回的 order_index 选取最优置换 |
实验与分析
主要结果
nuScenes val(MapTR 论文结果)
| 方法 | 模态 | Backbone | Epoch | AP_ped | AP_div | AP_bou | mAP | FPS |
|---|---|---|---|---|---|---|---|---|
| HDMapNet | C | Effi-B0 | 30 | 14.4 | 21.7 | 33.0 | 23.0 | 0.8 |
| VectorMapNet | C | R50 | 110 | 36.1 | 47.3 | 39.3 | 40.9 | 2.9 |
| VectorMapNet | C & L | R50 & PP | 110 | 37.6 | 50.5 | 47.5 | 45.2 | — |
| MapTR-nano | C | R18 | 110 | 39.6 | 49.9 | 48.2 | 45.9 | 25.1 |
| MapTR-tiny | C | R50 | 24 | 46.3 | 51.5 | 53.1 | 50.3 | 11.2 |
| MapTR-tiny | C | R50 | 110 | 56.2 | 59.8 | 60.1 | 58.7 | 15.1 |
nuScenes val(MapTRv2 论文结果)
| 方法 | 模态 | Backbone | Epoch | AP_ped | AP_div | AP_bou | mAP | FPS |
|---|---|---|---|---|---|---|---|---|
| MapTR | C | R50 | 24 | 46.3 | 51.5 | 53.1 | 50.3 | 15.1 |
| MapTRv2 | C | R18 | 110 | 46.9 | 55.1 | 54.9 | 52.3 | 33.7 |
| MapTRv2 | C | R50 | 24 | 59.8 | 62.4 | 62.4 | 61.5 | 14.1 |
| MapTRv2 | C | R50 | 110 | 68.1 | 68.3 | 69.7 | 68.7 | 14.1 |
| MapTRv2 | C | V2-99 | 110 | 71.4 | 73.7 | 75.0 | 73.4 | 9.9 |
| MapTRv2 | C & L | R50 & Sec | 24 | 65.6 | 66.5 | 74.8 | 69.0 | 5.8 |
关键发现:
- MapTR-nano 首次实现实时矢量化高精地图构建(25.1 FPS),比 VectorMapNet 快 8 倍
- MapTRv2-R50 仅用 24 epoch 就超过 MapTR-R50 用 110 epoch 训练的结果(61.5 vs. 58.7 mAP)
- 纯视觉 MapTRv2 凭借密集监督逐步缩小与 LiDAR 模态的差距(Camera-only 61.5 vs. LiDAR-only 61.5 mAP)
消融实验:验证三个洞察
MapTRv2 渐进式构建路线图
| 配置 | mAP | 增量 | 验证洞察 |
|---|---|---|---|
| MapTR baseline | 50.3 | — | — |
| +PV2BEV 换 LSS | 50.1 | -0.2 | 基础替换 |
| +辅助深度监督 | 55.2 | +4.9 | 洞察 3(密集监督) |
| +辅助 BEV 分割 | 56.5 | +6.2 | 洞察 3(密集监督) |
| +辅助 PV 分割 | 57.1 | +6.8 | 洞察 3(密集监督) |
| +解耦自注意力 | 57.6 | +7.3 | 洞察 3(解耦注意力) |
| +一对多匹配 | 61.5 | +11.2 | 洞察 3(一对多匹配) |
置换等价建模(洞察 1)
| 建模方式 | AP_ped | AP_div | AP_bou | mAP |
|---|---|---|---|---|
| 固定序(有歧义) | 34.4 / 52.7 | 48.1 / 59.1 | 50.7 / 60.3 | 44.4 / 57.4 |
| 置换等价(无歧义) | 46.3 / 59.8 | 51.5 / 62.4 | 53.1 / 62.4 | 50.3 / 61.5 |
上方数值为 MapTR / MapTRv2。人行横道(polygon)提升最大(+11.9 / +7.1 AP),验证了多边形等价置换数最多时消歧收益最大。
自注意力变体对比(洞察 2/3)
| 自注意力类型 | mAP | GPU 显存 | FPS |
|---|---|---|---|
| 全局(Vanilla) | 57.1 | 10443M | 14.7 |
| 仅实例间 | 56.8 | 8178M | 14.9 |
| 解耦(MapTRv2 默认) | 57.6 | 8458M | 14.1 |
性能瓶颈分析
MapTR-tiny 的运行时间分布(RTX 3090):
| 组件 | 耗时 (ms) | 占比 |
|---|---|---|
| Backbone | 55.5 / 42.4 | 62.1% / 59.8% |
| PV2BEV(GKT/BEVPool) | 12.3 / 11.6 | 13.8% / 16.4% |
| Map Decoder | 21.5 / 16.9 | 24.1% / 23.8% |
| 总计 | 89.3 / 70.9 | 100% |
上方数值为 MapTR / MapTRv2。Backbone 占据约 60% 的推理时间,是主要瓶颈。Map Decoder(含 6 层 Transformer)仅占约 24%,说明分层查询机制的计算开销可控。
失效场景分析
- 远距离地图元素:感知范围为 $[-15m, 15m] \times [-30m, 30m]$,远处元素投影到 BEV 后分辨率低,细节丢失
- 严重遮挡场景:多车拥堵或施工区域中,路面标线被大量遮挡,BEV 特征缺失
- 夜间/恶劣天气:定性可视化显示,MapTR 在雨天和夜间场景中仍保持较稳定的构建质量,但存在更多碎片化预测
- 相机外参偏差:当平移噪声标准差 $\sigma > 0.5m$ 或旋转噪声 $\sigma > 0.02rad$ 时,mAP 显著下降(50.3→34.0 / 50.3→42.0)
工程实践
训练配置
Backbone: ResNet-18 (nano) / ResNet-50 (tiny) / VoVNetV2-99 |
复现要点
- 置换等价 GT 生成:需预先为每个 GT 元素生成所有等价置换的点集(
shift_fixed_num_sampled_points),多线 2 种、多边形 $2N_v$ 种;实现时注意 polygon 的循环移位 + 方向翻转的组合顺序 - BEV 网格大小敏感:MapTR-nano 使用 0.75m 网格(效率优先)、tiny 使用 0.3m 网格(精度优先),二者的感知范围和分辨率差异会影响后续匹配和损失计算
- 边方向损失权重:$\beta = 5 \times 10^{-3}$ 是精心调优的结果;过大($10^{-2}$)反而降低 2 mAP,因为点级损失尚未收敛时强制约束边方向会引入矛盾梯度
- MapTRv2 一对多匹配显存:$K=6, T=300$ 时显存从 8458M 增至 19426M,需确保足够 GPU 显存;推理时该分支完全不参与
- PV2BEV 模块选择:MapTR 默认 GKT(易部署),MapTRv2 默认 BEVPoolv2(LSS-based,需深度监督配合才能发挥优势)
性能优化方向
精度提升:
- 引入时序信息(MapTR+ 已支持时序 GKT/BEVFormer,24 epoch 提升约 1-3 mAP),利用多帧聚合减少遮挡和远距离误检
- 使用更大 backbone + 更长训练(V2-99 + 110ep 可达 73.4 mAP),代价是推理速度降至约 10 FPS
速度优化:
- Backbone 轻量化为首选方向(占比 ~60%),如替换为 EfficientNet 或蒸馏模型
- 减少解码器层数(6→2 层),MapTR-nano 即采用此策略,精度下降约 8 mAP 但速度翻倍
研究启示
可迁移的思想
- 置换等价建模处理几何歧义:任何涉及有序点集表示的任务(轮廓检测、路径规划、骨架估计)都会面临点序模糊问题,MapTR 的等价置换组 + 最优匹配选择策略可直接迁移
- 分层查询分解实例-部件关系:将”实例查询 + 部件查询”通过加法组合的设计模式,适用于任何需要结构化表示的目标(如人体姿态的关节点、场景图的节点-关系等)
- 辅助密集监督加速稀疏预测收敛:稀疏 query-based 方法天然正样本不足,在骨干网络上添加密集分割/深度辅助任务是通用加速手段
- 一对多匹配增加正样本覆盖:受 DETR with Hybrid Matching 启发,该策略已被广泛验证可用于各类 query-based 检测/分割方法
方法局限
- 当前以单帧为主,缺乏长时序建图一致性保证(时序版本仍为初步探索)
- 感知范围受限于 BEV 网格大小($60m \times 30m$),无法处理远距离高精地图
- 不支持动态地图元素(如临时施工标线、可变车道)
技术影响
- MapTR 开创了在线矢量化高精地图构建的 DETR-like 范式,后续 BeMapNet、MachMap、PolyDiffuse、MapVR 等工作均以 MapTR 为对比基线或在其基础上改进
- VAD(Vectorized Scene Representation for Efficient Autonomous Driving)直接利用 MapTR 输出进行端到端运动规划,证明了矢量化地图对下游任务的价值
- MapTRv2 进一步将 centerline 建模纳入框架,为 TopoNet 等拓扑推理工作提供了基础输入
- 在工业界,MapTR 的实时性(25+ FPS)使得在线高精地图构建首次具备上车部署的可行性