NeRF(Neural Radiance Fields)属于生成式模型,是数字人应用到的模型。NeRF模型用神经辐射场技术合成复杂场景视频。
NeRF-神经辐射场:
论文地址:https://arxiv.org/pdf/2003.08934
下面介绍一下NeRF模型架构与技术原理
摘要:
NeRF在合成复杂场景的新视图方面取得了最先进的结果。该算法使用全连接(非卷积)深度网络表示一个场景,其输入是单个连续的5D坐标在空间位置(x, y, z)和观看方向(θ, ϕ),其输出是该空间位置的体密度和与视图相关的发射辐射度。通过查询沿相机射线的5D坐标来合成视图,并使用经典的体渲染技术将输出的颜色和密度投影到图像中。NeRF能有效优化神经辐射场,以渲染具有复杂几何和外观的场景的真实感新视图,并展示了优于之前在神经渲染和视图合成方面的工作的结果。
简介:
我们将静态场景表示为一个连续的5D函数,该函数在空间中的每个点(x, y, z)输出在每个方向发射的辐射(θ, ϕ),每个点的密度就像一个差分不透明度,控制通过(x, y, z)的光线积累多少辐射。该方法优化了一个不需要任何卷积层(通常称为多层感知器或MLP)的深度全连接神经网络,通过从单个5D坐标(x, y, z, θ, ϕ)回归到单个体积密度和视图相关的RGB颜色来表示这个函数。由于这个过程是自然可微的,我们可以使用梯度下降来优化该模型,方法是通过最小化每个观察图像和从我们的表示中渲染的相应视图之间的误差。通过为包含真实底层场景内容的位置分配高体积密度和准确颜色,鼓励网络预测场景的连贯模型。
优化复杂场景的神经辐射场表示的基本实现,并没有收敛到足够高分辨率的表示,而且在每个相机射线所需的样本数量方面效率很低。通过用位置编码转换输入的5D坐标来解决这些问题,使MLP能够表示更高频率的函数,并提出了一种分层采样程序,以减少对这种高频场景表示进行充分采样所需的查询数量。
NeRF技术贡献:
一、一种将具有复杂几何和材质的连续场景表示为5维神经辐射场的方法,参数化为基本的MLP网络。
二、 一个基于经典体绘制技术的可微绘制过程,我们用它来优化标准RGB图像的表示。这包括一种分层采样策略,将MLP的容量分配到具有可见场景内容的空间。
三、 一个位置编码,将每个输入的5D坐标映射到一个更高维的空间,使能够成功地优化神经辐射场来表示高频场景内容。
神经辐射场景表示 :
将一个连续的场景表示为一个5D向量值函数,其输入是一个3D位置x=(x,y,z)和2D观看方向(θ, ϕ),其输出是一个发射颜色c =(r, g, b)和体积密度σ。 在实践中,将方向表示为3D笛卡尔单位向量d。用MLP网络近似这种连续的5D场景表示FΘ :(x, d) → (c, σ)并优化其权重Θ,以从每个输入5D坐标映射到其相应的体密度和定向发射颜色。
通过限制网络预测体积密度σ作为位置x的函数,鼓励表示是多视图一致的,同时允许RGB颜色c作为位置和观看方向的函数进行预测。为了实现这一点,MLP FΘ首先处理具有8个全连接层的输入3D坐标x(使用ReLU激活和每个层256个通道),并输出σ和256维特征向量。然后将该特征向量与相机光线的观看方向连接起来,并传递到一个额外的全连接层(使用ReLU激活和128个通道),该层输出与视角相关的RGB颜色。
辐射场体绘制:
提出的5维神经辐射场将场景表示为空间中任意点的体积密度和定向发射辐射。我们使用经典体绘制的原理来渲染任何穿过场景的光线的颜色。体积密度σ(x)可以解释为射线在位置x的无限小粒子处终止的差分概率。相机光线r(t)= o+td与远近边界tn和tf的期望颜色C(r)为:
函数T(t)表示沿着从tn到t的射线的累积透过率,射线从tn到t没有击中任何其他粒子的概率。从连续神经辐射场渲染视图,需要估计通过所需虚拟相机的每个像素跟踪的相机光线的积分C(r)。
我们用积分的方法对这个连续积分进行数值估计。确定性正交法通常用于渲染离散体素网格,将有效限制表示的分辨率,因为MLP只会在一组固定的离散位置上进行查询。相反,我们使用分层抽样方法,将[tn, tf ]分成N等间隔的箱子,然后从每个箱子中均匀随机抽取一个样本:
虽然使用离散的样本集来估计积分,但分层采样能够表示连续的场景表示,因为它导致在优化过程中在连续位置对MLP进行评估。使用这些样本来估计C(r)与Max在Volume rendering review中讨论的积分规则:
其中δi =ti+1 − ti为相邻样本之间的距离。这个从(ci , σi)值的集合计算 的函数是可轻易微分的,可以简化为传统的alpha合成与alpha值αi =1-exp(−σiδi)。
优化神经辐射场
为了实现对高分辨率复杂场景的表示。以下提出两种改进。第一个是输入坐标的位置编码,帮助MLP表示高频函数,第二个是分层采样程序,允许我们有效地对这种高频表示进行采样。
- 位置编码
在工作中发现深度网络偏向于学习低频函数。在将输入传递给网络之前,使用高频函数将输入映射到更高维度的空间,可以更好地拟合包含高频变化的数据。在神经场景表示的背景下利用这些发现,将FΘ重新表述为两个函数FΘ =F Θ ◦ γ(一个是学习函数,一个是非学习函数)的组合,可以显著提高性能。这里γ是从R到更高维空间R 2L的映射,而F Θ仍然只是一个普通的MLP。形式上,我们使用的encoding函数是:
这个函数γ(.)分别应用于x中的三个坐标值(归一化为位于[-1,1]和笛卡尔视点方向单位向量d的三个分量(按构造位于[-1,1])。在实验中,将γ(x)设置为L=10,将γ(d)设置为L =4。用这些函数将连续的输入坐标映射到更高维的空间中,使MLP更容易近似更高频率的函数。
2、分层体采样
沿着每条相机光线密集评估N查询点上的神经辐射场网络的渲染策略是低效的:对渲染图像没有贡献的自由空间和被遮挡区域仍然被反复采样。从体绘制的早期工作中获得灵感,并提出一种分层表示,通过将样本按其对最终渲染的预期效果比例分配,来提高渲染效率。
这里不是只用一个网络来表示场景,而是同时优化两个网络:一个“粗”和一个“精”。首先使用分层抽样对一组Nc位置进行抽样,并评估这些位置的“粗”网络,如方程式2、3所述。给定这个“粗糙”网络的输出,然后我们沿着每条射线产生更有信息的点采样,其中样本偏向于体积的相关部分。为此,我们首先在方程式中重写来自粗糙网络的alpha复合颜色作为所有采样颜色的加权和ci沿着光线:
将这些权重归一化为 :产生沿射线的分段常数PDF。我们使用逆变换采样从这个分布中采样第二组Nf位置,评估我们在第一组和第二组样本的联合处的”精细”网络,并使用方程式计算光线的最终渲染颜色
。但使用所有Nc +Nf样本。这个过程为我们期望包含可见内容的区域分配了更多的样本。这解决了与重要性采样类似的目标,但我们使用采样值作为整个积分域的非均匀离散化,而不是将每个样本视为整个积分的独立概率估计。
实现细节
为每个场景优化一个单独的神经连续体表示网络。这只需要一个捕获的场景的RGB图像数据集、相应的相机姿态和内部参数和场景边界(对合成数据使用ground truth相机姿态、内部参数和边界,并使用COLMAP structure-from-motion包来估计真实数据的这些参数)。在每次优化迭代中,从数据集中所有像素的集合中随机采样一批相机射线,然后遵循分层采样,以从粗网络中查询Nc样本和从细网络中查询Nc+Nf样本。然后,使用体渲染程序来渲染来自两组样本的每条射线的颜色。损失只是粗略和精细渲染的渲染颜色和真实像素颜色之间的总平方误差:
其中R是每个批次中的光线集合,C(r)、 和分别是光线r的真实值、 粗体积预测和细体积预测RGB颜色。请注意,即使最终渲染来自也尽量减少的损失,
在实验中,使用4096条射线的批量大小,每个采样在粗体积中的Nc =64坐标和细体积中的Nf =128额外坐标。使用Adam优化器,
结果
通过定量和定性结果分析,所提出方法优于之前的工作,并提供了广泛的消融研究来验证所提出的设计选择。
学习率从开始,在优化过程中指数衰减到(其他Adam超参数保持默认值β1 =0.9、β2 =0.999和。对单个场景的优化通常需要大约100-300k迭代才能在单个NVIDIA V100 GPU上收敛(大约1-2天)。
下面介绍一下基于NeRF代码训练过程
1 下载代码,安装依赖包
git clone https://github.com/yenchenlin/nerf-pytorch.git
cd nerf-pytorch
pip install -r requirements.txt
2、下载数据集,解压到相应配置文件指定位置
bash download_example_data.sh
3、开始训练
python run_nerf.py --config configs/lego.txt
参数config的值可以根据情况选择
训练完成后会在下面位置生成一个.mp4视频文件
logs/lego_test/
4、训练完成后,可测试
python run_nerf.py --config configs/legotxt --render_only
NeRF的训练数据集类型有多种,其中llff与blender是常用的两种,llff类型数据用Colmap软件标注生成,blender类型数据用blender软件标注生成
了解blender软件标注方法,可参考另外一个CSDN作者文章:Nerf如何制作自己的llff数据集,地址:Nerf如何制作自己的llff数据集_出门吃三碗饭 nerf-CSDN博客