目录

前言

一、MapTR 想解决什么问题?

1. 在线

2. 矢量化

二、为什么传统方法不够理想?

1. 栅格表示不够自然

2. 后处理复杂且不稳定

3. 很难端到端优化

三、MapTR 如何表示地图元素?

1. 更贴近地图本质

2. 更适合下游任务

3. 可以借鉴目标检测中的集合预测思想

四、MapTR 面临的核心难点

1. 地图元素是结构化对象,不是简单目标

2. 同一个地图元素可能有多种等价表示

3. 地图预测具有天然层级结构

五、MapTR 的关键创新点

1. Hierarchical Query Embedding(层级查询嵌入)

2. Permutation-Equivalent Modeling(排列等价建模)

3. Hierarchical Bipartite Matching(层级二分图匹配)

六、MapTR 的整体框架怎么理解?

1. 提取多视角图像特征

2. 构建 BEV 表示

3. 使用 hierarchical map queries 解码地图元素

4. Transformer decoder 如何工作?

5. 输出矢量点集结果

七、MapTR 的 matching 机制怎么理解?

1. 实例级匹配

2. 点级匹配

八、MapTR 的损失函数怎么设计?

1. Classification Loss:管“这是什么”

2. Point-to-Point Loss:管“点在哪里”

3. Edge Direction Loss:管“形状像不像”

九、总结


前言

和传统的目标检测不同,高精地图构建并不是去识别“这是一辆车”或者“那是一个行人”,而是希望模型能够理解道路的整体拓扑与结构信息,例如:

  • 车道线
  • 道路边界
  • 人行横道
  • 路口导向线
  • 其他静态道路元素

这些信息对于自动驾驶系统的规划与控制模块来说非常重要。相比普通语义分割结果,结构化的地图信息更适合直接用于下游决策。

今天这篇文章,想聊一篇自动驾驶地图构建方向非常有代表性的工作:MapTR

它的核心思路可以概括为一句话:

将在线高精地图构建任务转化为端到端的结构化矢量元素预测问题。

如果你之前接触过 DETR、BEVFormer、VectorMapNet 一类工作,那么理解 MapTR 会更容易一些。本文尽量用通俗的方式,把 MapTR 的背景、核心思想、模型结构以及我个人的一些理解讲清楚。


一、MapTR 想解决什么问题?

先说结论,MapTR 主要解决的是:

如何从多视角相机图像中,直接预测出 BEV 视角下的矢量化地图元素。

这里有两个关键词:

1. 在线

“在线”意味着地图不是提前离线制作好再直接调用,而是车辆在行驶过程中,依赖实时传感器输入动态感知当前环境中的地图元素。

2. 矢量化

“矢量化”意味着模型最终输出的不是一张像素级的语义分割图,而是像车道线、边界线这类可以直接用点集、折线、曲线表示的结构化结果。

这件事为什么重要?

因为对于自动驾驶系统来说,真正有用的往往不是一张密密麻麻的分割图,而是诸如“这条车道线的几何形状是什么”“道路边界在哪里”“人行横道区域范围在哪”这类能够直接参与路径规划的结构化信息。

传统基于分割的方法虽然能做出 BEV 语义图,但通常还要经过一系列复杂的后处理,才能把分割结果转成可用的地图元素。而且后处理通常比较脆弱,一旦分割质量波动,最终地图质量也会受到明显影响。

MapTR 的价值就在这里:它希望绕过繁琐的后处理,直接预测矢量化地图结果。


二、为什么传统方法不够理想?

在 MapTR 之前,很多在线地图构建方法大致遵循这样的路线:

  1. 从多视角图像提取特征
  2. 映射到 BEV 空间
  3. 在 BEV 上做语义分割
  4. 再通过后处理提取车道线、边界线等地图元素

这个思路本身没问题,而且实现起来比较直观,但问题也很明显。

1. 栅格表示不够自然

车道线本质上是一条线,边界本质上也是线,人行横道则更接近一个区域或者多边形。

但如果统一把这些元素表示成二维栅格上的像素分类问题,其实有点“降维表达”的意思。虽然网络容易训练,但表达形式并不贴近地图元素的本质。

2. 后处理复杂且不稳定

从分割图到矢量元素,中间通常需要做骨架提取、连通域分析、曲线拟合、拓扑恢复等操作。这些步骤一旦处理不好,就很容易出现断裂、粘连、形状失真等问题。

3. 很难端到端优化

由于后处理往往不可微,训练时优化的是分割结果,但测试时真正用的是矢量结果,这中间存在目标不一致的问题。

所以从任务本质上来说,一个更合理的方向是:

既然最终想要的是矢量地图元素,那不如从一开始就直接预测矢量结果。

而这正是 MapTR 的核心出发点。


三、MapTR 如何表示地图元素?

MapTR 的一个重要设计是:

把地图元素统一表示为一组有序点集。

比如:

  • 一条车道线可以表示成若干个采样点连接形成的折线
  • 一条道路边界也可以表示成一组点
  • 某些区域类元素也可以转成点集形式进行建模

这样一来,地图构建任务就不再是“像素分类”,而变成了“结构化点集预测”。

这个表示方式有几个明显好处:

1. 更贴近地图本质

地图本来就是几何结构,不是像素块。

2. 更适合下游任务

规划与控制更容易消费矢量化结果,而不是去解析一张分割图。

3. 可以借鉴目标检测中的集合预测思想

既然每个地图元素都可以看作一个“实例”,那就可以像 DETR 一样,用 query 去预测一组地图元素。

也就是说,MapTR 本质上是在做一种 面向地图元素的集合预测,只不过每个实例输出的不是框,而是点集。


四、MapTR 面临的核心难点

看起来把地图元素表示成点集很自然,但真正做起来会遇到几个非常棘手的问题。

1. 地图元素是结构化对象,不是简单目标

在目标检测里,一个目标通常用一个矩形框描述就够了。但地图元素不一样,一条车道线可能由很多个点组成,形状是弯的、长的、不规则的。

这意味着模型不光要判断“有没有这条线”,还要预测“这条线具体怎么走”。

2. 同一个地图元素可能有多种等价表示

这是 MapTR 里非常关键的一个问题。

举个简单例子,一条折线如果由 20 个点组成,那么你可以从左到右描述,也可以从右到左描述。对于某些闭合区域,起点不同、遍历顺序不同,也可能表达的是同一个几何对象。

也就是说:

几何上是同一个对象,表示形式上却可能不唯一。

如果训练时硬性规定一种点序,模型就会变得很敏感。明明预测出的几何形状已经很接近真实结果,但只要起点不一致、顺序不同,损失仍然会很大。

这显然不合理。

3. 地图预测具有天然层级结构

地图元素的预测其实分两层:

  • 第一层:预测有哪些地图实例
  • 第二层:预测每个实例内部由哪些点构成

也就是说,这不是简单的一次性回归问题,而是带有层级关系的结构化预测任务。


五、MapTR 的关键创新点

围绕上面这些难点,MapTR 给出了几个很有代表性的设计。

1. Hierarchical Query Embedding(层级查询嵌入)

MapTR 没有把一个地图元素简单看成一个普通目标,而是明确引入了层级建模思路。

可以把它粗略理解成两层语义:

  • 实例级语义:这是什么地图元素
  • 点级语义:这个地图元素具体由哪些点构成

这种层级化设计的好处在于,模型不会只学到“检测到一条线”,而是能更细粒度地表达“这条线是由哪些关键点组织起来的”。

从任务本质上来说,这一步非常重要,因为地图元素本身就是强结构化的对象,不能只靠一个全局特征向量糊过去。

2. Permutation-Equivalent Modeling(排列等价建模)

这是我认为 MapTR 最有意思、也最值得学习的设计之一。

前面提到,同一个地图元素可能有多种等价点序表示。如果直接回归固定顺序的点,训练会非常不稳定。

MapTR 的做法可以理解为:

不把一种固定点序当成唯一标准答案,而是允许多个等价排列共同表示同一个地图元素。

这样模型训练时就能更关注几何形状本身,而不是死盯着某种人为规定的点排列顺序。

这其实是一个很有启发性的思想:
很多任务做不好,不一定是网络不够强,而可能是因为标签表示方式本身就存在歧义。

MapTR 通过排列等价建模,很好地解决了这种“同形异序”的监督问题。

3. Hierarchical Bipartite Matching(层级二分图匹配)

如果你熟悉 DETR,就知道它在训练时使用匈牙利匹配,把预测结果和真实目标一一对应起来。

MapTR 也借鉴了这种思想,但由于其输出是结构化地图元素,因此匹配过程不再只是简单比较类别和位置,而是要结合地图实例及其点集结构进行更细粒度的匹配。

换句话说,MapTR 把“集合预测”的思路从普通目标检测扩展到了“结构化地图元素预测”。

这也是它能做到端到端训练的重要原因。


六、MapTR 的整体框架怎么理解?

虽然论文中有不少细节,但如果从“输入—表示—解码—监督”这个角度去看,MapTR 的整体框架其实并不难理解。它本质上还是一个 encoder-decoder 范式:先把多视角图像编码成统一的 BEV 特征,再用结构化 query 去解码地图元素,最后通过层级匹配和几何损失完成训练。

1. 提取多视角图像特征

输入通常是环视相机图像。模型先通过 backbone 提取每个视角的视觉特征,再经过 neck 做多尺度特征融合。

这部分和很多 BEV 感知模型差不多,属于标准视觉特征提取流程。

2. 构建 BEV 表示

由于地图元素天然更适合在鸟瞰视角下表达,所以接下来需要把图像特征变换到 BEV 空间。

这一阶段的目标是得到统一的 BEV 特征图,用来描述道路场景的平面结构。

这里可以把 MapTR 理解成“站在很多 BEV 感知工作肩膀上的方法”。它真正的重点不在于如何从 2D 图像生成 BEV,而在于:有了 BEV 之后,怎样直接预测矢量化地图元素。

3. 使用 hierarchical map queries 解码地图元素

有了 BEV 特征之后,MapTR 会引入一组 map queries,但这里的 query 不是简单的“一个实例一个 query”就结束了。

MapTR 提出了 Hierarchical Query Embedding,也就是层级查询嵌入。你可以把它理解成两层:

  • instance-level query:负责表示“这是第几个候选地图实例”
  • point-level query:负责表示“这个实例内部的第几个点”

也就是说,MapTR 不只是让模型预测“有没有这条线”,而是显式让模型去建模“这条线由哪些点构成”。

这一点非常关键,因为地图元素本身就不是普通刚体目标,而是由点组织起来的几何结构。
如果只用一个实例向量去硬回归整条曲线,表达能力会比较吃紧;而 MapTR 通过“实例级 + 点级”两层 query,把地图元素的结构表达拆开建模,会更自然。

所以从这个角度看,MapTR 的 query 更像是:

实例槽位 + 点槽位 的组合,而不是 DETR 里单一的目标槽位。

4. Transformer decoder 如何工作?

在 decoder 中,这些层级 query 会不断和 BEV 特征交互,逐步形成地图元素表示。

如果说得更直白一点,这个过程可以理解为三件事同时发生:

  • 实例间交互:帮助模型区分“这是第 1 条线还是第 2 条线”
  • 实例内交互:帮助模型理解“这一组点应该连成什么形状”
  • 与 BEV 特征交互:帮助模型从鸟瞰特征中提取真正有用的道路几何信息

所以 MapTR 的 decoder 并不是简单“查一下特征然后直接输出”,而是在做一个结构化解码过程:既要学实例语义,又要学点集几何,还要学点和点之间的关系。

5. 输出矢量点集结果

最后,每个预测实例不再输出检测框,而是输出:

  • 地图元素类别
  • 对应点集坐标

也就是说,最终结果不是 bbox,也不是 segmentation mask,而是“类别 + 点集”的结构化矢量表达。

这也正是 MapTR 和普通检测框架最本质的区别:它预测的是矢量地图元素,而不是矩形目标。


七、MapTR 的 matching 机制怎么理解?

这部分是 MapTR 很关键、但很多文章容易一句带过的地方。

因为 MapTR 的输出不是 bbox,而是“地图实例 + 点集结构”,所以它的匹配也不是“预测框和 GT 框一一对应”那么简单。

MapTR 使用的是 Hierarchical Bipartite Matching,也就是分层做匹配。可以简单理解为两步。

1. 实例级匹配

第一层和 DETR 比较像:在固定数量的预测地图元素中,为每个 GT 元素找到最合适的那个预测实例。

这一步依然可以理解为 Hungarian Matching,但匹配代价不只是看类别,还要看点集位置。

也就是说,模型首先要解决的是:

哪一个预测实例负责哪一个真实地图元素。

2. 点级匹配

实例级匹配完成以后,问题还没有结束。

因为即便已经知道“这个预测实例对应这条 GT 车道线”,仍然还要进一步解决:

  • 预测出来的第 1 个点该对应 GT 的哪个点?
  • 起点从哪里开始算?
  • 顺序是正向还是反向?
  • 如果是闭合区域,多边形从哪个位置开始遍历?

这就是点级匹配存在的意义。

MapTR 的做法是:
对于同一个地图元素,允许多个等价排列参与比较,然后选择点级代价最小的那个排列作为监督目标。

这就把前面提到的 Permutation-Equivalent Modeling 真正落实到了训练过程中。

换句话说,MapTR 不是拍脑袋规定一种唯一点序,而是在训练时显式考虑:

同一个几何对象可以有多种等价点集表示。

这也是为什么它在结构化地图预测上比“固定点序硬回归”更合理。


八、MapTR 的损失函数怎么设计?

如果把 MapTR 的训练目标拆开来看,它的损失函数主要可以理解为三部分:

  • 分类损失
  • 点级位置损失
  • 边方向损失

这三部分分别对应三个问题:

  • 这是什么地图元素?
  • 每个点应该落在什么位置?
  • 这些点连起来之后的几何走向对不对?

1. Classification Loss:管“这是什么”

这部分比较直观。
在实例匹配完成之后,每个预测地图元素都会被赋予一个类别标签,然后通过分类损失进行监督。

这一项解决的是:

  • 这是 lane divider 还是 road boundary?
  • 这是 pedestrian crossing 还是 no-object?

这一部分和目标检测里的分类监督思路比较接近。

2. Point-to-Point Loss:管“点在哪里”

这是几何监督的核心部分。

在点级匹配确定之后,模型会对预测点和 GT 点之间的坐标误差进行约束。你可以把它理解成:

让预测出来的点尽量落在真实点附近。

如果只看这一项,它主要解决的是“节点位置准不准”的问题。

也就是说,它关心的是:

  • 车道线上的这些采样点是不是落在正确位置
  • 边界线上的关键点是不是偏移太大
  • 多边形顶点是不是贴近真实几何

3. Edge Direction Loss:管“形状像不像”

但只有点的位置损失还不够。

因为地图元素不是一堆独立散点,而是由点和点连接形成的折线、曲线或多边形。
如果只约束点坐标,模型虽然可能把点大致放对位置,但点和点之间连起来之后的整体方向和形状仍然可能不够稳定。

因此,MapTR 进一步引入了 Edge Direction Loss

这一项的作用可以理解成:

不仅要求点落得准,还要求这些点连起来之后的边方向尽量正确。

这样一来:

  • Point-to-Point Loss 负责约束点的位置
  • Edge Direction Loss 负责约束整体几何走向

前者更像“节点级监督”,后者更像“边级监督”。

两者结合起来,模型学到的就不只是一个散点集合,而是更接近真实道路几何形状的结构化结果。


九、总结

MapTR 是自动驾驶在线高精地图构建方向里非常有代表性的一篇工作。它的核心贡献,可以概括为以下几点:

  • 将地图元素统一建模为结构化点集
  • 用 Transformer 风格的集合预测框架直接输出地图实例
  • 通过层级查询嵌入建模实例级和点级关系
  • 通过排列等价建模解决点序不唯一问题
  • 用端到端方式实现在线矢量化地图构建

相比传统“BEV 分割 + 后处理”的路线,MapTR 更贴近地图构建任务的本质,也更符合自动驾驶下游模块对结构化表示的需求。

如果你正在学习以下方向:

  • 自动驾驶感知
  • BEV 表示学习
  • Transformer 在视觉中的应用
  • 矢量化地图构建
  • 结构化预测任务

那么 MapTR 绝对是一篇值得认真阅读的工作。


Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐