赞
踩
向量场、图片、曲面、有符号距离场都是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函数,它的输出是 ( R G B , σ ) (RGB,\sigma ) (RGB,σ)。RGB很好理解,就是这个点的颜色。而 σ \sigma σ,是一个被称为体素密度的计算量,下一节会具体讲解。
总而言之,Radiance Field描述了在三维空间中每个点的辐射度(radiance),这代表了在该点上的光照强度和颜色。通过学习辐射场,可以生成逼真的图像,包括场景中的各种光照和反射效果。
在三维图形学和计算机视觉中,体素密度 σ ( x ) \sigma(x) σ(x)通常用来表示体积数据中每个体素(三维像素)的密度或吸收率。这个密度函数 σ ( x ) \sigma(x) σ(x) 提供了对场景中不同区域的物质分布或浓度的描述。
具体而言, σ ( x ) \sigma(x) σ(x)表示在空间位置 x x x 处的体素密度。该函数的取值通常与场景中的物体或介质的性质有关,比如在医学图像学中, σ ( x ) \sigma(x) σ(x) 可能表示某个组织的密度,而在计算机图形学中,它可以表示某个材质或介质的密度。
一些常见的应用场景包括:
医学成像: 在医学图像学中, σ ( x ) \sigma(x) σ(x)可以表示组织的密度,例如在CT扫描中,不同的组织或器官会有不同的密度值。
体积渲染: 在体积渲染中, σ ( x ) \sigma(x) σ(x)可以用于模拟光线在体积中的吸收效应。不同密度的区域对光线的吸收程度不同,从而影响渲染结果。
计算机图形学: 在一些图形学的应用中, σ ( x ) \sigma(x) σ(x)可以表示材质的密度,影响光线通过材质时的表现。
通常,密度函数 σ ( x ) \sigma(x) σ(x)的值越大,表示该位置的体素越密集或吸收率越高。这种密度信息对于模拟光照、渲染和可视化等任务都是非常重要的。
渲染(Rendering)是指将三维模型或场景转换成二维图像的过程。在计算机图形学中,渲染是一个重要的概念,它是计算机图形学中最重要的技术之一。
在渲染过程中,计算机需要对三维模型或场景进行处理,包括建模、纹理、映射、光照计算、投影变换、视点变换等,最终生成一张二维图像。这个过程涉及到大量的计算和图形处理技术,如光线追踪、阴影计算、反射和折射等。
在NeRF中,用到了一种名为体渲染(Volumn render)的技术。
使用球追踪(Sphere Tracing)技术来渲染一个带有符号距离场(Signed Distance Field)的场景,并从中获取屏幕空间法线图(Screen Space Normal Map)和深度图(Depth Map)。其中关键要素如下:
Signed Distance Field(符号距离场): 符号距离场是一种表示空间中对象表面的方式。对于每个点,它的值表示该点到最近表面的有向距离,有向意味着正值表示在物体外,负值表示在物体内。符号距离场通常用于描述几何体,而无需显式表示几何体的网格。
Sphere Tracing(球追踪): 球追踪是一种光线追踪技术,通常用于符号距离场的渲染。它通过沿视线(ray)追踪场景中的物体表面,不断沿着视线前进,直到达到符号距离场的边界。这种技术可以有效地渲染符号距离场中的复杂几何形状,包括曲面和体积。
Screen Space Normal Map(屏幕空间法线图): 法线图是一种图像,其中每个像素的颜色表示与表面垂直的法线方向。屏幕空间法线图是将法线映射到屏幕空间的图像,通常在屏幕空间的 XY 平面上,用 RGB 值来表示法线的方向。
Depth Map(深度图): 深度图是一种图像,其中每个像素的值表示与相机的距离,通常以线性或非线性的方式编码。深度图在渲染中常用于实现景深效果和其他与深度相关的图形效果。
体渲染(Volume Rendering)是一种用于可视化三维体积数据的技术,通常应用于医学成像、科学可视化和计算机图形学等领域。体渲染的目标是生成逼真的图像,呈现出体积内部的结构和特征。
NeRF使用渲染方式的正是基于体渲染技术。由于体渲染全程都是可微分的,就可以用神经网络去训练NeRF函数。以下是体渲染的基本原理和一些关键公式:
体素(Voxel): 三维体积数据通常由体素组成,每个体素是体积中的一个像素,包含各种信息如密度、颜色等。这正是NeRF函数的输出。
体积光线积分: 体渲染的基本思想是对每条光线在体积中进行积分,计算该光线通过体素时的光照和颜色。这涉及到计算光线与体积中不同位置的相互作用。
光线在体积中的传播通常由类似以下的积分公式表示:
C = ∫ 0 t m a x T ( x ) ⋅ c ( x ) d x 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 − ∫ 0 x σ ( t ) d t T(x) = e^{-\int_{0}^{x} \sigma(t) \,dt} T(x)=e−∫0xσ(t)dt
其中 σ ( t ) \sigma(t) σ(t) 是在位置 t t t 处的密度。这由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,很好地解决了这个问题。其计算公式如下:
γ
(
p
)
=
(
s
i
n
(
2
0
π
p
)
,
c
o
s
(
2
0
π
p
)
,
…
,
s
i
n
(
2
L
−
1
π
p
)
,
c
o
s
(
2
L
−
1
π
p
)
\gamma(p)=(sin(2^0\pi p),cos(2^0\pi p),\ldots,sin(2^{L-1}\pi p), cos(2^{L-1}\pi p) \\
γ(p)=(sin(20πp),cos(20πp),…,sin(2L−1πp),cos(2L−1πp)
对应
(
x
,
y
,
z
,
θ
,
ϕ
)
(x,y,z,\theta,\phi )
(x,y,z,θ,ϕ),就是:
γ
(
(
x
,
y
,
z
)
)
=
(
s
i
n
(
2
0
π
(
x
,
y
,
z
)
)
,
c
o
s
(
2
0
π
(
x
,
y
,
z
)
)
,
…
,
s
i
n
(
2
L
−
1
π
(
x
,
y
,
z
)
)
,
c
o
s
(
2
L
−
1
π
(
x
,
y
,
z
)
)
)
γ
(
(
θ
,
φ
)
)
=
(
s
i
n
(
2
0
π
(
θ
,
φ
)
)
,
c
o
s
(
2
0
π
(
θ
,
φ
)
)
,
…
,
s
i
n
(
2
L
−
1
π
(
θ
,
φ
)
)
,
c
o
s
(
2
L
−
1
π
(
θ
,
φ
)
)
)
\gamma((x,y,z))=(sin(2^0\pi(x,y,z)),cos(2^0\pi(x,y,z)),\ldots,sin(2^{L-1}\pi(x,y,z)), cos(2^{L-1}\pi(x,y,z))) \\ \gamma((\theta,\varphi))=(sin(2^0\pi(\theta,\varphi)),cos(2^0\pi(\theta,\varphi)),\ldots,sin(2^{L-1}\pi (\theta,\varphi)),cos(2^{L-1}\pi (\theta,\varphi)) )
γ((x,y,z))=(sin(20π(x,y,z)),cos(20π(x,y,z)),…,sin(2L−1π(x,y,z)),cos(2L−1π(x,y,z)))γ((θ,φ))=(sin(20π(θ,φ)),cos(20π(θ,φ)),…,sin(2L−1π(θ,φ)),cos(2L−1π(θ,φ)))
( x , y , z , θ , ϕ ) (x,y,z,\theta,\phi ) (x,y,z,θ,ϕ)都要先归一化。 L是个超参数。
NeRF使用了基于体渲染的分层体素渲染技术。对于原始的体渲染公式的推理,涉及一些物理学原理,这里,我们直接不加证明地给出公式,这个公式几乎在所有关于NeRF的解释中都可以看见。
C ( 0 → ∞ ) = ∫ 0 ∞ T ( 0 → t ) ⋅ σ ( t ) ⋅ c ( t ) d t 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 ) = e x p ( − ∫ 0 t σ ( x ) d x ) T(0 \to t)=exp\left( - \int_{0}^{t } \sigma(x) \,dx \right) T(0→t)=exp(−∫0tσ(x)dx)
当然,我们不可能计算无穷远,规定如下:
积分下限,即光线起点:
t
n
e
a
r
,简写
t
n
积分上限,即光线终点:
t
f
a
r
,简写
t
f
积分下限,即光线起点:t_{near},简写t_{n} \\ 积分上限,即光线终点:t_{far},简写t_{f}
积分下限,即光线起点:tnear,简写tn积分上限,即光线终点:tfar,简写tf
上式修改为:
C
(
t
n
→
t
f
)
=
∫
t
n
t
f
T
(
t
n
→
t
)
⋅
σ
(
t
)
⋅
c
(
t
)
d
t
C(t_n \to t_f) = \int_{t_{n}}^{t_{f} } T(t_n \to t)\cdot \sigma(t) \cdot c(t) \,dt
C(tn→tf)=∫tntfT(tn→t)⋅σ(t)⋅c(t)dt
其中,
T
(
t
n
→
t
)
=
e
x
p
(
−
∫
t
n
t
σ
(
x
)
d
x
)
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
−
t
n
t-t_{n}
t−tn等分成n份,那么第
i
i
i个采样点的位置就是
t
i
=
t
n
+
i
n
⋅
(
t
−
t
n
)
,
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
再利用积分的可加性:
T
(
t
n
→
t
)
=
e
x
p
(
−
∫
t
n
t
σ
(
x
)
d
x
)
=
e
x
p
(
−
∑
i
=
0
n
−
1
∫
t
i
t
i
+
1
σ
(
x
)
d
x
)
T(t_n \to t)=exp\left( - \int_{t_{n}}^t \sigma(x) \,dx \right) \\ =exp\left( - \sum_{i=0}^{n-1}\int_{t_i}^{t_{i+1} } \sigma(x) \,dx \right)
T(tn→t)=exp(−∫tntσ(x)dx)=exp(−i=0∑n−1∫titi+1σ(x)dx)
再使用拉格朗日中值定理:
T
(
t
n
→
t
)
=
e
x
p
(
−
∑
i
=
0
n
−
1
∫
t
i
t
i
+
1
σ
(
x
)
d
x
)
=
e
x
p
(
−
∑
i
=
0
n
−
1
σ
(
x
i
)
⋅
(
t
i
+
1
−
t
i
)
)
x
i
∈
(
t
i
,
t
i
+
1
)
T(t_n \to t)=exp\left( - \sum_{i=0}^{n-1}\int_{t_i}^{t_{i+1} } \sigma(x) \,dx \right) \\ =exp\left( - \sum_{i=0}^{n-1} \sigma(x_i) \cdot (t_{i+1}-t_i) \right) \\ x_i \in (t_i ,t_{i+1})
T(tn→t)=exp(−i=0∑n−1∫titi+1σ(x)dx)=exp(−i=0∑n−1σ(xi)⋅(ti+1−ti))xi∈(ti,ti+1)
定义每一等分的长度为:
t
i
+
1
−
t
i
=
t
−
t
n
n
=
δ
i
t_{i+1}-t_i= \frac{t-t_{n}}{n}=\delta_i
ti+1−ti=nt−tn=δi:
T
(
t
n
→
t
)
=
e
x
p
(
−
∑
i
=
0
n
−
1
σ
(
x
i
)
⋅
δ
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)
只要给定了起点
t
n
t_n
tn和参数
t
t
t,那么
δ
i
\delta_i
δi就是常数,且:
x
i
∈
(
t
n
+
i
n
⋅
(
t
−
t
n
)
,
t
n
+
i
+
1
n
⋅
(
t
−
t
n
)
)
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))
σ ( x i ) \sigma(x_i) σ(xi)是通过近似计算的,只要n足够大, σ ( x i ) \sigma(x_i) σ(xi)就足够准确。
我们先推理
T
T
T的一个性质:
T
(
a
→
c
)
=
exp
(
−
[
∫
a
b
σ
(
t
)
d
t
+
∫
b
c
σ
(
t
)
d
t
]
)
=
exp
(
−
∫
a
b
σ
(
t
)
d
t
)
exp
(
−
∫
b
c
σ
(
t
)
d
t
)
=
T
(
a
→
b
)
⋅
T
(
b
→
c
)
这与T的概率解释是相吻合的:光线没有击中[a,c]内的任何粒子的概率,等于它没有击中[a,b]、[b,c]两个区间内任何粒子的这两个独立事件的概率的乘积。
我们再推理
C
C
C的一个性质,当[a,b]区间足够小:
C
(
a
→
b
)
=
∫
a
b
T
(
a
→
t
)
⋅
σ
(
t
)
⋅
c
(
t
)
d
t
≈
σ
(
i
)
⋅
c
(
i
)
∫
a
b
T
(
a
→
t
)
d
t
=
σ
(
i
)
⋅
c
(
i
)
∫
a
b
exp
(
−
∫
a
t
σ
(
x
)
d
x
)
d
t
其中,
i
∈
[
a
,
b
]
i \in[a,b]
i∈[a,b],然后利用拉格朗日中值定理:
C
(
a
→
b
)
≈
σ
(
i
)
⋅
c
(
i
)
∫
a
b
exp
(
−
σ
(
i
)
(
t
−
a
)
)
d
t
=
σ
(
i
)
⋅
c
(
i
)
⋅
exp
(
−
σ
(
i
)
(
t
−
a
)
)
−
σ
(
i
)
∣
a
b
=
c
(
i
)
⋅
[
1
−
exp
[
σ
(
i
)
(
b
−
a
)
]
]
有了这两个性质之后,我们可以很快速地对C进行离散化:
C
(
t
n
→
t
f
)
=
∑
i
=
0
n
−
1
∫
t
i
t
i
+
1
T
(
t
)
⋅
σ
(
t
)
⋅
c
(
t
)
d
t
,
n
等分
=
∑
i
=
0
n
−
1
∫
t
i
t
i
+
1
T
(
t
n
→
t
i
)
⋅
T
(
t
i
→
t
)
⋅
σ
(
t
)
⋅
c
(
t
)
d
t
,
性质一
=
∑
i
=
0
n
−
1
T
(
t
n
→
t
i
)
∫
t
i
t
i
+
1
T
(
t
i
→
t
)
⋅
σ
(
t
)
⋅
c
(
t
)
d
t
,
常数拿到积分外
=
∑
i
=
0
n
−
1
T
(
t
n
→
t
i
)
⋅
[
1
−
exp
[
−
σ
(
t
k
)
(
t
i
+
1
−
t
i
)
]
]
⋅
c
(
t
k
)
,性质二
=
∑
i
=
0
n
−
1
T
(
t
n
→
t
i
)
c
(
t
k
)
[
1
−
exp
[
−
σ
(
t
k
)
δ
i
]
]
其中:
t
n
为光线原点位置,通常为
0
t
i
=
t
n
+
i
n
⋅
(
t
−
t
n
)
,
i
=
0
,
1
,
2
,
.
.
.
,
n
t
k
∈
(
t
i
,
t
i
+
1
)
δ
i
=
t
i
+
1
−
t
i
=
t
f
−
t
n
n
t_n为光线原点位置,通常为0 \\ t_i=t_n+\frac{i}{n} \cdot ( t-t_{n}),i=0,1,2,...,n \\ t_k \in (t_i,t_i+1) \\ \delta_i=t_{i+1}-t_i=\frac{t_f-t_{n}}{n}
tn为光线原点位置,通常为0ti=tn+ni⋅(t−tn),i=0,1,2,...,ntk∈(ti,ti+1)δi=ti+1−ti=ntf−tn
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。