NeRF 从头开始 :在计算机图形学背景下解释 NeRF

新视图合成是一项重要的计算机视觉任务,具有多种应用。2020 年 NeRF 论文通过使用隐式体积表示在新颖的视图合成中实现了最先进的性能。这篇论文不仅实现了最先进的性能,而且彻底改变了我们通过神经网络(多层感知器)隐式表示 3D 描述的方式。本文将介绍 NeRF 中使用的计算机图形学的基本原语,然后从这些原语中激发 NeRF 的制定。

请注意,本文不会涵盖所有细节,但其目标是让读者熟悉基础知识,以便他们能够理解 NeRF 的基本思想以及扩展 NeRF 的论文。

背景

在本节中,我们将介绍计算机图形学和计算机视觉中的一些术语。如果熟悉这些概念,请随意跳过本节。

渲染
渲染是从场景的 3D 描述到 2D 图像的过程。

图 1:2D 图像的 3D 描述

上图显示了茶壶的 3D 模型。我们想要从这个 3D 对象生成 2D RGB 图像。计算机图形学中用于实现此任务的一种流行方法是光线追踪。

光线追踪
(注:假定具备相机和图像形成的基本知识。)光线追踪的概念涉及 3D 对象和 NxN 图像平面。为了在图像平面中渲染 3D 对象,我们定义从相机中心发出并穿过图像中每个像素的光线。对于每条光线,我们确定它是否与场景中的任何对象相交。如果存在交集,我们计算颜色并将其分配给相应的像素。

光线追踪

射线:为了定义射线,我们使用直线的参数方程,如果一条直线从点P开始并沿方向d行进,则直线(或射线)的方程如下:

射线的参数方程

参数t控制点x沿射线的位置。在图形中,t>0,因为我们总是在相机中心前面发射光线。
当我们计算每条光线的颜色时,问题是:我们如何计算颜色?

渲染方程
给定观察方向和表面上的点,发出的光如下:

图片来源:计算机视觉图宾根

渲染方程(简化)

注意:为了讨论的目的,我们可以假设光对应于 RGB 颜色。从上图我们可以看出,要计算表面上p点在观察方向v上的颜色,我们需要将p点本身发出的颜色与p点在观察方向v上反射的颜色相加。通过光源进行外部照明。在我们的例子中,观察方向是穿过 NxN 图像中每个像素的光线。让我们更详细地探讨渲染方程的各个项。

Lemit是点的内在属性,因此它是某个函数。对于反映的部分,我们有。

BRDF双向反射率分布函数。它给出了来自s 方向的输入光在观察方向v上反射回来的百分比。

上图说明了材质如何具有不同的 BRDF,可用于将材质分类为漫反射、镜面或镜面。漫反射材质在所有方向上均匀地反射入射光,而镜面材质在特定方向上反射更多,而镜子仅在一个方向上反射。现实世界的 BRDF 可能更加复杂。
如果我们有 BRDF,那么我们需要从s方向到p点的Lin来计算反射光。

反射部分的点积是由朗伯定律决定的。如果表面不垂直于入射光方向s (其方向由表面法线n给出),则有效面积会增加,并且特定点处的入射强度会降低。

如果有多个光源,则必须将所有光源的反射光相加。如果光来自所有可能的方向,则总和变为积分。

K 个光源反射光的总和

体积渲染
之前,我们了解了如何从观察方向 v 上的点p计算颜色Lo 

现在,让我们考虑一个中间有卷云的场景。云中的每个粒子都是模糊的,并非完全不透明,并且可以发射或吸收光。每个粒子的发射率在不同方向上变化。尽管粒子可以散射光,但我们现在将跳过对此进行建模,因为它太复杂了。

位于 P 点和相机 X 中间的体积云。每个粒子吸收一些入射光并发出自己的光

如果我们想计算从点p沿v方向朝向x的颜色Lo,颜色会是什么?我们不打算在这里推导方程,稍后会介绍。但本质的直觉是,我们计算有多少颜色I从点P沿方向v到达因为其中一些颜色会被体积云吸收。并且还计算每个体积粒子发射的颜色有多少在方向v上到达x (因为每个粒子也发射颜色,并且该颜色也会被方向v上的体积吸收)。最后,计算出所有颜色以获得最终的Lo。

Alpha 组合
如果我们有K 种颜色及其各自的 α 值。α值决定了颜色的透明度。如果 α=1,则该对象完全不透明并且将贡献全色,而 α=0 表示透明对象。现在,为了从K种颜色中获取新颜色,我们采用颜色的线性组合,并按其 alpha 值进行加权。

颜色的 Alpha 组成

基于图像的渲染
在计算机图形学中,3D 模型通常可用于渲染。然而,在计算机视觉中,我们只有特定场景的图像。要仅使用现有图像集生成同一场景的新图像,我们可以从图像估计 3D 模型,然后使用 3D 模型生成新渲染。这种方法称为基于图像的渲染

基于图像的渲染:基本管道

神经网络作为函数逼近器
此时,假设读者了解深度学习的基础知识。如果我们有一个关系Y = f(X),其中Y, X可以有任意数量的维度。我们可以使用深度神经网络来近似该关系。通过使用更具表现力和更大的网络,近似值会变得更好。

神经网络作为函数逼近器

问题表述

我们已经在高层次上涵盖了所有基础知识,以了解 NeRF 的制定。目标是根据来自多个视点的同一场景的一组图像生成新颖的视图。根据所涵盖的基础知识,我们可以将问题归因于基于图像的渲染,并学习 3D 模型来生成新图像。

从图像中学习 3D 模型

我们如何近似 3D 模型?一种方法是使用神经网络来学习 3D 模型。为了训练神经网络,我们可以使用综合分析(ABS)方法。这涉及在训练期间使用近似 3D 模型生成图像,并计算生成的图像和地面真实图像之间的光度损失。然后将计算出的损失反向传播以在训练期间优化 3D 模型。
选择哪些 3D 表示?

3D 表示。图片来源:ECCV 2022 NeRFD 教程

有许多 3D 表示可用于神经网络,但在本文档中,我不会介绍这些细节。有许多可用资源详细介绍了替代表示法的优缺点。NeRF 使用隐式体积表示,我将简要介绍隐式表示。

隐式表示
隐式 3D 表面的形式为f(x,y,z) = 0。这定义了函数f为零的一组点。 请注意,在隐式 3D 表面中,我们没有明确获得属于该表面的一组 3D 点,而是对点进行采样并检查它们是否满足标准 f(x,y,z ) = 0 如果是,则这些点属于表面。下图中给出了隐式表示的示例。

球体的隐式方程

基于坐标的神经网络
这些是隐式建模 3D 表示的网络类别。这些网络的基本公式如下:

我们输入一些 3D 坐标(类似于隐式 3D 表示)和输入条件(例如图像、视图方向或什么都没有)。然后神经网络输出该点的值v 。该值可以是任何描述该点是否属于 3D 对象的值。典型的例子有占用值(点是否属于表面的概率)、有符号距离场 SDF(点到 3D 表面的距离,如果点在表面之外,则距离为正,如果点在表面之外,则距离为负)。在表面内部,当点在表面上时为零)等。

基于坐标的网络示例。图片来源:Andreas Geiger 教授、博士

神经体积密度
NeRF 也属于基于坐标的网络类别,它隐式地对任意点的体积密度 σ 和与视图相关的颜色进行建模。与体积渲染类似,NeRF 将任何场景建模为体积云,其中粒子发射或吸收光。由于发射率不均匀,每个点都会发出与视图相关的颜色。关键的优点是体积云可以是连续且可微的,我们可以使用标准体积渲染来计算生成图像的每个像素的颜色,这也是可微的操作。我们将在本文后面更详细地探讨这个概念。

NeRF 的隐式表示。图片来源:ECCV 2022 NeRF 教程

NeRF:高级管道

NeRF 的高级流程如下:
1. 将 3D 位置和观察方向作为输入。
2. 输出颜色c和密度σ。
3. 使用体积渲染技术来计算最终颜色。
4. 使用光度损失进行优化

像素颜色的推导
至此,我们终于可以推导出图像中像素颜色的方程了。对于体积中的任何点 x,我们需要计算 σ(x)(x 点处的粒子密度)和 x 点处的颜色 c(x,v),其中 v 是观察方向。任何点的 σ 值都很重要,因为粒子在体积云中的分布可能不均匀。

体积云中的点 x,吸收和发射光。

为简单起见,忽略与视图相关的颜色依赖性,并假设体积云中的每个粒子具有相同的吸收系数。
要计算图像中像素i的颜色,请从相机中心发射一条光线穿过该像素,类似于光线追踪。

当光线向前移动时,它会穿过体积。让我们考虑沿着体积内的射线的点 t。此时的颜色和密度分别由 c(t) 和 σ(t) 给出。为了计算微分元素 dt 在 t 处发出的颜色,我们有:t
处的粒子数量:σ(t)dt t处的每个粒子发出颜色c(t),因此微分元素dtt处发出的颜色:σ( t)c(t)dt但是这种差异颜色的某些部分可能会被前面的体积云吸收。


 

因此,我们对另一个函数T(t)(透射率)进行建模,给出 t 之前吸收了多少颜色。同样,
每个粒子在t 处发射颜色c(t),因此
微分元素dtt处发射的颜色:σ(t)c(t)dt微分元素
dtt处传输到像素的颜色:T(t)σ(t )c(t)dt

为了计算沿光线发射的总颜色,我们对微分颜色进行积分。因此我们有等式

tf、tn 是沿着射线的远边界和近边界,因为射线可以延伸到无穷远。上面的方程给出了生成图像中单个像素的颜色。为了计算所有像素的颜色,我们发射光线穿过每个像素并进行上述积分。
注意我们只输出cσ,而不输出T(t)。可以证明,通过简单的推导,T(t)可以用σ(t) 来表示。

请注意,计算颜色的方程涉及二重积分,并且该积分无法通过解析求解。因此,通过采样对积分进行数值求解,得到以下方程:

图片来源:Andreas Geiger 博士教授

为了评估积分,我们采用以固定距离分隔的 N 个样本,从而求和。Ti给出第 i 段的透射率(通过第 i 段的颜色将到达像素)。请注意,Ti 的求和一直持续到 i-1,αi 给出了第 i 段的透明度。从直觉上看,这个方程也有意义。如果我们增加某一点的密度σ ,α 将增加,因为更多的粒子将同时发射和阻挡光,因此不透明度将增加。此外,如果我们增加密度σ,后面的点的T(透射率)将会减小,这在直观上也是有意义的。

实施细节

NeRF架构

NeRF 是一个简单的 MLP 网络,由 8 层组成,具有 ReLU 激活功能。输入是沿射线的3D 点x和观察方向d。某个点的密度仅取决于 3D 点,从而实现连贯的体积表示。在现实生活中,无论视角如何,3D 对象的密度都不会改变,但颜色会发生变化。因此,有一个附加层,它采用前一层的潜在表示和视图方向来输出与视图相关的颜色。

视点相关颜色

上图显示了发射颜色随观察方向的变化。在论文中,他们比较了有和没有视图依赖性的结果。如果我们不对视图依赖性进行建模,那么每个点将只有一种颜色,这将是训练期间学习到的平均颜色。
为什么我们有依赖于视图的颜色?
NeRF建模的物体在现实生活中并不发射颜色,但它们被光源照亮,因此所有颜色都是反射颜色。在渲染方程中,我们可以看到由于 BRDF,反射颜色与视图相关。因此,我们有依赖于视图的颜色。但NeRF 正在建模,将颜色反射为与视图相关的发射颜色。
最后一句话非常关键,它将用来讨论 NeRF 的局限性。

位置编码
神经网络偏向于学习低频,正如《傅里叶特征让网络在低维域中学习高频函数》一文所强调的那样。提出的解决方案是使用位置编码,将输入变换到更高维的频率空间。这有助于网络以较小的网络规模有效地学习高频细节。使用的位置编码与 Transformer 中的相同,但其用途不同。我不会详细解释为什么会发生这种情况,因为这个概念与 NeRF 想法没有直接关系,而是一种实现策略。

分层抽样
如前所述,通过抽样来近似积分。采样策略对于准确估计积分至关重要。因此,让我们仔细看看采样。

上图显示了沿射线的密度变化。我们的目标是采样密度更高的点,这表明该位置存在物体。如果我们像上面那样进行固定间隔的密集采样,会出现什么问题呢?
它的计算效率不高。我们可能会在没有密度质量的区域浪费样本,如最后两个样本被浪费的示例所示。另外,网络可能是离散的,这非常重要。如果我们在训练期间重复采样相同的点,网络将在这些点上进行优化,而在新视图的推理过程中,如果我们采样训练时采样点以外的任何点,网络可能不会给出期望的结果。
为了避免离散化问题,我们可以使用分层抽样。这个想法是沿着射线将线段划分为 N 个 bin,然后使用均匀分布从每个 bin 中采样一个点。通过这样做,将在每次训练迭代中采样一个新点,从而防止网络离散化。虽然有些点可能不会在每次迭代中被采样,但在训练过程中,我们可以假设大多数点都会被采样,从而使网络能够学习连续的表示。

为了解决有效采样的问题,NeRF 作者使用粗网络和细网络两个网络,并在训练过程中对两者进行优化。首先采用分层抽样的方式获得NC样本。这些样本被传递到粗网络以获得沿光线的 Nc 段的颜色和密度。

直观上,我们希望获得密度和透射率都高的样品。如果密度低,对总颜色的贡献可以忽略不计,如果没有透射率,贡献仍然较小。在上图中,我们可以看到 wi 的值取决于Tσ。因此,我们对 wi 的值进行归一化以创建概率分布。然后,我们使用逆变换采样从该分布中采样 Nf 个附加点。最后,我们使用 Nc + Nf 样本优化精细网络。

损失
损失是基于每个像素的简单光度损失。我们优化粗略和精细损失,因为粗略网络用于获得概率分布,我们从中为精细网络采样额外的 Nf 点。因此,如果粗网络表现良好,它将产生准确的密度,从而产生更有意义的概率分布,从而产生更有效的 Nf 个样本。

从渲染方程角度看NeRF

如果我们重新审视渲染方程并检查 NeRF 正在建模其中的哪一部分,我们可以轻松得出结论 NeRF 正在建模发射的部分。

由于 NeRF 没有对反射部分进行建模,因此无法使用 NeRF 重新照亮场景。这是推动 NeRF 进一步研究的限制之一,我们也尝试对反射部分进行建模。其中一些扩展包括 NerV、Nerd、Nerfactor 等。

结论

本文涵盖了理解 NeRF 并使用它们来制定 NeRF 问题陈述所需的基本原语。此外,我们还解释了为什么我们需要 NeRF 的扩展。

  • 23
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值