NeRF:将场景表示为用于视图合成的神经辐射场
本文主要对NeRF论文进行翻译(黑色字体),同时对一些不理解的概念和算法进行相应批注(红色字体)了解NeRF之前需要了解一些关于Volume Rendering的基础知识。
另,综合整篇论文可以了解到NeRF的任务在于实现对场景新视角的合成,而非3D重建。NeRF的网络输入图像和位姿,输出每个像素点对应的体积密度和颜色信息。
参考链接:
NeRF入门之体渲染 (Volume Rendering)
NeRF中的位置编码
我们提出了一种方法,该方法通过使用稀疏的输入视图集来优化底层连续体积场景函数,实现了合成复杂场景的新视图的最新结果。我们的算法使用一个全连接(非卷积)深度网络来表示一个场景,其输入是一个连续的5D坐标(3D位置+2D旋转),输出是该空间对应的体素密度和基于视角的辐射场。我们沿着相机光线查询5D坐标,并使用经典的体积渲染技术将输出的颜色和密度投影到图像中。因为体积渲染是自然可微分的,所以优化我们的表示所需的唯一输入是一组具有已知相机姿势的图像。我们描述了如何有效地优化神经辐射场,以渲染具有复杂几何形状和外观的场景的真实感新视图,并展示了优于先前神经渲染和视图合成工作的结果。视图合成结果最好作为视频观看,因此我们敦促读者观看我们的补充视频,以进行令人信服的比较。
(1)神经辐射场NeRF:NeRF可以简要概括为用一个MLP神经网络去隐式地学习一个三维场景。在基于Nerf的表示方法下,三维空间被表示为一组可学习且连续的辐射场,由输入图像+姿态
学习后,输出色彩+密度
。NeRF是一个过程。
(2)视图集:指一组某个场景下从多个视角拍摄的图片
(3)连续体积场景函数:指静态场景表示为连续的5D函数,该函数输出空间中每个点(x,y,z)
在每个方向(θ,φ)
上发射的辐射度
(4)5D坐标中的位置信息:指每个相机光线上的采样点xyz坐标。如图所示,相机坐标系以相机光心为坐标原点[0,0,0],连接坐标原点和像素点会得到一条该像素对应的相机光线,其物理意义是在这条相机光线上的3D点都有可能投影成为该像素。根据数据集中关于这个场景的最大点和最远点可以确定这条光线的范围[d_min, d_max],通过在这个范围内进行采样会得到一组采样点(下图中黑色的点),根据相机的内参很容易的可以得到每个采样点的xyz坐标,即训练网络的输入。
(5)5D坐标中的旋转信息:连接相机光心和像素对应的3D点会得到一条条射线,在成像平面相交的位置就是对应像素位置,这里的方向只每个3D点对应射线的方向,
?
\phi
?指3D点方位角,
θ
\theta
θ指仰角,他们和3D点半径(距离)共同表示一个3D空间点
(6)相机光线:对于某个视角,从相机光心出发,连接相机光心和图像中的某个像素可以得到一条射线,在这条射线上分布了一组点,该像素可以被理解为这条射线上某个点在图像平面上的投影,也即在该条射线上存在一个3D点和该像素一一对应
(7)透射比:光线由外界到达成像平面会穿过一个粒子群,由于受到粒子的吸收、放射、散射等作用,在穿过粒子群之后初始的光线强度会出现相应的衰减和增强,投射比(transmittance)表示粒子群某一点的透明度,数值越大说明粒子越透明,光线衰减的幅度就越小,透射比的计算公式如下公式所示。
(8)光学厚度:由上述公式(4)可以看到,透明度是关于光学厚度 τ a ( t ) = ρ ( t ) A \tau _{a}(t)=\rho (t)A τa?(t)=ρ(t)A的方程,其中 ρ ( t ) \rho (t) ρ(t)指该粒子群的粒子密度,A表示单个粒子的的投影面积,则可以知道粒子密度越大,投影面积越大,则最终粒子群中某点的透明度就越大。
(9)粒子密度:如下图所示,光沿直线方向穿过一堆粒子,如果能计算出每根光线从最开始发射到最终打到呈像平面上的辐射强度,就可以渲染出 投影图像。为简化计算,假设光子只和它附近的粒子发生作用,这个范围就是图中圆柱体大小的区间。而粒子密度指,在单位圆柱体积中粒子的数量。
(10)体积密度:上述透射比中已经说过,在光线穿过粒子群时由于受到粒子的吸收、放射、散射等作用,在穿过粒子群之后初始的光线强度会出现相应的衰减和增强,不同的粒子作用会得到不同的光学厚度表达,为了简化建模过程将所有的光学厚度统一用 σ \sigma σ进行表示,即体积密度。由此可以知道,体积密度可以用来表示粒子的不透明度,体积密度越大则投射比也即透明度越大。
(11)辐射场:指某条光线对3D场景下的某个点的影响,具体表现为3D点的颜色和点在该视角下的明暗变化。
(12)体渲染(Volume Rendering):某束粒子群,经过粒子的吸收、放射、散射等作用,在穿过粒子群之后初始的光线强度会出现相应的衰减和增强,最终落在成像平面上。体渲染技术就是对这一过程进行建模,计算光线在穿过3D空间中粒子群收到影响后的辐射度,具体表现为粒子的颜色和不透明度。
在这项工作中,我们以一种新的方式解决了长期存在的视图合成问题,方法是通过直接优化连续5D场景表示的参数,实现最小化一组捕获图像的渲染误差。
我们将静态场景表示为连续的5D函数,该函数输出空间中每个点(x,y,z)
在每个方向(θ,φ)
上发射的辐射度(颜色信息,其实想想颜色就是光线经过一系列的反射或者其他影响后的表达,即辐射度
),以及每个点的密度(体积密度,上面已经说过了,表征某个点的不透明程度,和粒子的密度以及粒子大小有关
),该密度的作用类似于微分不透明度,控制通过(x,y,z)的光线累积的辐射量。我们的方法优化了一个没有任何卷积层的深度全连接神经网络(通常称为多层感知器或MLP),通过从单个5D坐标(x,y,z,θ,φ)
回归到单个体积密度和视图相关的RGB颜色来表示该函数。为了从特定视角渲染该神经辐射场(NeRF),我们:1)使相机光线穿过场景以生成一组采样的3D点,2)使用这些点及其对应的2D观测方向作为神经网络的输入以产生一组颜色和密度的输出,3)使用经典的体渲染(Volume rending)技术将输出的颜色和密度信息累积到2D图像中。因为这个过程是自然可微的,我们可以使用梯度下降来优化这个模型,通过最小化每个观测到的图像和相应的基于我们的方法得到的视图渲染结果之间的误差。通过将多个视图之间的这种误差最小化,激励网络通过将高体积密度和准确的颜色
分配给包含真实底层场景内容的位置
来预测场景的连贯模型。图2显示了整个过程。
(1)光线从外部穿过会经过一组粒子群,在周围例子各种吸收和反射作用下,最终落到成像平面上成为一个具有颜色信息的图像,(a)部分红色射线上的黑点即该光线穿过的粒子群中的采样点
(2)误差的建立:对于输入的某个3D点及其旋转,经过模型会预测得到一个关于该点的颜色和体积密度信息,然后通过体渲染技术得到对应的图像像素值,渲染部分本质上是一个3D到2D的建模过程,利用重建部分得到的3D点的颜色及不透明度沿着光线进行整合得到最终的2D图像像素值,然后和图像真实的2D像素值做差得到误差函数
我们发现,优化复杂场景的神经辐射场不能收敛到足够高的分辨率结果,并且在每个相机射线所需的样本数量方面效率低下。我们通过用位置编码转换输入5D坐标来解决这些问题,该位置编码使MLP能够表示更高频率的函数,并且我们提出了一种分层采样过程,以减少充分采样这种高频场景表示所需的查询数量。
(1)高频与低频变化:简单的将就是数据的层级,低频数据如0.67777和0.66778,高频数据如319和320,显然低频数据之间的差距更大,场景中的变化反映在低频数据中的差距也会更明显
(2)位置编码器的引入:传统的MLP网络不善于学习高频数据信息,如果直接使用MLP学习,会导致学得纹理的表面相当模糊,即无法得到高分辨率的结果。因此引入了位置编码器,相当于对输入做了一个线性变换,让原本坐标很相邻的两个位置之间的差距变大,例如对于相邻的两个位置30和31,经过位置编码后变成?0.6842和0.6240
(3)分层采样:本文提高渲染效率的一种措施,对一条光线平均采样64个点的话可能有很多点是没有达到目标(处于空气之中),并且可能对含有物体的区域欠采样,如果单纯线性增加采样点,并没有在根本上解决问题。分层采样的目的是更加聚焦该光线上存在空间点的区域,对点比较密集的地方多采样,忽略点稀疏的区域
我们的方法继承了体积表示的优点:两者都可以表示复杂的真实世界几何体和外观,非常适合使用投影图像进行基于梯度的优化。至关重要的是,当以高分辨率对复杂场景进行建模时,我们的方法克服了离散体素网格高昂的存储成本。总之,我们的技术贡献是:
我们得到的神经辐射场方法在数量和质量上都优于最先进的视图合成方法,包括将神经3D表示与场景相匹配的工作,以及训练深度卷积网络来预测采样体积表示的工作。据我们所知,本文提出了第一个连续的神经场景表示,它能够从自然环境中捕获的RGB图像中渲染真实物体和场景的高分辨率真实感新颖视图。
最近计算机视觉的一个很有前途的方向是用MLP的权重编码对象和场景,MLP直接从3D空间位置映射到形状的隐式表示,例如该位置的带符号距离[6]。然而,到目前为止,这些方法无法以与使用离散表示(如三角形网格或体素网格)表示场景的技术相同的保真度再现具有复杂几何体的逼真场景。在本节中,我们回顾了这两条工作线,并将其与我们的方法进行了对比,我们的方法增强了神经场景表示的能力,从而为渲染复杂逼真的场景产生最先进的结果。
使用MLP从低维坐标映射到颜色的类似方法也已用于表示其他图形功能,如图像[44]、纹理材料[12,31,36,37]和间接照明值[38]。
最近的工作通过优化将xyz坐标映射到有符号距离函数[15,32]或占用域[11,27]的深度网络,研究了连续三维形状作为水平集的隐式表示。然而,这些模型受到访问真实3D几何结构的要求的限制,这些几何结构通常是从合成3D形状数据集(如ShapeNet[3])中获得的。随后的工作通过制定可微分的渲染函数放宽了对真实3D形状的这一要求,该函数允许仅使用2D图像来优化神经隐式形状表示。Niemeyer等人[29]将曲面表示为三维占有场,并使用数值方法找到每条射线的曲面交点,然后使用隐式微分计算精确导数。每个光线相交位置被提供作为神经3D纹理场的输入,该纹理场预测该点的漫反射颜色。Sitzmann等人[42]使用了一种不太直接的神经3D表示,该表示仅在每个连续的3D坐标处输出特征向量和RGB颜色,并提出了一种可微分渲染函数,该函数由沿着每条射线行进的递归神经网络组成,以决定表面的位置。
尽管这些技术可能代表复杂和高分辨率的几何体,但到目前为止,它们仅限于几何复杂度较低的简单形状,导致渲染过于平滑。我们表明,优化网络以编码5D辐射场(具有2D视图相关外观的3D体积)的替代策略可以表示更高分辨率的几何体和外观,以渲染复杂场景的真实感新视图。
给定密集的视图采样,可以通过简单的光场采样插值技术重建照片真实感的新视图[21,5,7]。对于具有稀疏视图采样的新型视图合成,计算机视觉和图形社区通过从观察到的图像中预测传统的几何和外观表示,取得了重大进展。一类流行的方法使用基于网格的场景表示,该场景具有漫射[48]或依赖于视图[2,8,49]的外观。可微分光栅化器[4,10,23,25]或路径跟踪器[22,30]可以直接优化网格表示,以使用梯度下降来再现一组输入图像。然而,基于图像重投影的基于梯度的网格优化通常很困难,可能是因为局部极小值或损失景观的条件较差。此外,该策略要求在优化前提供具有固定拓扑的模板网格作为初始化[22],这通常不适用于不受约束的真实世界场景。
另一类方法使用体积表示来解决从一组输入RGB图像合成高质量照片级真实感视图的任务。体积方法能够真实地表示复杂的形状和材料,非常适合基于梯度的优化,并且与基于网格的方法相比,往往产生较少的视觉干扰伪像。早期的体积方法使用观察到的图像来直接为体素网格着色[19,40,45]。最近,几种方法[9,13,17,28,33,43,46,52]使用多个场景的大型数据集来训练深度网络,该网络从一组输入图像中预测采样的体积表示,然后使用阿尔法合成[34]或沿射线学习合成来在测试时渲染新视图。其他工作已经针对每个特定场景优化了卷积网络(CNN)和采样体素网格的组合,使得CNN可以补偿来自低分辨率体素网格[41]的离散化伪影,或者允许预测的体素网格基于输入时间或动画控制而变化[24]。虽然这些体积技术在新的视图合成方面取得了令人印象深刻的结果,但由于其离散采样,其缩放到更高分辨率图像的能力从根本上受到时间和空间复杂性差的限制——渲染更高分辨率的图像需要更精细的3D空间采样。我们通过在深度完全连接的神经网络的参数内编码连续体积来避免这个问题,这不仅产生比以前的体积方法高得多的质量渲染,而且只需要这些采样体积表示的一小部分存储成本。
本文创建了一个关于连续场景的5D向量函数,其输入是3D的XYZ位置信息和2D的视图,其输出是该点在成像平面对应的RGB颜色信息和体积密度 σ \sigma σ。在实践中,我们使用一个3D笛卡尔坐标系的单位向量d来表示方向。我们使用MLP网络(如下述公式)来近似这种连续5D场景表示,并优化其权重 Θ \Theta Θ,以实现每个输入5D坐标到其相应的体积密度和颜色的映射。
为了促进实现多视角观测表示的一致性,我们限制网络仅将体积密度σ预测作为位置x=(x,y,z)的函数,同时允许将RGB颜色c预测为位置和观看方向的函数。为了实现这一点,MLP映射
F
Θ
F_{\Theta}
FΘ?首先处理具有8个完全连接层的输入3D坐标x(使用ReLU激活和每层256个通道),并输出σ和256维特征向量。然后,该特征向量与相机光线的观测方向
d
=
(
θ
,
?
)
d=(\theta,\phi)
d=(θ,?)连接,并传递到一个额外的完全连接层(使用ReLU激活和128个通道),该层输出依赖于视图的RGB颜色。
图3展示了关于我们的方法如何使用输入观测方向来表示非朗伯效应。如图4所示,在没有视图依赖性的情况下训练的模型(仅x作为输入)难以进行有效推测。
我们的5D神经辐射场将场景表示为空间中任何点的体积密度和定向辐射(即RGB颜色信息
)。我们使用经典体积渲染[16]的原理来渲染穿过场景的任何光线的颜色。体积密度σ(x)
可以解释为射线在位置x终止于无穷小粒子的微分概率。记边界为
t
n
t_n
tn?和
t
f
t_f
tf?的相机射线
r
(
t
)
=
o
+
t
d
r(t)=o+td
r(t)=o+td得到的对应颜色信息为:
其中,函数
T
(
t
)
T(t)
T(t)表示相机射线从
t
n
t_n
tn?到t时刻的累计透射率,它表示射线在
t
n
t_n
tn?到t时刻不穿过任何粒子的概率。从连续神经辐射场中渲染一个视图需要对穿过图像每个像素的光线的积分C(r)
进行估计。(图像中的每个像素都可以看作光线从无穷远处积分的结果,物理过程就是光线穿过粒子群并受到周围许多粒子的吸收、散射等作用,最终形成成像平面像素的颜色,这是volumn rending体渲染部分的知识。)
我们通过求解对这个连续积分进行数值估计。确定性求积分通常用于渲染离散体素网格,这会限制我们的场景渲染结果的分辨率,因为MLP只能在固定的离散位置集合进行查询。相反,我们使用分层采样方法,将[tn,tf]划分为N个均匀间隔的部分,然后从每个部分中均匀随机抽取一个样本:
尽管我们使用离散样本集来估计积分,但分层采样使我们能够表示连续的场景表示,因为它会导致在优化过程中在连续位置评估MLP。我们使用这些样本来估计具有正交规则的C(r)
,该正交规则在Max[26]的体绘制综述中讨论:
其中, δ i = t i + 1 ? t i \delta _{i}=t_{i+1}-t_i δi?=ti+1??ti?是两个相邻采样之间的间隔。公式3所表示的函数从一组由点的颜色c和体积密度$\delta 估计整体的辐射度 估计整体的辐射度 估计整体的辐射度\hat{C}?$是可微的,同时将公式3中的 1 ? e x p ( ? σ i ) δ i 1-exp(-\sigma _{i})\delta _{i} 1?exp(?σi?)δi?部分记为 α i \alpha _{i} αi?
在上一节中,我们已经描述了将场景建模为神经辐射场并从该表示中渲染新视图所需的核心组件。然而,如第6.4节所示,我们观察到这些组件不足以实现最先进的质量。我们引入了两种改进,以实现高分辨率复杂场景的表现。第一种是输入坐标的位置编码,有助于MLP表示高频函数,第二种是分层采样过程,使我们能够有效地对这种高频表示进行采样。
尽管神经网络是通用函数逼近器[14],但我们发现,让网络FΘ直接在xyzθφ输入坐标上操作会导致渲染在表示颜色和几何图形的高频变化方面表现不佳。这与Rahaman等人[35]最近的工作一致,该工作表明深度网络倾向于学习低频函数。他们还表明,在将输入传递到网络之前,使用高频函数将输入映射到更高维的空间能够更好地拟合包含高频变化的数据。
高频和低频的问题前面已经了解,就是连续数值之间的变化幅度。因为像素值一般是整数,在输入MLP进行处理时得到的结果也是粗糙的,无法得到高分辨率的结果。
我们在神经辐射场表示的基础上应用了这些发现,令函数
F
Θ
F_{\Theta}
FΘ?作为两个函数的结合,即
F
Θ
=
F
Θ
′
?
γ
F_{\Theta}=F_{\Theta}^{'}\cdot \gamma
FΘ?=FΘ′??γ,前者表示基于学习的神经网络,后者为普通的映射函数,位置编码处理使得性能得到显著提升(见图4和表格2)。函数
γ
\gamma
γ会将原始的坐标信息进行一个广义的傅立叶变换(也有点像归一化处理
),使得原本相邻的两个位置差距扩大以实现更高分辨率的处理效果(如将30和31两个连续的数值经过一次编码后变成?0.6842和0.6240,这使得迭代过程中变得更加精细
)
在实际操作中,将位置的xyz坐标和3D旋转向量分别带入到映射函数 γ ( ? ) \gamma(\cdot) γ(?),一般在处理坐标时L=10,在处理旋转向量时L=4。
在流行的Transformer体系结构[47]中使用了类似的映射,称为位置编码。然而,Transformers将其用于另一个目标,即提供序列中标记的离散位置,作为不包含任何顺序概念的架构的输入。相反,我们使用这些函数将连续输入坐标映射到更高维的空间中,以使我们的MLP能够更容易地近似更高频率的函数。根据投影[51]对3D蛋白质结构建模的相关问题的并行工作也利用了类似的输入坐标映射。
我们在沿着每条相机射线的N个查询点上密集评估神经辐射场网络的渲染策略是低效的:对渲染图像没有贡献的自由空间和遮挡区域仍然被重复采样。我们从早期的体渲染工作中获得了灵感[20],并提出了一种分层表示,通过按样本对最终渲染的预期效果成比例分配样本来提高渲染效率。
我们不只是使用单个网络来表示场景,而是同时优化两个网络:一个“粗略”网络和一个“精细”网络。我们首先使用分层采样对一组Nc
个位置进行采样,并评估这些位置的“粗略”网络,如方程2和3所示。给定这个“粗略”网络的输出,然后我们沿着每条射线对点进行更精确的采样,其中样本偏向体积的相关部分。要做到这一点,我们首先重写方程3中来自粗略
网络
C
^
(
r
)
\hat{C}(r)
C^(r)的
α
\alpha
α作为沿着射线的所有采样颜色
c
i
c_i
ci?的加权和(公式5):
公式5和公式3属于同一个函数,不同的是对 T i ( 1 ? e x p ( ? σ i δ i ) ) T_{i}(1-exp(-\sigma_{i}\delta_{i})) Ti?(1?exp(?σi?δi?))进行了归一化处理。
通过对以下权重
w
i
w_i
wi?进行归一化处理,得到一个沿着相机光线方向的的概率密度函数,如下图中的左图所示。
然后基于粗采样得到的概率密度函数,使用用逆变换采样(inverse transform sampling)再采样出第二组
N
f
N_f
Nf?个点,如下图中的右图。在第一组和第二组样本的并集
N
c
+
N
f
N_c+N_f
Nc?+Nf?评估我们的“精细”网络,并使用公式3计算光线
C
^
(
r
)
\hat{C}(r)
C^(r)的最终渲染颜色。此过程将更多样本分配给我们希望包含可见内容的区域(即采样点分布比较密集的区域
)。这解决了与重要性采样类似的目标,但我们使用采样值作为整个积分域的非均匀离散化,而不是将每个样本视为整个积分的独立概率估计。
对于某条相机光线上的采样点,如下图所示肯定是分布不均匀的,有的地方采样点比较密集有的地方比较稀疏,如果简单的进行均匀采样就会失去很多有效的采样点,因此这里作者采用了分层采样的策略。首先进行一次均匀采样,得到当前相机光线上采样点的分布情况,然后对采样点分布较多的区域再进行二次采样得到一组更为精确的采样点。
我们为每个场景优化单独的神经连续体积表示网络。这只需要场景的RGB图像
、相应的相机姿态和内参数
以及场景边界
(我们使用真实的相机位姿、内参和边界作为合成数据,并使用COLMAP
这一SFM功能包来估计真实数据的参数)。在每次优化迭代中,我们从数据集中的所有像素集中随机采样一批相机射线,然后按照第5.2节中描述的分层采样来查询来自粗略网络的Nc
个样本和来自精细网络的Nc+Nf
个样本。然后,我们使用第4节中描述的体积渲染过程来渲染两组样本中每条光线的颜色。我们的损失只是粗略渲染和精细渲染的渲染和真实像素颜色之间的总平方误差:
场景边界:指该相机视角下场景点离相机中心最近(near)和最远(far)的距离,通过计算colmap重建的3D稀疏点在各个相机视角下最近和最远的距离得到。体素渲染需要在一条射线上采样3D点,这就需要一个采样区间,而near和far就是定义了采样区间的最近点和最远点。贴近场景边界的near/far可以使采样点分布更加密集,从而有效地提升收敛速度和渲染质量
其中R
是每个batch中光线的集合,
C
(
r
)
C(r)
C(r)、
C
^
c
(
r
)
\hat{C}_{c}(r)
C^c?(r)、
C
^
f
(
r
)
\hat{C}_{f}(r)
C^f?(r)分别为关于射线r
的颜色渲染真值、基于粗采样网络的预测、基于精细网络采样的预测。注意到即使最终渲染来自
C
^
f
(
r
)
\hat{C}_{f}(r)
C^f?(r),我们也将
C
^
c
(
r
)
\hat{C}_{c}(r)
C^c?(r)的损失最小化,以便来自粗略网络的权重分布可以用于在精细网络中分配样本。
在我们的实验中,我们使用4096条射线的批量大小,每条射线在粗略体积中以Nc=64
个坐标采样,在精细体积中以Nf=128
个附加坐标采样。我们使用Adam优化器
[18],其学习率从
5
×
1
0
?
4
5×10^{?4}
5×10?4开始,并在优化过程中指数衰减到
5
×
1
0
?
5
5×10^{?5}
5×10?5(其他Adam超参数保留为默认值
β
1
=
0.9
β1=0.9
β1=0.9,
β
2
=
0.999
β2=0.999
β2=0.999,以及
?
=
10
?
7
\epsilon = 10?7
?=10?7).单个场景的优化通常需要大约100-300k次迭代才能收敛到单个NVIDIA V100 GPU上(大约1-2天)。