| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 人工智能 -> 【NeRF】原始论文解读 -> 正文阅读 |
|
[人工智能]【NeRF】原始论文解读 |
NeRF: Representing Scenes as Neural Radiance Fields for View SynthesisIntroduction本文通过一个直接优化连续5D场景表征的参数的形式解决了一个长期存在的视角生成的问题。可以尝试把静态的场景看作是一个5D的函数,其中三个维度 ( x , y , z ) (x,y,z) (x,y,z) 表示空间位置,( θ , ? ) \theta, \phi) θ,?)表示在特定位置上的辐射方向。
对应的编码输出会有一个密度值,类似于微分不透明度的形式,表示了光纤通过该空间位置累计的辐射量。本文的方法中不涉及任何的卷积,仅采用了MLP来实现从5D坐标 ( x , y , z , θ , ? ) (x,y,z,\theta,\phi) (x,y,z,θ,?)到单体素的RGB颜色(视角相关)以及密度的映射。为了实现这种特定视角下neural radiance field(NeRF)的渲染
我们发现,在针对复杂场景的神经辐射场的表面进行优化的过程中,想要实现足够高的分辨率基本是很难收敛的,同时样本也是远远不够。因此,尝试使用位置编码来转换输入的5D信息。这种位置编码能够使得MLP能够学到更高频的信息。此外提出了一种分层采样的策略来减少训练数据量。 我们的方法继承了体积表示的优点:两者都可以表示复杂的真实世界几何体和外观,非常适合使用投影图像进行基于梯度的优化。关键是,我们的方法克服了在高分辨率下建模复杂场景时离散体素网格的高昂存储成本。总之,主要技术贡献是:
从定量化和定性的角度,我们证明了神经雷达场对比传统的试图合成方法有着更优异的性能。据我们所知,本文是首次提出连续场景表示的方法,这个方法能够根据自然捕捉到的RGB图像中捕捉到映射关系,并进行新的视角下的高分辨率照片渲染。 Related WorkCV领域里面有一个很有意思的方向是通过使用MLP来对物体以及场景进行编码,直接对一个形状的3D空间位置到一个隐式表示进行编码。但是,目前来看这些方法依然还不能够使用离散表征(三角形的网格或者是体素网格)那样的离散表示一样复制生成非常逼真的虚拟场景。 有一个类似的方法:使用MLPs来实现低维坐标到颜色空间的映射,这种方法也常被用于表示其他图形功能,如图像,纹理材料和间接照明值。 Neural 3D shape representations近期有一些研究尝试通过优化深度网络(网络实现了 x y z xyz xyz坐标到Signed Distance Function或者是 x y z xyz xyz到occupancy field的映射),探索了将连续3D空间中的形状作为level sets的隐式表示(?行吧,这句话看不明白)。然而,这些模型由于需要获得真实的3D几何图形作为Ground Truth(例如ShapeNet数据集,一个点云数据集),这使得模型的应用收到限制。后续有一些工作通过约定可微分的渲染函数来缓解这一状况,此时隐式表示只需要使用2D的图像就可以进行优化了。Niemeyer, et,al. 将表面表示为三维占位场,并使用数值方法找到每条射线与物体表面的交点,然后使用隐式微分计算出精确的导数。每条射线的交点位置都被提供给一个神经三维纹理场,以预测该点的diffuse color。Sitzmann et, al. 使用了一个不那么直接的神经三维表示法,即只是在每个连续的三维坐标上输出一个特征向量和RGB颜色,并提出了一个由递归神经网络组成的可微分渲染函数,沿着每条射线行进来确定表面的位置。 虽然这些提到的体积能够有可能实现复杂、高分辨率的物体表征,但迄今为止这些方案都局限于去表征一些复杂度较低的简单形状,造成了一些oversmoothed的渲染结果。 View synthesis and image-based rendering在有特定视角下的密集采样数据的前提下,可以通过简单的光场采样插值技术重建出照片级的新视角图片。对于具有稀疏采样前提下的新视角图像合成,CV领域以及图形学领域通过观察输入图像来预测传统几何形状的外观这方面已经取得了巨大的进展。一套比较流行的方案是使用mesh-based场景表征,利用可微分的光栅和路径追踪可以直接利用反向传播优化mesh表征来重构输入图片。然而基于梯度的mesh优化在image reprojection方面一直是一个很大的困难。一些可能的问题是因为局部极小值或者是损失函数的优化过程中存在着一些难以达到的条件。此外,这类方法通常还要求有一个拥有固定拓扑结构的mesh模板作为一个初始化,这一点显然不太适用于无约束的自然场景。 另一类方法使用volumetric表征来解决从一组输入RGB图像合成高质量照片级视角图像的任务。基于volumetric的方法能够真实地表示复杂的形状和材料,非常适合基于梯度的优化场景,并且与基于mesh-based的方法相比,产生更少的视觉伪影。早期volumetric的方法使用观察到的图像直接为体素网格着色。最近,有一些方法使用多个场景的大型数据集来训练深度网络,这些网络从一组输入图像中预测采样的volumetric表征,然后使用alpha-compositing或沿光线学习合成来在测试时渲染新视角图像(? 行吧,没看明白)。也有其他一些工作,尝试针对每个特定场景使用CNNs和采样voxel grids的组合进行优化,这使得CNN可以补偿来自低分辨率体素网格的离散化伪影,或者允许预测的体素网格根据输入时间或动画控制而变化。虽然这些基于volumetric的技术在新的视角图像合成方面取得了令人印象深刻的成果,但由于其离散采样,在适配更高分辨率图像的时候,会从从根本上受到时间和空间复杂性的限制(渲染更高分辨率的图像需要对三维空间进行更高的采样)。我们通过在Fully-Connected DNNs的参数内编码连续体积来避免这个问题,该神经网络不仅生成比以前的体积方法更高质量的渲染,而且采用的存储成本大幅降低。 Neural Radiance Field Scene Representation我们尝试把连续的场景看作是一个5D的向量函数,其中包含一个3D的位置信息 x = ( x , y , z ) \textbf{x}=(x,y,z) x=(x,y,z)以及一个2D的视角方向变量 ( θ , ? ) (\theta, \phi) (θ,?),对应的模型的输出是对应的反射颜色 c = ( r , g , b ) \mathbf{c} = (r,g,b) c=(r,g,b)以及对应的volume密度 σ \sigma σ。在实际表示过程中,实际可以将方向看作是一个3D笛卡尔坐标系的单位向量 d \mathbf{d} d,我们使用MLP网络来模拟这种映射关系: F Θ : ( x , d ) → ( c , σ ) F_{\Theta}:(\mathbf{x},\mathbf{d}) \rightarrow (\mathbf{c}, \sigma) FΘ?:(x,d)→(c,σ)。 通过限制预测网络的密度 σ \sigma σ 仅为位置 x \mathbf{x} x的函数,同时设置RGB颜色 c \mathbf{c} c可以根据位置 x \mathbf{x} x以及视角方向 σ \sigma σ,借此我们来保证多视图的一致性(?这里不明白为啥)。为此,MLP模型 F Θ F_{\Theta} FΘ?首先使用8层全连接层来处理输入的3D坐标 x \mathbf{x} x(使用ReLU激活函数且每一层为256个通道),并输出 σ \sigma σ以及256维的特征向量。利用这个特征向量与相机的观察方向串联,输入到另一个额外的全连接层(使用ReLU和128个通道)从而输出view-dependent的RGB颜色值。下图给出了只是用 x \mathbf{x} x的情况下的结果。 Volume Rendering with Radiance Fields
我们的5D神经雷达场将场景表示为空间中任意点的体积密度和定向发射辐射。我们使用经典volume rendering原理渲染穿过场景的任何光线的颜色。因此,volume的密度 σ ( x ) \sigma(\mathbf{x}) σ(x)可以被定义为光纤位置 x \mathbf{x} x上的一个微小粒子上终止时候的可微分概率。因此,相机在附近 t n t_n tn?和远端 t f t_f tf?期望的颜色 C ( r ) = r ( t ) = o + t d C(\mathbf{r})=\mathbf{r}(t) = \mathbf{o} + t\mathbf{d} C(r)=r(t)=o+td可以被定义为:
C ( r ) = ∫ t n t f T ( t ) σ ( r ( t ) ) c ( r ( t ) , d ) d t , ?where? T ( t ) = exp ( ? ∫ t n t σ ( r ( s ) ) d s ) C(\mathbf{r}) = \int_{t_n}^{t_f} T(t)\sigma(\mathbf{r}(t))\mathbf{c}(\mathbf{r}(t), \mathbf{d})dt, \text{ where } T(t) = \text{exp} \left( -\int_{t_n}^{t}\sigma(\mathbf{r}(s))ds \right) C(r)=∫tn?tf??T(t)σ(r(t))c(r(t),d)dt,?where?T(t)=exp(?∫tn?t?σ(r(s))ds) 函数 T ( t ) T(t) T(t)表示的是随着光线从 t n t_{n} tn?到 t t t过程中的累计透过率,换而言之就是光线从从 t n t_{n} tn?到 t t t过程中的没有遇到其他粒子的概率。从我们的连续神经辐射场渲染视图需要估计通过所需虚拟摄像机的每个像素跟踪的摄像机光线的积分 C ( r ) C(\mathbf{r}) C(r)。 我们使用求积数值(quadrature)估计这个连续积分。确定性求积通常用于绘制离散体素网格,它将有效地限制我们表示的分辨率,因为MLP只会在一组离散位置进行mapping。对此,我们尝试着使用了一个分层抽样的方法,将
[
t
n
,
t
f
]
[t_n, t_f]
[tn?,tf?]划分成
N
N
N个均匀的bins,然后从每一个bin中均匀随机抽样: 总而言之,就是空间的一个位置上的一条光线,在这条光线上随机采样5D点,利用MLP模型来映射5D位置信息以及颜色+密度(或者说不透明度)。 Optimizing a Neural Radiance Field上面一个章节对核心组件进行了一些描述,但是我们注意到上面提到的这些东西不足以去实现一个SOTA的图片渲染,我们对此采用了两个技巧来实现高精度的复杂场景表征。 Positional encoding尽管神经网络是通用函数近似器,但我们发现,让网络 F Θ F_\Theta FΘ?直接处理 x y z θ σ xyz\theta\sigma xyzθσ会导致渲染在高频区域的表征能力不足。这与Rahaman et,al. 最近的工作一致,这表明深度网络倾向于学习低频函数。他们还表明,在将输入传递到网络之前,使用高频函数将输入映射到更高维空间,可以更好地处理包含高频变化的数据。 我们利用了这些现有的探索,重新将
F
Θ
F_\Theta
FΘ? 定义定义为
F
Θ
′
°
γ
F'_\Theta \circ\gamma
FΘ′?°γ ,其中
γ
\gamma
γ表示一个映射将
R
\mathbb{R}
R到高维空间
R
2
L
\mathbb{R}^{2L}
R2L,且
F
Θ
′
F'_\Theta
FΘ′?依旧是一个简单的常规MLP模块。从形式上来看,Encoding Function其实可以被定义为: 实际上位置编码的概念在Transformer里面也有,但是Transformer用这个玩意儿实际上就是未来确定token的顺序,我们这里是将输入坐标映射到高维空间便于优化。 Hierarchical volume sampling我们的渲染策略是沿着相机光线找到 N N N个点来对MLP网络进行训练。但是考虑到对于一些自由空间以及遮挡区域依旧采用这种方案时,会产生很多的无效点从而导致效率低下(🏷这里其实就是因为我们没有任何的先验信息,我们不知道哪些是有效的采样点,只能低效地进行大量重复采样,一个简单的解决方案就是先粗后精的方案)。 我们尝试同时优化两个网络,一个粗模块,一个精模块。首先采样出
N
c
N_c
Nc?个位置,然后用粗网络在这些位置上进行评估。然后根据生成的结果,沿着光线产生一个精细的采样点,且这些采样点的位置倾向于有意义的点。从实际上看,就是首先利用粗网络合成颜色
C
^
c
(
r
)
\hat C_c(\mathbf{r})
C^c?(r),然后将这个结果作为沿着光线上所有的采样点的weighted sum: Implementation details这一章节实际没啥太多要说的,总结来看就是把粗网络和精网络两个部分的损失进行了叠加,损失的计算公式是: 在本文的实验过程中,batch size使用了4096条光线, N c = 64 , N f = 128 N_c=64, N_f=128 Nc?=64,Nf?=128,使用了Adam作为优化器,学习率是 5 × 1 0 ? 4 5 \times 10^{-4} 5×10?4,然后指数下降到 5 × 1 0 ? 5 5 \times 10^{-5} 5×10?5,Adam的参数设置选择默认 β 1 = 0.9 , β 2 = 0.999 , ? = 1 0 ? 7 \beta_1=0.9, \beta_2 = 0.999, \epsilon=10^{-7} β1?=0.9,β2?=0.999,?=10?7。整个优化过程大约需要100-300k轮迭代,在单个NVIDIA V100 GPU上大约需要1-2天。 Results结果展示就不写了,实际上很多其他文章应该都有介绍了,就放一张图看看就行。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 0:47:22- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |