草庐IT

论文阅读笔记-DAGMapper: Learning to Map by Discovering Lane Topology

xiaoliu-ya 2023-03-28 原文

Title:DAGMapper: Learning to Map by Discovering Lane Topology

题目:DAGMapper:通过发现车道拓扑学习制作地图

DAG:有向无环图

目标:通过车辆的一次通过获得的3D感官数据来绘制复杂高速公路的车道边界,这些车道由于分叉和合并而包含拓扑变化。

方法:首先利用安装在自动驾驶汽车上的激光雷达来构建一个鸟瞰世界的视图(BEV)。然后,我们利用一个深度网络提取下一车道网络的精确几何和拓扑。

输入:一个BEV聚合的激光雷达强度图像 \(D\)
输出:由深度神经网络参数化的车道边界的 DAG (与车道边界相对应的结构化折线的集合)。

难点:高速公路由于分叉和合并而包含复杂的拓扑变化

解决办法:通过在有向无环图模型 (DAG) 中构建推理问题来解决这些挑战,其中图的节点编码车道边界局部区域的几何和拓扑属性。由于我们事先不知道车道拓扑,我们也可以推断每个区域的 DAG 拓扑(即节点和边)。我们利用深度神经网络的力量来表示 DAG 中的条件概率。然后,我们设计了一个简单而有效的贪婪算法来增量估计图以及每个节点的状态。我们以端到端方式学习我们的深度神经网络的所有权重。我们称此方法为 DAGMapper 。

问题的制定和 DAG 的提取

标注道路:首先选取一个初始顶点,在车道边缘点击来跟踪车道边界,如果发生了拓扑变化(道路尽头、岔路)就进行相应的标注。

\(G = (V, E)\) 为 DAG ,其中 V 表示对应的节点集, E 表示定义拓扑的边。
DAG 中每个节点 \(v_i = (x_i,θ_i,s_i)\) 编码道边界局部区域的几何和拓扑性质,进一步用\(v_{p(i)}\)\(v_{c(i)}\) 表示节点 \(v_i\) 的父节点和子节点。

  • 几何分量 \(x_i\) 表示顶点在全局坐标中的位置
  • 几何分量 \(θ_i\) 表示在前一个顶点位置 \(x_{P(i)}\) 处的转角
  • 状态分量 \(s_i\) 是一个分类随机变量,表示:
    • 1是否在不改变拓扑的情况下继续车道边界,
    • 2在分叉处为新车道边界生成一个额外顶点,
    • 0终止车道边界(在合并处)。

网络设计


全局特征网络:该网络的目的是为头部网络构建特征以供使用。由于拓扑结构的变化通常是渐进的,如果特征仅捕捉局部的观测,或者网络的接收域很小,则很难推断出拓扑结构的变化。该网络的输入是鸟瞰图投影聚合 LiDAR 强度图像 \(D∈\mathbb{R}^{1×H×W}\) ,每像素5厘米。图像的宽(W)为8000pixel,长(H)为1200pixel,对应于测绘车行驶方向400m,宽度60m。为了更好地推断每个顶点的状态,必须利用更大的上下文信息。采用基于特征金字塔网络的编码器-解码器架构,对车道边界和场景的上下文进行编码。自底向上、自顶向下的结构使网络能够处理和聚合多尺度特征;跳过链接有助于在每个分辨率上保留空间信息。这个网络的输出是一个 feature map \(F∈\mathbb{R}^{C× \frac{H}{4} × \frac{W}{4}}\)

距离变换网络:距离变换 (DT) (更确切地说,阈值逆距离变换)网络是一种有效的映射特征。它对图像中每一点到最近的车道边界的相对距离进行编码。

  • 网络:采用了一个由一组残差层组成的 header
  • 输入:以全局特征图F作为输入
  • 输出:输出一个阈值化的逆 DT 图像 \(D∈\mathbb{R}^{1× \frac{H}{4} × \frac{W}{4}}\)
  • 我们使用这个 DT 图像 \(D\) 有三个目的:
    • 将它作为一个额外的通道叠加到全局特征映射 F 中,并将其提供给其他 header 。我们的目标是使用 \(D\) 作为关注车道边界位置的一种形式。
    • \(D\) 进行阈值化、二值化和骨架化,并获得骨架的端点作为图的初始顶点。
    • 在使用 alg1 推断图之后,通过初始化图中没有覆盖的 \(D\) 区域上的点来绘制错过的车道边界。

方向Header:该网络充当 \(p(θ_i|θ_{P(i)},s_{P(i)},x_{P(i)})\) 的近似值。该 header 根据父顶点的几何和拓扑信息,预测旋转后的 RoI 沿着当前顶点所在的车道边界的方向。

  • 网络:一个简单的卷积 RNN ,使用 RNN 来编码先前方向和状态的历史。
  • 输入:一个双线性插值轴对齐的裁剪,来自于以 \(x_{P(i)}\) 为中心的 F, D 的拼接和状态\(s_{P(i)}\)的通道式独热码。在分叉处或合流处,两条车道的边界非常接近。调节状态向量向标头发送信号以预测与其车道边界相对应的正确方向。
  • 输出:下一个旋转RoI的方向向量。

位置Header:这个网络可以被视为 \(p(x_i|θ_i,s_{P(i)},x_{P(i)})\) 的近似。给定前一个顶点的状态和位置,网络预测在由方向 header 生成的车道边界上旋转 RoI 内所有可能位置的概率分布。该 RoI 由 F、D 和 \(s_{P(i)}\) 的通道方式 one-hot 编码的串联中双线性插值而成的。插值后,我们将区域上采样到原始图像的维数,并将其传递给卷积递归神经网络 (RNN) 。 RNN 的输出被输入到一个轻量级的编码器-解码器网络,该网络输出 \(x_i\) 位置的 softmax 概率映射,该概率图映射到图像的全局坐标系。

  • 输入:前一个顶点的状态和位置
  • 输出: \(x_i\) 位置的 softmax 概率映射,该概率图映射到图像的全局坐标系。即在由方向 header 生成的车道边界上旋转 RoI 内所有可能位置的概率分布

状态header:该 header 可以看作是 \(p(s_i|θ_i,s_{P(i)},x_{P(i)})\) 的近似,它推断道边界的局部拓扑状态。具体来说,该网络预测了一个分类分布,指定是继续正常绘图,停止绘图,还是在我们到达合并时分岔一个新的车道边界。

  • 网络:利用卷积 RNN 对历史数据进行编码
  • 输入:相同的位置标题的旋转 RoI
  • 输出:三种状态的 softmax 概率

网络学习

采用多任务目标来监督模型的所有不同部分。 由于所有组件都是可区分的,我们可以端到端地学习我们的模型。 特别地,我们使用对称倒角距离将每条 GT 折线 Q 与其预测 P 匹配:

其中 p 和 q 分别是折线 P 和 Q 上的密集采样坐标。 为了学习拓扑状态,我们使用多标签焦点损失并稍作修改; 我们不是取所有个体损失的平均值,而是将它们相加并除以焦点权重的总和。 在这里,直觉是错误的预测被更多地强调并且不会被对应于正常状态的过采样类所抑制。 最后,我们使用余弦相似度损失和 l2 损失来学习方向和距离变换。

实验

数据集:我们的数据集由激光雷达点云组成,这些点云是通过驾驶一辆测绘车辆多次通过北美主要公路获得的。对于车辆的每次行驶,我们使用IMU里程数数据在一个任意原点的公共坐标系中聚合点云。在我们的离线地图设置中,局部区域点云的聚集来自过去以及未来的激光雷达扫描。接下来,我们将点云投影到鸟瞰图上,并通过取海拔最低的返回点的强度,以每像素5厘米的分辨率栅格化。由于我们对落在路面上的车道边界的高清映射很感兴趣,所以通过选取海拔最低的点,我们的目标是过滤掉来自其他移动车辆的激光雷达返回。

Baseline:由于文献中没有使用 BEV LiDAR 图像在高速公路上进行离线测绘的基线,我们基于 [6] 和 [21] 创建了两个基线。

  • 基线:对于由 (DT 基线) 表示的基于 [6] 的第一个基线,我们使用具有额外上采样和残差层的全局特征网络的相同主干,仅在原始图像维度上预测逆阈值 DT 图像。我们在车道边界每侧的 32 个像素处对距离变换进行阈值处理。接下来,我们对 DT 图像进行二值化并进行骨架化以获得车道边界的密集表示。这是一个非常强大的基线,因为主干网络的整个容量都致力于预测 DT 图像。但是,我们的方法不同之处在于我们以端到端的方式以折线的形式输出车道边界的结构化表示,这适用于循环中的注释器以进行校正任务。
  • 我们基于 (HRAN) 表示的 [21] 创建了第二个基线。 HRAN 架构的循环车道计数模块具有在图像底部从道路的左到右关注新车道边界的概念,这对于在分叉和合并处产生新车道边界的一般情况进行了分解。因此,我们通过在训练和推理过程中移除车道计数模块,而是为初始化提供地面实况起点,从而使该基线更加强大。请注意,我们的方法会自动从 DT 图像中推断出初始点。

有关论文阅读笔记-DAGMapper: Learning to Map by Discovering Lane Topology的更多相关文章

  1. ruby - 寻找通过阅读代码确定编程语言的ruby gem? - 2

    几个月前,我读了一篇关于ruby​​gem的博客文章,它可以通过阅读代码本身来确定编程语言。对于我的生活,我不记得博客或gem的名称。谷歌搜索“ruby编程语言猜测”及其变体也无济于事。有人碰巧知道相关gem的名称吗? 最佳答案 是这个吗:http://github.com/chrislo/sourceclassifier/tree/master 关于ruby-寻找通过阅读代码确定编程语言的rubygem?,我们在StackOverflow上找到一个类似的问题:

  2. UE4 源码阅读:从引擎启动到Receive Begin Play - 2

    一、引擎主循环UE版本:4.27一、引擎主循环的位置:Launch.cpp:GuardedMain函数二、、GuardedMain函数执行逻辑:1、EnginePreInit:加载大多数模块int32ErrorLevel=EnginePreInit(CmdLine);PreInit模块加载顺序:模块加载过程:(1)注册模块中定义的UObject,同时为每个类构造一个类默认对象(CDO,记录类的默认状态,作为模板用于子类实例创建)(2)调用模块的StartUpModule方法2、FEngineLoop::Init()1、检查Engine的配置文件找出使用了哪一个GameEngine类(UGame

  3. LC滤波器设计学习笔记(一)滤波电路入门 - 2

    目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称

  4. ruby-on-rails - 在 irb 中阅读文档 - 2

    我怀念ipython的一件事是它有一个?为特定功能挖掘文档的运算符。我知道ruby​​有一个类似的命令行工具,但是我在irb中调用它非常不方便。ruby/irb有类似的东西吗? 最佳答案 Pry是IPython的Ruby版本,它支持?命令来查找有关方法的文档,但语法略有不同:pry(main)>?File.dirnameFrom:file.cinRubyCore(CMethod):Numberoflines:6visibility:publicsignature:dirname()Returnsallcomponentsofthef

  5. Unity Shader 学习笔记(5)Shader变体、Shader属性定义技巧、自定义材质面板 - 2

    写在之前Shader变体、Shader属性定义技巧、自定义材质面板,这三个知识点任何一个单拿出来都是一套知识体系,不能一概而论,本文章目的在于将学习和实际工作中遇见的问题进行总结,类似于网络笔记之用,方便后续回顾查看,如有以偏概全、不祥不尽之处,还望海涵。1、Shader变体先看一段代码......Properties{ [KeywordEnum(on,off)]USL_USE_COL("IsUseColorMixTex?",int)=0 [Toggle(IS_RED_ON)]_IsRed("IsRed?",int)=0}......//中间省略,后续会有完整代码 #pragmamulti_c

  6. Tcl脚本入门笔记详解(一) - 2

    TCL脚本语言简介•TCL(ToolCommandLanguage)是一种解释执行的脚本语言(ScriptingLanguage),它提供了通用的编程能力:支持变量、过程和控制结构;同时TCL还拥有一个功能强大的固有的核心命令集。TCL经常被用于快速原型开发,脚本编程,GUI和测试等方面。•实际上包含了两个部分:一个语言和一个库。首先,Tcl是一种简单的脚本语言,主要使用于发布命令给一些互交程序如文本编辑器、调试器和shell。由于TCL的解释器是用C\C++语言的过程库实现的,因此在某种意义上我们又可以把TCL看作C库,这个库中有丰富的用于扩展TCL命令的C\C++过程和函数,所以,Tcl是

  7. ruby - 如何将 Vim 中的 "expand"文本转换成一种易于阅读的方式? - 2

    我经常使用嵌套数据结构,很多时候我必须从控制台手动分析它们。问题是它们全部打印在一行中。是否有一种简单的方法可以根据{,[,],}和逗号重新构造数据结构的显示,使其看起来像Ruby的pretty_print输出? 最佳答案 :%s/\([{,]\)/\1\r/gggVG=:setft=ruby呜呜呜 关于ruby-如何将Vim中的"expand"文本转换成一种易于阅读的方式?,我们在StackOverflow上找到一个类似的问题: https://stacko

  8. 计算机网络笔记:TCP三次握手和四次挥手过程 - 2

    TCP是面向连接的协议,连接的建立和释放是每一次面向连接的通信中必不可少的过程。TCP连接的管理就是使连接的建立和释放都能正常地进行。三次握手TCP连接的建立—三次握手建立TCP连接①若主机A中运行了一个客户进程,当它需要主机B的服务时,就发起TCP连接请求,并在所发送的分段中用SYN=1表示连接请求,并产生一个随机发送序号x,如果连接成功,A将以x作为其发送序号的初始值:seq=x。主机B收到A的连接请求报文,就完成了第一次握手。客户端发送SYN=1表示连接请求客户端发送一个随机发送序号x,如果连接成功,A将以x作为其发送序号的初始值:seq=x②主机B如果同意建立连接,则向主机A发送确认报

  9. 基于SpringBoot的线上日志阅读器 - 2

    软件特点部署后能通过浏览器查看线上日志。支持Linux、Windows服务器。采用随机读取的方式,支持大文件的读取。支持实时打印新增的日志(类终端)。支持日志搜索。使用手册基本页面配置路径配置日志所在的目录,配置后按回车键生效,下拉框选择日志名称。选择日志后点击生效,即可加载日志。windows路径E:\java\project\log-view\logslinux路径/usr/local/XX历史模式历史模式下,不会读取新增的日志。针对历史文件可以分页读取,配置分页大小、跳转。历史模式下,支持根据关键词搜索。目前搜索引擎使用的是jdk自带类库,搜索速度相对较低,优点是比较简单。2G日志全文搜

  10. ruby - 在使用 ruby​​ 中的 "mail"gem 阅读电子邮件时需要帮助 - 2

    我正在使用Watir进行自动化,它会创建一封我需要检查的电子邮件。有人指出电子邮件gem是执行此操作的最简单方法。我添加了以下代码,并且能够从我的收件箱中收到第一封电子邮件。require'mail'require'openssl'Mail.defaultsdoretriever_method:pop3,:address=>"email.someemail.com",:port=>995,:user_name=>'domain/username',:password=>'pwd',:enable_ssl=>trueendputsMail.first我是这个论坛的新手,有以下问题:如何获

随机推荐