NeRF的核心点是实现了复杂静态场景的隐式表达,用一个神经网络来建模。
本文提出了一种新方法,通过使用稀疏的输入视图集优化底层连续的体积场景函数,实现了合成复杂场景的新视图的SOTA。
算法使用全连接深度神经网络(MLP)表示一个场景:
输入是单个连续的5D坐标 (空间位置(x, y, z)和观看方向(θ, φ));
输出是该空间位置的 体积密度 和对应视角的 颜色。
我们沿着相机光线查询5D坐标来合成视图,并使用经典的体积渲染技术(volume rendering),将输出的体积密度和颜色投影到二维图像中。
因为体积渲染结果是可微的,优化NeRF隐式表达所需的唯一输入是一组已知相机位姿的图像。
我们描述了如何有效地优化神经辐射场,以渲染具有复杂几何形状和外观的场景的逼真的新视图,并演示了优于神经渲染和视图合成之前的工作的结果。
在这项工作中,我们通过直接优化连续5D场景表示的参数来解决长期存在的问题,以最大限度地减少绘制一组捕获图像的误差。
我们将静态场景表示为一个连续的5D函数,该函数输出在空间中每个点(x, y, z)的每个方向(θ, φ)发射的辐亮度,每个空间点的体积密度被看作是可微的不透明度,控制通过空间点(x, y, z)的光线累积的辐亮度。我们的方法优化了一个没有任何卷积层的深度全连接神经网络(MLP),从单个5D坐标(x, y, z, θ, φ)回归到单个体积密度和对应视角的RGB颜色来表示这个函数。
为了渲染特定视角的神经辐射场(NeRF),有以下三个步骤:
1.让相机光线穿过场景,采样一组3D点
2.将一组空间点和它们对应的二维观看方向输入到神经网络,产生一组输出的颜色和体积密度
3.用经典的体素渲染技术,将这些颜色和密度积累到一个2D图像中
因为这个过程是自然可微的,我们可以使用梯度下降来优化这个模型,最小化每个观察到的图像(已知真实数据)和我们的表示最终呈现的对应视图(预测数据)之间的误差。跨多个视图的误差最小化,鼓励网络通过分配高体积密度和精确的颜色到包含真实底层场景内容的位置,来预测一个连贯一致的场景模型。
我们发现,优化复杂场景的神经辐射场表示的基本实现方法并不能收敛到足够高的分辨率表示,而且在每个相机射线所需的样本数量方面效率不高。我们将输入5D坐标通过positional encoding进行转换来解决这些问题,该位置编码使MLP能够表示更高频率的函数,并且我们提出了一种分层采样程序,以减少对这种高频场景表示进行充分采样所需的查询数量。
我们的方法继承了体积表示的优点:两者都可以表示复杂的现实世界的几何形状和外观,并非常适合使用投影图像进行基于梯度的优化。最重要的是,我们的方法克服了离散立体像素网格在高分辨率下建模复杂场景时过高的存储成本。综上所述,我们的技术贡献是:
将具有复杂几何和材料的连续场景表示为5D神经辐射场的方法,参数化为基本MLP网络。
用基于经典渲染技术的可微渲染过程,来优化标准RGB图像的表示。这包括分层采样策略,将MLP的容量分配给具有可见场景内容的空间。
位置编码(Positional Encoding)将每个输入5D坐标映射到高维空间,可以优化神经辐射场来表示高频场景内容。
连续场景表示为5D向量函数
输入:(x, y, z, θ, φ)
3D location x = (x, y, z)
2D viewing direction (θ, φ)
(在实践中将视角方向表示为3D单位向量d)
输出:(r, g, b, σ)
emitted color c = (r, g, b)
volume density σ
优化目标函数 FΘ : (x, d) → (c, σ)
通过限制体积密度 σ 仅仅是 x 的函数,而颜色 c 同时是 x 和 d 的函数,驱使网络产生多视角一致的预测。
网络结构:MLP FΘ首先输入3D坐标x通过8个全连接层(ReLU激活,每层256通道),并输出σ和256维特征向量。然后,这个特征向量与相机光线的观看方向d连接(concatenate),并传递到一个额外的全连接层(ReLU激活,128通道),输出视角相关的RGB颜色。
作者使用经典体渲染的原理渲染任何穿过场景的光线的颜色。体积密度σ(x)通俗地理解为不透明度,而严谨来讲可以解释为射线在x处终止于无穷小粒子的微分概率。
【如上式所述,
r(t) = o + td 表示以相机o为原点发出的射线,
C(r) 是远近界分别为 tn 到 tf 的光线 r 呈现的期望颜色,
T(t) 表示从 tn 到 t 的累计透射率】
要从连续的神经辐射场表示渲染出一个视图,需要估计图像的每个像素对应的相机射线上的积分C(r)
确定性求积(deterministic quadrature)通常用于离散的体素网格,这限制了表示的分辨率,因为MLP只能用固定的离散值作为输入。
作者采用了分层抽样方法(stratified sampling approach),将[tn, tf]分为N个间隔均等的“容器”,从每个“容器”中随机抽取一个样本(见下式)
这样的话,虽然我们采用了离散的样本集来估计积分,但分层采样使得MLP可以对连续的位置进行估计,提供连续的场景表示。
【其中 δi = t(i+1) − ti ,即相邻样本间的距离】
至此我们利用构造出可微的函数来估计积分,得到图像的每个像素对应的相机射线上的颜色表达。
作者引入了两个改进来实现对高分辨率复杂场景的表示:
尽管神经网络是通用的函数逼近器,但作者发现直接使用5D向量 (x, y, z, θ, φ) 作为输入,在颜色和几何的高频变化时表现不佳(之前有研究表明,深度网络倾向于学习低频函数;在输入传递到网络之前,使用高频函数将输入映射到高维空间可以更好地拟合包含高频变化的数据)
基于以上想法,作者将可学习的MLP映射 FΘ 重新定义为 FΘ = F’Θ ◦ γ
F’Θ 是可学习的MLP
γ 不可学习,是R到高维空间R(2L)的映射:
γ(.) 分别作用于3D坐标 x 的三个维度 x, y, z(归一化到 [-1, 1] 区间),
并且分别作用于3D视角方向 d 的三个维度(单位向量,各个维度的值在 [-1, 1] 区间),
(实践中,对于 γ(x) 定义 L = 10;对于 γ(d) 定义 L = 4)
(题外话:原论文中提到,在流行的Transformer架构中也应用了类似的positional encoding,然而Transformer将其用于不同的目标,即提供序列中标记的离散位置,作为不含顺序性的结构的输入。我们使用这些函数将连续输入坐标映射到高维空间,以使我们的MLP更容易近似更高频率的函数。)
如4.部分讲到的渲染策略,我们沿着每一条相机射线在N个查询点上进行密集的估计是低效的:因为对于渲染图像没有帮助的自由空间以及物体内部区域仍然被冗余地采样。
作者从早期的体积渲染工作中获得灵感,提出了一个提高渲染效率的层次性表达方式——根据最终渲染得到的预期效果按比例分配样本。
具体如何实现这样的想法呢?
作者同时优化两个网络,一“粗”一“细”(one “coarse” and one “fine”),
“粗略的”网络用来评估渲染的预期效果并给出采样的权重信息,在此基础上重新采样优化“精细的”网络。
具体来讲,首先用分层采样,采样一组Nc个位置的空间点,根据上述(2)式和(3)式原理优化“粗略的”网络,
拿到“粗略的”网络的输出后,如何利用相关信息,再次采样优化“精细化的”网络呢?
下式呈现了“粗略的”网络求解渲染颜色的原理(其实就是将(3)式改为在Nc个样本上的求和)
将参数 wi 归一化(normalize)为 wi’ = wi / ∑wj,沿着相机射线得到一个分段常值的概率密度函数(PDF)
使用逆变换采样从这个概率分布上取Nf个空间点,
综合得到的Nc+Nf个样本评估“精细化的”网络,并计算渲染得到的颜色。
这样就实现了将更多的样本量分配给期望包含可见内容的区域。
我们使用采样值作为整个积分域的非均匀离散化,而不是将每个样本作为整个积分的独立概率估计。
需要注意的是,NeRF模型并不具有通用性:神经辐射场隐式地表达了用于训练的场景信息,不具有渲染其他场景的能力。
数据集:
场景的一组RGB图片,以及图片对应的相机位姿和内参;
场景边界
每一次优化迭代的过程:
从数据集的所有像素集合中随机采样一组(batch)相机射线;
根据 Sec 5.2 部分所述,用 Nc 个样本query“粗略的”网络,用 Nc + Nf 个样本query“精细的”网络;
用 Sec 4. 部分所述的体素渲染原理,计算两组样本中每个相机射线渲染出的颜色;
如下式,损失函数只是对于粗略的和精细的网络上每条射线与真实值的平方误差加和
【R:两组样本中的所有射线集;
C(r):r射线上的真实颜色
Cc(r):r射线上“粗略的”网络的体渲染颜色
Cf(r):r射线上“精细的”网络的体渲染颜色】
即使最终的渲染来自于“精细的”网络Cf(r),我们依然最小化Cc(r),使得“粗略的”网络上学习到的权重分布可以更好地采样训练“精细的”网络的样本。
超参数:
batch_size(camera rays):4096;
Nc = 64;
Nf = 128;
optimizer = Adam (β1 = 0.9,β2 = 0.999,ε = 10^(-7));
learning rate:5 × 10 ^ (-4) 指数衰减到 5 × 10 ^ (-5)
100-300K iterations to converge;
single NVIDIA V100 GPU (about 1–2 days)
作者从定量和定性两方面展示了NeRF的优越性。
(主要与LLFF, SRN, NV进行对比,具体数据和示例分析参见论文,此处略去)
我们的工作直接解决了以前使用MLP将对象和场景表示为连续函数的工作的不足。我们证明,将场景表示为5D神经辐射场(一种MLP,输出体积密度和视点相关的颜色,作为3D位置和2D视点方向的函数) 产生的渲染效果比之前主要的训练深度卷积网络输出离散体素表示的方法更好。
尽管我们已经提出了一种分层采样策略来提高渲染样本的效率(用于训练和测试),但在研究有效优化和渲染神经辐射场的技术方面仍有很多进展。未来工作的另一个方向是可解释性:采样表示,如体素网格允许对渲染视图的预期质量和失败模式进行推理,但当我们在深度神经网络的权重中编码场景时,还不清楚如何分析这些问题。
我们相信这项工作在基于真实世界图像的图形表示方面取得了进展,其中复杂的场景可以由实际物体和场景的图像优化的神经辐射场组成。
(笔者为了清晰直接地进行表述,本文中图片均引自原论文,在此作出说明)
下面列出一些笔者认为有价值参考的NeRF相关介绍:
NERF从入门到精通(比较详细,其中给出了很多不错的其他文章的链接,可以作为学习流程的主要依据)
【3D】NERF论文随笔
NeRF神经辐射场ECCV2020(其中关于渲染的基本概念有简明的介绍)
NeRF 论文主要点细致介绍