关于NeRF
1. 特性
NeRF技术会为每个场景单独优化一个神经网络
对于合成数据:NeRF使用真实的相机姿态、内参和边界
对于真实数据:使用COLMAP从运动软件包估计这些参数
NeRF技术在不需要显式地重建场景几何的情况下,可以从输入的 RGB 图像数据集中学习场景的连续体积表示
2. 原理
2.1 利用MLP模拟5D函数以表示连续空间场景
方法:用一个5D向量值函数表示连续场景,其输入为3D坐标 x = (x, y, z) 和2D视角方向 (θ, φ)(实践中用单位向量 d表示),输出为该坐标发射的颜色 c = (r, g, b) 和体积密度 σ。用一个MLP网络 FΘ : (x, d) → (c, σ) 来近似这个连续的5D场景表示,并优化权重 Θ 以将每个输入的5D坐标映射到其对应的体积密度和方向发射颜色。
为了保证多视角一致性,我们限制网络仅将体积密度σ作为位置x的函数进行预测,同时允许将RGB颜色c作为位置和观察方向的函数进行预测。为了实现这一点,MLP FΘ首先用8个全连接层(使用ReLU激活函数和每层256个通道)处理输入的3D坐标x,并输出σ和一个256维的特征向量。然后,将这个特征向量与摄像机光线的观察方向连接,并传递到另一个全连接层(使用ReLU激活函数和128个通道),输出视角相关的RGB颜色。
2.2 利用体渲染技术得到特定的摄像机光线颜色
沿一条摄像机光线在场景中生成一组采样的3D点,将这些点及其相应的观察方向作为神经网络的输入,产生一组颜色和密度的输出,使用经典体渲染技术将这些颜色和密度累积成一个2D图像
2.3. 通过梯度下降优化2.1构建的MLP网络
上文提到的过程可微分,可通过梯度下降来优化这个模型,使每个现实图像与渲染出的视图之间的误差最小化。
3. 改进
原理部分谈到原始NeRF的最初想法与实现过程,但实际使用时发现(a)在对高频场景进行复现时,经过大量迭代依然无法收敛到高分辨率表示,(b)2.2提到的分层“采样一组点”效率低,因为对光线颜色无影响的部分也会被采样(例如被遮挡)。因此论文分别提出两项改进
3.1. 加入位置编码
Rahaman 等人研究表明深度网络更倾向于学习低频函数,以及在将输入传递给网络之前,使用高频函数将输入映射到更高维空间可以更好地拟合包含高频变化的数据。
本文利用这些发现,将F_θ改写为两个函数F_θ=F_θ^′∘γ的组合,其中γ 是一个从R映射到更高维空间R^2L的映射,而F_θ^′是一个普通的 MLP。
将此函数分别应用于 x 中的三个坐标值(x, y, z)与单位向量d的三个分量。在本实验中,L = 10 用于 γ(x),L = 4 用于 γ(d)。
3.2. 层次化采样
原始策略:在每个相机光线上对神经辐射场网络进行密集评估,共计 N 个查询点,但不会对最终渲染图像产生贡献的自由空间和被遮挡区域仍然会被重复采样,导致效率较低
层次化表示:对整个体积空间进行层次划分,然后基于每个层级的预期贡献来分配采样点。
方法:同时优化两个神经网络,先用分层采样取Nc个点,评估出“粗糙”神经网络。把从“粗糙”网络获得的颜色作为权重因子,将更多的采样点Nf分配到对最终渲染结果影响较大的体积部分。以此提高效率且降低渲染的计算成本。
4. 实际训练过程
使用4096条光线优化神经网络
对于“粗糙”网络,Nc = 64 个坐标
对于“精细”网络,额外采样Nf = 128个坐标
使用NVIDIA V100训练,100k-300k次迭代后收敛(约1-2天)