@TOC
向量场、图片、曲面、有符号距离场都是Fields。
Explicit surfaces和implicit surfaces是在计算机图形学和计算机视觉领域中用于表示三维对象的两种不同方法。
Explicit Surfaces(显式表面):
Implicit Surfaces(隐式表面):
总的来说,显式表面和隐式表面是两种不同的表示方法,各有优缺点。选择使用哪种方法通常取决于具体的应用和场景,以及对于计算效率和表达能力的需求。
Mesh和Point cloud都是显示表面。
Radiance Fields(辐射场)是一种用于描述三维场景中光照和颜色的方法。Radiance Fields通常被用于图形学和计算机视觉领域,以捕捉场景中的光照效果、颜色和阴影等细节。
我们可以把辐射场看成一个函数。它接受一个向量(x,y,z,θ,ϕ)(x,y,z,\theta,\phi )(x,y,z,θ,ϕ)作为输入,其中,(x,y,z)(x,y,z)(x,y,z)表示这个点在空间中的坐标,(θ,ϕ)(\theta,\phi )(θ,ϕ)表示观察角度(俯仰角pitch和偏航角yaw)。
这个函数被称为NeRF函数,它的输出是(RGB,σ)(RGB,\sigma )(RGB,σ)。RGB很好理解,就是这个点的颜色。而σ\sigmaσ,是一个被称为体素密度的计算量,下一节会具体讲解。
总而言之,Radiance Field描述了在三维空间中每个点的辐射度(radiance),这代表了在该点上的光照强度和颜色。通过学习辐射场,可以生成逼真的图像,包括场景中的各种光照和反射效果。
在三维图形学和计算机视觉中,体素密度 σ(x)\sigma(x)σ(x)通常用来表示体积数据中每个体素(三维像素)的密度或吸收率。这个密度函数 σ(x)\sigma(x)σ(x) 提供了对场景中不同区域的物质分布或浓度的描述。
具体而言,σ(x)\sigma(x)σ(x)表示在空间位置 xxx 处的体素密度。该函数的取值通常与场景中的物体或介质的性质有关,比如在医学图像学中, σ(x)\sigma(x)σ(x) 可能表示某个组织的密度,而在计算机图形学中,它可以表示某个材质或介质的密度。
一些常见的应用场景包括:
通常,密度函数σ(x)\sigma(x)σ(x)的值越大,表示该位置的体素越密集或吸收率越高。这种密度信息对于模拟光照、渲染和可视化等任务都是非常重要的。
渲染(Rendering)是指将三维模型或场景转换成二维图像的过程。在计算机图形学中,渲染是一个重要的概念,它是计算机图形学中最重要的技术之一。
在渲染过程中,计算机需要对三维模型或场景进行处理,包括建模、纹理、映射、光照计算、投影变换、视点变换等,最终生成一张二维图像。这个过程涉及到大量的计算和图形处理技术,如光线追踪、阴影计算、反射和折射等。
在NeRF中,用到了一种名为体渲染(Volumn render)的技术。
使用球追踪(Sphere Tracing)技术来渲染一个带有符号距离场(Signed Distance Field)的场景,并从中获取屏幕空间法线图(Screen Space Normal Map)和深度图(Depth Map)。其中关键要素如下:
体渲染(Volume Rendering)是一种用于可视化三维体积数据的技术,通常应用于医学成像、科学可视化和计算机图形学等领域。体渲染的目标是生成逼真的图像,呈现出体积内部的结构和特征。
NeRF使用渲染方式的正是基于体渲染技术。由于体渲染全程都是可微分的,就可以用神经网络去训练NeRF函数。以下是体渲染的基本原理和一些关键公式:
光线在体积中的传播通常由类似以下的积分公式表示:
C=∫0tmaxT(x)⋅c(x)dx C = \int_{0}^{t_{max}} T(x) \cdot c(x) \,dx C=∫0tmaxT(x)⋅c(x)dx
其中:
透明度传输函数T(x)T(x)T(x) 定义了在光线穿过体积中的不同位置时,光线的透明度变化。这通常是一个关于密度或强度的函数。常见的形式之一是:
T(x)=e−∫0xσ(t)dt T(x) = e^{-\int_{0}^{x} \sigma(t) \,dt} T(x)=e−∫0xσ(t)dt
其中σ(t)\sigma(t)σ(t) 是在位置 ttt 处的密度。这由NeRF函数计算得出。
颜色传输函数C(x)C(x)C(x)定义了在体积中不同位置的颜色。这由NeRF函数计算得出。
三维内容是形状和外观的组合。如果拥有一个三维内容,再搭配一个渲染器,就可以得到在想要的视角下观察这个物体的RGB图像。
Material texture map & environment lighting:分为两步
Radiance field:已经介绍过。
两种表征方式的特点:
输入空间坐标和位姿,经过神经网络的推理之后,我们可以获得重建的辐射场(Radiance Field)。然后,将这些Radiance Field经过体渲染(Volumn render),就可以得到我们可以观测的RGB图像。
首先,输入的(x,y,z,θ,ϕ)(x,y,z,\theta,\phi )(x,y,z,θ,ϕ)会经过一层Positional Encoding去提取高频特征,这个Positional Encoding怎么做的会在下一节讲。然后,(x,y,z)(x,y,z )(x,y,z)经过MLP的推理,输出体素密度σ\sigmaσ。此外,在输出体素密度σ\sigmaσ的上一层中,加入了经过编码的(θ,ϕ)(\theta,\phi )(θ,ϕ),然后再经过另外的MLP的推理,输出颜色RGB。最后体素密度σ\sigmaσ和颜色RGB进行体渲染。
图中,γ(x)\gamma(x)γ(x)表示经过编码的(x,y,z)(x,y,z )(x,y,z),γ(d)\gamma(d)γ(d)表示经过编码的(θ,ϕ)(\theta,\phi )(θ,ϕ)。
需要注意的是,在原论文中,作者还在网络中间第二次加入了坐标信息来进行加强。MLP的层数与结构如图所示。
神经网络的偏移(bias)的本意是为了拟合地更加平滑,但在NeRF的任务中,太过平滑(smooth)的图像往往意味着模糊,因此,我们更加尖锐(sharp)、梯度更大的图像。
NeRF作者在最上层插入了一层Fourier features,很好地解决了这个问题。其计算公式如下:
KaTeX parse error: Expected 'EOF', got '\\' at position 86: …2^{L-1}\pi p) \̲\̲
对应(x,y,z,θ,ϕ)(x,y,z,\theta,\phi )(x,y,z,θ,ϕ),就是:
KaTeX parse error: Expected 'EOF', got '\\' at position 113: …}\pi(x,y,z))) \̲\̲ \gamma((\theta…
(x,y,z,θ,ϕ)(x,y,z,\theta,\phi )(x,y,z,θ,ϕ)都要先归一化。 L是个超参数。
NeRF使用了基于体渲染的分层体素渲染技术。对于原始的体渲染公式的推理,涉及一些物理学原理,这里,我们直接不加证明地给出公式,这个公式几乎在所有关于NeRF的解释中都可以看见。
C(0→∞)=∫0∞T(0→t)⋅σ(t)⋅c(t)dt C(0 \to \infty) = \int_{0}^{\infty } T(0 \to t)\cdot \sigma(t) \cdot c(t) \,dt C(0→∞)=∫0∞T(0→t)⋅σ(t)⋅c(t)dt
其中,T(0→t)=exp(−∫0tσ(x)dx)T(0 \to t)=exp\left( - \int_{0}^{t } \sigma(x) \,dx \right)T(0→t)=exp(−∫0tσ(x)dx)
当然,我们不可能计算无穷远,规定如下:
KaTeX parse error: Expected 'EOF', got '积' at position 2: 积̲分下限,即光线起点:t_{ne…
上式修改为:
KaTeX parse error: Expected 'EOF', got '(' at position 3: C(̲t_n \to t_f) = …
其中,T(tn→t)=exp(−∫tntσ(x)dx)T(t_n \to t)=exp\left( - \int_{t_n}^{t } \sigma(x) \,dx \right)T(tn→t)=exp(−∫tntσ(x)dx)
笔者看了很多的blog,说的都不是很清楚。这里有不对的请指正。
连续性方程无法通过计算机求解,需要离散化。
接下来,我们先对T(t)T(t)T(t)进行离散化。首先,把积分区间长度t−tnt-t_{n}t−tn等分成n份,那么第iii个采样点的位置就是
ti=tn+in⋅(t−tn),i=0,1,2,...,n t_i=t_n+\frac{i}{n} \cdot ( t-t_{n}),i=0,1,2,...,n ti=tn+ni⋅(t−tn),i=0,1,2,...,n
再利用积分的可加性:
KaTeX parse error: Expected 'EOF', got '\\' at position 70: …,dx \right) \̲\̲ =exp\left( - …
再使用拉格朗日中值定理:
KaTeX parse error: Expected 'EOF', got '\\' at position 93: …,dx \right) \̲\̲ =exp\left( - …
定义每一等分的长度为:ti+1−ti=t−tnn=δit_{i+1}-t_i= \frac{t-t_{n}}{n}=\delta_iti+1−ti=nt−tn=δi:
T(tn→t)=exp(−∑i=0n−1σ(xi)⋅δi) T(t_n \to t)=exp\left( - \sum_{i=0}^{n-1} \sigma(x_i) \cdot \delta_i \right) T(tn→t)=exp(−i=0∑n−1σ(xi)⋅δi)
只要给定了起点tnt_ntn和参数ttt,那么δi\delta_iδi就是常数,且:
xi∈(tn+in⋅(t−tn),tn+i+1n⋅(t−tn)) x_i \in \left( t_n+\frac{i}{n} \cdot ( t-t_{n}) ,t_n+\frac{i+1}{n} \cdot ( t-t_{n}) \right) xi∈(tn+ni⋅(t−tn),tn+ni+1⋅(t−tn))
σ(xi)\sigma(x_i)σ(xi)是通过近似计算的,只要n足够大,σ(xi)\sigma(x_i)σ(xi)就足够准确。
我们先推理TTT的一个性质:
T(a→c)=exp(−[∫abσ(t)dt+∫bcσ(t)dt])=exp(−∫abσ(t)dt)exp(−∫bcσ(t)dt)=T(a→b)⋅T(b→c) \begin{aligned} \mathcal{T}(a\rightarrow c)& =\exp\left(-\left[\int_a^b\sigma(t)dt+\int_b^c\sigma(t)dt\right]\right) \\ &=\exp\left(-\int_a^b\sigma(t)dt\right)\exp\left(-\int_b^c\sigma(t)dt\right) \\ &=\mathcal{T}(a\rightarrow b)\cdot\mathcal{T}(b\rightarrow c) \end{aligned} T(a→c)=exp(−[∫abσ(t)dt+∫bcσ(t)dt])=exp(−∫abσ(t)dt)exp(−∫bcσ(t)dt)=T(a→b)⋅T(b→c)
这与T的概率解释是相吻合的:光线没有击中[a,c]内的任何粒子的概率,等于它没有击中[a,b]、[b,c]两个区间内任何粒子的这两个独立事件的概率的乘积。
我们再推理CCC的一个性质,当[a,b]区间足够小:
KaTeX parse error: Expected & or \\ or \end at position 18: …begin{aligned} \̲b̲o̲l̲d̲s̲y̲m̲b̲o̲l̲{C}(a\rightarro…
其中,i∈[a,b]i \in[a,b]i∈[a,b],然后利用拉格朗日中值定理:
KaTeX parse error: Expected & or \\ or \end at position 18: …begin{aligned} \̲b̲o̲l̲d̲s̲y̲m̲b̲o̲l̲{C}(a\rightarro…
有了这两个性质之后,我们可以很快速地对C进行离散化:
KaTeX parse error: Expected & or \\ or \end at position 132: …thbf{c}(t) dt,n等̲分 \\ &=\sum_{i=…
其中:
KaTeX parse error: Expected 'EOF', got '为' at position 5: t_n为̲光线原点位置,通常为0 \\…
本文由博客一文多发平台 OpenWrite 发布!