一、论文阅读知识储备
这篇论文是将NeRF结合进SLAM的探索性的尝试,在我的这篇文章中并没有太多涉及NeRF的详细解说,但看懂这篇论文有必须懂NeRF,所以推荐读者去看:【较真系列】讲人话-NeRF全解(原理+代码+公式)_哔哩哔哩_bilibili
论文原文地址:[2103.12352] iMAP: Implicit Mapping and Positioning in Real-Time (arxiv.org)
二、作者想要解决的问题
传统的基于点云的SLAM系统建出来的图是相对稀疏的,即使是号称稠密的SLAM系统也只是获得的点云更密集些,本质上还是离散的不连续的。而基于占据网格、SDF和TSDF这些隐式表示方法建出来的图又有这些问题:占据网格表达精细度不足且难以表示复杂材质,SDF光影效果和学习能力有限,TSDF色彩和纹理表现弱且对动态场景适应性差。要实现真正的稠密、连续的场景重建,就需要新的隐式表示来表达场景。受到大火的NeRF的启发,作者将NeRF结合进SLAM,用RGB-D输入做出一个实时的重建和定位系统——iMAP。这篇论文的效果说不上特别好,甚至可能不如一些传统的工作,它本质上是一次将NeRF融入SLAM的尝试,给后续许多工作提供了实验支撑。
三、iMAP的核心内容
1.系统总览
如图所示,分别是从RGB-D输入的当前帧色彩图像和深度图。用之前的帧优化后的MLP网络来进行Tracking获得当前帧的位姿,再用作者提出的关键帧选取策略来判断当前帧是否是关键帧,如果是关键帧就将当前帧和之前的帧放到一起组成帧集合,再用作者提出的训练策略来优化MLP网络。
2.隐式场景神经网络(Implicit Scene Neural Network)
作者采用与NeRF一样的网络架构,用一个MLP来表示场景,这个MLP以一个三维坐标p(x,y,z)为输入,有4个层隐藏层和2个输出头。其中每个隐藏层有256个特征值,两个头分别预测这个点的颜色值c(R,G,B)和体密度。作者在这里剔除了NeRF的观察方向输入,因为作者对于重建色彩没那么重视。NeRF之所以引入一个观察方向d输入,是因为从不同的方向看一个点,这个点的颜色是有变化。
为了将三维坐标升维到更高的维度上,作者应用了傅里叶特征网络(Fourier Feature Networks)中提出的高斯位置嵌入(Gaussian positional embedding)。这里就和NeRF里用的升维方法不同了。升维的计算方式为:,这里B是
维的矩阵。B还是可以从网络中学习的。
3.深度和颜色渲染(Depth and Colour Rendering)
给定相机位姿和像素坐标 [u, v],我们首先反投影单位化的观察方向并将其转换为世界坐标:
,这里的K是相机的内参矩阵。沿着r采样N个点,设每个采样得到的点距离光心的距离是{d1,d2,d3,......,dn},则采样点可以表示为pi = di x r。将pi升维后输入MLP,就可以得到pi对应的颜色值c(R,G,B)和体密度
。最后用下述公式渲染:
其中,
,
.
4.联合优化(Joint optimisation)
我们定义分别为RGB-D相机的拍摄的照片的颜色值、深度值和位姿。各项损失函数可以如下定义:
①光度损失:
其中,W是用于优化的帧的数量(之后的W都是这个含义)。
②深度损失:
其中。
③最后的损失函数就是上面两个损失的加权和:
5.关键帧选择(Keyframe Selection)
利用视频流中的所有图像联合优化网络参数和相机姿态在计算上是不可行的。然而,由于视频图像存在巨大的冗余(相邻帧之间的相似性很高),我们可以用稀疏的具有代表性的关键帧集合来表示场景,并基于信息增益(information gain)进行增量选择。总是选择第一帧来初始化网络和固定世界坐标系。每增加一个新的关键帧,就固定网络的参数,将新一帧的每条射线上的采样点输入到MLP网络中,得到渲染值,用渲染值和真实色彩求损失,更新这一帧的位姿直到收敛。将收敛后的渲染值求下述判断函数的值:
最后计算P小于0.1的像素的个数的比例(就是拿小于0.1的数量除以被采样的总数量),若P<(在这里作者设为0.65),就说明新进入的帧被MLP表示得不好。
6.主动式采样(Active Sampling)
①图像主动采样(Image Active Sampling):渲染和优化所有图像上得所有像素将在计算和内存上花费巨大。为了实时性,在每次迭代时只渲染和优化一个非常稀疏的随机像素集(每幅图像上随机地选取200个像素)。然后使用渲染损失来指导系统对重建效果不好的区域进行主动采样。
每次联合优化迭代分为两个阶段。首先,在一帧上随机均匀采样一组像素。对这些像素用已有的MLP网络和体渲染来渲染色彩值和体密度,计算损失,并更新网络和相机姿态。当当迭代收敛后,计算损失统计(就是计算帧上那片区域的损失更高,在第二阶段对损失更高的区域采样更多的像素)。为此,将每幅图像划分为[ 8 × 8 ]个网格,并计算每个正方形区域内的平均损失:
计算每个区域的概率分布:
最后按比例分配每个区域的采样点的个数。
②关键帧主动采样(Keyframe Active Sampling):作者通过一组选定的关键帧来不断优化MLP场景地图,作为记忆库(也就是作者在用当前帧优化MLP和帧位姿时,为了避免灾难性遗忘,而同时利用历史帧来优化网络),以避免网络遗忘。我们希望将更多的样本分配给损失较高的关键帧,因为它们涉及到新探索的、高度详细的或网络开始遗忘的区域。我们遵循一个类似于图像主动采样的过程,并为每个关键帧分配ni个样本,与关键帧之间的损失分布成正比。总而言之就是,那张关键帧的损失更高,那张帧上就采样更多的点。
③有界关键帧选择(Bounded Keyframe Selection):随着相机移动到新的和未探索的区域,我们的关键帧集不断增长。为了约束联合优化的计算量,在每次迭代中选择固定数量的关键帧,根据损失分布随机采样。我们总是在联合优化中包含最后一个关键帧和当前活动帧,组成一个W = 5的不断变化帧的有界窗口。如下图所示: