HDMapNet: An Online HD Map Construction and Evaluation Framework

Task: Online Local HD Map Construction
Method: MLP View Transform, Camera+LiDAR BEV Fusion, Semantic + Instance + Direction Heads
Venue: ICRA
Year: 2022
Paper: https://arxiv.org/abs/2107.06307
Code: https://github.com/Tsinghua-MARS-Lab/HDMapNet

1. 摘要

HDMapNet 提出了首个面向在线本地高精地图构建的端到端学习框架。区别于传统离线高精地图依赖大规模人工标注 + SLAM 全局优化、维护成本高且无法实时更新的现状,本文以车载多视角相机 + LiDAR 为输入,直接在 BEV 空间预测出语义掩码 + 实例嵌入 + 方向场三类信息,并通过聚类与方向引导的贪心连接获得可用的矢量化地图元素(车道线 / 人行横道 / 道路边界)。在 nuScenes 上以多模态融合方案达到 39.7% IoU 与 35.2% Chamfer mAP,比当时基于 IPM / Lift-Splat-Shoot 的 BEV 分割 baseline 大幅领先,并配套提出了一套基于 Chamfer 距离的实例级评测协议,是后续 VectorMapNet / MapTR 等矢量化建图方法共同的起点。

核心论点:把 HD 地图从”离线人工资产”重塑为”在线车载推理任务”,并用栅格语义 + 实例嵌入 + 方向场三件套替代 SLAM + 人工标注的传统流水线。

2. 问题与动机

方案 代表 核心问题
离线 HD 地图 TomTom / HERE 等商用方案 标注昂贵、更新慢、要求精确定位
SLAM + 人工后处理 各种 LiDAR SLAM 全局一致性优化复杂,对车载部署不友好
BEV 分割 baseline IPM / VPN / LSS + 类别分割 只能给”哪类像素”,无法区分实例,难以矢量化

核心痛点:在车载实时算力下,从多模态原始传感器直接输出可用于下游规划的本地矢量化高精地图——既要语义、又要实例、还要方向,并且不能依赖 SLAM 与离线标注。

3. 核心洞察

洞察 1:MLP 视图变换替代 IPM / LSS

PV→BEV 转换是所有 BEV 方法的关键一步:

  • IPM:假设地面是平面,几何上严格但对地面起伏、车辆抖动极敏感;
  • LSS:用 depth 分布把像素 lift 到 3D 视锥再 splat,几何可解释但 depth 误差大;
  • HDMapNet:在每个视角上用一个通道级共享的 MLP 学习从 PV 特征到 BEV 特征的映射:

$$\mathcal{F}^{c}{\mathcal{I}^i}[h][w] = \phi^{hw}{\mathcal{V}^i}\big(\mathcal{F}^{pv}{\mathcal{I}^i}[1][1], \ldots, \mathcal{F}^{pv}{\mathcal{I}^i}[H^{pv}][W^{pv}]\big)$$

不假设几何先验,让网络自己学如何把 PV 像素重排到 BEV 网格。视图变换消融上,这个 MLP 方案 IoU 33.4%,显著好于 IPM 的 14.1% 与 LSS 的 27.4%。

洞察 2:语义 + 实例 + 方向,三分支让分割可向量化

只有语义分割是远远不够的——同类别的两条相邻车道线在像素上根本无法区分。HDMapNet 在 BEV 解码器后并行三个分支:

  1. 语义分支:FCN + 交叉熵,输出三类(divider / ped_crossing / boundary);
  2. 实例嵌入分支:用判别损失把同实例像素拉近、不同实例推远:

$$L_{var} = \frac{1}{C}\sum_{c=1}^{C}\frac{1}{N_c}\sum_{j=1}^{N_c}\big[|\mu_c - f_j^{\text{inst}}| - \delta_v\big]_+^2$$

$$L_{dist} = \frac{1}{C(C-1)}\sum_{c_A \neq c_B}\big[2\delta_d - |\mu_{c_A} - \mu_{c_B}|\big]_+^2$$

参数 $\delta_v = 0.5$、$\delta_d = 3.0$;

  1. 方向分支:把 BEV 平面方向离散为 $N_d$ 类,每个像素预测自己沿元素延伸的方向,作为后续向量化连接的引导。

后处理:DBSCAN 聚类(实例嵌入)→ NMS → 沿方向场贪心连接 → 输出矢量多段线。

洞察 3:BEV 是多模态融合的天然空间

Camera 提供语义和远处细节,LiDAR 提供准确深度与近距几何,二者在 BEV 空间天然对齐:

  • camera 分支:EfficientNet-B0 + MLP 视图变换;
  • LiDAR 分支:PointPillars + 动态体素化;
  • 融合方式:直接 BEV 拼接 + 卷积,简单稳定。

实验上:camera-only 33.4% IoU、LiDAR-only 33.9% IoU、Fusion 39.7% IoU——融合的提升幅度(+6 IoU)超过任何单一架构改进,验证 BEV-level fusion 的工程价值。BEVFusion 之后把这条路线工程化到极致。

三个洞察的递进关系

  1. 表示:MLP 视图变换给出可学习的 BEV 特征;
  2. 监督:语义 + 实例 + 方向三分支让特征可以被解码为矢量元素;
  3. 模态:camera + LiDAR 在 BEV 上融合放大整体性能。

要记住的 3 个数字

  • 39.7% IoU / 35.2% Chamfer mAP:nuScenes Fusion 模型上的语义/实例双指标;
  • **MLP 33.4% vs LSS 27.4% vs IPM 14.1%**:视图变换消融的关键对比,确立”学位置”在矢量化任务上的优势;
  • +6 IoU(融合 vs 单模态):BEV-level fusion 带来的纯增益,比换 backbone 更实用。

4. 方法设计

4.1 整体架构

一行公式概括:

$${\text{6 cams}, \text{LiDAR}} \rightarrow \text{BEV feat} \rightarrow {\text{semantic}, \text{instance emb}, \text{direction}} \rightarrow \text{vector polylines}$$

ASCII 架构图:

   6× surround cams                LiDAR sweep
        │                              │
        ▼                              ▼
  ┌───────────────┐              ┌──────────────┐
  │ EfficientNet  │              │ PointPillars │
  │     -B0       │              │  + dyn vox   │
  └──────┬────────┘              └──────┬───────┘
         │ F^pv (per-view)              │
         ▼                              │
  ┌───────────────────────┐             │
  │  Per-view MLP         │             │
  │  PV → BEV (learned)   │             │
  └──────┬────────────────┘             │
         │ F^c_BEV (W×H×C1)             │ F^P_BEV (W×H×C2)
         └─────────────┬────────────────┘
                       ▼
              ┌────────────────┐
              │ BEV concat +   │
              │  conv fusion   │
              └────────┬───────┘
                       │ F_BEV
        ┌──────────────┼──────────────┐
        ▼              ▼              ▼
  ┌──────────┐   ┌────────────┐  ┌────────────┐
  │ Semantic │   │ Instance   │  │ Direction  │
  │ FCN      │   │ Embedding  │  │ N_d-way    │
  │ (CE)     │   │ (var+dist) │  │ classify   │
  └────┬─────┘   └─────┬──────┘  └─────┬──────┘
       │               │               │
       └───────┬───────┴───────────────┘
               ▼
      ┌───────────────────┐
      │ DBSCAN + NMS +    │
      │ direction-guided  │
      │ greedy linking    │
      └─────────┬─────────┘
                ▼
        vector polylines
   (divider / ped_xing / boundary)

4.2 关键组件

组件 输出 功能
EfficientNet-B0 (×6 cams) per-view PV feature 共享图像 backbone
Per-view MLP $\mathcal{F}^c_{BEV}$ 学习 PV → BEV 映射
PointPillars + dyn vox + PointNet(64-d) $\mathcal{F}^P_{BEV}$ LiDAR BEV 编码
BEV concat + 2 conv $\mathcal{F}_{BEV}$ 多模态融合
Semantic FCN 3-class mask 类别预测
Instance embedding per-pixel embedding discriminative loss,供聚类
Direction head $N_d$-class 引导矢量化连接

损失函数(4 项加权):

$$\mathcal{L} = \mathcal{L}{\text{ce}} + \alpha, L{var} + \beta, L_{dist} + \gamma, \mathcal{L}_{\text{dir}}$$

4.3 关键代码

实例分支的判别损失是 HDMapNet 的核心可向量化设计,对应仓库中的 discriminative_loss 实现。

📄 点击展开 discriminative loss 关键逻辑(基于官方实现整理)
# 来源:hdmapnet/loss.py
# https://github.com/Tsinghua-MARS-Lab/HDMapNet

def discriminative_loss(embedding, instance_label,
delta_v=0.5, delta_d=3.0,
alpha=1.0, beta=1.0, gamma=0.001):
"""
embedding: [B, D, H, W] per-pixel embedding
instance_label: [B, H, W] 实例 id(0 为背景)
"""
B = embedding.shape[0]
var_loss, dist_loss, reg_loss = 0., 0., 0.
for b in range(B):
emb_b = embedding[b].view(D, -1) # [D, HW]
ids = instance_label[b].view(-1) # [HW]
unique_ids = ids.unique()
unique_ids = unique_ids[unique_ids != 0] # 去背景
C = len(unique_ids)
if C == 0:
continue

# 1) 每个实例的均值嵌入 mu_c
mus = []
for c in unique_ids:
mask = (ids == c)
mu_c = emb_b[:, mask].mean(dim=1)
mus.append(mu_c)
mus = torch.stack(mus, dim=0) # [C, D]

# 2) variance loss: 实例内拉紧
for k, c in enumerate(unique_ids):
mask = (ids == c)
d = torch.norm(emb_b[:, mask] - mus[k:k+1].t(), dim=0) - delta_v
var_loss += (torch.clamp(d, min=0.) ** 2).mean()
var_loss /= C

# 3) distance loss: 实例间推开
if C > 1:
for a in range(C):
for bb in range(a+1, C):
d = 2*delta_d - torch.norm(mus[a] - mus[bb])
dist_loss += torch.clamp(d, min=0.) ** 2
dist_loss /= (C * (C - 1))

# 4) regularization: mu 不要漂太远
reg_loss += torch.norm(mus, dim=1).mean()

return alpha*var_loss/B + beta*dist_loss/B + gamma*reg_loss/B

这段损失是后续矢量化能成立的核心保证:没有它,DBSCAN 无法稳定区分相邻的两条同类车道线。

5. 实验与分析

5.1 主要结果

nuScenes 验证集,语义 IoU(%):

方法 Divider Ped Crossing Boundary All
IPM 14.4 9.5 18.4 14.1
Lift-Splat-Shoot 27.4
VPN 33.9
HDMapNet (Surr) 40.6 18.3 41.4 33.4
HDMapNet (LiDAR) 36.6 22.5 42.5 33.9
HDMapNet (Fusion) 43.0 27.4 48.8 39.7

实例级 mAP(Chamfer 距离 {0.2, 0.5, 1.0}):

方法 Divider Ped Crossing Boundary mAP
IPM(B) 2.1 4.7 11.7 9.0
VPN 18.0 9.5 30.4 19.3
HDMapNet (Surr) 23.2 15.6 40.3 26.4
HDMapNet (Fusion) 31.3 23.9 50.4 35.2

关键发现

  1. MLP 视图变换在所有视图变换里 IoU 最高(33.4%),且不依赖 depth;
  2. Fusion 在三类元素上全面领先单模态;
  3. 论文同时提出了基于 Chamfer 距离的实例 mAP 协议,成为后续 VectorMapNet / MapTR 共同采用的评测标准。

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

配置 关键现象 验证洞察
视图变换:IPM 14.1% / IPM(B) 21.6% / IPM(CB) 26.6% / LSS 27.4% / MLP 33.4% MLP 显著优于几何 + 显式 depth 方案 洞察 1
三分支 ablation:去掉实例嵌入则无法区分相邻同类 矢量化质量崩溃,定性可见 洞察 2
模态:Cam 33.4% / LiDAR 33.9% / Fusion 39.7% 融合带来 +6 IoU 净增益 洞察 3
时序融合:1 帧 32.9% → 2 帧 35.8% → 4 帧 36.4% IoU 多帧聚合带来稳定提升 洞察 1(特征质量)
恶劣天气:晴 44.9% / 夜 39.3% / 雨 38.7% IoU LiDAR 的存在降低了对相机的依赖 洞察 3

注:实例嵌入分支的开关消融在论文中以定性可视化形式给出,未给完整中间数值;上表”效果”列为定性描述。

5.3 性能瓶颈分析

  • ped_crossing 类别 IoU 始终偏低(27.4%):人行横道的几何条带状结构对实例聚类不友好,DBSCAN 容易把相邻条纹合并;
  • 方向分支精度依赖 $N_d$ 的选取:$N_d$ 太小不够精细,太大类别不平衡,论文采用离散方向类别折中;
  • BEV 分辨率 256×256 受显存限制:远处元素在 BEV 上像素稀疏,远距离 mAP 显著下降。

5.4 失效场景分析

论文在第 5 节定性讨论:

  • 夜间 / 雨天:摄像头对比度差,IoU 从 44.9% 下降到 ~39%;
  • 遮挡区域:被前车挡住的车道线无法补全,模型也不会”幻觉”;
  • 复杂路口:多条边界与车道线交错时,实例聚类容易把不同元素错合。

6. 工程实践

6.1 训练配置

Camera backbone:  EfficientNet-B0 (ImageNet pretrained)
LiDAR backbone: PointPillars + dynamic voxelization + PointNet (64-d)
View transform: per-view MLP (channel-wise shared)
BEV resolution: 256 × 256 (其他实验也用更高分辨率)
Loss: CE (semantic) + var + dist + direction CE
Optimizer: Adam, lr 1e-3
Batch size: 32
Heads: 3 parallel (semantic / instance / direction)
Vectorization: DBSCAN + NMS + direction-guided greedy linking

6.2 复现要点

  1. 判别损失的 $\delta_v$ / $\delta_d$ 不要乱调:论文的 0.5 / 3.0 是经验最优,调小会让聚类边界模糊;
  2. direction 类数 $N_d$ 要与方向连接逻辑配套,否则贪心连接经常拐错方向;
  3. Camera 与 LiDAR BEV 必须严格几何对齐——两个分支用同一套 BEV 网格定义(中心、分辨率、范围);
  4. DBSCAN 的 eps:在 BEV 像素单位下设置,对最终 mAP 影响显著,与实例嵌入维度 $D$ 强相关;
  5. EfficientNet-B0 在多视角下显存敏感,batch 32 通常需要 8 卡 V100 起步。

6.3 性能优化方向

精度提升

  • 替换 MLP 视图变换为可微采样(如 deformable attention),引入显式几何先验;
  • 实例嵌入维度 $D$ 加大并配合更强的对比损失,缓解 ped_crossing 聚类合并问题;
  • 引入时序融合(论文已验证 4 帧带来 +3.5 IoU 的空间)。

速度优化

  • LiDAR 分支用稀疏卷积;
  • 后处理 DBSCAN 在 GPU 上重写,避免 CPU 瓶颈;
  • BEV 分辨率自适应:远处用低分辨、近处用高分辨。

7. 研究启示

7.1 可迁移的思想

  • “语义 + 实例 + 方向”三件套:把分割从”哪类”扩展到”哪类 + 哪个 + 朝哪”,是任何”栅格→矢量”任务的通用模板;
  • MLP 视图变换:在不知道几何先验时,用学习的方式做 PV→BEV 是高性价比起点;
  • BEV-level 多模态融合:camera 与 LiDAR 在 BEV 拼接是工程上最稳定的多模态范式(BEVFusion 把它推到极致);
  • Chamfer 距离实例评测:把”分割 IoU”升级为”实例集合的几何匹配”,成为后续矢量化建图论文的统一指标。

7.2 方法局限

  1. 后处理 pipeline 长(DBSCAN + NMS + greedy linking),失败模式难以追溯;
  2. 同类邻近实例的分离仍是聚类瓶颈(ped_crossing 27.4% 远低于 boundary 的 48.8%);
  3. 输出仍是栅格表示再启发式向量化,难以直接给下游规划用——后续 VectorMapNet / MapTR 直接端到端输出向量正是为此而生。

7.3 技术影响

  • 在线本地高精地图任务范式的奠基之作,证明了”地图可以是实时输出而不是离线资产”;
  • 提出的 Chamfer 距离实例 mAP 协议被 VectorMapNet、MapTR、MapTRv2 等所有后续矢量化方法继承;
  • 工业上,HDMapNet 的”语义 + 实例 + 方向”三分支结构被许多量产方案沿用作 BEV 分割的默认设计;
  • 为 VectorMapNet 的”端到端矢量化”提供了直接对比 baseline,催生了”栅格 → 矢量”的范式跃迁。