添加小助理:cv3d001,备注:方向+学校/公司+昵称,拉你入群。文末附3D视觉行业细分群。
扫描下方二维码,加入
「3D视觉从入门到精通」知识星球
(
点开有惊喜
)
,星球内凝聚了众多3D视觉实战问题,以及各个模块的学习资料:
近20门秘制视频课程
、
最新顶会论文
、计算机视觉书籍
、
优质3D视觉算法源码
等。想要入门3D视觉、做项目、搞科研,欢迎扫码加入!
本篇文章提出了一种灵活且通用的SLAM框架,它通过模块化代码设计和多进程运行机制便于集成和迁移不同的算法,同时提供统一的结果输出和评估功能,实现了不同SLAM算法的公正比较。
论文链接:https://arxiv.org/pdf/2410.23690
代码链接:https://github.com/openxrlab/xrdslam
论文作者:Xiaomeng Wang, Nan Wang, Guofeng Zhang
本文提出了一种灵活的SLAM框架——XRDSLAM。它采用模块化代码设计和多进程运行机制,从而提供了高度可复用的基础模块,例如统一的数据集管理、三维可视化、算法配置和度量评估。这可以帮助开发者快速构建一个完整的SLAM系统,灵活组合不同的算法模块并且进行标准化的基准测试,以比较精度和效率。在该框架内,集成了若干种不同类型的最先进SLAM算法,包括基于NeRF和3DGS的SLAM(甚至里程计或者重建算法),其展现了灵活性和可扩展性。本文还对这些集成的算法进行综合比较和评估,分析了每种算法的特点。最后,本文将所有代码、配置和数据开源,旨在促进开源生态系统中SLAM技术的广泛研究和发展。
SLAM(同时定位和建图)技术在自动驾驶、机器人和AR/VR等领域中发挥着至关重要的作用。通过分析和融合传感器数据,实现了设备的精确6DoF(自由度)定位,并且实时构建环境地图,为自动驾驶、机器人导航和AR/VR等应用提供了基础功能。地图表示的形式对于SLAM算法的设计是至关重要的。尽管传统的SLAM算法通常基于稀疏或者半稠密的点云来表达场景并且通过手写规则来管理地图,但是这限制了SLAM技术的发展。
近年来,神经辐射场(NeRF)和3D Gaussian Splatting(3DGS)等技术在新型视图合成方面取得了重大进展。基于学习的场景表示利用了可微分栅格化、连续建模、噪声处理和空洞填充等优势,为SLAM领域注入了新的能量。一些最近的工作试图将NeRF和3DGS加入到SLAM系统中。一些方法直接使用RGB-D数据作为颜色和深度监督来训练网络参数并且优化位姿。其它方法仅依赖于RGB数据,通过加入正则化约束来优化网络和位姿。一些工作还通过引入ICP和ORB-SLAM等技术,将新技术与这些传统的SLAM技术相结合。此外,还有一些工作试图集成额外的网络来提供先验信息(例如深度先验、光流和法向量),旨在提高训练速度并且改进重建质量。
然而,随着新论文和技术的不断涌现,跟踪进展和集成代码变得越来越具有挑战性。很多研究实现分散于独立的代码仓库中,缺乏统一的开发和评估过程。这使得公正且全面的比较变得非常困难。此外,SLAM系统的复杂度为从头开始构建完整的SLAM系统带来了很高的技术障碍和开发成本。受到NeRFStudio在NeRF领域中的成功启发,本文引入了XRDSLAM,这是一种用于基于深度学习SLAM的可扩展且多功能的框架。本项工作的主要贡献如下:
模块化设计:
XRDSLAM采用多进程机制和模块化代码设计,从而将跟踪、建图和可视化过程解耦。该框架提供了模块化数据输入/输出、配置解析、可视化和结果导出功能模块,允许用于灵活组合和替换不同的算法模块,以实现快速迭代和优化。
统一的流程:
该框架提供了一个具有可复用组件的统一SLAM开发过程,使开发者能够轻松地构建完整的SLAM算法。它还标准化了数据处理和评估,实现了不同SLAM算法之间公正且有效的评估。具体而言,本文设计了一种专门的Model类来管理深度学习模型的所有操作,使开发者更容易地构建基于学习的算法。
SOTA算法的集成:
本文集成了最先进(SOTA)的SLAM算法,这验证了框架的灵活性和可扩展性,也促进了开源社区对不同算法的学习和比较。
XRDSLAM提供了一种高度可配置、高效且易于扩展的框架。受到NeRFStudio的启发,XRDSLAM采用模块化代码设计,通过继承和多态来组织SLAM组件。它通过集中管理的配置类来处理参数,并且使用多进程并行处理来加速跟踪、建图和可视化任务,从而显著提升系统性能。XRDSLAM结合了灵活的配置、资源共享和多进程机制,以构建一个多功能、高效的开发平台。
▲图1|XRDSLAM的系统概述
©️
【深蓝AI】编译
XRDSLAM框架如图1所示,主要处理四个部分的交互:
1)数据集输入:
该框架需要从一个或者多个传感器接收数据,例如RGB图像、深度图像、IMU数据等。XRDSLAM通过多个Dataset类来处理不同格式的数据集,并且提供了统一的数据加载接口和预处理功能;
2)核心SLAM算法:
XRDSLAM通过Algorithm和Model类来组织核心SLAM算法。用户可以通过继承和替换组件来快速实现和优化SLAM算法。Model类由Algorithm类调用。开发者可以通过Model类来设计和管理深度学习算法;
3)可视化:
XRDSLAM提供了在线和离线可视化工具。在线可视化工具实时显示SLAM系统的状态,包括2D图像渲染和3D场景表示,帮助用户进行调试和优化。离线可视化工具用于渲染和显示SLAM算法的结果,支持保存为视频文件以供后续分析;
4)评估:
XRDSLAM自动保存SLAM系统的结果,并且使用评估模块来评估轨迹和重建结果。
SLAM系统通常由多个模块组成,例如跟踪、建图和闭环检测。为了实现模块解耦和独立运行,XRDSLAM采用了多进程机制。该框架包含三个关键的子进程:Tracker、Mapper和Visualizer。
1)Tracker:
它负责处理输入数据并且输出相机位姿信息。它从Dataset类中接收数据,计算相机的位姿信息并且将结果传给Mapper进程;
2)Mapper:
它提取关键帧并且优化位姿和地图信息。Mapper进程从Tracker进程接收帧数据和位姿参数,以不断扩展地图,进一步优化相机位姿和地图参数,并且处理地图融合和更新等任务;
3)Visualizer:
它负责可视化轨迹、渲染图像和重建结果。它实时地从Tracker进程接收数据并且可视化它们。
通过Pytorch的多进程模块,XRDSLAM实现了这些进程的创建和初始化,实现了并行处理。这种多进程架构不仅提高了系统的效率和实时性,还允许每个模块独立管理资源,减少了资源竞争和冲突,从而提高了系统的稳定性和可靠性。此外,它还支持模块的独立扩展和优化,进一步增强了框架的灵活性。
XRDSLAM框架通过以下方法实现进程间数据共享和协调:
1)BaseManager:
它用于创建Algorithm类的共享实例,允许Tracker和Mapper进程方便地共享数据和功能。通过集中管理核心跟踪和建图功能,它促进了高效的数据交换和功能协作;
2)Queue:
它用于在进程之间传递数据流。Tracker进程将处理的位姿信息和输入帧信息打包成Frame,并且通过map_buffer将其传入Mapper进程。它还通过viz_buffer将系统状态信息传入Visualizer进程,从而实现高效的数据流传输。
3)Event:
它用于进程之间的运行和状态同步。事件event_ready和event_processed用于表示数据处理的准备和完成,确保Tracker和Mapper进程之间的有效协调和同步。
通过这些机制,XRDSLAM能够在不同进程之间保持数据和算法状态的一致性,同时使用缓冲区和事件同步来有效管理数据流和进程之间的协调。
XRDSLAM采用模块化设计,允许每个SLAM组件独立配置和扩展,从而提高系统的效率和可维护性。整个系统包括核心算法组件和通用组件。为了减少冗余开发,通用模块的评估和可视化被抽象为utility类。
基本组件包括用于配置参数、数据读取、位姿变换和相机模型等功能的常用基类。
▲图2|XRDSLAM的组成部分
©️
【深蓝AI】编译
1)Config:
与NeRFStudio一样,XRDSLAM使用配置类来组织和管理SLAM算法的参数和组件。该配置类继承自InstantiateConfig,并且通过setup方法来动态实例化相应的对象。系统中的每个组件均可以通过统一的方式来配置和实例化。XRDSLAMerConfig集中管理与SLAM运行相关的所有参数,并且通过该配置类,用户可以方便地控制SLAM系统的行为,简化参数管理和调试过程。配置类的使用不仅提高了代码的可读性,还增强了系统的灵活性和可扩展性。
2)BaseDataset:
基于NICE-SLAM代码,XRDSLAM通过get_dataset方法来支持多种类型的数据集,并且允许通过配置轻松扩展或者切换数据源,以满足不同的数据需求。数据集加载由继承自BaseDataset的多种数据集类和辅助函数来实现。这些utility类与各种数据格式和来源兼容,提供了一个统一的相机模型和数据加载接口,这有助于集成到SLAM框架中。目前支持的数据集包括Replica、ScanNet、TUM RGBD、7-Scenes、Co-Fusion和Euroc,其主要功能包括读取RGB和深度图像、IMU数据和相机位姿,以及执行必要的预处理(例如去畸变、降采样)。
3)OptimizablePose:
OptimizablePose类用于SLAM中的位姿优化,处理旋转和平移。本文扩展了Vox-Fusion代码中的OptimizablePose类,以支持两种旋转表示方法:角轴和四元数。它利用PyTorch的自动微分功能来实现梯度优化,高效地在位姿参数和旋转矩阵之间进行转换。OptimizablePose类包含在Frame类中。
4)Frame:
Frame类用于管理SLAM系统中的单帧数据,包括RGB图像、深度图像和位姿。它封装了这些信息,并且提供了设置、获取和优化的方法。通过继承torch.nn.Module,它有助于在深度学习框架内进行管理和优化。
5)Camera:
Camera用于管理XRDSLAM中的相机模型。目前,支持的模型是针孔模型。相机的内参和分辨率信息存储在Camera类中。
1)Algorithm:
Algorithm类是一个抽象类,它定义了实现SLAM算法所需的核心接口和方法。它提供了选择优化的帧、获取模型输入、计算损失、预处理和后处理等功能,为SLAM系统构建了通用的迭代优化过程。此外,该类包括用于优化器配置、系统状态维护和更新的抽象方法。
通过继承Algorithm类,可以实现不同的SLAM算法,以实现满足特定要求的自定义功能。XRDSLAM框架已经集成了各种算法,例如NICE-SLAM、Co-SLAM、Vox-Fusion、Point-SLAM和SplaTAM。每种算法在继承Algorithm类的基础上扩展了特定的优化和处理过程,展现了框架的灵活性和可扩展性。
此外,Algorithm类将跟踪和建图进程解耦,允许用户替换和结合不同的跟踪和建图方法,以快速验证各种解决方案。
具体而言,当跟踪功能直接使用输入真值位姿时,系统可以从传统的SLAM模式过渡到增量重建过程。NeuralRecon通过该方法集成到XRDSLAM中。对于不需要建图的算法(例如DPVO),开发者可以跳过Mapper模块,仅在Tracker模块中实现位姿跟踪功能。
2)Model:
Model类是所有特定网络模型的基类,为模型提供了基本结构和通用接口。它继承自PyTorch的nn.Module,用于定义和管理深度学习模型的主要组件。Model类的核心任务包括前向传播、损失计算和获取优化的参数。
子类根据模型的特定网络结构(包括编码器、解码器等)进行配置,管理模型输入和输出、损失计算、地图更新以及NeRF和3DGS渲染等过程。这些子类实现了不同地图表示的管理和更新,例如多分辨率特征网格、稀疏体素八叉树、哈希网格、神经点云、3DGS等。
3)Visualizer和OfflineViewer:
Visualizer类负责SLAM过程中生成的图像和3D数据的实时可视化。它从SLAM系统接收并且处理数据(例如位姿、RGB图像、深度图像、网格和点云),并且使用Open3D和Matplotlib来实时显示。核心功能包括轨迹显示、图像质量指标的计算和呈现以及可视化结果的保存。即时可视化效果使研究者能够快速调试和优化算法。
OfflineViewer用于回放SLAM算法的结果。它读取轨迹数据并且相应地更新界面中的图像、点云和网格。根据配置,OfflineViewer还可以将渲染结果保存为视频。
4)Metrics和Evaluation:
XRDSLAM支持获取和保存跟踪帧的位姿、渲染的图像以及场景的点云或者网格,并且根据真值数据来计算相关的评估指标。EvalMetrics类为SLAM结果提供了一个评估进程。SLAM系统的总体评估包括三个主要方面:渲染质量、3D重建质量和轨迹精度,具体指标包括:
轨迹精度:
在SLAM领域中,ATE是一种广泛使用的精度指标,本文用该指标来评估轨迹精度;
渲染指标:
本文采用PSNR(峰值信噪比)、SSIM(结构相似性指数度量)和LPIPS(学习感知图像块相似度)来评估新视图渲染的质量。
重建质量:
本文使用7个指标来全面评估重建的质量,包括精度、完整度、完成率、准确率、召回率、F-Score、L1-Depth。
表格1展现了在3D visualizer中运行的各种算法。其中包含5种SLAM方法、一种里程计方法和一种增量式重建方法,所有均集成在XRDSLAM中。
▲表格1|集成不同类型的SLAM,包括基于NeRF/3DGS的SLAM、里程计和重建,涵盖了不同的场景编码和几何表示
©️
【深蓝AI】编译
此外,XRDSLAM可以灵活支持各种场景编码格式和建图方法,例如NICE-SLAM的多分辨率特征网格、Co-SLAM的哈希网格、Vox-Fusion的稀疏体素八叉树、Point-SLAM的神经点云和SplaTAM的3DGS。
为了便于对现有SLAM算法进行评估,本文选择Replica数据集作为基准。Replica数据集提供了真实、高质量的空间重建结果、真值轨迹和RGBD数据,满足了测试和评估大多数当前SLAM算法的需求。本文使用8个室内RGBD序列进行评估。此外,开发者可以参考原始论文中提供的配置参数,用于在其它数据集上比较评估。
1)精度评估:
XRDSLAM提供了一个用于详细评估的评估模块。本文使用Replica数据集的原始分辨率和原始算法仓库提供的默认参数来比较算法的准确性。每个Replica数据集包含2000帧图像,每50帧进行一次场景渲染,以获得RGB和深度图像。Tracker进程实时更新轨迹估计,并且在运行完成后自动保存3D网格。在评估过程中,DPVO需要尺度校正,这是因为DPVO仅使用RGB数据而没有真实尺度。
表格2显示了多种原始算法及其集成版本(带“*”)在8个Replica数据集上的指标平均结果。原始算法和XRDSLAM集成的算法之间更好的结果以粗体表示。完整的评估表格可以在github仓库中查看。
▲表格2|从三个方面评估基于指标的集成方法:轨迹、渲染和重建
©️
【深蓝AI】编译
从表格2中可以明显看出,集成到XRDSLAM中的算法在精度方面与原始版本相当。在3D重建质量方面,Point-SLAM在精度指标上表现最佳。在图像渲染质量方面,Point-SLAM和SplaTAM均展现出出色的性能。在定位指标方面,DPVO的精度最高,SplaTAM的定位精度优于其它基于神经建图的方法。
图3显示了集成到XRDSLAM中的若干种SLAM方法在Replica/room0数据集上进行网格重建的定性结果,其性能逐步提升,从NICE-SLAM、CO-SLAM、Vox-Fusion到Point-SLAM。
▲图3|不同集成算法在Replica数据集上网格重建的比较
©️
【深蓝AI】编译
2)性能评估:
使用Python的tqdm库来统计每帧的运行时间,并且计算每种算法的FPS。表格1总结了在降采样的Replica/office0数据集上运行XRDSLAM的基准测试结果。由于NeuralRecon仅支持640x480分辨率,因此图像会从原始分辨率裁剪并且调整到这一分辨率进行测试。
表格1表明,在集成到XRDSLAM的算法中,NeuralRecon的效率最高。在SLAM算法中,使用哈希网格的Co-SLAM在效率方面表现最佳,而Point-SLAM和SplatTAM则效率相对较低。尽管SplatTAM在图像渲染方面更高效,但是由于需要处理每一帧和更高的迭代次数,系统的整体效率并不理想。
此外,XRDSLAM中NICE-SLAM的FPS与论文中的结果非常不同,主要是因为原始的NICE-SLAM默认在运行过程中提取网格,这会导致耗时更长。XRDSLAM标准化了数据保存过程,使得算法性能的比较更为公正。影响算法效率的因素不仅包括数据保存和算法自身的进程,还包括迭代次数、采样点数量和数据处理间隔帧。为了确保与原始算法的精度保持一致,在评估阶段使用了原始算法的默认配置。
表1还提供了XRDSLAM在Replica/office0数据集上运行时的峰值GPU内存使用情况(以GB为单位)。在测试过程中,Vox-Fusion的GPU内存最初飙升到大约10GB左右,然后下降并且稳定在4-6GB之间。SplaTAM的内存使用与分辨率密切相关,主要是因为它使用RGB-D点云进行GS初始化。基于神经点云的Point-SLAM随着点云地图的扩展,内存消耗也在增加。基于固定分辨率体素栅格和每帧恒定数量样本的CoSLAM和NICE-SLAM具有相对稳定的内存使用。NeuralRecon是一种增量式重建方法,随着地图规模的增加,内存消耗也会增加。
本文引入了一种新的通用SLAM框架——XRDSLAM。该框架提供了一个通用的接口和工具,使平台易于使用。模块化设计便于集成和迁移不同的算法,同时提供统一的结果输出和评估功能,实现了不同SLAM算法的公正比较。XRDSLAM显著降低了代码开发的成本并且提高了开发效率,从而促进SLAM技术的发展。
在该平台上,集成了最先进的SLAM算法(Vox-Fusion、NICE-SLAM、SplaTAM等),并且在统一的框架内进行客观评估,科学地分析了不同算法的精度特性和计算效率。
XRDSLAM: A Flexible and Modular Framework for Deep Learning
based SLAM