赞
踩
NeRF SLAM(Neural Radiance Fields Simultaneous Localization and Mapping)是一种结合神经辐射场(NeRF)和SLAM(Simultaneous Localization and Mapping)的先进技术,用于实时地构建三维环境地图并同时估计相机的姿态。目前NeRF-SLAM主要有以下两个方向:
那么基于这两个方向,目前的NeRF SLAM的工作主要分为以下三类:仅优化NeRF、仅优化位姿、位姿和NeRF联合优化。与此同时,本文也把最新的3D Gaussian Splatting也加入调研序列中。每个工作介绍的时候都会给出论文的下载链接、源代码(如有)、demo video(如有)
本博文,意在记录本人调研NeRF-SLAM的时候做的学习记录,部分资料来源于网络,本博文仅仅供本人学习记录用~
目录
NeRF 所做的任务是 Novel View Synthesis(新视角合成),即在若干已知视角下对场景进行一系列的观测(相机内外参、图像、Pose 等),合成任意新视角下的图像。传统方法中,通常这一任务采用三维重建再渲染的方式实现,NeRF 希望不进行显式的三维重建过程,仅根据内外参直接得到新视角渲染的图像。为了实现这一目的,NeRF 使用用神经网络作为一个 3D 场景的隐式表达,代替传统的点云、网格、体素、TSDF 等方式,通过这样的网络可以直接渲染任意角度任意位置的投影图像。
NeRF 的思想比较简单,就是通过输入视角的图像每个像素的射线对于密度(不透明度)积分进行体素渲染,然后通过该像素渲染的 RGB 值与真值进行对比作为 Loss。由于文中设计的体素渲染是完全可微的,因此该网络可学习:
关于更详细的什么是NeRF,我们接下来看看NeRF的开山之作,通过阅读这篇论文,看看到底什么是NeRF。由于这属于整个NeRF SLAM的基础,故此,此处做更深入的理解与学习。
NeRF:Representing Scenes as Neural Radiance Fields for View Synthesis
NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis
论文采用的只是fully-connected(non-convolutional)deep network,也就是只是MLP而不是CNN。论文中一个示意的网络结构如下:
而这个网络的输输入则是一个5D的数据,包括了3D 位置 x=(x,y,z) 和 2D 视角方向(θ,ϕ),一共5D。对于其中的 2D 视角方向可以用下图进行直观解释(个人理解其实就是6-DoF pose中的x、y、z、row、pitch)。
在实际实现中,论文将视角方向表示为一个三维笛卡尔坐标系单位向量d,也就是图像中的任意位置与相机光心的连线,我们用一个 MLP 全连接网络表示这种映射(x为3D位置):
通过优化这样一个网络的参数 Θ 来学习得到这样一个 5D 坐标输入到对应颜色c和密度σ输出的映射。
而网络的输出则是volume density (体积密度) and view-dependent emitted radiance at that spatial location(对应位置的辐射radiance )。对于每个5D位置都输出一个对应的辐射(radiance 其实也就是RGB信息)以及density(其实也就是不透明度)。
所谓的不透明度就是控制光线通过位置xyz的累计的幅度。
通过沿着相机光线查询5D坐标来合成视图,并使用经典的体积渲染技术将输出的颜色和密度投影到图像中。
此外,还需要image对应的camera pose已知来作为输入(也就是经典的SLAM中已知pose纯mapping的问题)。
总而言之,所谓的“神经辐射场(Neural Radiance Field)”可以理解为物体发出辐射,从而在观察者传感器(人眼)上形成颜色。在NeRF中是5D的,用来表达复杂的几何+材质连续场景的方法,该辐射场使用 MLP 网络进行参数化,而这个MLP的网络的输入与输出如下:
最后,再通过经典的体素渲染(Volume Rendering)将获得的一系列颜色和密度累计到一个2D图像上。由于这个过程是可微的,因此采用梯度下降法来对观测到的image以及渲染的视角(views rendered from our representation)进行优化。将这个误差在多个视图之间最小化,鼓励网络通过分配高体积密度和准确颜色给包含真实场景内容的位置来预测场景的一致模型。下图为NeRF的流程
这篇论文主要工作和创新点如下:
1)提出一种用 5D 神经辐射场 (Neural Radiance Field) 来表达复杂的几何+材质连续场景的方法,该辐射场使用 MLP 网络进行参数化;(这个神经辐射场是用来通过优化来保证真实感)
2)提出一种基于经典体素渲染 (Volume Rendering) 改进的可微渲染方法,能够通过可微渲染得到 RGB 图像,并将此作为优化的目标。该部分包含采用分层采样的加速策略,来将 MLP 的容量分配到可见的内容区域;
3)提出一种位置编码 (Position Encoding) 方法将每个 5D 坐标映射到更高维的空间,这样使得我们可以让我们优化神经辐射场更好地表达高频细节内容。
个人认为:前面的两个contribution算是NeRF中最主要的思想,第三点算是一个提升。因为最基本的形式并不足以handle复杂的场景下的高分辨率渲染。通过Position Encoding来让MLP实现高频的表达,通过hierarchical sampling策略来降低高频场景表达所需的采样。
为了让网络学习到多视角的表示,论文有如下两个合理假设:
预测体积密度 σ 的网络部分输入仅仅是输入位置 x,而预测颜色 c 的网络输入是视角和方向 d。在具体实现上:
如下图所示
接下来看看,如何基于辐射场进行体素渲染(Volume Rendering with Radiance Fields)
采用经典的渲染方式来对场景中的颜色进行渲染。对于基于辐射场的体素渲染。为了理解文中的 Volume Rendering 和 Radiance Field 的概念首先我们回顾下图形学中最基础的渲染方程:
如下图所示,渲染方程表达了 3D 空间位置 x 在方向 d 的辐射(出射光)。该辐射表达为该点自身向外的辐射(发射光) 和该点反射外界的辐射(反射光)之和。
简单理解辐射概念,在物理学中,光就是电磁辐射,电磁波长 λ 与频率 ν 的关系式为
也就是二者的乘积为光速 c。而我们又知道可见光的颜色 RGB 就是不同频率的光辐射作用于相机的结果。因此在 NeRF 中认为辐射场就是对于颜色的近似建模。
经典的体素渲染方法有网格渲染、体素渲染等,对于很多类似云彩、烟尘等等特效。而5D 神经辐射场将场景可以表示为:其所在空间中任意点的体素密度和有方向的辐射亮度。体素密度 σ(x) 定义为光线停留在位置 x 处无穷小粒子的可导概率(或者也可以理解为光线穿过此点后终止的概率)。使用经典的立体渲染的原理,我们可以渲染出任意射线穿过场景的颜色。因此对于某个视角 o 发出的方向为 d 的光线,其在t 时刻到达点为:
那么沿这个方向在时间范围(tn,tf) 对颜色积分,获得最终的颜色值C(r) 为:
函数T(t) 表示光线从 tn 到 t 累积的透明度 (Accumulated Transmittance)。换句话说,就是光线从tn 到 t 穿过没有碰到任何粒子的概率。按照这个定义,视图的渲染就是表示成对于 C(r) 的积分,它是就是虚拟相机穿过每个像素的相机光线,所得到的颜色。
不过在实际的渲染中,并不能进行连续积分。因此论文通过采用分层采样 (stratified sampling) 的方式对 [tn,tf] 划分成均匀分布的N个小区间,对每个区间进行均匀采样,划分的方式如下:
对于采样的样本,论文采用离散的积分方法:
其中,是相邻样本之间的距离。下图非常形象地演示了体素渲染的流程:
上述方法就是 NeRF 的基本内容,但基于此得到的结果并能达到最优效果,存在例如细节不够精细、训练速度较慢等问题。为了进一步提升重建精度和速度,论文还引入了下面两个策略来优化一个神经辐射场(Optimizing a Neural Radiance Field ):
对于Positional Encoding (位置编码)。尽管神经网络理论上可以逼近任何函数,但是通过实验发现仅用 MLP 构成的 FΘ 处理输入 (x,y,z,θ,ϕ) 不能够完全表示出细节。即:神经网络倾向于学习到频率较低的函数。同时通过将输入通过高频函数映射到高维空间中,可以更好地拟合数据中的高频信息。通过这些发现应用到神经网络场景表达任务中,论文将 FΘ 修改成两个函数的组合:
通过这样的方式可以明显提升细节表达的性能,其中:
论文使用的编码函数如下:
该函数 γ(⋅) 会应用于三维位置坐标 x (归一化到 [−1,1])和三维视角方向笛卡尔坐标 d。在论文中对于 γ(x) 设置 L=10;对于γ(d) 设置 L=4。因此可以得到对于三维位置坐标的编码长度为:3×2×10=60,对于三维视角方向的位置编码为 3×2×4=24,这也与网络结构图上的输入维度相对应。
接下来看看Hierarchical Sampling Procedure (分层采样方案)
分层采样方案来自于经典渲染算法的加速工作,在前述的体素渲染 (Volume Rendering) 方法中,对于射线上的点如何采样会影响最终的效率,如果采样点过多计算效率太低,采样点过少又不能很好地近似。那么一个很自然的想法就是希望对于颜色贡献大的点附近采样密集,贡献小的点附近采样稀疏,这样就可以解决问题。基于这一想法,NeRF 很自然地提出由粗到细的分层采样方案(Coarse to Fine)。
Coarse 部分:首先对于粗网络,采样 Nc 个稀疏点(c 表示 Coarse),并将公式用新的形式修改(加入权重):
其中权重需要进行归一化:
这里面的权重可以看成沿着射线的分段常数概率密度函数 (Piecewise-constant PDF)。通过这个概率密度函数可以粗略地得到射线上物体的分布情况。
Fine 部分:在第二阶段,论文使用逆变换采样 (Inverse Transform Sampling),根据上面的分布采样出第二个集合 Nf,最终我们仍然使用公式 来计算 。但不同的是使用了全部的个样本。使用这种方法,第二次采样可以根据分布采样更多的样本在真正有场景内容的区域,实现了重要性抽样 (Importance Sampling)。如上图所示,白色点为第一次均匀采样的点,通过白色均匀采样后得到的分布,第二次再根据分布对进行红色点采样,概率高的地方密集,概率低的地方稀疏 (很像粒子滤波)。
至于在训练优化函数方面,论文的定义非常简单直接,就是对于粗网络和精网络都用渲染的 L2 Loss,公式如下:
与其他的多视角合成(View Synthesis)的方法对比。
定量对比可以发现NeRF优异于其他经典的渲染方法的。
定性对比的效果如下。在合成的数据集上,纹理恢复的效果也是好很多的,跟GT非常的接近。
而在真是的数据集上性能也是非常强大的。
这部分介绍的就是仅仅用NeRF来做mapping的工作,image的pose需要已知或者通过其他算法提供。这也是原本的NeRF提出的时候主要的解决问题(三维重建),大量NeRF的各种变种也属于这个类别。
Nerf++: Analyzing and improving neural radiance fields
GitHub - Kai-46/nerfplusplus: improves over nerf in 360 capture of unbounded scenes
NeRF++是在NeRF基础上进行的研究,主要分析了NeRF能够处理三维形状歧义性的原因;以及给出NeRF在大规模无边界场景的360°视角合成的一种处理方案。
Shape-Radiance Ambiguity
问题:使用二维图像做渲染,目标是渲染出新视角下的颜色分布,而无须特别关注真实的几何形状,并且根据三维点到相机原点的射线上所有点的成像特征也无法确定深度,导致几何解的不唯一,存在歧义性。
NeRF能够处理歧义性的原因在于,不同的观测角度下同一点产生的颜色值不同,采用原始点(颜色)与坐标点(位置)的分开输入和分开进行编码,使得观测角度独立,保证了渲染的细节信息,消除歧义性。
Parameterization of Unbounded Scenes
问题:较小的场景深度范围内,NeRF可以通过积分(离散求和)还原辐射场和体密度。但户外360°场景的背景景深可能非常大(如山脉、天空),巨大的动态深度范围使得积分逼近变得困难,无法兼顾近景和远景的分辨率。
NeRF++将原始NeRF扩展到无边界场景中。利用两个NeRF分别处理前景和背景,解决NeRF前景清晰背景模糊的问题。
NeRF++引入逆球面参数化的方法优化无边界场景。球内部使用原始的NeRF进行渲染;对于球外点
重新使用一个四元组来表示,如下:
r能够唯一确定这个方向上的一个球外点。在这样的表示下,四元组中的每个参数都是有界的,1/r相当于将外部点逆转到球内部,然后可套用NeRF进行渲染这个四元组。
于穿过球体内外两部分的光线分别积分,将两个NeRF的渲染结果进行融合,得到一条射线上的颜色和透明度,因此重新渲染积分公式如下:
在单位球外的点(x,y,z),通过几何变换即可映射到球面上的点(x',y',z'),该点由圆心o和p点连线与球面交点确定,同时记录距离r。
效果如下:确实在一些纹理细节上的恢复比传统的NeRF有提升~
Instant neural graphics primitives with a multiresolution hash encoding
Instant neural graphics primitives with a multiresolution hash encoding (1)
下面介绍的比较有意思的两个工作Orbeez-SLAM与GO-SLAM都是基于Instan-NGP来实现实时的渲染的,为此,深入了解一下这个工作~
这是英伟达一个工作,最快可以将训练 NeRF 模型缩至 5 秒。而这一实现这是来自于论文所提出的多分辨率哈希编码技术(multiresolution hash encoding)。论文在4 个代表性任务中对多分辨率哈希编码技术进行验证,它们分别是神经辐射场(NeRF)、十亿(Gigapixel)像素图像近似、神经符号距离函数(SDF)和神经辐射缓存(NRC)。每个场景都使用了 tiny-cuda-nn 框架训练和渲染具有多分辨率哈希输入编码的 MLP。
将神经网络输入映射到更高维空间的编码过程,从紧凑模型中提取高近似精度。在这些编码中,通过可训练、特定于任务的数据结构,承担了很大一部分学习任务。进而可以使用更小、更高效的多层感知机。因此,本文提出一种多分辨率哈希编码。
通过对输入做哈希encoding的方式,来让很小的网络也能学到很高的质量。之所以小网络就可以学到很好结果是因为,它把很多可学习的特征存在了多个不同分辨率的哈希表里,让那些feature来承担了很大部分的学习负担。
对于神经网络,它们把数据信息存储在了网络权重中,但信息完全存在网络中会导致计算很慢,网络表达能力也会受到的限制。于是考虑把latent feature用结构化的方式存储,比如存在3d grid上,这样表达能力不会受到网络权重数量的限制,每次bp的参数也只和3d grid对应的cell还有小网络相关,训练时间大大缩短。但是,3d grid这种结构化数据其实是很浪费的,因为只有表面信息是有意义的,绝大多数cell是空的。用acorn那样的树形数据结构可以减少内存以及需要训练的数据量,但是训练过程中动态维护树的结构,带来比较大的开销。所以论文就提出了一种多层次的hash encoding方式,来解决像acorn这样的树形结构存在的弊端。它其实就是提出了用多分辨率的哈希表这个数据结构来存feature。
对于一个3维空间,我们可以认为它是由两个部分的信息组成的。
1、低分辨率(coarse部分)相当于低频部分,此部分可以大致刻画局部趋势。低分辨率下,网格点与阵列条目呈现 1:1 映射;
2、高分辨率部分(fine)相当于高频部分,此部分可以刻画局部细节。高分辨率下,阵列被当作哈希表,并使用空间哈希函数进行索引,其中多个网格点为每个阵列条目提供别名。这类哈希碰撞导致碰撞训练梯度平均化,意味着与损失函数最相关的最大梯度将占据支配地位。因此,哈希表自动地优先考虑那些具有最重要精细尺度细节的稀疏区域。
因此,通过multi-resolution grids就是为了兼顾不同方面(低分辨率局部趋势)(高分辨率局部细节)而设置的结构。 最后不同分辨率的特征将被concat在一起。
不同分辨率下的哈希表都可以并行地查询,进而保证了高效性。
步骤:
1、分层(Hashing of voxel verticles)。先把现在的定义域划分成不同resolution的L层,比如下图(1)中的红色和蓝色线就划分了不同resolution的格点。确定好最精细和最粗糙的grid划分的resolution之后,中间层的resolution通过等比级数计算得到。
这里的b是通过Nmax(最精细resolution)和Nmin(最粗糙resolution)算出来的一个系数。然后l是指第多少层。
2、hash encoding(Look up - Hashing)。把不同层的grid全都映射到这个层对应的一个哈希表里(如图2所示)。最理想的情况当然是最精细的resolution下,每个格点也能有一个在哈希表上对应的位置来存它的feature,但是这会很费空间。所以这篇文章设定了哈希表最大的一个T。现在蓝色和红色情况下,格点数小于T,所以每一个grid都有一个对应的哈希槽来存它的feature。但如果grid数大于这个T,那通过哈希函数的映射后,很多格点会对应到哈希表上同一个位置。这里为了节省时间/空间,它不对hash collision(哈希冲突)做任何处理,如果算出来哈希值一样,那就用同一个feature来刻画这些格点。
3、线性插值(Linear interpolation)。每个点都是由周围格点的线性插值来得到自己的feature(如图3所示)。
4、网络学习(Concatenation and Network learning)。然后它把这个点和它对应的所有层的feature全都concat起来喂给网络去学习。见上图的(4)操作。
之后论文就对这个处理方式进行了论证,包括F(每个feature的维度),L(multiresolution的层数),T(每层哈希表的最大entry个数)等进行了大量的消融实验。此外,由于不处理hash collision,会出现在较高resolution的层出现很多个格点对应同一个feature的现象。那这就会带来歧义。这就体现了multiresolution的好处,虽然这某几个个格点在这一层对应了同一个feature,但是它俩不太可能在所有层都对应同一个feature。而网络input又是这个点以及它对应的所有feature一起送到网络里的,所以网络在学习的过程中是可以区分不同点的。
但同时,虽然在比较精细的层,很多点都在优化同一个feature。但是最重要的点,比如nerf里表面的点,它对应的梯度会比空间中那些空的点更大,因此它也会对这个feature的优化起主导作用,从而让真正重要的点的信息去支配这个最精细feature的学习。
由于本博文主要是关于NeRF的,所以关注 NeRF 场景的效果。对于大型的 360 度场景(左)以及具有许多遮蔽和镜面反射表面的复杂场景(右)都得到了很好的支持。实时渲染这两种场景模型,并在 5 分钟内通过随意捕获的数据进行训练:左边的一个来自 iPhone 视频,右边的一个来自 34 张照片。效果可以说是很惊艳了,而且这篇论文在本人写这篇博客的时候citation已经达1000+了,也有大量基于这个工作的延申了,故此后续开发直接基于源代码做就好了,这个图结构以及压缩编码的具体原理应该是不需要深入推敲的。
RO-MAP:Real-Time Multi-Object Mapping with Neural Radiance Fields
RO-MAP:Real-Time Multi-Object Mapping with Neural Radiance Fields
第一个不依赖于3D先验的单目多对象建图pipeline。同时可以定位object的位置以及渲染。(由于不是相机的自定位只是物体的定位,所以不归为下面SLAM中,但这其实也属于SLAM的一种,Object-SLAM,利用语义等信息来定位以及重建物体)。对于每个检测的物体都单独每个目标都单独训练一个MLP,建立物体级NeRF地图。
整个框架分为物体级SLAM和物体级NeRF两部分。物体级SLAM基于ORB-SLAM2实现,识别目标没有使用学习方法,而是使用一种轻量级的手工方法来定位。还采用一种基于稀疏点云的语义信息和统计信息的方法来自动关联多视图观测与目标地标。在估计 了物体级SLAM的边界框和相机姿态后,就可以用NeRF学习物体的稠密几何形状。每当检 测到一个新的对象实例,初始化一个新的NeRF模型(也是用Instant-NGP)。注意,这里的 NeRF不重建整个场景,而是只表示单个对象,也就是可以使用轻量级网络加快训练速度。
实验效果如下:
vMAP:Vectorised Object Mapping for Neural Field SLAM
vMAP:Vectorised Object Mapping for Neural Field SLAM
这也是一篇物体级NeRF SLAM方案,同样是为每个目标单独分配一个MLP。vMAP的输入包括RGB图像、深度图、位姿、实例分割结果。位姿由ORB-SLAM3计算, 实例分割由Detic计算,再根据实例分割区域对RGB和深度图进行采样,之后就可以使用 NeRF进行训练和渲染。此外还需要执行一个帧间对象关联,包括语义一致性关联(类别 相同)和空间一致性关联(位置相同),用来判断是否是同一个物体。
vMAP处理的一个场景最多可以有50个独立的物体,并且有以5HZ的输出更新map。性能上挺不错的~同时论文也展示了在单个GPU下同时训练及优化大量的MLP object model。
Point-NeRF:Point-based Neural Radiance Fields
Point-NeRF:Point-based Neural Radiance Fields
传统的NeRF渲染需要很长的时间,因为要求MLP把整个图像的一切都渲染出来,需要对每个场景进行优化。而另一方面,deep multi-view stereo方法可以较快进行场景的重建,因此Point-NeRF就是结合MVS和NeRF,过neural features相关联,使用neural 3D point cloud来渲染,实现训练时间快30倍。
Point-NeRF使用其他方法获得初始的点云来指导NeRF。Point-NeRF 表现形式为:每个点云都有一个neural feature,而每个neural point都编码了3D几何信息和点表面信息(appearance)。对于每个3D位置,采用MLP网络来累计它的体素密度(volume densiy)以及辐射信息(radiance)。
初始点云的获得使用了learning-based的MVS。然后采用deep CNN(用图像与2D特征点来做训练)来获取点云特征(这一波操作就属实有点很cv了hhh)。而多个视角下的这些点组成所谓的point-based radiance field。然后通过网络训练如何由这些neural point变成渲染后的三维模型。从下图也确实可以看到,Point-NeRF训练了10k steps(21分钟)的渲染效果要比NeRF训练2天的效果好上不少~
至于为什么呢?我也感到好奇,难道真的是加入的网络越多,网络越大效果就越好?如果把deep CNN提取特征点,改为非learning提取特征点。MVS产生的点云改为其他方式产生的点云,那是否也是效果更好呢?还是因为是MVS已经恢复出来一个比较好的三维结构,在此上做渲染,所以耗费不多就可以超越NeRF呢?
论文的主要contribution:
Point-NeRF的ppeline如下图所示。以图像序列及其对应的相机位姿为输入,通过 MVSNet 预测这些图像的深度图从而生成一个初始点云,再通过一个 VGG 网络提取多级图像特征将初始点云扩展为神经点云。这个初始的神经点云。为了合成新视图,只在神经点云附近进行可微射线积分和计算阴影。在每个阴影位置,聚集K个神经点邻域的特征,并计算辐射率和体密度。整个过程可以端到端训练。
至于具体的神经点云的渲染以及点云的增长和剪枝此处就不介绍了。下面直接看看它的实验效果。首先是定量分析。这里虽然有标出point-NeRF不同代数的结果,但是没有标出其他方法的代数。以及还有一个很大的疑问就是代数跟计算量相关联吗?就是会不会存在一种情况就是:Point-NeRF的参数量远大于某个baseline,而计算量也大于某个baseline。那如果代数*单代的计算量并不能划等号,单纯这样的对比好像没有什么意义。就相当于我用台超算跑一个小时比你用2048GPU跑10个小时要好,那能说明什么?
目前看来NeRF跟之前做过的超分是很类似的,都只是评估相似度,但是三维重建不是应该评价深度恢复的精度吗?还是说以及默认learning恢复的精度比较好,单纯只评估恢复的场景的纹理相似度?
定性分析:还是存在定量的问题啦~至于视觉效果,选一下总能选到比较好的~
下图的这个实验比较有意思,这其实就是跟depth completion比较类似,或者image inapinting很像。理论上按这个思路,通过如此稀少的点就重建稠密深度,那完全就可以用于lidar或livox了。
NeRF-SLAM:Real-Time Dense Monocular SLAM with Neural Radiance Fields
NeRF-SLAM:Real-Time Dense Monocular SLAM with Neural Radiance Fields
这是第一个实现基于dense SLAM与NeRF的环境重建的pipeline,但它的NeRF部分其实也是做mapping的工作。
基于learning的单目三维重建已经是比较的成熟。但是单目稠密SLAM也好,直接进行单目深度估计也好,得到的深度图很多数值是不能用的(难以用来恢复几何geometrically和光度photometrically较精确的3D map)。而NeRF的发展,带来了光度恢复较好的优势(哦!这大概也就是NeRF系列的论文只看光度恢复效果的原因?),但是却不能实时,同时也是需要ground truth pose来作为输入的。(虽然像BARF这些工作也证明了pose并不是必须的)
本文利用单目稠密SLAM与分层体积神经辐射场(hierarchical volumetric neural radiance fields)的各自优势,通过单目dense SLAM来提供信息(pose与depth map,同时带有它们相应的uncertainty),利用这些信息进行深度边缘协方差加权的稠密深度损失训练,进而来实现实时构建环境的神经辐射场。通过所提出的uncertainty-based depth loss来实现良好的光度恢复以及几何结构的恢复。
整个算法的流程如下图所示
NeRF-SLAM的输入是连续的单目序列,采用Droid-SLAM (DROID-SLAM:Deep Visual SLAM for Monocular, Stereo and RGB-D Cameras,此处不展开介绍,下方给出该论文的视频)。Droid-SLAM的流程种也就是包括了图中的这个ConvGRU来估计稠密光流和光流权重,之后就是一个稠密BA问题估计位姿和深度,并将系统方程线性化为近似相机/深度箭头块状的稀疏Hseeian矩阵(以及舒尔补等处理了)最后把图像、位姿、深度图、位姿不确定性、深度不确定性全部馈送给NeRF进行训练。
DROID-SLAM:Deep Visual SLAM for Monocular, Stereo and RGB-D Cameras
定量实验的结果如下。光度学误差用PSNR来对比,几何误差用L1,所谓的L1是:we use the L1 depth error between the estimated and the ground-truth depth-maps as a proxy for geometric accuracy (Depth L1),应该也就是深度精度评估中的depth error了
关于depth error,常用的指标应该是下面几个。而所谓的L1应该是Mean Absolute Error(绝对平均误差)
而视觉对比的话,则是如下:
而下面这个对比实验比较有意思:作者的应该就是noisy pose与noisy depth了,视觉效果上还是比较好的,可以跟用了GT depth的持平。但是跟GT Pose No Depth相比好像差别不大~
论文也分析了这个framework的缺陷就是内存占用比较大~
感觉这篇论文还是带来一些inspiration的,应该也算是NeRF进军SLAM的引路?
SMERF: Streamable Memory Efficient Radiance Fields for Real-Time Large-Scene Exploration
SMERF:Streamable Memory Efficient Radiance Fields for Real-Time Large-Scene Expl
该成果最主要的突破就是没有利用3D Gaussian Splatting(关于Gaussian Splatting请见下面介绍)技术就可以实现NeRF大场景在笔记本以及手机端的实时流式加载和渲染。主要是通过分层模型(a hierarchical model)与蒸馏训练(distillation training strategy)。
SMERF是以Merf: Memory-efficient radiance fields for real-time view synthesis in unbounded scenes为基础的,然后构建自主约束的MERF子模块的分层结构。由于还涉及到其他的结构,暂时理论部分看得比较迷糊,这里就先跳过了~
根据论文的描述,SMERF的提出有几个比较重要的研究基础:
1、提升NeRF的速度,NeRF虽然在效果上还不错,但是其在训练速度以及实时方面都存在耗时过长的问题,所以也就针对这个问题出现了不少的研究方案,比如通过预先计算一些与视角无关的颜色以及透明度,并将他们存储到一些稀疏的体数据结构,或者将一个大的场景分解为一些小的MLPs网格,可以提升训练以及渲染的效率,但是这种以空间换时间的做法一般会导致内存的消耗增加。
所以针对如何平衡内存使用以及渲染时间这个问题,又产生了类似MERF这方案,该方案就研究如何在受限的内存上实现这种MLPs网格的快速表达,这也是SMERF的研究基础。
2、提升NeRF的质量,NeRF在抗锯齿,去除毛刺以及稳定性方面提出了很多方法,但是这种方案在高分辨的情况下难以满足实时渲染的效率要求,因而论文就考虑使用蒸馏技术将训练好的模型蒸馏到MERF的子模型中,从而来提升渲染速度。
3、基于栅格化的视图合成,其实在这个方面比较具备代表性的就是3D Gaussian Splatting技术,这个技术其实是介于点云以及NeRF中间的一种表达方式,在表达上没有直接使用点,也没有用辐射场,而是使用了类似高斯椭圆这种“软点”,然后再利用神经网络训练优化进行这些软点的融合和叠加,从而取得比较好的表达效果,同时又可以利用当前GPU的栅格化渲染的能力,所以可以实现实时渲染,但是这种方法会在一些地方形成比较明显的“毛刺”,这也是SMERF重点对比的对象。
4、大尺度场景NeRF表达,NeRF最早的构建方式主要还是针对围绕对象的局部场景,但是要扩展到更大的场景目前在这个方面的两个主要做法就是:第一、融合抗锯齿技术的基于网格的辐射场;第二、基于相机的位置将大的场景分成多个区域的场景,分开为每个区域训练NeRF,但是这里面需要针对一些重迭的区域设置冗交叉的场景,所以难以扩展到城市级别。
而在SMERF的方案中,其将整个场景氛围多个子模型区域,每个子模型使用局部坐标,每个子模型都可以表达整个场景,但是大部门的模型容量只用于自己归属的区域,然后每个么分区中都实例化了一系列和当前空间位置铆定的MLPs权重,参数化延迟外观模型,它是一个渲染期间和相机位置相关的三线性插值函数,下图的b&c呈现的就是相机位于子模型内和子模型外的可视化处理方式。
5、蒸馏和NeRF,蒸馏的核心就是通过训练一个小模型来近似一个大模型的能力,把大场景的MLPs蒸馏到一个小的网格MLPs中以及把一些代价比较高的二次光线反射能力蒸馏到一个清凉的模型中。而Google SMERF的关键工作就是要将预训练好的大尺度、高质量的Zip-NeRF模型蒸馏到一系列的类似MERF的子模型中。
下面看看实验效果
说实话,这些图上我没有看出很明显的差异(就是一些模糊,sharp不sharp的区别吧?)数值指标差异也不太大,但是论文网站中给出的示例,可以发现根据视角的变化,后台持续在加载一系列的RAW文件,然后马上渲染出三维结构,这点倒是很惊艳的。
当然啦,此处所谓的大场景更多是一种相对的说法,指的是全部的室内空间(但也比下面几个工作中提到的large scale要大些~论文中提到最大可达300平米),而不是像城市那样的大级别的地图,且目前主页只是demo没有代码开源,这也是目前看到的第一个在手机端可以实现实时的NeRF渲染的工作了。
Nerfies:Deformable Neural Radiance Fields
Nerfies:Deformable Neural Radiance Fields
这是第一个可变形场景的NeRF(主要就是针对场景并不是刚体的,是可以形变的),如下图所示,就是从多个不同的视角下拍的图片,合成一个新的视角。这是通过continuous volumetric deformation field以及对应的elastic regularization来实现的。
Pipeline 方面应该就是在传统的NeRF前面多加了个code以及deformation field进而生成canonical(范式) 的表达,利用这个表达来反应不同的观测量。
与采用NeRF来进行mapping相反,这个类型的工作是使用NeRF反过来优化pose,但如果只是设计损失函数再梯度回传的话,定位精度应该很难和传统SLAM比。
Photorealistic and differentiable rendering of NeRF enables many applications such as direct pose optimization and training set expansion!
INeRF:Inverting Neural Radiance Fields for Pose Estimation
INeRF:Inverting Neural Radiance Fields for Pose Estimation
本文就是使用NeRF来反过来优化位姿。通过image获取camera相对于3D 物体或者场景的6-DoF pose。通过NeRF渲染的图像与observed image的光度误差来计算位姿。
iNeRF的输入有三个:
这其实就有点像PTAM中的2D-3D model alignment,用直接法来估算pose,只是需要解决如何构建NeRF与image直接的光度误差。那么这个思路就非常的直接了~如下图所示。通过不停的迭代,直到渲染的image与观测的image对齐
当然这个计算量应该是巨大的,INeRF中还通过一些策略来sampling合适的point来构建优化。同时采用INeRF也可以给NeRF提供pose(这应该就是鸡生蛋、蛋生鸡的最基本的SLAM问题)。整个pipeline如下图所示
前面和传统的NeRF一样,只不过后面渲染图像和真实图像的光度误差反过来又优化位姿。
一个定性的实验如下:其中的百分比代表了用了百分之多少的数据来训练NeRF,而后面+INeRF就代表用INeRF的pose来提供训练的pose。右侧四栏其实可以看到用了INeRF来提供pose的效果更好。
至于pose估计的精度嘛~感觉这个验证不够说服力
个人感觉这篇论文是提供了一个很好的思路,但是实验感觉没有太大的说服力,也没有很好验证算法的有效性。
NeRF-Loc:Visual Localization with Conditional Neural Radiance Field
这也是一篇NeRF模型和图像直接匹配进行定位的文章。论文的框架如下。这篇论文是re-localization,那应该只是一个解决重定位的问题(不过INeRF本质上也是一个重定位而不是轨迹推进吧)?利用学习到的条件NeRF三维模型,计算3D描述子,直接与图像匹配,实现由粗到精的视觉定位。
类似于INeRF,也是采用NeRF来作为3D场景的表达(不同的是,INeRF只能在pre-training scene下定位,泛化能力与场景的先验之间是互相矛盾的~),通过利用feature matching以及场景对应的坐标,模型学习可推广知识和场景先验。也提出一个appearance adaptation layer的结构解决training和testing之间的gap。
整个Pipeline里场景表示为可泛化NeRF,从3D场景中随机采样点,并将3D点馈送到NeRF模型中以生成3D描述子。然后直接根据3D和2D描述符来匹配,由PnP解算相机位姿。因此大大提升了泛化能力以及对pre-training scene的要求降低了。
作者采用conditional NeRF model,它可以产生任意3D locations下的3D特征。为了保持泛化性,该conditional NeRF model建立在一个支持集(support set)上,支持集由几幅给定的参考图像和深度图组成。基于这个支持集来产生3D描述子。模型不仅在多个场景的联合训练学习了一般匹配,还在每个场景优化过程中以残差的方式记忆了基于坐标的场景。
论文中conditional NeRF模型的架构,通过新视图合成和3D-2D匹配来共享任意三维位置的特征生成器。
为了解决训练支持图像和查询图像之间的外观变化,还提出了一个外观自适应层,在匹配之前查询图像和三维模型之间的图像风格对齐。
虽然前面吹嘘了一顿。但从contribution中可以看到,所谓的conditional NeRF model是multi-scenes pretraining then per-scene finetuning。简而言之就是“50步笑百步”,总之就是比INeRF等更好
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。