NeRF 原始论文 & NeRF Studio 安装使用

关于NeRF

特性

NeRF技术会为每个场景单独优化一个神经网络
对于合成数据:NeRF使用真实的相机姿态、内参和边界
对于真实数据:使用COLMAP从运动软件包估计这些参数
NeRF技术在不需要显式地重建场景几何的情况下,可以从输入的 RGB 图像数据集中学习场景的连续体积表示

原理

NeRF 原始论文 & NeRF Studio 安装使用_第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颜色。

利用体渲染技术得到特定的摄像机光线颜色

沿一条摄像机光线在场景中生成一组采样的3D点,将这些点及其相应的观察方向作为神经网络的输入,产生一组颜色和密度的输出,使用经典体渲染技术将这些颜色和密度累积成一个2D图像

通过梯度下降优化2.1构建的MLP网络

上文提到的过程可微分,可通过梯度下降来优化这个模型,使每个现实图像与渲染出的视图之间的误差最小化。

改进

原理部分谈到原始NeRF的最初想法与实现过程,但实际使用时发现(a)在对高频场景进行复现时,经过大量迭代依然无法收敛到高分辨率表示,(b)2.2提到的分层“采样一组点”效率低,因为对光线颜色无影响的部分也会被采样(例如被遮挡)。因此论文分别提出两项改进

加入位置编码

Rahaman 等人研究表明深度网络更倾向于学习低频函数,以及在将输入传递给网络之前,使用高频函数将输入映射到更高维空间可以更好地拟合包含高频变化的数据。
本文利用这些发现,将F_θ改写为两个函数F_θ=F_θ^′∘γ的组合,其中γ 是一个从R映射到更高维空间R2L的映射,而F_θ′是一个普通的 MLP。

将此函数分别应用于 x 中的三个坐标值(x, y, z)与单位向量d的三个分量。在本实验中,L = 10 用于 γ(x),L = 4 用于 γ(d)。

层次化采样

原始策略:在每个相机光线上对神经辐射场网络进行密集评估,共计 N 个查询点,但不会对最终渲染图像产生贡献的自由空间和被遮挡区域仍然会被重复采样,导致效率较低
层次化表示:对整个体积空间进行层次划分,然后基于每个层级的预期贡献来分配采样点。
方法:同时优化两个神经网络,先用分层采样取Nc个点,评估出“粗糙”神经网络。把从“粗糙”网络获得的颜色作为权重因子,将更多的采样点Nf分配到对最终渲染结果影响较大的体积部分。以此提高效率且降低渲染的计算成本。

实际训练过程

使用4096条光线优化神经网络
对于“粗糙”网络,Nc = 64 个坐标
对于“精细”网络,额外采样Nf = 128个坐标
使用NVIDIA V100训练,100k-300k次迭代后收敛(约1-2天)

结果与对比


NeRF 原始论文 & NeRF Studio 安装使用_第2张图片

其中第一列为现实图片,第二列为NeRF生成效果,三至四/五列为其他模型生成效果(Ship & Lego 分别为LLFF, SRN, NV; T-Rex 分别为LLFF, SRN)

关于NeRF Studio

简介

NeRF Studio提供了一个调用各种NeRF模型的接口。
它包含的模型有Nerfacto, Instant-NGP, NeRF, Mip-NeRF, TensoRF等,同时还有一些第三方模型,例如Instruct-NeRF2NeRF和K-Planes。
其中Nerfacto是nerfstudio提出的,通过整合多篇论文对nerf模型的优化,设计了一个比较全面的神经辐射场解决方案。它是nerfstudio的默认模型,也是最推荐使用的模型。从效率和准确度来讲,个人通过一次简单的对比发现它可以在与instant-NGP,一个以快速为核心特性的模型,训练速度差不多的情况下,渲染效果比instant-NGP更好。
而第三个NeRF就是最熟悉的初代NeRF。根据个人对论文的理解,NeRF训练的时间应该比nerfacto慢的多,可能需要1-2天才能完成一个场景的训练。原始的NeRF是不需要cuda加速的,可能这也解释了它和nerfacto这种模型的速度差异。而因为nerfstudio提供了配有cuda加速的模型,因此在安装nerfstudio前需要先安装好cuda toolkit。

使用方法

NeRF一共有三个调用方法,分别是在本地从头配置环境、下载docker镜像与使用Google Colab在线使用。配置环境需要的时间按顺序递减,但便利性理论来讲也是递减的。nerfstudio提供了一个网页https://github.com/nerfstudio-project/nerfstudio/blob/main/docs/quickstart/installation.md#dependencies专门讲解各种配置与使用流程。

  1. 按照GitHub教程配置环境。这样的好处是可以完全本地化而不需要联网,因为无论是nerfstudio还是用来查看训练进度的viewer都是可以本地安装与使用的。但缺点是nerfstudio对于环境的依赖比较多,像这样从头配置环境可能会遇到相比后两种多的多的问题。
  2. 下载Docker镜像。上文的连接有很详细的使用教程。
  3. 使用Google Colab上提供的现成demo直接训练范例数据或直接上传自己的数据训练。这样的好处是完全不需要环境,可以直接运行,但训练成果只能以视频的形式导出。

你可能感兴趣的:(python,机器人,自动驾驶,计算机视觉,人工智能)