在线高精地图生成算法调研

一、HDMapNet

 整体的网络架构如图所示,最终的Decoder输出三个分支,一个语义分割,一个embedding嵌入分支,一个方向预测。然后通过后处理将这些信息处理成向量化的道路表示。方向预测把360度分为N份,然后GT的话是有两个方向为1,其余为0,我们得到两个方向,分别乘以步长得到下一个点,后处理就这样贪婪的将其连接。

img2bev的方式之前有IPM,通过假设地面的高度都为0来完成转换,但是因为存在地面倾斜和车的颠簸,我们并不能保证车道线被正确投影到BEV上。而LSS的话,由于没有显式的深度作为监督,所以效果也不是很好。这里我们采用VPN的方式,使用全连接网络来学习如何进行视角变换。

二、MapTR

1.论文创新点:

1.受DETR的影响,设计了一种端到端的矢量化地图构建算法,采用一种分层查询嵌入方案,灵活编码实例级和点级的信息,并进行分层二分匹配,依次分配实例和点。同时提出点对点损失和边缘方向损失对点和边缘级别的几何方向信息进行监督。
2.提出一种置换等价建模方法,将每个地图元素构建为一个具有一组等价置换的点集。
3.相比于HDmapNet的复杂耗时后处理,之前的vectorMapNet也是将每个地图元素表示为一个点序列,但是他是利用自回归解码器对点进行顺序预测,导致推理时间较长以及置换的不确定性。本文是同时预测多个实例的多个点,并行输出。

2.置换等价建模

地图元素可以分为两种,一种封闭形状的polygon,一种开放形状的polyline,两者都可以表示为有序的点集。第一种有2n种排列方式,第二种有两种排列方式,其实他们都可以用来表示一个地图元素,而vectormapnet里将GT的一个固定排列点集作为监督显然是不合理的。为此我们将一个地图元素所有的排列可能都作为匈牙利匹配的对象,相当于构建一种等价置换集合。

3.层级匹配 

先并行推测一个固定大小的地图元素集合N,同时我们也会对GT的地图元素使用空集填充,将其长度填充到N,每个地图元素包含(一个元素标签 + 地图元素点集 +  点集的所有排列组合),然后模型预测的地图元素包含(一个元素标签 + 一个地图有序点集),引入层级二分图匹配算法,按照顺序执行实例级别的匹配和点级别的匹配。
实例级别匹配:首先在预测的地图元素和真值之间找到最优的实例级别的标签分配,使得cost最小。代价有两部分,一个是标签的focal loss损失,一个是两个点集的位置匹配损失。
这里埋个坑,点集的位置匹配损失是指?有序点集还是无序点集,看公式应该是预测的有序点集和GT里面的无序点集,很奇怪这个和下面的点集匹配有啥区别
后续看了这个老哥的解读,上面说其实这个位置匹配损失和下面的点级别匹配损失一摸一样。
MapTR阅读笔记 环视车道线 - 知乎 (zhihu.com)


点级别匹配:实例级匹配完,和GT非空实例匹配的地图元素被看作正样本,我们对他们进行点级别匹配。也就是模型预测的点集和所有的GT点集排列组合求匹配成本,选择最小匹配成本的GT点集排列。这里求的是点与点之间的曼哈顿距离损失

4.模型结构

使用纯相机来生成在线高精地图,img2bev使用的地平线提出的GKT方法,对于BEV query,先通过内外参得到其在图像上的先验位置(可能对应多张图),并提取附近w*h核区域的特征,然后和bev query做交叉注意力机制。

得到BEV特征之后, 论文中使用一个类似于DETR结构的解码器,作者引入了两种query embedding,一个是实例级别的查询向量(有N个),一个是点级别的查询向量(有NV个),点级别的查询向量被所有的地图元素(也就是实例)共享使用。那么第i个地图元素的第j个点的分层查询表达式为其对应的实例级别查询向量 + 点级别对应的查询向量。

 得到每一个点的特征后,我们先将其送入多头自注意力机制,让分层查询相互交换信息(包括实例级以及点集之间),然后再采用可变形注意力机制来让分层查询与BEV特征之间进行交互,每个查询qij预测一个二维归一化的BEV上的xy坐标点,然后在坐标点附近来采样BEV特征,并更新这个查询qij的特征,就这样不断的迭代。最终每个地图元素都是一组参考点集合,把这个送入预测头,得到一个分类score和2Nv维度的向量,表示预测点集中Nv个点的位置。

 5.损失构成

对于实例级别的最优匹配结果,我们使用focal loss计算其分类损失。
然后点级匹配完成后,我们对点与点之间求曼哈顿的距离损失,来对点的位置进行约束。
但是,仅仅约束点的位置,对于边缘线的方向并没有很好的约束,所以加入了边缘方向损失,作者考虑配对点集里的预测边缘和真值边缘之间的余弦相似度,来进行约束。

6.MapTRV2的改进 

1.针对分层查询机制里面的自注意力模块进行解耦操作。这大大减少了内存消耗。

2.提出了更高效的交叉注意力机制变体。不仅对BEV特征进行,还对PV特征进行查询。

3.为了加速训练收敛,在训练时添加了一个one-to-many的辅助匹配分支。

4.添加了三个辅助密集预测损失,用来辅助训练。

首先说第一点:原本的预测query是N * Nv个点,然后做自注意力机制时间复杂度为(N * Nv)^2.
论文里对这里进行解耦操作,分别进行实例间自注意力机制和实例内点的自注意力机制。时间复杂度降为(N^2 + Nv^2).

第二点:之前的交叉注意力机制预测一个点在BEV上用可变形注意力提取特征,现在将点投影到图像上,再提取特征,使得特征更丰富。

第三点:我们把GT重复K次来作为辅助分支的真值,以此来增加正样本的比例。同时主分支与辅助分支共用解码器和点级query。

第四点:使用了LSS,同时加入深度预测辅助分支,PV语义分割分支,和BEV语义分割分支。深度预测损失参考BEVDepth。添加了一个额外的BEV分割头辅助训练。进一步为了充分利用密集监督,利用地图GT结合相机内外参得到在透视图上前景mask并使用辅助PV分割头训练网络。

 

7.关于MapTR的一些思考

 端到端的预测相较于基于pixel的逐像素预测,最终距离精度目前来看还是会差一点。但是省去了繁琐的后处理操作,所以实时性很强。同时由于其是直接对一个实例出20个点,所以模型对于遮挡会比pixel的更鲁棒。同时还有一个诟病就是训练时间过长,需要很久,个人认为在解码时,一个query会预测一个BEV上的位置,但是他都没有BEV上的准确特征,怎么可以得到准确的BEV位置那。比如他真实位置在(100,100),但是一开始模型随便预测一个(20,20),此时可变形注意力机制提取(20,20)附近的特征,那他可以修正吗?我感觉(20,20)的特征并不能很好的让他向(100,100)靠拢,因为它毕竟不是全局注意力机制,只是一个局部的,我感觉应该是这里导致他训练收敛一直很慢。

三、SuperFusion

采用多层级的图像点云特征融合来做。

首先是数据层面的融合,先将点云投影到图像,然后稀疏深度与图像进行concate,同时利用双线性插值得到密集深度图,对LSS的深度估计进行监督。

特征层面的融合,将点云的BEV特征作为Q去查询图像的特征,做cross-attention得到新的BEV特征,并通过一系列的卷积融合。得到点云BEV最终特征。

BEV层面的融合,将图像特征通过LSS转到BEV后,与点云BEV特征融合,但是由于内外参以及深度估计误差,所以直接concate会导致特征对不齐。所以它先concate然后学习一个flow field,根据据flow field对图像BEV特征进行重新计算(每个位置一个流动方向,然后双线性插值得到流动后的特征来作为当前图像BEV特征),然后再将两者concate。

其后处理部分和HDMapNet是一样的。

四、MachMap

五、MapVR

猜你喜欢

转载自blog.csdn.net/slamer111/article/details/132173286