MapTR: Structured Modeling and Learning for Online Vectorized HD Map Construction

Task: Online Vectorized HD Map Construction
Method: Permutation-Equivalent Modeling, Hierarchical Query, Hierarchical Bipartite Matching
Venue: ICLR Spotlight
Year: 2023
Paper: https://arxiv.org/abs/2208.14437
Code: https://github.com/hustvl/MapTR

1. 摘要

MapTR(Map TRansformer)提出了一个结构化、端到端的 Transformer 框架,用于高效的在线矢量化高精地图构建。HDMapNet 走”BEV 分割 + 后处理”路线,VectorMapNet 走”DETR + 自回归 polyline 生成”两阶段路线,二者各有瓶颈:前者依赖 DBSCAN 启发式向量化,后者推理只能逐点串行(2.9 FPS)。MapTR 的核心创新是置换等价建模(Permutation-Equivalent Modeling)——把每个地图元素建模为带有一组等价置换的点集,精确描述几何形状的同时消除点序歧义;配合分层查询(实例查询 + 点查询的加性组合)与分层二部匹配(先匹配实例、再从置换组中选最优点序),首次实现了”一次前向并行预测 polyline”,把推理速度从 VectorMapNet 的 2.9 FPS 抬到 25.1 FPS(**+8×**)。MapTR-tiny 在 nuScenes 24-epoch 训练即达 50.3 mAP,比当时多模态最优方法高 13.5 mAP;MapTR-nano 在 RTX 3090 上达到实时(25.1 FPS)。

核心论点:矢量化高精地图构建的关键瓶颈是”形状歧义”——多线/多边形的同一几何形状对应多种等价点序,固定一种作为监督会与其他等价排列产生矛盾。把固定序换成”置换组 + 最优匹配”,配合分层查询与分层匹配,可以同时拿下精度(+5.9 mAP)和速度(+8× FPS)。

2. 问题与动机

方法类型 代表作 核心问题 mAP / FPS
BEV 语义分割 HDMapNet 栅格化 + DBSCAN 启发式向量化,缺乏实例级矢量信息 23.0 / 0.8
自回归序列预测 VectorMapNet 逐点串行推理(2.9 FPS)、点序歧义未解决 40.9 / 2.9
前视图车道检测 PersFormer / LSTR 仅单视图、单类型元素,无法处理全景多类地图
SLAM 离线建图 LOAM / LIO-SAM 流程复杂、维护成本高、自车定位误差敏感

核心痛点:地图元素(车道线、人行横道、道路边界)具有动态形状,无法像目标检测那样用 bbox 简单抽象;同一形状存在多种等价点序排列,将其中一种作为监督信号会带来梯度矛盾;现有方法要么慢(VectorMapNet 自回归),要么需要大量后处理(HDMapNet 启发式聚类)。

3. 核心洞察

洞察 1:置换等价建模——消除形状表示的点序歧义

传统做法:把地图元素表示为固定顺序的有序点列 $V_F = [v_0, v_1, \ldots, v_{N_v-1}]$,隐含规定了唯一的遍历方向和起点。

MapTR 做法:把每个地图元素建模为 $\mathcal{V} = (V, \Gamma)$,其中 $V$ 是点集、$\Gamma$ 是一组等价置换(覆盖所有产生相同几何形状的排列方式)。

对于多线(polyline,如车道线,2 个端点都可作为起点):

$$\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 个方向,共 $2N_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**)——polygon 的等价置换数最多($2 \times 20 = 40$ 种),消除歧义带来的收益最显著。

洞察 2:分层查询——结构化编码地图元素

传统做法(DETR 式):每个 query 对应一个实例的整体信息,难以编码”实例 + 多个内部点”的两层结构。

MapTR 做法:分别定义 $N$ 个实例级查询 $\{q_i^{\text{ins}}\}$ 和 $N_v$ 个点级查询 $\{q_j^{\text{pt}}\}$(所有实例共享),通过加法组合得到每个点的分层查询:

$$q_{ij}^{\text{hie}} = q_i^{\text{ins}} + q_j^{\text{pt}}$$

总查询数为 $N \times N_v$(如 50 × 20 = 1000),但参数量只是 $N + N_v$(70)。这种”实例 × 部件”的因子分解让每个点 query 自适应地分布在实例的不同位置,天然适配不规则形状,又避免了组合爆炸。

洞察 3:分层二部匹配——把”哪个实例”和”哪个点序”解耦

匹配也分两层:

Step 1:实例级匈牙利匹配——找到预测实例 → GT 实例的最优全局对应 $\hat{\pi}$;

Step 2:点级匹配——对每个正样本实例,从置换组 $\Gamma$ 中选出 Manhattan 距离最小的点序 $\hat{\gamma}$:

$$\hat{\gamma} = \arg\min_{\gamma \in \Gamma} \sum_{j=0}^{N_v - 1} D_{\text{Manhattan}}(\hat{v}_j, v_{\gamma(j)})$$

为什么更好:把”哪个实例”和”哪个点序”两个组合优化解耦——前者是经典 DETR 的全局二部匹配,后者只在置换组里枚举(多线 2 种、多边形 $2N_v$ 种),二者都可以在 GPU 上高效求解,避免了联合优化的指数爆炸。

三个洞察的递进关系

  1. 表示:用置换组消除几何形状的点序歧义;
  2. 查询:分层查询把实例 × 部件因子分解;
  3. 匹配:分层匹配让”实例对应”和”点序对齐”解耦求解。

要记住的 3 个数字

  • 50.3 mAP(24 ep, R50, tiny)vs 固定序 44.4 mAP:置换等价建模带来的纯增益 +5.9 mAP
  • 25.1 FPS(nano, R18)vs VectorMapNet 2.9 FPS:实时矢量化建图的奠基速度,**+8×**;
  • +11.9 AP on ped_crossing:消歧收益与等价置换数正相关的最强证据(polygon 的 $2N_v$ 远多于 polyline 的 2)。

4. 方法设计

4.1 整体架构

$$\text{6 cams} \xrightarrow{\text{Backbone}} \text{PV feat} \xrightarrow{\text{PV2BEV (GKT)}} \text{BEV feat} \xrightarrow{\text{Map Decoder}} {(\text{class}, \text{polyline}_{N_v\times 2})}$$

PV(Perspective View)特征:Backbone 在相机原始透视视角下提取的 2D 特征,保留了相机投影空间关系。PV2BEV 模块(MapTR 默认 GKT,也兼容 BEVFormer 的可变形注意力)负责把 PV 特征投影到 BEV 平面坐标系。

MapTR 架构图

ASCII 架构图:

6 cam (1600×900)
      │
      ▼
┌──────────────┐
│  Backbone    │   ResNet-18 / ResNet-50
│  (PV feat)   │   输出: 6 × C × H × W
└──────┬───────┘
       │
       ▼
┌──────────────┐
│  PV → BEV    │   GKT (Geometry Kernel Transformer)
│  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)

4.2 关键组件

模块 选型 作用
Backbone ResNet-18 (nano) / ResNet-50 (tiny) PV 图像特征提取
PV2BEV GKT(默认)/ Deformable Attn 2D → BEV 特征变换
Map Decoder 6 层 Transformer 分层查询解码
Self-Attn 全局 self-attention($N \cdot N_v$ tokens) 查询间交互
Cross-Attn BEV-based Deformable Attention 查询与 BEV 特征交互
匹配 分层匈牙利 + 置换组枚举 标签分配
分类头 同实例 $N_v$ 个点特征取均值 → FC 实例类别
回归头 每个点 query 独立预测 (x, y) 残差 点集坐标

损失函数

$$\mathcal{L} = \lambda_c \mathcal{L}_{\text{cls}} + \lambda_p \mathcal{L}_{\text{p2p}} + \lambda_d \mathcal{L}_{\text{dir}}, \qquad \lambda_c = 2,\ \lambda_p = 5,\ \lambda_d = 5\times 10^{-3}$$
  • 分类损失 $\mathcal{L}_{\text{cls}}$:Focal Loss;
  • Point-to-Point 损失:在最优置换 $\hat{\gamma}$ 下逐点 Manhattan 距离
$$\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)})$$

4.3 关键代码

分层查询通过实例嵌入 + 点级嵌入相加构成:

# 来源:projects/mmdet3d_plugin/maptr/dense_heads/maptr_head.py
# https://github.com/hustvl/MapTR/blob/main/projects/mmdet3d_plugin/maptr/dense_heads/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)

分类头对同一实例的 $N_v$ 个点特征取均值,回归头每个 query 独立预测 2D 坐标残差:

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

匹配阶段,对每个 GT 实例预先生成所有等价置换的点序 gt_shifts_pts,assigner 返回的 order_index 指向当前预测下的最优置换:

# 在 _get_target_single 中
if order_index is None:
assigned_shift = gt_labels[sampling_result.pos_assigned_gt_inds]
else:
# order_index: (num_query, num_gt) 记录每对 (pred, GT) 的最优置换索引
assigned_shift = order_index[sampling_result.pos_inds,
sampling_result.pos_assigned_gt_inds]

# 取出对应顺序的 GT 点集作为监督
pts_targets[pos_inds] = gt_shifts_pts[
sampling_result.pos_assigned_gt_inds, assigned_shift, :, :]

5. 实验与分析

5.1 主要结果

nuScenes val(论文 Tab. 1,AP 阈值 {0.5, 1.0, 1.5} m):

方法 模态 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

关键发现

  1. MapTR-nano 首次实现实时矢量化建图(25.1 FPS),比 VectorMapNet 快 且 mAP 高 5.0;
  2. MapTR-tiny 24-ep 即超过 VectorMapNet 110-ep 多模态成绩(50.3 vs 45.2 mAP),仅靠纯视觉 + 端到端范式;
  3. 110-ep 时三类元素全面超过 60 AP,证明并行 polyline 预测在精度上完全不输自回归生成。

5.2 消融实验:验证三个洞察

配置 关键现象 验证洞察
固定序 vs 置换等价 44.4 → 50.3 mAP(+5.9) 洞察 1
ped_crossing(polygon)增益 +11.9 AP(vs polyline 仅 +3.4 AP) 洞察 1(置换数越多收益越大)
分层查询 vs 单层查询 分层显著优于把所有点拼成一个长 query 洞察 2
分层匹配 vs 联合匹配 解耦显著降低匹配求解时间,且收敛更稳 洞察 3
Decoder 层数:6 → 2 nano 用 2 层换速度,精度下降约 8 mAP 工程权衡
BEV 网格:0.3 m / 0.75 m tiny 0.3 m / nano 0.75 m,精度 vs 速度 工程权衡

5.3 性能瓶颈分析

MapTR-tiny 推理时间分布(RTX 3090):

组件 耗时 (ms) 占比
Backbone 55.5 62.1%
PV2BEV (GKT) 12.3 13.8%
Map Decoder 21.5 24.1%
总计 89.3 100%

Backbone 占 60%,是主要瓶颈;Map Decoder(含 6 层 Transformer 与置换匹配)仅 24%,说明分层查询机制本身计算开销可控。

5.4 失效场景分析

  • 远距离地图元素:感知范围 $[-15, 15],\text{m} \times [-30, 30],\text{m}$,远端 BEV 分辨率低,细节丢失;
  • 严重遮挡场景:多车拥堵或施工区路面标线被大量遮挡,BEV 特征缺失;
  • 相机外参偏差:平移噪声 $\sigma > 0.5,\text{m}$ 或旋转 $\sigma > 0.02,\text{rad}$ 时 mAP 显著下降(50.3 → 34.0);
  • 夜间 / 雨天:定性结果稳定但碎片化预测增多。

6. 工程实践

6.1 训练配置

Backbone:        ResNet-18 (nano) / ResNet-50 (tiny)
Input: 6 cams, 1600×900, resize 0.2 (nano) / 0.5 (tiny)
Batch size: 32(6 view,8× RTX 3090)
Optimizer: AdamW, lr = 6e-4, weight decay = 0.01, cosine
Backbone LR: ×0.1 multiplier
Schedule: 24 / 110 epochs
BEV grid: 0.3 m (tiny) / 0.75 m (nano)
Decoder layers: 6 (tiny) / 2 (nano)
Instance queries: 50 (tiny) / 100 (nano)
Point queries: 20
Loss weights: λ_c=2, λ_p=5, λ_d=5e-3
PV2BEV: GKT (默认)

6.2 复现要点

  1. 置换等价 GT 预生成:每个 GT 元素需生成所有等价置换的点集(shift_fixed_num_sampled_points);多线 2 种、多边形 $2N_v$ 种;polygon 的循环移位 + 方向翻转的组合顺序要严格一致;
  2. BEV 网格大小:nano 0.75 m / tiny 0.3 m,感知范围与分辨率必须同步配置匹配损失计算;
  3. 边方向损失权重 $\lambda_d = 5 \times 10^{-3}$ 是精心调优的结果,过大($10^{-2}$)反而降低 ~2 mAP——点级损失尚未收敛时强制约束边方向会引入矛盾梯度;
  4. PV2BEV 选择 GKT:相比 LSS 或 BEVFormer 的 deformable attention,GKT 在精度 / 速度 / 部署友好度上较平衡;
  5. 分类头取均值:同实例 $N_v$ 个点特征 mean-pool 后再分类,避免每个点都打分带来的不一致。

6.3 性能优化方向

精度提升

  • 引入时序信息(多帧 BEV 聚合可加 1–3 mAP);
  • 替换更强 backbone(V2-99 / SwinT),代价是速度下降;
  • 加入辅助密集监督(深度 / PV 分割 / BEV 分割)——这正是 MapTRv2 的核心改进。

速度优化

  • Backbone 是首要瓶颈,可换 EfficientNet-B0 或蒸馏小模型;
  • 减少 Decoder 层数(6 → 2,nano 即采用此策略,精度 −8 mAP / 速度 +2×);
  • 降低 BEV 分辨率到 0.75 m(nano 路线)。

7. 研究启示

7.1 可迁移的思想

  • 置换等价建模处理几何歧义:任何涉及有序点集表示的任务(轮廓 / 路径 / 骨架)都会面临点序模糊问题,MapTR 的”置换组 + 最优匹配选择”是通用模板;
  • 分层查询分解实例-部件关系:实例 × 部件的因子化查询设计,参数量从 $N \cdot N_v$ 降到 $N + N_v$,可推广至人体姿态关节点、场景图节点-关系等任务;
  • 分层匹配解耦组合优化:先实例匹配再部件匹配的 two-step 策略,是处理”集合的集合”类问题的工程化标配;
  • DETR-style 端到端 + 一次性并行预测:彻底取代”自回归生成形状”的范式,是 VectorMapNet → MapTR 这次跃迁的本质。

7.2 方法局限

  1. 单帧推理,缺乏时序一致性保证;
  2. 感知范围受限于 BEV 网格($60 \times 30,\text{m}$),无法处理远距离 HD 地图;
  3. 不支持动态地图元素(临时施工标线、可变车道);
  4. 收敛仍偏慢(24 ep 50.3 → 110 ep 58.7),稀疏 query 范式天然正样本不足——这是 MapTRv2 用一对多匹配 + 密集监督要解决的问题。

7.3 技术影响

  • 开创了在线矢量化建图的 DETR-like 范式,BeMapNet、MachMap、PolyDiffuse、MapVR 等后续工作均以 MapTR 为基线;
  • 首次让在线高精地图构建具备上车部署可行性(25+ FPS 实时);
  • 置换等价建模直接被多个后续工作沿用(PivotNet、MapNeXt 等);
  • VAD / SparseDrive 等端到端规划工作直接消费 MapTR 的矢量化输出,打通了感知 → 规划的数据闭环;
  • 直接催生 MapTRv2,从精度(73.4 mAP)和功能(centerline / 3D)两个维度做全面增强。