【NeRF】对小白友好的Neural_Radiance_Fields讲解

cnblogs 2024-08-15 13:43:00 阅读 52

@

目录

    <li>1.Definition of field(场的定义)
    • 1.1 shape representations(各种形状表征方式)
    • 1.2 Explicit surfaces and implicit surfaces
    • 1.3 Radiance Field(Implicit Surfaces)
      • 体素密度
  • 2.Definition of Rendering(渲染的定义)
    • 2.1 Sphere Tracing(球追踪技术)
    • 2.2 Volumn render(体渲染)
  • 3.3D contents(什么是三维内容)
    • appearance representation(外表表征方式)
  • 4.NeRF的具体细节
    • 4.1 Neural Field General Framework
    • 4.2 三维重建过程
      • Architecture(神经网络架构)
        • Fourier features(Positional Encoding)
    • 4.3 NeRF的分层体素渲染:Hierarchical volume sampling
      • 原始公式解释
      • $T(t_n \to t)$离散化
      • $C(t_n \to t_f)$离散化

1.Definition of field(场的定义)

  • A field is a quantity defined for all spatial and/or temporal coordinates.(场是由空间或者时间定义的量)
  • A neural field is a field that is paramaterized fully or in part of by a neural network.(神经场是神经网络构成部分或者全部参数的场)

class="img-pbox">src="/uploads/2024/08/15/1723700590647006189.webp" alt="在这里插入图片描述" loading="lazy">

向量场、图片、曲面、有符号距离场都是Fields。

1.1 shape representations(各种形状表征方式)

class="img-pbox">src="/uploads/2024/08/15/1723700587904076171.webp" alt="在这里插入图片描述" loading="lazy">

    <li>Mesh:表面是由一个个三角形组成
  • Point cloud:点云
  • Occupancy field:对三维空间中的每一个点,如果这个点被物体占有,则把这个点的value设置为1
  • Signed distance field:对三维空间中的每一个点,把这个点的value设置为到物体最近表面的距离,区分正负,图中蓝色为负

1.2 Explicit surfaces and implicit surfaces

Explicit surfaces和implicit surfaces是在计算机图形学和计算机视觉领域中用于表示三维对象的两种不同方法。

  1. Explicit Surfaces(显式表面):

    • 在显式表面中,对象的几何形状是通过显式定义的表面方程或参数化表示的。这意味着,对于给定的参数值,你可以直接计算出表面上的点的坐标。
    • 显式表面通常通过数学公式或参数方程表示,例如球体的方程是$x^2 + y^2 + z^2 = r^2$,或者一个平面的方程是 $ax + by + cz + d = 0$。
    • 优点是可以直接得到表面上的点的位置,容易进行几何计算。但对于复杂形状,表达式可能变得复杂。
  2. Implicit Surfaces(隐式表面):

    • 在隐式表面中,对象的表面并不直接表示为显式的方程或参数形式。相反,对象的表面由一个隐含的函数$F(x, y, z)$决定,函数值为零的点在表面上。
    • 表面的形状由零集 $F(x, y, z) = 0$决定,例如 $x^2 + y^2 + z^2 - r^2 = 0$表示一个球体的隐式表面。
    • 隐式表面通常用于描述不规则或复杂的几何形状,因为它们不需要直接解出表面方程。但要计算表面上的点,通常需要使用数值方法,例如Marching Cubes算法。

总的来说,显式表面和隐式表面是两种不同的表示方法,各有优缺点。选择使用哪种方法通常取决于具体的应用和场景,以及对于计算效率和表达能力的需求。

Mesh和Point cloud都是显示表面。

1.3 Radiance Field(Implicit Surfaces)

Radiance Fields(辐射场)是一种用于描述三维场景中光照和颜色的方法。Radiance Fields通常被用于图形学和计算机视觉领域,以捕捉场景中的光照效果、颜色和阴影等细节。

class="img-pbox">src="/uploads/2024/08/15/1723700592444028586.webp" alt="在这里插入图片描述" loading="lazy">

我们可以把辐射场看成一个函数。它接受一个向量$(x,y,z,\theta,\phi )$作为输入,其中,$(x,y,z)$表示这个点在空间中的坐标,$(\theta,\phi )$表示观察角度(俯仰角pitch和偏航角yaw)。

这个函数被称为NeRF函数,它的输出是$(RGB,\sigma )$。RGB很好理解,就是这个点的颜色。而$\sigma$,是一个被称为体素密度的计算量,下一节会具体讲解。

总而言之,Radiance Field描述了在三维空间中每个点的辐射度(radiance),这代表了在该点上的光照强度和颜色。通过学习辐射场,可以生成逼真的图像,包括场景中的各种光照和反射效果。

体素密度

在三维图形学和计算机视觉中,体素密度 $\sigma(x)$通常用来表示体积数据中每个体素(三维像素)的密度或吸收率。这个密度函数 $\sigma(x)$ 提供了对场景中不同区域的物质分布或浓度的描述。

具体而言,$\sigma(x)$表示在空间位置 $x$ 处的体素密度。该函数的取值通常与场景中的物体或介质的性质有关,比如在医学图像学中, $\sigma(x)$ 可能表示某个组织的密度,而在计算机图形学中,它可以表示某个材质或介质的密度。

一些常见的应用场景包括:

    <li>医学成像: 在医学图像学中, $\sigma(x)$可以表示组织的密度,例如在CT扫描中,不同的组织或器官会有不同的密度值。
  1. 体积渲染: 在体积渲染中,$\sigma(x)$可以用于模拟光线在体积中的吸收效应。不同密度的区域对光线的吸收程度不同,从而影响渲染结果。
  2. 计算机图形学: 在一些图形学的应用中,$\sigma(x)$可以表示材质的密度,影响光线通过材质时的表现。

通常,密度函数$\sigma(x)$的值越大,表示该位置的体素越密集或吸收率越高。这种密度信息对于模拟光照、渲染和可视化等任务都是非常重要的。

2.Definition of Rendering(渲染的定义)

渲染(Rendering)是指将三维模型或场景转换成二维图像的过程。在计算机图形学中,渲染是一个重要的概念,它是计算机图形学中最重要的技术之一。

在渲染过程中,计算机需要对三维模型或场景进行处理,包括建模、纹理、映射、光照计算、投影变换、视点变换等,最终生成一张二维图像。这个过程涉及到大量的计算和图形处理技术,如光线追踪、阴影计算、反射和折射等。

在NeRF中,用到了一种名为体渲染(Volumn render)的技术

2.1 Sphere Tracing(球追踪技术)

class="img-pbox">src="/uploads/2024/08/15/1723700582198046107.webp" alt="在这里插入图片描述" loading="lazy">

使用球追踪(Sphere Tracing)技术来渲染一个带有符号距离场(Signed Distance Field)的场景,并从中获取屏幕空间法线图(Screen Space Normal Map)和深度图(Depth Map)。其中关键要素如下:

    <li>Signed Distance Field(符号距离场): 符号距离场是一种表示空间中对象表面的方式。对于每个点,它的值表示该点到最近表面的有向距离,有向意味着正值表示在物体外,负值表示在物体内。符号距离场通常用于描述几何体,而无需显式表示几何体的网格。
  1. Sphere Tracing(球追踪): 球追踪是一种光线追踪技术,通常用于符号距离场的渲染。它通过沿视线(ray)追踪场景中的物体表面,不断沿着视线前进,直到达到符号距离场的边界。这种技术可以有效地渲染符号距离场中的复杂几何形状,包括曲面和体积。
  2. Screen Space Normal Map(屏幕空间法线图): 法线图是一种图像,其中每个像素的颜色表示与表面垂直的法线方向。屏幕空间法线图是将法线映射到屏幕空间的图像,通常在屏幕空间的 XY 平面上,用 RGB 值来表示法线的方向。
  3. Depth Map(深度图): 深度图是一种图像,其中每个像素的值表示与相机的距离,通常以线性或非线性的方式编码。深度图在渲染中常用于实现景深效果和其他与深度相关的图形效果。

2.2 Volumn render(体渲染)

class="img-pbox">src="/uploads/2024/08/15/1723700591763039356.webp" alt="在这里插入图片描述" loading="lazy">

体渲染(Volume Rendering)是一种用于可视化三维体积数据的技术,通常应用于医学成像、科学可视化和计算机图形学等领域。体渲染的目标是生成逼真的图像,呈现出体积内部的结构和特征。

NeRF使用渲染方式的正是基于体渲染技术。由于体渲染全程都是可微分的,就可以用神经网络去训练NeRF函数。以下是体渲染的基本原理和一些关键公式:

    <li>基本要素:
  • 体素(Voxel): 三维体积数据通常由体素组成,每个体素是体积中的一个像素,包含各种信息如密度、颜色等。这正是NeRF函数的输出
  • 体积光线积分: 体渲染的基本思想是对每条光线在体积中进行积分,计算该光线通过体素时的光照和颜色。这涉及到计算光线与体积中不同位置的相互作用。
    start="2"> <li>光线的传播和积分:

光线在体积中的传播通常由类似以下的积分公式表示:

$$

C = \int_{0}^{t_{max}} T(x) \cdot c(x) ,dx

$$

其中:

  • $C,color,$是最终生成图像的对应光线的像素点颜色;
  • $t_{max}$ 是光线在体积中传播的最大距离;
  • $T(x),transparent,$是光线在位置$x$处的透明度(也称为传输函数);
  • $c(x)$ 是在位置 $x$ 处的颜色。
    start="3"> <li>透明度传输函数:

透明度传输函数$T(x)$ 定义了在光线穿过体积中的不同位置时,光线的透明度变化。这通常是一个关于密度或强度的函数。常见的形式之一是:

$$

T(x) = e{-\int_{0} \sigma(t) ,dt}

$$

其中$\sigma(t)$ 是在位置 $t$ 处的密度。这由NeRF函数计算得出

    start="4"> <li>色彩传输函数:

颜色传输函数$C(x)$定义了在体积中不同位置的颜色。这由NeRF函数计算得出

3.3D contents(什么是三维内容)

class="img-pbox">src="/uploads/2024/08/15/1723700593945017801.webp" alt="在这里插入图片描述" loading="lazy">

三维内容是形状和外观的组合。如果拥有一个三维内容,再搭配一个渲染器,就可以得到在想要的视角下观察这个物体的RGB图像。

appearance representation(外表表征方式)

class="img-pbox">src="/uploads/2024/08/15/1723700588742064346.webp" alt="在这里插入图片描述" loading="lazy">

    <li>

    Material texture map & environment lighting:分为两步

      1. Material texture map:把一个appearance转化为一张图片,图片的每个像素存储appearance对应位置的材质信息。类似于把地球画成世界地图的过程。
      1. start="2"> <li>environment lighting:光照分布
  • Radiance field:已经介绍过。

两种表征方式的特点:

  • Material texture map & environment lighting:
    • 优点:材质和光照分离,这意味着可以很方便单独修改物体的表面材质和外部光照条件。比如,可以给兔子皮毛上贴一个五角星,然后可以容易地重新获得对应的appearance。也可以打光更亮一点,让兔子变得很明亮。
    • 缺点:反渲染比较复杂
  • Radiance field:
    • 优点:形式简单
    • 缺点:材料和光照混合,在新环境中原来的appearance就失效了。

4.NeRF的具体细节

4.1 Neural Field General Framework

class="img-pbox">src="/uploads/2024/08/15/1723700585937089295.webp" alt="在这里插入图片描述" loading="lazy">

输入空间坐标和位姿,经过神经网络的推理之后,我们可以获得重建的辐射场(Radiance Field)。然后,将这些Radiance Field经过体渲染(Volumn render),就可以得到我们可以观测的RGB图像。

4.2 三维重建过程

Architecture(神经网络架构)

class="img-pbox">src="/uploads/2024/08/15/1723700592892059719.webp" alt="在这里插入图片描述" loading="lazy">

首先,输入的$(x,y,z,\theta,\phi )$会经过一层Positional Encoding去提取高频特征,这个Positional Encoding怎么做的会在下一节讲。然后,$(x,y,z )$经过MLP的推理,输出体素密度$\sigma$。此外,在输出体素密度$\sigma$的上一层中,加入了经过编码的$(\theta,\phi )$,然后再经过另外的MLP的推理,输出颜色RGB。最后体素密度$\sigma$和颜色RGB进行体渲染。

class="img-pbox">src="/uploads/2024/08/15/1723700589727016776.webp" alt="在这里插入图片描述" loading="lazy">

图中,$\gamma(x)$表示经过编码的$(x,y,z )$,$\gamma(d)$表示经过编码的$(\theta,\phi )$。

需要注意的是,在原论文中,作者还在网络中间第二次加入了坐标信息来进行加强。MLP的层数与结构如图所示。

Fourier features(Positional Encoding)

class="img-pbox">src="/uploads/2024/08/15/1723700595021021847.webp" alt="在这里插入图片描述" loading="lazy">

神经网络的偏移(bias)的本意是为了拟合地更加平滑,但在NeRF的任务中,太过平滑(smooth)的图像往往意味着模糊,因此,我们更加尖锐(sharp)、梯度更大的图像。

NeRF作者在最上层插入了一层Fourier features,很好地解决了这个问题。其计算公式如下:

$$

\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) \

$$

对应$(x,y,z,\theta,\phi )$,就是:

$$

\gamma((x,y,z))=(sin(20\pi(x,y,z)),cos(20\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(20\pi(\theta,\varphi)),cos(20\pi(\theta,\varphi)),\ldots,sin(2^{L-1}\pi (\theta,\varphi)),cos(2^{L-1}\pi (\theta,\varphi)) )

$$

$(x,y,z,\theta,\phi )$都要先归一化。 L是个超参数。

4.3 NeRF的分层体素渲染:Hierarchical volume sampling

原始公式解释

NeRF使用了基于体渲染的分层体素渲染技术。对于原始的体渲染公式的推理,涉及一些物理学原理,这里,我们直接不加证明地给出公式,这个公式几乎在所有关于NeRF的解释中都可以看见。

$$

C(0 \to \infty) = \int_{0}^{\infty } T(0 \to t)\cdot \sigma(t) \cdot c(t) ,dt

$$

其中,$T(0 \to t)=exp\left( - \int_{0}^{t } \sigma(x) ,dx \right)$

当然,我们不可能计算无穷远,规定如下:

$$

积分下限,即光线起点:t_{near},简写t_{n} \

积分上限,即光线终点:t_{far},简写t_{f}

$$

上式修改为:

$$

C(t_n \to t_f) = \int_{t_{n}}^{t_{f} } T(t_n \to t)\cdot \sigma(t) \cdot c(t) ,dt

$$

其中,$T(t_n \to t)=exp\left( - \int_{t_n}^{t } \sigma(x) ,dx \right)$

  • 物理解释:

笔者看了很多的blog,说的都不是很清楚。这里有不对的请指正。

  1. $T(t_n \to t)$:光线从$t_{n}$行进至$t$处,未撞击到物体的概率。根据上面$T(x)$的定义,随着光线路径的长度增加,$T$的积分区间$t-t_{n}$会增加,也就会增加对$\sigma(x)$积分的量,$T$的大小也就不断减小。也就是说,随着光线越来越远,$T$逐渐减小,透明度在不断地下降,光线没有碰撞到任何粒子的概率也在减小。
  2. $sigma(x)$:在x位置粒子的密度
  3. $c(x)$:在x位置粒子的颜色

$T(t_n \to t)$离散化

连续性方程无法通过计算机求解,需要离散化。

接下来,我们先对$T(t)$进行离散化。首先,把积分区间长度$t-t_{n}$等分成n份,那么第$i$个采样点的位置就是

$$

t_i=t_n+\frac{i}{n} \cdot ( t-t_{n}),i=0,1,2,...,n

$$

再利用积分的可加性:

$$

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} } \sigma(x) ,dx \right)

$$

再使用拉格朗日中值定理:

$$

T(t_n \to t)=exp\left( - \sum_{i=0}{n-1}\int_{t_i} } \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_{i+1}-t_i= \frac{t-t_{n}}{n}=\delta_i$:

$$

T(t_n \to t)=exp\left( - \sum_{i=0}^{n-1} \sigma(x_i) \cdot \delta_i \right)

$$

只要给定了起点$t_n$和参数$t$,那么$\delta_i$就是常数,且:

$$

x_i \in \left( t_n+\frac{i}{n} \cdot ( t-t_{n}) ,t_n+\frac{i+1}{n} \cdot ( t-t_{n}) \right)

$$

$\sigma(x_i)$是通过近似计算的,只要n足够大,$\sigma(x_i)$就足够准确。

$C(t_n \to t_f)$离散化

我们先推理$T$的一个性质:

$$

\begin{aligned}

\mathcal{T}(a\rightarrow c)& =\exp\left(-\left[\int_ab\sigma(t)dt+\int_bc\sigma(t)dt\right]\right) \

&=\exp\left(-\int_ab\sigma(t)dt\right)\exp\left(-\int_bc\sigma(t)dt\right) \

&=\mathcal{T}(a\rightarrow b)\cdot\mathcal{T}(b\rightarrow c)

\end{aligned}

$$

这与T的概率解释是相吻合的:光线没有击中[a,c]内的任何粒子的概率,等于它没有击中[a,b]、[b,c]两个区间内任何粒子的这两个独立事件的概率的乘积。

我们再推理$C$的一个性质,当[a,b]区间足够小:

$$

\begin{aligned}

\boldsymbol{C}(a\rightarrow b)& =\int_a^b\mathcal{T}(a\to t)\cdot\sigma(t)\cdot\mathbf{c}(t)dt \

&\approx \sigma(i) \cdot \mathbf{c}(i) \int_a^b\mathcal{T}(a\to t)dt \

&=\sigma(i) \cdot \mathbf{c}(i) \int_ab\exp\left(-\int_at\sigma(x)dx\right)dt

\end{aligned}

$$

其中,$i \in[a,b]$,然后利用拉格朗日中值定理:

$$

\begin{aligned}

\boldsymbol{C}(a\rightarrow b)&\approx \sigma(i) \cdot \mathbf{c}(i) \int_a^b\exp\left( - \sigma(i)(t-a) \right )dt \

&=\sigma(i) \cdot \mathbf{c}(i) \cdot\frac{\exp\left( - \sigma(i)(t-a) \right)}{ - \sigma(i) }\biggr|_a^b \

&=\mathbf{c}(i) \cdot [ 1-\exp[ \sigma(i)(b-a) ] ]

\end{aligned}

$$

有了这两个性质之后,我们可以很快速地对C进行离散化:

$$

\begin{aligned}

C(t_{n} \to t_f)

&= \sum_{i=0}{n-1}\int_{t_{i}}{t_{i+1}}\mathcal{T}(t) \cdot \sigma(t) \cdot \mathbf{c}(t) dt,n等分 \

&=\sum_{i=0}^{n-1} \int_{t_{i}}^{t_{i+1}} \mathcal{T}(t_n \to t_i)\cdot\mathcal{T}(t_i \to t) \cdot \sigma(t)\cdot\mathbf{c}(t)dt ,性质一\

&=\sum_{i=0}^{n-1} \mathcal{T}(t_n \to t_i) \int_{t_{i}}^{t_{i+1}}\mathcal{T}(t_i \to t) \cdot \sigma(t)\cdot\mathbf{c}(t)dt,常数拿到积分外 \

&=\sum_{i=0}^{n-1} \mathcal{T}(t_n \to t_i)\cdot

[ 1-\exp[ -\sigma(t_k)(t_{i+1}-t_i) ] ]

\cdot \mathbf{c}(t_k),性质二 \

&=\sum_{i=0}^{n-1} \mathcal{T}(t_n \to t_i)\mathbf{c}(t_k)

[ 1-\exp[ -\sigma(t_k)\delta_i ] ]

\end{aligned}

$$

其中:

$$

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}

$$

本文由博客一文多发平台 OpenWrite 发布!



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。