赞
踩
论文原文:https://arxiv.org/abs/2103.12352
这篇文章来自Andrew Davison实验室,在ICCV 2021上发表。这项工作首创性的提出了在SLAM过程中使用MLP来表征场景地图,是SLAM与隐式神经网络的一次结合。
目录
这篇论文是受到了2020 ECCV一篇论文名叫NeRF的启发。
3D场景的表征可以分为"显式"和"隐式"表示。
显式表示(Explicit Representation):显式表示方法直接存储和表示场景的几何结构。这意味着它们以明确的方式存储场景中的每个对象的几何形状、位置和方向等信息。常见的显式表示方法包括三角网格、点云和体素等。这些方法直接捕捉了场景的几何形状,但可能需要较大的存储空间和计算资源来表示和处理复杂的场景。
隐式表示(Implicit Representation):隐式表示方法通过定义场景的函数或模型来表示场景,而不需要直接存储其几何结构。隐式表示可以看作是从输入的位置或坐标到场景属性(例如密度、颜色、法线等)的映射函数。常见的隐式表示方法包括体素网格、有向距离场(Signed Distance Field)、神经网络等。这些方法通常具有较小的存储需求,并且能够在更紧凑的表示中捕捉场景的细节和复杂性。
有关于NERF神经网络结构,已经有很多值得学习的博文,我就不在这里详细介绍了。博文链接附上,有兴趣的同学可以了解一下。iMAP的网络结构就是在Nerf上做了一些简化修改。
在论文中提到的MLP就是以nerf网络为基础进行的修改,它具有4个特征尺寸为256的隐藏层,以及两个输出头(这里的隐藏层是指神经网络中的中间层,用于处理输入数据并提取特征。每个隐藏层都有256个特征,表示在该层中使用了256个神经元来进行计算和转换。)
而两个输出头是指MLP网络的最后两层,用于生成网络的输出。在这个论文中,输出头的任务是预测三维坐标点p=(x, y, z)对应的颜色和体积密度值,即fθ(p) = (c, ρ)。换句话说,MLP的最后两个层分别负责预测颜色值c和体积密度值ρ。
图:Nerf神经网络结构
通过将输入坐标p输入到MLP网络中,经过多个隐藏层的处理和特征提取,最终通过两个输出头生成对应位置的颜色和体积密度值。这样的设计使得MLP能够学习输入坐标与颜色、体积密度之间的复杂非线性关系,从而实现对地图的建模和表示。
系统如何生成用于查询颜色和体积密度的光线样本呢? 也就是说如何找到一些列样本点,以便于将样本点的数据喂到神经网络中去?
首先,根据相机的内参以及像素坐标转化为归一化的观看方向,并转化为世界坐标。接下来,作者沿着光线方向取n个样本。这意味着在沿着观看方向的线上,作者选择了一系列采样点,每个采样点对应一个特定的深度值。这些深度值被表示为{d1, d2, ..., dn}。
一旦获得了光线样本点pi,作者就通过查询神经网络fθ(pi)来获取每个样本点的颜色和体积密度。换句话说,作者使用光线样本点作为输入,通过神经网络查询得到每个样本点的颜色和体积密度信息。
在得到体积密度之后,作者还会将体积密度转化为占用概率。将体积密度转化为占用概率的主要目的是将体积密度的连续值转换为更直观和可解释的表示形式。体积密度是描述场景中物质分布的属性,而占用概率则提供了一种更直观的方式来描述场景中的实体占据情况。(占用概率指示了一个体素是否被物体所占据的可能性。占用概率通常被定义为介于0和1之间的值,表示一个体素被认为是占用的概率。当占用概率接近于1时,表示该体素很可能被物体所占据;当占用概率接近于0时,表示该体素很可能为空白或未被物体所占据。)
在这种方法中,首先选择第一个图像帧作为初始关键帧,并使用它来初始化网络,并固定世界坐标框架。然后,每当添加一个新的关键帧时,系统会创建一个网络的副本,用于表示该时间点的三维地图的快照。随后的帧将与这个副本进行比较,如果它们观察到一个明显新的区域,就会被选为新的关键帧。
作者还提出了一种自适应的关键帧选择方法,用于确定哪些帧应该被添加到关键帧集合中,以便更好地表示场景并更新地图。
作者通过计算每个帧的归一化深度误差来衡量该帧已经被地图解释的程度。归一化深度误差是指实际深度值和地图快照预测的深度值之间的差异,并将其归一化为一定范围内的值。
作者定义了一个阈值TD=0.1,当归一化深度误差小于该阈值时,表示该帧已经被地图解释得相当准确。然后作者计算了该阈值下已被解释的帧的比例P,表示在所有像素样本中,有多少比例的样本已经被地图解释得相当准确。如果该比例P低于设定的阈值tp(作者设置为tp=0.65),即解释得准确的样本比例低于阈值的百分比,那么该帧将被添加到关键帧集合中。
当我们想要重建一个三维场景并生成真实的图像时,论文中提出了一种方法来同时优化两个关键部分:场景表示和相机姿态。也就是对神经网络函数参数的优化和相机姿态的同时优化。
(对于一些关键帧的数据,包括颜色和深度测量,这些测量是在初始相机姿态下进行的。我们希望找到更准确的相机姿态,并使用它们来改善场景的重建。)
首先作者使用了一个可微分的渲染函数,它将隐式场景网络的参数、相机姿态和关键帧的数据作为输入,并生成对应的渲染图像。
在优化过程中,作者通过调整网络参数和相机姿态,使渲染图像与实际测量数据更加吻合。
作者关注了两种误差:几何误差和光度误差。
几何误差表示渲染图像中像素的深度与实际测量的深度之间的差异,光度误差表示渲染图像中像素的颜色与实际测量的颜色之间的差异。通过不断迭代优化,调整了隐式场景网络的参数和关键帧的相机姿态,使得渲染图像更加真实地反映了实际场景的几何形状和外观特征。
光度误差:在给定的渲染图像中,我们希望通过神经网络生成的像素色值与实际测量的像素色值之间尽可能接近。为了衡量这种接近程度,论文中使用了光度损失来度量两者之间的差异。
光度损失是通过计算每个像素样本的渲染色值和测量色值之间的差异来定义的。具体地,对于每个像素样本,我们用EPi[u, v]表示其渲染色值和测量色值之间的差异。这里,ii[u, v]表示生成的渲染图像的色值,而ii[u, v]表示实际测量的色值。
然后用这个公式来计算误差损失,其中si是每个关键帧中所选的像素的数量,W是关键帧的数量,M是所有像素之和。
(为了度量这种差异,论文中将每个像素样本的差异值绝对值之和作为光度损失。这样做的目的是将渲染色值和测量色值之间的整体差异量化为一个标量值,方便在优化过程中进行梯度计算和损失优化。)
几何损失用于度量深度估计的准确性,其中通过比较实际深度值和预测深度值之间的差异来评估重建质量。具体地,给定像素坐标(u,v),我们可以通过深度图像提取实际深度值Di[u, v],而预测的深度值由神经网络产生,表示为ˆDi[u, v]。
为了量化深度估计的差异,我们可以计算几何损失,即将实际深度值和预测深度值相减,得到一个差异值,即i[u, v] = Di[u, v]−ˆDi[u, v]。这个差异值可以指示深度估计的准确性,较小的差异表示较好的重建。
作者使用深度方差作为归一化的因子,这样可以降低不确定区域(例如物体边界)的损失,通过将几何损失除以深度方差,可以将损失归一化,并降低在不确定区域的权重,以减少对于不确定区域的过度优化。
最后,作者使用了ADAM优化器来优化他们的模型。(ADAM是一种常用的梯度优化算法,用于更新神经网络的参数,以最小化损失函数。)
这两个损失函数的加权和被用作优化器的目标函数。并且,作者使用了一个权重因子λp来调整光度误差的重要性。
在传统的图像优化方法中,绘制和优化所有图像像素需要大量的计算和内存开销。为了减轻这种负担,iMAP采用了图像的规律性,并引入了图像主动采样的策略。
具体而言,在每次迭代时,iMAP不会对整个图像的所有像素进行渲染和优化,而是只选择一组非常稀疏的随机像素集进行处理。每张图像中只选择了200个像素作为样本进行优化。这样做的好处是能够降低计算和内存开销,加快优化的速度。
此外,iMAP还利用渲染损失来指导主动采样的过程。渲染损失是通过比较渲染色值和测量色值之间的差异来定义的。在信息较多的细节区域或者重建尚不精确的区域,渲染损失较大,表明需要更多的样本来优化该区域。因此,在这些区域,iMAP会主动选择更多的像素进行采样,以提高重建的准确性。
在采样阶段,首先将每个关键帧的深度图像和颜色图像分成一个[8×8]的网格。然后,在每个网格中均匀地选择一组像素作为采样点。在每个区域中,我们计算采样像素Si在该区域内的平均损失。这些采样像素是从每个区域中均匀采样得到的。通过计算每个区域的平均损失,我们可以得到关于该区域损失的统计信息。
我们将这些统计量归一化为一个概率分布。最终的目的是使用这个分布来重新采样每个区域,生成一组新的采样样本。这些新的样本数量与刚刚计算得到的损失统计有极高的关联性,可以看到,中间这些损失较高的区域,会分配到跟多的采样点,而四周损失较低的区域则分配较少的采样点。
通过这种方式,我们将更多的样本分配给损失较高的区域,从而在优化过程中更加关注这些区域。这样可以提高对信息较多的细节区域或重建不精确的区域的采样密度,以获得更准确的重建结果。
对于关键帧的选择也用到了相同的思想。
随着相机的移动,我们的关键帧集会不断增。然而,在联合优化计算中,同时考虑所有关键帧可能会导致计算负担过大,无法满足实时性要求。因此,在每次迭代时,我们从关键帧集中随机采样一固定数量的关键帧。采样的概率基于关键帧的损失分布,即损失较高的关键帧有更高的概率被选中。
在有界关键帧选择中,我们始终包括最后一个关键帧和当前活动帧参与联合优化。这样可以确保我们在优化中考虑了最新的信息,并将新的观测结果纳入到场景地图的建模中。我们构建一个有界窗口,其中包括最后一个关键帧和当前活动帧,加上另外几个采样的关键帧,总数通常为5个。
首先需要明确系统需要一个初始化的过程,主要涉及以下几个步骤:
网络参数初始化:在开始使用iMAP系统之前,全连接神经网络fθ的权重和偏差需要进行初始化。通常可以使用随机初始化的方法来设置网络的初始参数。
相机姿态初始化:在系统启动时,需要获取相机的初始姿态信息。这可以通过传感器提供的初始姿态估计(例如惯性测量单元IMU)或者使用其他初始化算法(例如追踪算法)来得到。
场景初始化:初始时,系统还没有对场景进行建模。因此,需要选择一个起始关键帧作为初始关键帧,并使用它来初始化场景地图。初始关键帧可以是视频流中的第一帧或手动选择的特定帧。
iMAP的框架和传统SLAM类似,nerf模型可以看作三维地图。iMAP输入RGB-D图像,分为Tracking和Mapping两个线程,优化相机位姿及nerf模型。
Tracking线程使用当前的nerf模型优化当前的相机位姿;同时判断该帧是不是关键帧,如果是关键帧,则送入mapping线程,关键帧的位姿和nerf模型一同优化。由于对图像每个像素都进行优化非常耗时,因此作者提出了一种主动采样的策略,将图像划分为多个patch,根据每个patch的loss作为权重采样共计200个像素进行优化。
imap系统分为两个线程. 分别是跟踪线程和建图线程。
首先传入了带有深度信息的RGB图像,其中包含了相机的坐标信息和观察角度,首先判断这是否是关键帧,如果是的话就将这一帧加入到关键帧集中,进行联合优化(优化网络参数和相机位姿),
跟踪线程优化当前帧相对于场景地图的位姿, 建图线程同步优化网络参数(代表地图)和关键帧位姿.
可以看一下最终的结果:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。