nerf总结

目录

Nerf简介

相关知识

辐射场

体渲染

显示表示

隐式表示

Nerf工作的框架

NeRF详细工作的解析

(1)神经辐射场场景表示

(2)体积渲染与辐射场

(3)位置编码

(4)分层体积抽样

NeRF的改进与应用


Nerf简介

NeRF的研究目的是合成同一场景不同视角下的图像。根据给定一个场景的若干张图片,重构出这个场景的3D表示,然后推理的时候输入不同视角就可以合成(渲染)这个视角下的图像了。

「3D表示」有很多种形式,NeRF使用的是辐射场,然后用「体渲染」(Volume Rendering)技术,给定一个相机视角,把辐射场渲染成一张图像。

相关知识

辐射场

所谓辐射场,我们可以把它看做是一个函数:如果我们从一个角度向一个静态空间发射一条射线,我们可以查询到这条射线在空间中每个点 (x,y,z) 的密度 σ ,以及该位置在射线角度 (θ,ϕ) 下呈现出来的颜色 c ( c=(R,G,B) ),即 F:(x,y,z,θ,ϕ)→(R,G,B,σ) 。其中密度是用来计算权重的,对点上的颜色做加权求和就可以呈现像素颜色。实际上,对于辐射场我们只要维护一个表,给定一个 (x,y,z,θ,ϕ) 直接查表获得RGB值和密度,给体渲染方法用就好了。而NeRF提出了更好的方法:用神经网络来建模这个映射。

体渲染

体渲染简而言之是从体数据渲染得到2D图片的过程。

现实生活中,有一些领域采集的3D数据是以体数据格式存储的,例如医疗中的CT和MRI、地质信息、气象信息等,这些数据需要渲染到2D图像才能够被人类理解。除此之外体数据建模(Volume)相比于传统的Mesh、Point,更加适合模拟光照、烟雾、火焰等非刚体,因此也在图形学中有很多应用。

体数据的渲染主要是指通过追踪光线进入场景并对光线长度进行某种积分来生成图像或视频,具体实现的方法包括:Ray Casting,Ray Marching,Ray Tracing。

NeRF通过隐式表达的方式完成新视角合成任务(Novel View Synthesis Task)

新视角合成任务

指的是对于某一场景给定某些视角下的观测(图片),通过算法合成新视角下的观测(图片)的任务,如下图所示:

视角合成方法通常使用一个中间3D场景表征作为中介来生成高质量的虚拟视角,如何对这个中间3D场景进行表征,分为了“显示表示“和”隐式表示“,然后再对这个中间3D场景进行渲染,生成照片级的视角。

显示表示

3D场景包括Mesh,Point Cloud,Voxel,Volume等,它能够对场景进行显式建模,但是因为其是离散表示的,导致了不够精细化会造成重叠等伪影,更重要的是,它存储的三维场景表达信息数据量极大,对内存的消耗限制了高分辨率场景的应用。

隐式表示

3D场景通常用一个函数来描述场景几何,可以理解为将复杂的三维场景表达信息存储在函数的参数中。因为往往是学习一种3D场景的描述函数,因此在表达大分辨率场景的时候它的参数量相对于“显示表示”是较少的,并且”隐式表示“函数是种连续化的表达,对于场景的表达会更为精细。

NeRF做到了利用”隐式表示“实现了照片级的视角合成效果,它选择了Volume作为中间3D场景表征,然后再通过Volume rendering实现了特定视角照片合成效果。可以说NeRF实现了从离散的照片集中学习出了一种隐式的Volume表达,然后在某个特定视角,利用该隐式Volume表达和体渲染得到该视角下的照片。

Nerf工作的框架

简单的来说,NeRF工作的过程可以分成两部分:三维重建渲染

1.三维重建部分本质上是一个2D到3D的建模过程,利用3D点的位置(x,y,z)及方位视角(θ,φ)作为输入,通过多层感知机(MLP)建模该点对应的颜色color(c)及体素密度volume density(σ),形成了3D场景的”隐式表示“。即下图的红框a和b部分

2.渲染部分一个3D到2D的建模过程,渲染部分利用重建部分得到的3D点的颜色及不透明度沿着光线进行整合得到最终的2D图像像素值。即下图的红框c部分

3.优化部分,在训练的时候,利用渲染部分得到的2D图像,通过与Ground Truth做L2损失函数(L2 Loss)进行网络优化。这样的损失函数用于衡量生成的图像与真实图像之间的差异,以指导模型参数的更新。即下图的红框d部分

NeRF详细工作的解析

(1)神经辐射场场景表示

神经辐射场场景表示(Neural Radiance Field Scene Representation)该部分的输入是三维位置(x,y,z)和二维方位视角(θ,φ),输出是颜色c=(r,g,b)和体素密度σ,即利用一个MLP网络近似地表示这种映射F:(x,d) -> (c,σ),这个映射F就是一种3D场景的”隐式表示“。

该MLP网络先使用8个全连接层处理三维位置(x,y,z),输出体素密度σ和256维特征向量(因此体素密度σ仅是关于三维位置(x,y,z)的函数);然后将上面得到的256维特征向量与二维方位视角(θ,φ)concat,接着用4个全连接层处理,输出颜色c=(r,g,b)。(当然,这里预处理需要使用高频位置编码,详细信息看③Positional encoding部分)

该部分即下图红框部分:

(2)体积渲染与辐射场

体积渲染与辐射场(Volume Rendering with Radiance Fields)该部分使用经典体渲染(Volume Rendering)的原理渲染通过场景的任何光线的颜色,即下面这条式子:

其中函数T(t)表示射线从tn到t沿射线累积透射率,即射线从tn到t不碰到任何粒子的概率。从(1)中建模的Neural Radiance Field中绘制视图,需要估计通过所需虚拟相机的每个像素跟踪的相机光线的积分C®,然而(1)中建模后选取了Volumn作为3D中间表示,势必会使用到离散求积法对这个连续积分进行数值估计,这会极大地限制表示的分辨率,因此可通过分层抽样方法的方法,使得即使使用离散的样本估计积分,但是能够较好地表示一个连续的场景(类似重要性采样,对整个积分域进行非均匀离散化,较能还原原本的积分分布)。其中离散化式子为:

该部分即下图红框部分:

(3)位置编码

位置编码(Positional encoding)该部分中指出尽管神经网络是通用的函数近似器,但是他们发现,让①中的MLP网络(F:(x,d) -> (c,σ))直接操作 (x,y,z,θ,φ)输入会导致渲染在表示颜色和几何形状方面的高频变化方面表现不佳,表明深度网络偏向于学习低频函数。因此在将(x,y,z,θ,φ)输入传递给网络之前,使用高频函数将输入映射到更高维度的空间,可以更好地拟合包含高频变化的数据。该高频编码函数为:

这个高频编码函数有点类似傅里叶级数的方式,其中p就是(x,y,z,θ,φ)输入,并且输入均归一化于[-1,1],在实验中针对于(x,y,z)输入取L=10,针对于(θ,φ)输入取L=4,即:

(4)分层体积抽样

分层体积抽样(Hierarchical volume sampling)该部分指出因为空间中的密度分布是不均匀的,射线均匀随机采样的话,渲染效率会比较低:射线射了半天可能经过高密度的点比较少。从上面的分析我们可以看到,整个渲染过程无非是对射线上的采样点的颜色进行加权求和。其中权重 wi=Ti(1−exp(−σiδi)) .

 我们可以用渲染公式中对颜色加权权重 wi 作为在对应区间采样的概率。我们训练两个辐射场网络,一个粗糙网络(Coares)一个精细网络(Fine)。粗糙网络是在均匀采样得到比较少( Nc )的点进行渲染并训练的网络,用来输出wi进行采样概率估计。对 wi 进行归一化,把它看作是概率值:

NeRF的改进与应用

NeRF的发展主要分为两个大的方向,一种是基于NeRF问题的改进,一种是基于NeRF的应用。

基于NeRF问题的改进,主要包括:

速度慢

只针对静态场景

泛化性差

需要大量视角

其他

基于NeRF(或者神经场)的应用,简要的分类和总结,主要包括:

逆渲染

可控编辑

数字化人体

多模态

图像处理

视频处理

特殊领域

猜你喜欢

转载自blog.csdn.net/qq_46684028/article/details/132481123
今日推荐