NeRF based SLAM学习笔记(7):从Point NeRF到Loopy SLAM
Point NeRF
System Overview
场景表征
使用neural point cloud表示场景
$$
P = {(p_i, f_i, r_i)|i = 1,…,N}
$$
p表示坐标,f是feature vector,r是scale confidence value,表示位于实际场景表面附近的可能性。
参考资料
问题:
查询MLP的次数和原版NeRF差不多,拖慢了渲染速度;
比如,这里可以用上SNeRG[20] Baking Neural Radiance Fields for Real-Time View Synthesis. ICCV 2021. 这样的延迟渲染模型来加速,把一条射线上的采样点的特征融合之后再拿去解码,从而减少MLP查询次数;
点云密度和渲染质量之间需要平衡;
- 点云密度高,显存占用增加
- 降低点云密度,会降低渲染质量
小模型这样的问题不明显,但是场景扩大就有问题了;
Point SLAM
System Overview
场景表示
一系列的点云,每个点包括:位置、geometric特征向量、color特征向量
Point Adding Strategy
- 采样阶段:
- 对于每个映射阶段和给定的估计相机姿态,从图像平面均匀采样X个像素和在具有最高颜色梯度幅度的前10Y个像素中采样Y个像素。
- 像素转换到3D空间:
- 利用可用的深度信息,将这些像素转换到三维空间。在三维空间中搜索半径为r内的邻居点。
- 点的添加:
- 如果在搜索半径r内没有找到邻居点,则沿着光线添加三个神经点。这些点以深度读数D为中心,并且偏移量分别为(1 − ρ)D和(1 + ρ)D,其中ρ ∈ (0, 1)是一个超参数,用于考虑期望深度噪声。
- 初始化:
- 使用特征向量的正态分布初始化这些点。这三个点作为有限的更新带,其深度依赖性可用于建模深度相机的常见噪声特性。
- 点云的增长和收敛:
- 随着处理更多帧,神经点云逐渐增长以表示场景的探索,但当不再访问新的场景部分时,它会收敛到有限的点集。与许多基于体素的表示不同,不需要在重建之前指定任何场景边界。
该策略的关键思想是在SLAM过程中根据当前相机姿态和深度信息动态地添加特征点,以捕获场景中的重要结构并适应深度相机的噪声。这种方法允许在不提前知道场景边界的情况下进行建图,并且可以在场景探索过程中动态地调整特征点的分布。
Dynamic Resolution
简单说就是每个区域点的数量、密度都是动态调整的。这样可以在保持建图精度的同时,节省计算和内存资源。
颜色梯度比较大的地方,可能信息比较丰富,就需要更大的点密度,Point Adding Strategy添加点的半径就可以设置的小一些;
反过来,颜色梯度非常小的地方,那说明信息很少,可以更低的点密度,Point Adding Strategy添加点的半径可以更大一些。
Rendering
如果像素点有观测深度,就在深度前后采样5个点,按照距离计算权重;如果没有观测深度,就采样25个点,按照占用率计算权重。
其他的部分比较常见,这里不记录。
Mapping
损失函数很简单,这里有一个细节,对于每个mapping phase,首先只使用深度进行优化,论文认为这样可以更好的初始化颜色的优化过程。
但是最近也有研究深度噪声对重建影响的工作,这里就完全依赖深度了。
如果给的深度误差比较大,可能对重建的结果有不小的影响。
Tracking
和NICE-SLAM的Tracking非常相似。
Exposure Compensation
居然还有exposure MLP来处理不同帧之间曝光变化的问题。
实验部分
主要在Replica、TUM-RGBD和ScanNet上面测试。mesh是通过marching cubes算法获取的。
提到了对于motion blur和specularities(镜面反射)非常敏感。
Loopy SLAM
还是Point SLAM那个组做的工作
论文的贡献
- 我们提出了 Loopy-SLAM,这是一种密集的 RGBD SLAM 方法,它将神经特征锚定在点云子图中,这些子图在场景探索过程中以数据驱动的方式迭代增长。 我们根据相机运动动态创建子图,并逐步在子图关键帧之间构建姿势图。 全局位置识别用于在线检测循环闭合,并直接在场景表示上通过简单有效的刚性校正来全局对齐轨迹和子图。
- 我们提出了一种直接实现密集神经 SLAM 闭环的方法,与之前的工作相反,不需要场景表示的任何梯度更新或重新集成策略
- 传统上,严格的子图配准可能会在重叠区域中产生可见的接缝。 我们基于神经点云的方法避免了这种情况,并且我们在轨迹捕获结束时应用颜色和几何的特征细化。 我们进一步引入了重叠区域中子图的特征融合策略,以避免过多的内存使用并提高渲染性能。
论文提到的观点
作者认为SLAM可以分为耦合的方法和解耦合的方法,其中耦合的方法指的是使用相同的场景表示来进行tracking和mapping,解耦的方法对每个任务都使用独立的框架。
目前解耦的方法能够实现更好的跟踪精度,但是会产生不期望的数据冗余和独立性;
作者认为tracking和mapping是耦合的任务,可以用相同的场景表示;
这里不是很懂,作者提到的解耦的方法我刚好都没有好好的去看过,不过Orbeez-slam是使用传统方法tracking,再用instant-ngp做mapping的。
作者引用的解耦的方法:
- 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.
作者引用的耦合的方法:
- 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.
耦合方法中,除了MIPS_Fusion之外,其他所有方法都是实现的frame-to-model tracking,这会导致位姿出现显著的漂移。
解耦方法都使用多分辨率哈希网格,这样不容易进行地图校正。而基于点的表示方法特别适合进行地图校正。
对其他回环检测方法的评价
略,直接看论文的Loop Closure on Dense Maps.部分
System Overview
大部分流程都和Point SLAM一样,需要注意的是Keyframe Selection and Submap Initialization部分:论文认为过于频繁的创建子图也会增加姿态漂移,因此他们没有使用固定间隔等方法,而是根据相机运动去动态的创建全局关键帧。然后,在子图构建完成的时候进行闭环检测。
对于Building Submaps Progressively部分,提到了子图的第一帧作为全局关键帧,但是没有具体说明如何创建一个新的子图。。。不过Figure 2下面的描述倒是说创建新的全局关键帧的时候,会开始初始化一个新子图。
那估计这个系统的全局关键帧会挺少的,不然子图会比较多。。。
Loop Closure and Refinement
与MIPS-Fusion相比的话,这里的loop closure比较功利,每次开始新的submap就检测一次回环,MIPS-Fusion是开启新的submap之后,如果再回到之前submap的subvolume中才会检测,而且还有额外的条件。
Global Place Recognition 每个全局关键帧都被添加到Bow数据库中用于位置识别。这里论文cue了一下MIPS-Fusion,认为MIPS-Fusion这种通过重叠的submap去检测回环,只适合较小漂移的校正。
有点像ORB-SLAM的做法,这里我需要再好好了解一下
但是这里即使全局位置识别做得很好,自己用的还是子地图,而且还是每次开始新的子地图就检测一次回环,真不一定能比过MIPS-Fusion吧。。。
而且后面的实验也没有和人家MIPS-Fusion用过的数据集比较。。。
Pose Graph Optimization 下面是GPT的一个总结
这部分看不太懂,以后再好好研究一下吧。。。
Loop Edge Constraints 下面也是GPT的一个介绍
Feature Fusion and Refinement 在tracking结束之后才会开始连接所有子图来构成一个全局的神经点云,首先是进行特征融合来压缩模型,由于Loopy SLAM是基于Point SLAM的工作,本质上还是feature point+decoder的结构,这里论文选择的是特征融合之后固定decoder,然后把color 和 geometry feature再进行一个优化。
实验部分
Replica、TUM-RGBD数据集都用了,但是没有专门去找那种大场景、回环的。
不过论文在ScanNet上做了一些实验,倒是也有说服力的证明了自己的回环是有效果的。
但是我最近看的这些做回环检测的论文,实验都做的不太够。。
一方面,在经典的几个数据集上比较自己的性能;
另外一方面,只在某个能体现回环的数据集上证明自己回环有效果。