Neural Point SLAM回顾
引言
上一篇文章笔者回顾了Neural Point Rendering相关的工作,这篇文章笔者将聚焦于Neural Point在SLAM上的一些应用。
在NeRF时代出现的iMAP、NICE-SLAM、Co-SLAM等工作,他们的tracking基本都是渲染图像-计算损失-反向优化位姿;尽管也有Orbeez-SLAM、GO-SLAM等工作,但他们都借助了ORB-SLAM、Droid-SLAM等External Tracker,并不是在NeRF表示的场景之上直接做tracking的。
而到了3DGS时代,或许是因为研究惯性,早期的3DGS SLAM工作还是沿用了老一套的tracking方法:渲染图像-计算损失-反向优化位姿。
是不是NeRF SLAM做一半转3DGS了,偷看(/ω\*)……… (/ω•\*)
而到现在笔者写这篇文章,也没有了解到多少直接在3DGS上进行tracking的SLAM工作。另外,无论是NeRF SLAM还是3DGS SLAM,绝大部分工作都是通过子地图拼接来实现loop closure,或者只是通过位姿图优化(PGO)等方法在回环时调整了每一帧的位姿,并且需要进行额外的迭代优化来矫正地图。
如果有笔者没有注意到的工作,欢迎在评论区讨论分享!!!
RGBD GS-ICP SLAM可以算一篇在3DGS上进行tracking的工作,但代码实现上看着很奇怪。。。
不过,自从Point-NeRF等工作出现后,基于Neural Point的SLAM逐渐涌现。Point-SLAM将Neural Point的思路引入SLAM领域,而Point-SLAM的作者进一步提出了后续工作——Loopy-SLAM,在Point-SLAM的基础上实现了基于子地图拼接的Loop Closure。之后PIN-SLAM在Neural Point表示场景的框架下,实现了无需子地图的Loop Closure。
接下来笔者将着重介绍这三篇工作。
Point-SLAM: Dense Neural Point Cloud-based SLAM (ICCV 2023)
论文想要解决的问题:Can point-based neural scene representations be used for tracking and mapping for real-time capable SLAM?
论文的贡献:
- We present Point-SLAM, a real-time capable dense RGBD SLAM approach which anchors neural features in a point cloud that grows iteratively in a data-driven manner during scene exploration. We demonstrate that the proposed neural point-based scene representation can be effectively used for both mapping and tracking.
- We propose a dynamic point density strategy which allows for computational and memory efficiency gains and trade reconstruction accuracy against speed and memory.
- Our approach shows clear benefits on a variety of datasets in terms of tracking, rendering and mapping accuracy.
论文的Pipeline:
Neural Point Cloud Representation
场景表示:场景被表示为neural point cloud,每一个neural point包括位置、几何特征、颜色特征。
Point Adding Strategy:
- 采样阶段:在图像平面上均匀采样$X$个像素,并且在具有最高颜色梯度幅度的前$10Y$个像素中采样$Y$个像素。
- 判断是否需要添加点:利用深度图的信息,将像素点转换到三维空间,并且在每个点的半径$r$内查找是否有neural point。如果没有neural point,则需要添加neural point。
- 添加新的neural point:对于半径$r$内没有查找到neural point的那些像素点,需要沿着该像素的射线添加3个neural point,这三个点以该像素点的深度$D$为中心,偏移量为$(1-\rho)D$和$(1+\rho)D$,其中$\rho \in (0,1)$,是一个超参数,表示期望深度噪声。
- 初始化新的neural point:使用正态分布初始化每一个neural point的特征向量。
这个添加点的策略允许在不提前知道场景边界的情况下进行建图,并且可以在场景探索过程中动态地调整特征点的分布,即使是不再访问新的场景部分,它也会收敛到有限的点集。
Dynamic Resolution:
为了节省计算和内存资源,每个区域点的数量、密度都是动态调整的。
颜色梯度比较大的地方,可能信息比较丰富,就需要更大的点密度,Point Adding Strategy的搜索半径就可以设置的小一些。反过来,颜色梯度非常小的地方,那说明信息很少,可以更低的点密度,Point Adding Strategy的搜索半径可以更大一些。
Rendering
解码器设计:Point-SLAM吸收了NICE-SLAM中decoder的设计思路,使用与NICE-SLAM相同结构的解码器。其中geometry decoder表示为$h$,和NICE-SLAM一样都是预训练好的网络,网络参数被固定住不再优化;而color decoder表示为$g_\xi$,和NICE-SLAM一样,网络的参数$\xi$是需要训练的。
采样策略:与NICE-SLAM采样策略不同的是,Point-NeRF对于有深度的像素,在$(1-\rho)D$和$(1+\rho)D$之间均匀采样5个点,而对于没有深度的像素,在5cm和$1.2D_{max}$之间采样25个点。
Neural Point查找:对于每一个采样点,在半径$2r$内查找neural point,至少需要查找到两个点,否则该点的占用率为0。如果存在多个点,就只取最近的8个点来计算。
渲染过程:与NICE-SLAM、Point-NeRF等工作一样,都是采用体渲染得到深度和颜色。
与Point-NeRF在渲染上的区别:Point-SLAM像NICE-SLAM一样,设计了geometry feature和color feature,而Point-NeRF只有color feature。另外,Point-SLAM对color feature采用了“Per-point processing”的处理,而geometry feature没有经过这个处理。
Mapping and Tracking
Mapping阶段:在Mapping阶段,Point-SLAM在RGBD帧上均匀渲染$M$个像素,并且使用如下所示的损失函数。在最开始的迭代中,Point-SLAM只使用深度项进行优化,之后剩下的60%次迭代中才会引入颜色项。
Tracking阶段:Point-SLAM在每一帧中采样$M_t$个像素,并且使用恒速运动模型来初始化位姿。tracking使用的损失函数为:
Exposure Compensation
对于帧间曝光变化较大的场景,论文使用额外的模块来减少相应像素之间的色差。
实验部分
论文展示了非常多的实验结果,下面只截取一部分。
为什么fr1/desk2和fr1/room,传统的几个SLAM方法都跑失败了???
局限性
如果允许对neural point的位置进行动态优化,可以更好的处理深度噪声。
不过3DGS优化了每一个高斯的位置,也还是有比较严重的噪声。
点密度的局部自适应基于简单的启发式方法,理想情况下,这一过程可以通过学习的方法来实现。
对运动模糊和高光反射比较敏感。
Loopy-SLAM: Dense Neural SLAM with Loop Closures (CVPR 2024)
论文提到的观点:
作者认为SLAM可以分为耦合和解耦合的方法,其中耦合的方法指的是使用相同的场景表示来进行tracking和mapping,解耦的方法对每个任务都使用独立的框架。
目前解耦的方法能够实现更好的跟踪精度,但是会产生不期望的数据冗余和独立性。耦合方法中,除了MIPS_Fusion之外,其他所有方法都是实现的frame-to-model tracking,这会导致面对现实场景中带有噪声的数据,估计的位姿会产生显著的漂移。
但是frame-to-frame不应该更容易漂移?只不过frame-to-model太容易受到噪声影响了,毕竟model构建的不好,新来的frame估计的位姿也不好,又导致更新之后的model更差了,开始滚雪球了。
作者提到的解耦的方法:
- Orbeez-slam
- Newton: Neural view-centric mapping for on-the-fly large-scale slam.
- NeRF-SLAM: Real-Time Dense Monocular SLAM with Neural Radiance Fields
- Go-slam: Global optimization for consistent 3d instant reconstruction.
作者认为tracking和mapping是耦合的任务,可以用相同的场景表示。但是解耦方法基本都使用多分辨率哈希网格,这样不容易进行地图校正,而基于点的表示方法特别适合进行地图校正。(论文的motivation)
作者提到的耦合的方法:
- Eslam: Efficient dense slam system based on hybrid representation of signed distance fields
- Point-slam: Dense neural point cloud-based slam.
- iMAP: Implicit Mapping and Positioning in Real-Time.
- Co-slam: Joint coordinate and sparse parametric encodings for neural real-time slam
- Vox-fusion: Dense tracking and mapping with voxel-based neural implicit representation.
- Nice-slam: Neural implicit scalable encoding for slam.
论文的贡献:
- We propose Loopy-SLAM, a dense RGBD SLAM approach which anchors neural features in point cloud submaps that grow iteratively in a data-driven manner during scene exploration. We dynamically create submaps depending on the camera motion and progressively build a pose graph between the submap keyframes. Global place recognition is used to detect loop closures online and to globally align the trajectory and the submaps with simple and efficient rigid corrections directly on the scene representation.
- We propose a direct way of implementing loop closure for dense neural SLAM that does not require any gradient updates of the scene representation or reintegration strategies, contrary to previous works.
- Traditionally, rigid submap registration may create visible seams in the overlapping regions. Our approach based on neural point clouds avoids this and we apply feature refinement of color and geometry at the end of the trajectory capture. We further introduce a feature fusion strategy of the submaps in the overlapping regions to avoid excessive memory usage and to improve the rendering performance.
论文的Pipeline:
Neural Point Cloud-based SLAM
这部分基本与Point-SLAM是一样的,多了子地图构建的内容。
子地图的第一帧作为global keyframe,在当前子地图中,当前帧与对应的global keyframe的旋转角度或者相对平移超过设定的阈值,就会创建新的子地图。
在每个子地图中还会间隔一定帧选择一次local keyframe,用于优化子地图。但是当新的子地图被初始化时,这些local keyframe会被删除。
Loop Closure and Refinement
与MIPS-Fusion相比的话,Loopy-SLAM的loop closure比较功利,每次开始新的submap就检测一次回环。MIPS-Fusion是开启新的submap之后,如果再回到之前submap的subvolume中才会检测,而且还有额外的条件。
Global Place Recognition:每个全局关键帧都被添加到视觉词袋Bow数据库中用于全局位置识别。这里论文cue了一下MIPS-Fusion,作者认为MIPS-Fusion这种通过重叠的submap去检测回环,只适合较小漂移的校正。
Pose Graph Optimization:每个节点$T_s \in SE(3)$表示global keyframe在世界坐标系下的位姿的correction。姿态图中包括了两种边,其中odometry edge连接了相邻子地图的global keyframe,并且使用单位矩阵作为约束;loop edge连接不相邻的子地图的global keyframe,每次完成一个子地图就查询词袋(Bow)数据库,根据查询结果添加loop edge。PGO最终的输出是对global keyframe姿态的一组刚性校正变换$T$。
Loop Edge Constraints:对于子地图$P^s$和$P^t$之间的loop edge,需要计算约束条件$T_{st}$。论文提到,直接使用子地图中的neural point cloud是不稳定的,有两个原因:
- 密集表面配准方法需要在表面均匀采样,但是子地图的分辨率是动态的;
- 子地图中的锚定点(应该就是地图中的neural point)来自单个深度观测,可能会存在噪声,从而影响配准的结果。
因此,论文使用由粗到精的方法来对齐两个子地图,为了减轻上面提到的问题,论文通过volumetric TSDF Fusion来整合与子地图相关联的所有深度帧,并通过marching cubes提取表面,在表面上均匀采样得到新的点云$S^s$和$S^t$。
粗对齐阶段,论文使用Rusu等人(Fast point feature histograms (fpfh) for 3d registration)的全局配准方法。
精配准阶段,论文使用ICP在完整分辨率的点云上进行配准。
Feature Fusion and Refinement:在Tracking结束之后,Loopy SLAM会将所有子地图连接到一起组成一个global neural point cloud。这个过程首先在重叠的子地图区域进行特征融合来压缩模型,由于Loopy SLAM是基于Point SLAM的工作,本质上还是feature+decoder的结构,这里论文选择的是特征融合之后固定decoder,然后把color和geometry feature再进行优化。
实验部分
论文主要在Replica、TUM-RGBD、ScanNet上做了实验。
Tracking的结果:
Rendering和Reconstruction的结果:
运行时间、内存占用的结果:
场景中点的数量:
局限性
下面是论文提到的局限性:
可以结合使用frame-to-model和frame-to-frame queues的组合来构建更健壮的tracker;
类似于构建local map,实现frame-to-local model?
loopy-slam只利用了3D点特征,其实还可以利用关联关键帧的图像特征,从而实现更鲁棒更快速的配准;
位置识别可以通过学习的方法来提升;
loopy-slam没有实现relocalization。
relocalization指的是tracking失败的时候,重新定位相机所在的位置,恢复tracking。
下面是笔者认为的局限性:
- 没有在更大的场景中验证loop closure的有效性,比如TUM-RGBD fr3有两个专门用于回环检测的场景;
- 还是基于子地图拼接的思路实现的loop closure,不能够调整子地图中neural point之间的结构。
PIN-SLAM: LiDAR SLAM Using a Point-Based Implicit Neural Representation for Achieving Global Map Consistency (TRO 2024)
论文想要解决的问题:These SLAM approaches lack support for direct loop closure corrections and are not able to build globally consistent maps of larger scenes. This is mainly due to the usage of regular grid-based local feature embeddings, which are not elastic and resilient to loop corrections.
论文为什么选择neural point表示场景:We opt to use a neural point-based implicit representation, which has two main advantages over grid-based representations: the flexibility of spatial distribution and the elasticity for transformations. Recent work (Point-SLAM) only makes use of the first advantage for neural RGB-D SLAM at the cost of scalability and inefficient neighborhood querying. Instead, we exploit the second and more important advantage to build a globally consistentmap that can be corrected while online mapping after closing a loop, which is essential for large-scale LiDAR-based SLAM.
论文在Introduction提到,Mapping部分主要是基于之前的工作SHINE-Mapping,而Odometry部分是扩展了之前的工作LocNDF。
工作是延续的,非常扎实,令人羡慕。
论文提出了四个key claims:
- Our SLAM system achieves localization accuracy better or on par with state-of-the-art LiDAR odometry/SLAM approaches and is more accurate than recent implicit neural SLAM methods on various datasets using different range sensors.
- Our method can conduct large-scale globally consistent mapping with loop closure thanks to the elastic neural point representation.
- Our map representation is more compact than the previous counterparts and can be used to reconstruct accurate and complete meshes at an arbitrary resolution.
- Our correspondence-free scan-to-implicit map registration and the efficient neural point indexing by voxel hashing enable our algorithm to run at the sensor frame rate on a single NVIDIA A4000 graphics processing unit (GPU).
论文对基于Submap的方法的评价:The submap-based methods accumulate the observations as a submap and assume the submap is a locally defined rigid body. The pseudoglobal consistency is maintained by optimizing a graph linking submaps and their associated poses through submap-to-submap registrations. The usage of submaps decreases the number of nodes and edges in PGO, thus saving computational effort. However, these methods have issues of ambiguity in the overlapping region of the adjacent submaps and determining appropriate criteria for submap division to balance the rigidity and efficiency.
论文的Pipeline:
论文将他们的方法分成5个部分:
- Preprocessing:对于输入点云$P$,通过体素下采样到用于registration的点云$P_r$和用于mapping的点云$P_m$;
- Odometry:通过将点云$P_r$与local map $M_l$的implicit SDF进行配准来估计全局的位姿$T_{WC_t}$,并将前后两帧的变换$T_{C_{t-1}C_t}$作为一条边添加到Pose Graph $G$中。
- Mapping:根据地图$M$过滤掉用于mapping的点云$P_m$中的动态点,并沿着从传感器到$P_m$中每个点的射线进行采样,得到训练样本$D$,并使用在Odometry中计算的位姿$T_{WC_t}$将其转换到世界坐标系中。使用靠近场景表面的样本$D_s \subset D$来初始化新的neural point,并且将他们附加到地图$M$上,并且重置local map $M_l$,让其以当前位置$T_{WC_t}$为中心。使用采样的点$D_s$来更新训练样本池$D_p$,并且使用$D_p$和SDF监督来优化local map $M_l$中的neural point feature。最后将更新之后的local map $M_l$分配回global map $M$中。
- Loop closure detection:通过local map $M_l$生成一个本地极坐标上下文描述符$U_t$。之后通过比较当前帧和候选帧描述符之间的特征距离来搜索潜在的loop closure。一旦检测到当前帧$C_t$和候选帧$C_k$之间的存在闭环,就通过将当前帧点云$P_r$和以候选帧位置$t_{WC_k}$为中心的local map $M_l$进行配准,来验证是否真的存在闭环。如果配准成功,就将配准产生的变换$T_{C_kC_t}$作为新的边添加到Pose Graph $G$中。
- Pose graph optimization:加入loop closure edge之后,对pose graph $G$进行优化。优化之后对global map $M$中每个neural point的位置和方向及其关联帧进行变换,以保证全局一致性。在完成loop correction之后,对训练样本池$D_p$进行变换,并且重置local map $M_l$。
PIN-SLAM的内容非常多,可以移步这篇文章。
总结&讨论
在PIN-SLAM出来之前,笔者一直认为与NeRF、Neural Point相比,3DGS才是最“几何”的表示方法,毕竟3DGS显示的给出了点云,尽管这个点云有很多的噪声。
而当时一些neural point的工作,比如Point-NeRF论文中说“we find that directly optimizing the location of the existing points makes the training unstable and cannot fill the large holes”,笔者便认为neural point效果好主要是因为feature + decoder这一套流程的差值能力好,以及neural point也避免了在空白区域采样。而neural point的位置几乎无法优化,直接使用输入的点云,并且通过一些简单的加剪枝策略添加和删除点,那“几何”肯定是很好的,不过怎么利用这一点是个难解决的问题。
在Point-SLAM和Loopy-SLAM中,neural point是从RGB-D输入得到的,但是它们没有用传统的点云配准方法实现tracking,而是渲染图像-计算损失-反向优化位姿,其中Loopy-SLAM的loop closure也还是通过子地图的方式实现的,与之前一些基于feature grid的nerf slam没有太大的区别,并没有利用到neural point在几何上的优点。
而PIN-SLAM对neural point的开发很深入,不但实现了在neural point上进行tracking,也实现了不使用子地图的loop closure,工作做得非常完整。PIN-SLAM主要是面向lidar的,不过也扩展到了RGB-D的输入上,论文的实验部分展示了在Replica数据集上与一众RGB-D NeRF SLAM方法的对比,位姿精度遥遥领先。
笔者认为科研创新不是一蹴而就的,解决问题应该建立在完全认知问题的基础上。笔者目前在3DGS SLAM的研究上遇到一些困难,因此回顾了与3DGS很相似的Neural Point系列的方法,写了这两篇文章,希望能从中得到一些灵感,更全面的认识问题,也期待能和大家交流讨论。
参考资料
- How NeRFs and 3D Gaussian Splatting are Reshaping SLAM: a Survey
- Point-SLAM: Dense Neural Point Cloud-based SLAM
- Loopy-SLAM: Dense Neural SLAM with Loop Closures
- PIN-SLAM: LiDAR SLAM Using a Point-Based Implicit Neural Representation for Achieving Global Map Consistency
注:本文是笔者学习研究过程中的思考整理,如有错误疏漏,请各路大佬批评斧正!