MapTR/MapTRv2 An End-to-End Framework for Online Vectorized HD Map Construction

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 平面坐标系。

MapTRv2 架构图
多视图 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}}$:相邻点构成的边的余弦相似度
$$\mathcal{L}_{\text{p2p}} = \sum_{i} \mathbb{1}_{\{c_i \neq \varnothing\}} \sum_{j=0}^{N_v - 1} D_{\text{Manhattan}}(\hat{v}_{\hat{\pi}(i),j},\ v_{i,\hat{\gamma}_i(j)})$$ $$\mathcal{L}_{\text{dir}} = -\sum_{i} \mathbb{1}_{\{c_i \neq \varnothing\}} \sum_{j=0}^{N_v - 1} \text{cos\_sim}(\hat{\mathbf{e}}_{\hat{\pi}(i),j},\ \mathbf{e}_{i,\hat{\gamma}_i(j)})$$

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

# 分层查询嵌入:实例级 + 点级
if self.query_embed_type == 'instance_pts':
pts_embeds = self.pts_embedding.weight.unsqueeze(0) # (1, Nv, D*2)
instance_embeds = self.instance_embedding.weight.unsqueeze(1) # (N, 1, D*2)
object_query_embeds = (pts_embeds + instance_embeds).flatten(0, 1) # (N*Nv, D*2)

分类分支:对同一实例的所有点特征取均值后预测类别;回归分支:每个查询独立预测 2D 坐标。

(来源:maptr_head.py

# 分类:将同一实例的 Nv 个点特征取均值
outputs_class = self.cls_branches[lvl](
hs[lvl].view(bs, self.num_vec, self.num_pts_per_vec, -1).mean(2)
)
# 回归:每个查询预测 2D 点坐标(相对 reference point 的残差)
tmp = self.reg_branches[lvl](hs[lvl])
tmp[..., 0:2] += reference[..., 0:2]
tmp = tmp.sigmoid() # 归一化到 [0, 1]
📄 点击展开 置换等价匹配(shift_fixed_num_sampled_points)代码

点级匹配的核心:对每个 GT 实例生成所有等价置换的点序,在匹配阶段选择 Manhattan 距离最小的那个。

(来源:maptr_head.py

# 在 _get_target_single 中,根据 assigner 返回的 order_index 选取最优置换
if order_index is None:
assigned_shift = gt_labels[sampling_result.pos_assigned_gt_inds]
else:
# order_index: (num_query, num_gt) 记录每对预测-GT最优的置换索引
assigned_shift = order_index[sampling_result.pos_inds,
sampling_result.pos_assigned_gt_inds]

# 使用最优置换索引从 gt_shifts_pts 中取出对应顺序的 GT 点集
pts_targets[pos_inds] = gt_shifts_pts[
sampling_result.pos_assigned_gt_inds, assigned_shift, :, :]

实验与分析

主要结果

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

关键发现

  1. MapTR-nano 首次实现实时矢量化高精地图构建(25.1 FPS),比 VectorMapNet 快 8 倍
  2. MapTRv2-R50 仅用 24 epoch 就超过 MapTR-R50 用 110 epoch 训练的结果(61.5 vs. 58.7 mAP)
  3. 纯视觉 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
Input: 6 cameras, 1600×900, resize ratio: 0.2 (nano) / 0.5 (tiny)
Batch Size: 32 (6 view images, 8× RTX 3090)
Optimizer: AdamW, lr=6e-4, weight decay=0.01, cosine decay
Backbone LR: ×0.1 multiplier
Schedule: 24 epochs (ablation) / 110 epochs (full)
BEV Grid: 0.3m (tiny) / 0.75m (nano)
Decoder Layers: 6 (tiny) / 2 (nano)
Instance Queries: 50 (tiny) / 100 (nano)
Point Queries: 20
Loss Weights: λ_c=2, λ_p=5, λ_d=0.005
Augmentation: Color Jitter
Training Memory: ~10287M (MapTR-tiny bs4) / ~19426M (MapTRv2 bs24)

复现要点

  1. 置换等价 GT 生成:需预先为每个 GT 元素生成所有等价置换的点集(shift_fixed_num_sampled_points),多线 2 种、多边形 $2N_v$ 种;实现时注意 polygon 的循环移位 + 方向翻转的组合顺序
  2. BEV 网格大小敏感:MapTR-nano 使用 0.75m 网格(效率优先)、tiny 使用 0.3m 网格(精度优先),二者的感知范围和分辨率差异会影响后续匹配和损失计算
  3. 边方向损失权重:$\beta = 5 \times 10^{-3}$ 是精心调优的结果;过大($10^{-2}$)反而降低 2 mAP,因为点级损失尚未收敛时强制约束边方向会引入矛盾梯度
  4. MapTRv2 一对多匹配显存:$K=6, T=300$ 时显存从 8458M 增至 19426M,需确保足够 GPU 显存;推理时该分支完全不参与
  5. 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)使得在线高精地图构建首次具备上车部署的可行性