作者丨黄浴@知乎

编辑丨3D视觉工坊

在2021.6接收于IEEE Robotics And Automation Letters的论文“CodeMapping: Real-Time Dense Mapping for Sparse SLAM using Compact Scene Representations“,arXiv在 2021.7.19上传,作者来自著名的伦敦帝国学院Andrew J. Davison组。

CodeMapping:稀疏SLAM实时密集建图(帝国理工学院)_深度图

本文为稀疏视觉 SLAM 系统提出了一种利用紧凑场景表示的致密制图框架。当今稀疏视觉 SLAM 系统可以准确可靠地估计相机轨迹和地标(landmarks)位置。虽然这些稀疏地图对定位很有用,但它们不能用于其他如避障或场景理解等任务。

本文的框架将 SLAM 系统产生的相机姿势、关键帧和稀疏点作为输入,并为每个关键帧预测致密深度图像。基于作者之前的工作CodeSLAM (““CodeSLAM — learning a compact, optimisable representation for dense visual SLAM”,CVPR'18),加入变分自动编码器 (VAE),以灰度、稀疏深度和来自稀疏 SLAM 的重投影误差图像为条件,预测不确定性-觉察的致密深度图。然后,VAE 使得多视图优化改进致密深度图像,提高了重叠帧的一致性。制图模块以松散耦合的方式与 SLAM 系统并行地单线程运行。这种设计可与任意量度的稀疏 SLAM 系统集成,不会延迟SLAM主过程。致密制图模块不仅可以用于局部制图,还可以通过 TSDF 融合进行全局一致的致密3D 重建,在实验中以ORB-SLAM3为例。

注:和本文思想相似的是CodeVIO(“CodeVIO: Visual-inertial odometry with learned optimizable dense depth,” arXiv:2012.10133, 2020),也是基于类似CodeSLAM VAE方法。

如图是系统概览图:致密制图模块订阅BA得到的稀疏点集和相机姿态,在单线程中运行致密预测和多视图优化。

CodeMapping:稀疏SLAM实时密集建图(帝国理工学院)_3d_02

该系统启动一个 SLAM 进程(跟踪、本地和全局地图线程)和一个连续并行运行的致密地图进程,直到输入的数据流停止。这项工作用 ORB-SLAM3 作为稀疏 SLAM 系统,支持多模态传感器输入,显示出最佳的性能。

SLAM进程

跟踪:使用传感器信息来估计相机相对于现有地图的姿态。在ORB-SLAM3 运行pose-only BA,最大限度地减少当前图像和地图之间匹配特征的重投影误差;这个过程实时地在每个输入帧完成,并且判断当前帧是否关键帧。

地图:运行BA做姿态和几何细化。ORB-SLAM3 为此运行局部和全局BA;局部BA仅用少量关键帧进行优化,而全局BA用整个图(graph)。每次局部BA后,SLAM 线程将数据从四个关键帧的窗口传输到致密制图(Dense Mapping)线程;四个关键帧包括最新的关键帧和基于 ORB-SLAM3 的共见性(covisibility)标准挑选的前三个共见(covisible)关键帧。关键帧数据由各自的相机姿态、稀疏深度和重投影误差图像组成;每个稀疏深度图通过关键帧的投影 3D 地标(landmarks)获得,重投影误差图的计算通过每个 3D 地标投影到所有可观测帧的相应匹配ORB特征位置得到的平均距离。与其他帧无匹配的新校准(registered)关键点,其重投影误差初始化为一个很大值 (比如10)。

致密制图进程

稀疏-致密预测:致密制图线程接收到来自 SLAM 线程的关键帧数据,检查该关键帧数据是否已经处理过;如果不,用稀疏深度和重投影误差输入图像运行深度补全(depth completion)VAE,预测初始密集深度图。深度补全 VAE 为预测的致密深度图生成低维潜码,用于之后的多视图优化。

多视图优化:初始预测之后,深度图通过SLAM 系统提供的相机姿态的滑动窗多视图优化进行细化(如下图所示);继续作者之前的工作DeepFactors (“DeepFactors: Real-time probabilistic dense monocular SLAM,” IEEE Robotics and Automation Letters, 2020)提出的基于因子图(factor graph)优化,考虑了重叠帧之间不同类型的因子(Photometric Factor、Reprojection Factor和Sparse Geometric Factor);其中仅优化每帧代码,而不优化相机姿态,因为假设来自稀疏 SLAM 的姿态已经足够准确,并且逐像素致密对齐(dense alignment)不太可能进一步提高准确性。

CodeMapping:稀疏SLAM实时密集建图(帝国理工学院)_3d_03

(左:稀疏SLAM点,中:初始深度补全,右:5-视角的优化)

如图说网络架构图:是DeepFactors的CVAE继续扩展结果。

CodeMapping:稀疏SLAM实时密集建图(帝国理工学院)_深度图_04

顶网络是一个 U-Net,将灰度图像与稀疏深度和稀疏 SLAM 系统的重投影误差图连接起来作为输入。与 CodeSLAM 和 DeepFactors 类似,深度和重投影误差值用邻近参数化(proximity parametrization)归一化到范围 [0, 1]。该网络通过多个卷积层计算特征,并输出深度不确定性(depth uncertainty )预测。

如下图给出的深度预测,没有考虑重投影误差的条件:红点由稀疏 SLAM 生成,网络完成致密几何重建。蓝色圆圈部分,突出显示的是预测受到的严重SLAM 点异常值影响。

备注:感谢微信公众号「3D视觉工坊」整理。CodeMapping:稀疏SLAM实时密集建图(帝国理工学院)_深度图_05

与内点相比,出格点往往具有更高的平均重投影误差值。因此,在 U-Net 输入包含稀疏重投影误差图,为网络提供每点的不确定性。底网络是由一个取决于分解特征的 VAE。这个网络生成潜码、致密深度预测和不确定性图 (uncertainty map)。该网络的损失函数由深度重建损失和KL散度损失组成。

深度重建损失定义为:

CodeMapping:稀疏SLAM实时密集建图(帝国理工学院)_深度图_06

遵循其训练/测试数据拆分,使用ScanNet 数据集大概0.4M图像。ScanNet 包含 Kinect 相机拍摄的各种室内 RGBD 图像。为生成稀疏深度输入,在彩色图像做ORB 关键点检测,并从每个 Kinect 深度图选择 1000 个关键点。VAE 的输入是原始 Kinect 深度图像,在当前姿态渲染给定 3D 场景模型获得深度图,作为损失函数的真值深度。

要生成重投影误差图不太简单,处理时间长,在整个 ScanNet 数据集运行 SLAM 系统不可行。相反,文章提出一种在训练期间模拟重投影错误的方法。ORB-SLAM3 的重投影误差分布在不同序列之间相似,并且非常类似于指数高斯分布(如图所示)。添加噪声给稀疏深度图,这样产生的重投影误差遵循此分布,可准确模拟 ORB-SLAM3 的属性。

CodeMapping:稀疏SLAM实时密集建图(帝国理工学院)_3d_07

数据集创建步骤见如下图所示。

CodeMapping:稀疏SLAM实时密集建图(帝国理工学院)_3d_08

首先,对数据集的每一帧(“参考帧”),随机选择一个距离参考(“虚拟关键帧”) 2 米以内的相邻帧。然后,将参考帧的点反投影到 3D ,并计算每个 3D 点到虚拟关键帧相机中心的线。对每个点,从指数高斯分布采样一个重投影误差。依此沿着这个线扰动一个点的位置,这样扰动点的 2D 投影和参考帧原始点2D 位置之间的距离,与这个采样的重投影误差值相匹配。此过程应用于所有稀疏深度测量,用扰动的稀疏深度图和重投影误差作为 U-Net 的输入。实验中以 0.0001 的学习率、256 × 192 的图像大小、32 的码大小和Adam 优化器,对网络进行 10 epochs的训练。

如图是多视图优化的因子图:

CodeMapping:稀疏SLAM实时密集建图(帝国理工学院)_3d_09

其中Photometric Factor定义为

CodeMapping:稀疏SLAM实时密集建图(帝国理工学院)_关键帧_10

而Reprojection Factor定义为

CodeMapping:稀疏SLAM实时密集建图(帝国理工学院)_深度图_11

最后,Sparse Geometric Factor定义为

CodeMapping:稀疏SLAM实时密集建图(帝国理工学院)_关键帧_12

一些实验结果如下:

CodeMapping:稀疏SLAM实时密集建图(帝国理工学院)_深度图_13CodeMapping:稀疏SLAM实时密集建图(帝国理工学院)_关键帧_14CodeMapping:稀疏SLAM实时密集建图(帝国理工学院)_关键帧_15CodeMapping:稀疏SLAM实时密集建图(帝国理工学院)_深度图_16CodeMapping:稀疏SLAM实时密集建图(帝国理工学院)_关键帧_17

今后工作,会在致密制图模块中考虑语义分割和实例分割。

本文仅做学术分享,如有侵权,请联系删文。



CodeMapping:稀疏SLAM实时密集建图(帝国理工学院)_深度图_18