介绍
NeRF是一篇新视角合成 (Novel View Synthesis) 方面的论文,开创性的使用了隐式神经网络表达场景的方法,使用 MLP 网络学习场景中的几何以及光照。后通过经典的体渲染技术获得照片级的新视角
背景
在视角合成中通常需要一个3D场景表示来作为中介来生产高质量的虚拟视角,根据表现形式的不同,3D场景表示可以分为“显式”和“隐式”表达
显式表达 (Explicit Representation) 包括网格 (Mesh), 点云 (Point Cloud), 体素 (Voxel), 体积 (Volume), 深度图 (Depth Map)等不同方式。
显式表达的优点为能对场景进行显式建模,从而合成照片级的新视角;缺点是显式表达均为离散表示方式,精细化程度不够且在高分辨率下场景内存开销极大
隐式表达 (Inplicit Repersentation) 通常为使用一个函数来表示场景几何,隐式表达使用一个多层感知器 (Multi-Layer Perception, MLP) 模拟该函数:输入空间的3D坐标,输出对应的几何信息。
隐式表达的优点是它为一种连续的表示,内存开销极小,适用于高分辨率场景,而且通常不需要3D信号进行监督。在NeRF之前,其缺点为无法合成照片级的新视角,如 Signed Distance Function (SDF)
NeRF方法
NeRF 首次利用隐式表示实现了照片级的视角合成效果,与之前方法不同的是,NeRF 使用了 Volume 作为中间表达,尝试重建一个隐式的 Volume
NeRF的主要贡献有:
- 提出了一种5D Neural Radiance Field的方法实现复杂场景的隐式表达
- 基于经典的体渲染 (Volume Rending) 提出了一种可微渲染的流程,并且引入一种分层渲染的优化
- 引入位置编码 (Position Encoding),解决高频变换区域合成精度问题
神经场
神经场 (Neural Field) 在 Neural Fields in Visual Computing and Beyond 这篇文章中的到了非常详尽的阐述,简单来说:
场 (Field) 用于表达连续空间某一量,即“时空的函数”。当我们讨论场时,我们讨论的是一个连续的概念,且是将一个高维的向量映射到一个标量
神经场即用神经网络的方式进行全部或部分参数化的场
在计算机视觉领域,可以认为神经场是空间坐标或其他维度(时间,姿态等)作为输入,通过MLP网络模拟目标函数,生成一个目标标量(颜色,深度等)
体渲染
渲染可以说是图形学的核心,而体渲染 (Volume Rendering) 是渲染技术中的一个分支,主要是为了解决云、烟、胶状体等非刚性物体的渲染
为了渲染这种非刚性物体,体渲染将非刚性物体抽象表示成为粒子群,光线在穿过这类物体时,就是光子和粒子发生碰撞的过程
体渲染将碰撞分类成下图的四种情形:吸收 (Absorption)、发射 (Emission)、内散射 (In-scattering) 和外散射 (Out-scattering)
具体实现
本节将分成四个部分叙述 NeRF 的具体实现过程,以下是本节结构:
- 基本实现
1.1 基本步骤
1.1 神经辐射场 (Neural Radiance Field)
1.2 体渲染 (Volume Rendering) - 优化
2.1 位置编码 (Position Encoding)
2.2 分级表征渲染 (Hierachical Sampling)
基本步骤
使用训练完成的 NeRF 模型进行新视角合成的步骤如下:
- 对于要合成的图片上的每一个像素,从相机发生光线到该像素并在光线上进行均匀采样,生成一组采样点
- 对于每一个采样点,使用采样点的三维坐标和观察角度作为神经辐射场的输入,得到颜色和体积密度
- 使用经典的体渲染将颜色和体积密度生成图像
Neural Radiance Field
神经辐射场是 NeRF 的主要内容,使用一个神经网络来近似出一个三维场景的表达。神经辐射场中隐式表达了场景中每个点从每一个角度看过去颜色和体积密度,即原文中公式:
$$
\begin{equation} F(\mathbf{x}, \theta, \phi) \rightarrow (\mathbf{c}, \sigma) \end{equation}
$$
其中 $\mathbf{x}$ 是场景中点的三维坐标,$(\theta, \phi)$ 分别代表球面坐标系下的方位角和极角,$\mathbf{c} = (r,g,b)$ 代表颜色,$\sigma$ 代表点的体积密度
该函数 $F_\Theta$ 在 NeRF 中用一个或多个(取决于是否进行优化) MLP 网络来近似表达,而观察角度 $(\theta, \phi)$ 通常使用一个三维单位向量 $\mathbf{d} = (d_x, d_y, d_z)$ (下称方向向量)表示。在函数的输出中,颜色 $\mathbf{c}$ 与观察角度以及场景中点的坐标有关,而与密度 $\sigma$ 和观察角度无关
基本 NeRF 模型中的神经辐射场结构如下:
- 8 层全连接激活函数 (ReLU) 层,每层拥有 256 个通道,使用采样点坐标 $\mathbf{x}$ 作为输入
- 一个的 256 通道全连接激活函数层,输出 $\mathbf{x}$ 处的密度和一个高维的特征向量 (在原文中为 256 维)。
- 一个 128 通道全连接激活函数层,使用上面输出的高维特征向量与观察角度 $\mathbf{d}$ 结合作为输入,输出 $\mathbf{x}$ 处的颜色 $\mathbf{c}$
由于损失函数的计算中使用了 Volume Rendering 过程中产生的参数,所以损失函数将放在下一小节进行叙述
Volume Rendering in NeRF
我们在上一小节中由指定的观察角度得到该观察角度下场景中点的密度和颜色后,将用体渲染的方式进行新视角的合成
在原版 NeRF 模型中,对于任意的一条相机光线 $\mathbf{r}(t) = \mathbf{o}+t\mathbf{d}$ ($\mathbf{o}$ 代表相机位置,$\mathbf{d}$ 代表观察视角),使用如下公式计算光线上 $t_n$ 到 $t_f$ 处的颜色:
$$
\begin{equation} C(\mathbf{r}) = \int_{t_n}^{t_f} T(t)\sigma(\mathbf{r}(t)) \mathbf{c}(\mathbf{r}(t), \mathbf{d}) dt \end{equation}
$$
其中 $\sigma(\mathbf{r}(t))$ 和 $\mathbf{c}(\mathbf{r}(t), \mathbf{d})$ 分别代表在点 $\mathbf{r}(t)$ 处的体积密度和方向向量 $\mathbf{d}$ 看去的颜色,$dt$ 代表积分增量
$T(t)$ 为光线从 $t_n$ 到 $t$ 处的累加透光率,表示光线从 $t_n$ 走到 $t$ 处没有击中任何粒子的概率,由以下公式计算:
$$
\begin{equation} T(t) = \exp(-\int_{t_n}^{t} \sigma(\mathbf{r}(s)) ds) \end{equation}
$$
通过对从相机到将要生成的新视角的图片上每一个像素的光线进行积分,我们可以得到新合成视角的图像,但该方程是连续形式,在实际的神经网络训练过程中无法完成。所以我们使用 Quadrature 积分法将其化为离散形式进行近似计算
可以使用数值积分的方式对式(3)进行数值估计,在原版的 NeRF 中,使用 Stratified Sampling 的方式来逼近实际数值。我们将区间 $[t_n, t_f]$ 分成 $N$ 等分,在每一个小区间上进行随机采样一点。这样式(3)就可以用下述公式进行逼近:
$$
\begin{equation} \hat{C}(r) = \sum_{i=1}^{N} T_i \alpha_i \mathbf{c_i},\ \ \mathrm{where} \ T_i = \exp(\sum_{j=1}^{i-1} \sigma_i \delta_i) \end{equation}
$$
其中 $\delta_i = t_{i + 1} - t_i$ ,即相邻两采样点之间的距离,$(\sigma_i, \mathbf{c}_i)$ 代表 MLP 计算出的该采样点的体积密度和颜色, $\alpha_i = (1-\exp(-\sigma_i \cdot \delta_i))$ 代表点 $i$ 处的透光度
原版 NeRF 中使用光度一致性作为损失函数来调整参数,对于每一张图片来说,损失函数可以描述为下式:
$$
\begin{equation} L = \sum_{r \in R} \big| \hat{C}(\mathbf{r}) - C_{gt}(\mathbf{r}) \big|_2^2 \end{equation}
$$
其中 $C_{gt}(r)$ 代表光线 $\mathbf{r}$ 照射到像素的真实颜色,$R$ 为照射到合成图像上到每一像素的光线的集合
Position Encoding
通过上图我们可以发现,使用前文中的方法,在图像高频变换部分的生成效果不佳
在 Rahaman 等人所作文章[1]中指出神经网络倾向于学习低频信息,而 NeRF 需要关注场景的颜色的纹理信息等高频细节。如果直接使用MLP学习,会导致学得纹理的表面相当模糊。因此引入了位置编码,让MLP同时学习高低频信息,提升清晰度
我们将位置向量 $\mathbf{x}$ 和 方向向量 $\mathbf{d}$ 转化为高频变量:
$$
\gamma(p) = (\sin(2^0\pi p), \cos(2^0\pi p), \dots, \sin(2^{L-1}\pi p), \cos(2^{L-1}\pi p))
$$
将位置编码后的 $(x, y, z)$ 和 $(\theta, \phi)$ 作为输入就可以生成更加清晰的图片
Hireacial Simpling
在前文中我们使用离散的近似积分对场景进行体渲染,但场景中存在的 free space 和 occluded regions 这些对渲染结果无贡献的区间也同样参与到了渲染中。为了更有效的进行渲染,NeRF 使用了分级表征渲染的思想[2]提高渲染效率
在该思想中,我们同时优化两个神经网络 “coarse” 和 “fine”。
作者先使用上文的分层采样得到 $N_c$ 个采样点,使用 coarse 的渲染方程进行计算:
$$
\begin{equation} \hat{C_c}(\mathbf{r}) = \sum^{N_c}_{i=1} w_i c_i,\ \ \mathrm{where} \ w_i = T_i(1-exp(-\sigma_i \delta_i)) \end{equation}
$$
后对 $w_i$ 进行归一化 $\hat{w_i} = w_i / \sum^{N_c}_{j=1} w_j$ ,得到分段常数概率密度函数。而后通过逆变换采样(Inverse Transform sampling)获得 $N_f$ 个点,添加到原 $N_c$ 个点中用于 fine 网络的渲染
通过第二次采样,我们所得到的采样点则会更多得使用对颜色计算贡献更有意义的体素进行计算
损失函数修改如下:
$$
\mathcal{L} = \sum_{r \in \mathcal{R}} \Big[ \big\Vert \hat{C_c}(\mathbf{r}) - C_{gt}(\mathbf{r}) \big\Vert_2^2 + \big\Vert \hat{C_f}(\mathbf{r}) - C_{gt}(\mathbf{r}) \big\Vert_2^2 \Big]
$$
NeRF相关优化
NeRF存在的问题:
- 训练和渲染速度极慢
- 只能表示静态场景
- 无法泛化至其他场景
- 需要大量视角进行训练
以下介绍不同方面的改进工作
质量和几何学优化
视角合成质量优化
Mip-NeRF
- 使用锥体追踪替代光线追踪
- 在低分辨率下效果相较原方法新视角质量较好
Mip-NeRF 360
- 将 Mip-NeRF 扩展至无边界场景
- 将 Mip-NeRF 中高斯分布进行重参数化
- 使用 proposal MLP 进行体素深度的预测,寻找合适的采样间隔
- 使用正则化的方式消除伪影和背景噪声
Ref-NeRF
- 基于 Mip-NeRF, 设计用于获取更好的表面反射
- 将计算密度的 MLP 修改为除输出密度和特征向量,还输出漫反射、高光、粗糙度和法线。其中漫反射和高光相乘与颜色 MLP 的输出高光相加
- 使用从以粗糙度为参数的球面高斯分布中采样的向量的球谐函数来参数化方向向量
- Ref-NeRF 性能与上述改进与标准 NeRF 相比较优,且可以计算出准确的高光和反射
RegNeRF
- 旨在解决稀疏输入下的 NeRF 训练问题
- 使用正则化优化颜色和深度计算
Ray Prior NeRF
- 旨在解决训练图像对拍摄物体视角覆盖范围不广时效果不佳的问题
- 提出 Random Ray Casting (RRC),以光线和物体交点为球心做半球面,固定范围内随机生成新射线获取颜色作为伪标签(半监督学习),具体如下图所示
- 提出 Ray Atlas (RA) ,使用全局射线方向代替单一射线方向
- 上述两项优化与大部分 NeRF 改进兼容
使用深度监督和点云优化训练
Depth-Supervised NeRF
- 旨在解决原始 NeRF 几何与深度计算不精确的问题
- 使用 COLMAP[3] 提取训练图像点云用于优化训练
- 在 MLP 中添加 KL Divergence 项以最小化射线分布与加噪深度分布之间的 KL Divergence
- 另一个相似工作[4]中使用深度补全网络生成深度和不确定性图,使用 ScanNet[5] 和 MatterPort3D[6] 生成 RGB-D 数据,并在深度数值上添加高斯噪声
NeringMVS
- 旨在解决 NeRF 对场景三维结构认知不足
- 提出一种使用单目深度网络预测深度图并优化 NeRF 训练的方法
- 使用 COLMAP 提取深度图用于训练单目深度神经网络
- 使用单目神经网络预测出的深度图计算 NeRF 采样时的边界
PointNeRF
- 使用一个预训练的 3D CNN 来生成训练图片的深度和点在表面的置信度
- 使用一个预训练的 2D CNN 提取训练图像的特征
- 使用上述数据作为点云中每个点的特征建立点云
- 使用一个 PointNet-like 网络回归计算密度和颜色
其他几何优化
SNeS
- 优化几何生成
- 通过添加软对称性约束,学习场景中局部和部分隐藏场景对象的可能对称性
$S^3$-NeRF
- 优化几何生成
- 通过场景中的 shadow 和 shading 信息推测场景的几何形状
- 使用一个 UNISURF-based 的占位场表示 3D 场景,并且使用一个基于占位的阴影计算方式
- 实现了单图生成 NeRF,在单图生成深度图像和表面法线重建效果极佳
训练和推理速度优化
在原 NeRF 中,提出了 Hierarchical Rendering 的方法来提升速度。在这个方法中,作者使用一个粗略和一个精细的神经网络来表示场景,粗略神经网络的输出用于限定精细神经网络的采样点范围。这种方法阻止了神经网络像原始 NeRF 方法一样在各个方位进行大密度的精细采样,使得场景中无贡献部分的采样权重降低,优化训练速度
我们将随后的改进分为两类:
- 一类首先做完模型的训练,再将网络的评估结果存入一种更易访问的数据结构中。这类方法虽然极大的提升了速度,但仅能提升推理速度,我们将这类模型称为烘焙 (baked) 模型
- 另一类称为非烘焙 (non-baked) 模型,这类模型中包含多种不同的改进。通常这类模型尝试从已学习的 MLP 参数中学习不同的场景特征,将原 MLP 的规模缩小,以获得更快的训练和推理速度
Baked
Sparse Neural Voxel Grid (SNeRG)
- 优化推理速度
- 在一个稀疏体素网格上预计算漫反射、密度和特征向量
- 在这个方法中,MLP 仅用于计算高光
- 较原方法快 3000 倍
PlenOctree
- 优化推理速度
- 提出一个基于球谐函数的神经辐射场,输出为球谐函数的系数
- 使用八叉树 (octree) 存储预计算出的 MLP 中颜色的球谐函数系数
- 可以使用蒙特卡洛估计在标准 NeRF 上实现
FastNeRF
- 优化推理速度
- 将颜色函数分解为一个依据方向和位置的 MLP 和一个仅依据方向的 MLP 的输出的内积
- 使得FastNeRF可以轻松的在密集网格中缓存颜色和密度的评估信息
- 引入硬件光追
KiloNeRF
- 优化推理速度
- 将场景分割成上千个独立小场景分别进行计算
- 使用一个预训练好的 Teacher MLP 对小场景 Student MLP 进行知识蒸馏 (Knowledge Distillation)
- 较原方法快 2000 倍
Fourier Plenoctree
- 用于动态场景神经辐射场的高效建模和实时渲染
- 首先使用可泛化 NeRF 和 Shape-From-Silhouette 创建一个粗糙人体外壳
- 对外壳内部的点进行采样,并将数据存储在一个 Plenoctree 中
- 使用透射率阈值来消除大部分空点,对于剩余的点,生成新的叶子密度和SH 颜色系数,并更新 Plenoctree
- 然后使用傅里叶变换的多层感知机 (Fourier Transform MLP )来提取密度和 SH 颜色系数的傅里叶系数,然后将其输入到反离散傅里叶变换中,以恢复 SH 系数和密度
Mobile NeRF
- 优化推理速度
- 使用 MLP 计算基于多边形网格的场景数据
- 将透明度离散化,并使用超采样实现抗锯齿
- 使用额外的 small MLP 为像素着色
NeLF
- 优化渲染速度
- 使用 MLP 预计算光场取代神经辐射场
Non-Baked
Efficient NeRF
- 优化训练及推理速度
- 基于PlenOctree
- 提出 Valid Sampling 和 Pivotal Sampling 两个优化
- Valid Smapling 只计算采样点中密度大于 $0$ 的部分
- Pivotal Smapling 只计算采样点中密度大于 $thershold$ 的部分,原文预定义 $thershold = \epsilon < T_i\alpha_i$
- 提出一种新的数据结构 NeRFtree,能够达到有效缓存及查询3D scene信息的目的
Neural Sparse Voxel Fields (NSVF)
- 优化训练及推理速度
- 提出了一种基于体素的 NeRF 模型,将场景看作以体素为边界的神经辐射场的集合
- 通过存储在体素顶点处的可学习特征插值获取特征表示,并输入到一个共享的 MLP 中计算密度和颜色
- 基于稀疏体素交点进行光线采样
- 由于存储网格和特征向量,内存开销较大
AutoInt
- 优化训练及推理速度
- 将式(4),即离散化后的体渲染公式进行分解并使用 Automatic Integration Technic 进行优化
- 计算 MLP 网络中的导数图,并将其重构,快速计算积分过程
Deterministic Integration for Volume Rendering (DIVeR)
- 优化训练及推理速度
- 与 NSVF 一致,使用体素网格构建 NeRF 模型并使用一个 MLP 进行稀疏性正则化和体素剔除
- 在体渲染部分,在体素网格中执行确定性射线采样,为每个射线间隔(同 NSVF 由射线与特定体素的交点定义)产生一个积分特征,将其输入 MLP 获取每个射线间隔的颜色和密度
- 实质上反转了采样和 MLP 评估的顺序
Instant Neural Graphics Primitives (Instant-NGP)
- 极大的优化训练和推理速度
- 提出一个多分辨率参数化哈希编码,与 NeRF 一起同时训练
- 使用忽略空白区域、指数步进、样本压缩优化射线光线行进过程
稀疏训练数据优化
基本的 NeRF 训练每一个场景时都需要对应场景密集的多视角图像和图像对应的相机姿态,所以在稀疏训练图像或是视角覆盖不完全的情况下,新视角生成的效果不理想,容易出现单一视角过拟合或是不合理的几何结构等情况。
对于这类问题,一些优化方案使用预训练的图像特征提取网络 (leverage pretrained image feature extraction networks,一般为预训练的卷积神经网络 (Convolutional Neural Network, CNN)) 来大幅降低需要的训练图像数量,一些作者将这种处理操作称为图像特征条件化 (image featrue conditioning)。在工作[7] 中使用深度/几何学监督的方法同样实现了该效果。
这些模型通常拥有较快的训练速度,在前面的章节提到的使用正则化或几何学优化的工作同时也减少了对训练图像视角的要求,如:DS-NeRF、$\mathbf{S}^3$-NeRF 等
pixelNeRF
- 使用预训练的卷积神经网络和双线性插值来提取图像特征
- 在基准 NeRF 的相机射线上对每个查询点进行图像特征提取
- 将提取的图像特征、视角方向和查询点输入 NeRF 来获取密度和颜色
- 工作 General Radiance Field (GRF) [8] 在规范空间中使用类似方法达成了相似的结果
MVSNeRF
- 使用与 pixelNeRF 稍不同的实现
- 使用卷积神经网络提取图像特征,而后使用平面扫描和基于方差的成本,将这些2D特征映射到一个体素化的 3D 代价体积中,并将其作为 NeRF 的输入
- 使用一个预训练的 3D 神经编码体积,并用插值生成每个点的潜在编码
- 训练过程中涉及了对 3D 特征体积和 NeRF 中 MLP 的联合优化
- 在 DTU 数据集上训练 15 分钟可以达成与原 NeRF 几个小时训练同样的效果
DietNeRF
- 引入基于从 Clip-ViT [9] 中提取的图像特征语义一致性损失 $L_{sc}$
- $ L_{sc}=\dfrac{\lambda}{2} \big\Vert \phi(I)-\phi(\hat{I}) \big\Vert^2_2$
- 其中 $\phi$ 表示由 Clip-ViT 计算的训练图像 $I$ 和渲染图像 $\hat{I}$ 的特征,减少了特征向量归一化时的余弦相似度损失
Neural Rays (NeuRay)
- 同样使用代价体积,对于所有的输入图像,使用 Multi-View Stereo (MVS) 算法估计其代价体积
- 为了达成这个目的,首先使用一个简介卷积神经网络来创建特征图 $G$
- 在体渲染时,使用这些特征在 MLP 中提取并处理可视性和局部特征,并使用其生成颜色和透明度
- 可视性使用累加密度函数进行计算,并处理为以下加权和 sigmoid 函数 $\Phi$ 的形式
- $ v(z)= 1 - t(z),\ \mathrm{where} \ t(z)=\sum_{i=1}^{N} w_i\Phi((z-\mu_i)/\sigma_i)$
- 其中 $w_i, \mu_i, \sigma_i$ 均为使用 MLP 从图 $G$ 中解码获得
- 采样时使用 alpha 值进行采样优化,只对拥有高命中几率的点进行采样
- 对新场景的泛化能力较好,并且可以进一步微调以超越基准 NeRF 的性能
GeoNeRF
- 基于几何先验的 NeRF 泛化
- 引入特征金字塔网络 (Feature Pyramid Network, FPN) 提取输入图像中的特征,后使用平面扫描创建级联 3D 成本体积
- 从这两种特征表示中,对于每条光线上的 $N$ 个采样点,每个采样点生成一个视角无关,多个视角相关的特征标记
- 以上步骤使用 Transformer [10] 进行优化
- 之后,对获取到的 $N$ 个视角无关的标记,使用自编码器 (AutoEncoder) 优化并计算出光线上采样点的密度;对于获取到的采样点的视角相关多个标记组成的 $N$ 个集合,作为 MLP 输入用于计算颜色
- 只需简易微调即可泛化到不同场景
NeRFusion
- 同样从卷积神经网络中计算图像特征
- 使用一个稀疏三维卷积神经网络将图像特征转化为局部特征体积
- 对于每一帧,均做一次转化。后使用门控制循环神经网络 (Gate Recurrent Unit, GRU) 来将这些体积聚合成为全局特征体积以计算颜色和密度
AutoRF
- 专注于无背景物体的新视角合成
- 对于给定的二维多角度图集,使用全景分割 (Panoptic Segmentation) 来提取物体三维边界框和物体掩码
- 使用物体边界定义标准物体坐标空间 (Normalized Object Cooordinate Space, NOCS) [11] ,进而用于物体的预体渲染
- 使用编码卷积神经网络计算外观和形状代码,并使用和 GRAF [12] 中相同的方法进行操作
- 除了使用光度一致性损失 (5) 之外,还定义占用损失:
- $ L_{occ}=\dfrac{1}{|W_{occ}|} \sum_{u \in W_{occ}\ \log(Y_u(1/2-a)+1/2)}$
- 其中 $Y$ 为物体遮罩,$W_{occ}$ 为前景或者后景像素集
- 在训练时使用上述定义损失函数对外观代码、形状代码和物体边界进行优化
SinNeRF
- 优化单图计算 NeRF 场景
- 使用图像变换 (image warping) 和已知的相机内参及姿态创建深度参考,来对不可见的视图进行深度监督
- 使用带有 CNN 判别器 (discriminator) 的对抗训练来提供逐块 (patch-wise) 的纹理监督
- 使用预训练的 ViT (Vision Transformer) 从参考块和不可见的块中分别提取全局图像特征,并比较它们之间的平方损失 (L2 loss) 项和全局结构先验 (Globol Structure Prior)
GeoAug
- 使用 [DS-NeRF](#Depth-Supervised NeRF) 作为基准生成新的噪声图像作为增强输入
生成式和条件化模型
受到 2D 计算机视觉领域的发展启发,生成式NeRF模型可以根据文本、图像或潜在编码生成 3D 几何形状。这种条件化的生成方式还允许对场景进行一定程度的编辑。这些模型可以大致分为基于生成对抗网络(GAN)的方法和扩散 (Diffusion) 方法。这些生成式NeRF模型通常使用 2D 生成模型创建 “场景” 的图像,然后用这些图像来训练 NeRF 模型。本节中也包括使用生成式潜在优化 (latent optimization) 对潜在编码进行条件化的场景编辑方法
NeRF-VAE
- 可泛化至新场景,并且无需从头开始训练
- 使用基于 Iterative Amortized Inference [12] 和 ResNet [13] 的潜在编码对 NeRF 渲染器进行条件化
- 文中还引入了一种基于注意力的场景函数
- 在 5-20 张训练图像时,效果优于基准 NeRF ,但在训练样本稠密 (100+) 的情况下,效果劣于基准 NeRF
基于 GAN 的方法
对抗训练一般用于生成或隐式条件 NeRF 模型。生成式对抗网络 (GANs) 拥有两个部分:生成器 $G$ 用于从隐式编码或噪声生成图片,判别器 $D$ 用于判断图像是“合成”还是“真实”图像。
在这个网络结构中,生成器寻求一种方法来”骗过“判别器,并让其生成的图片和真实图像无法分辨,而判别器的目标为判断正确率最大化。这两个网络的对抗训练也是对下方这个最小最大损失/值函数的优化
$$
\begin{equation} \min_G \max_D \mathbb{E_{x \sim data}} [\log D(x)] + \mathbb{E_{z \sim p(z)}}[\log(1-D(G(z)))] \end{equation}
$$
其中生成器从分布 $p(z)$ 中采样的隐式代码 $z$ 中生成图像,而判别器将生成的图像与训练图像 $x$ 进行对比。在基于 GAN 的 NeRF 模型中,生成器 $G$ 包含了所有的新视角合成步骤,并且可以被过渡性的认为是 NeRF 模型。在这种情况下,生成器除了隐式代码外还要包含输入视角。而判别器 $D$ 一般为图像分类 CNN
GRAF
- 旨在从一组未设定 pose 的 2D 图像中学习出丰富的生成模型
- 第一个使用对抗训练的 NeRF 模型
- 其生成器使用隐式外观编码 $\mathbf{z_a}$ 和形状编码 $\mathbf{z_s}$,并使用函数 $G(\gamma(\mathbf{x}), \gamma(\mathbf{d}), \mathbf{z_s}, \mathbf{z_a}) \rightarrow (\sigma, \mathbf{c})$ 计算图像
- 在实践中,形状编码用于调节场景的密度,并与嵌入的位置链接,输入到方向无关的 MLP。外观编码用于调节场景的颜色,与嵌入的观察方向链接,输入到方向相关的 MLP
$\pi$-GAN
- 旨在解决 GAN 中的视图一致性问题
- 同样使用 GAN 来训练 NeRF 模型
- 其生成器为基于 SIREN [14] 网络的 NeRF 体渲染器,并且使用正弦激活函数替换标准 NeRF MLP 中的 ReLU 激活函数
EG3D
- 旨在优化速度
- 提出一种新的基于三平面的场景混合表示,将特征存储在三个轴对齐的平面上并使用一个小的解码器 MLP 用于 GAN 框架的渲染
- GAN 框架由一个姿态条件化的 StyleGAN2 [15] 特征图生成器,用构建三平面。一个 NeRF 渲染模块将三平面上的特征转化为低分辨率图像,以及一个超分辨率模块
- 在人脸重建的真实度和 3D 结构方面较优
StyleNeRF
- 专注于 2D 图像生成
- 使用 NeRF 将 3D 感知引入 StyleGAN 图像生成框架,StyleNeRF 使用风格编码条件化 NeRF 并使用上采样模组作为生成器,使用 StyleGAN2 [15] 的解码器并引入路径正则化项进行优化
Pix2NeRF
- 提出了一种基于 $\pi$-GAN 的对抗训练模型,可以从随机采样的隐式代码和姿态中生成 NeRF 渲染图像
- 基于 $\pi$-GAN 构建,由基于 NeRF 的生成器 $G : d, z \rightarrow I$,CNN 判别器 $D : I \rightarrow d, l$ 和编码器 $E : I \rightarrow d, z$ 组成。其中 $z$ 是从多元分布中采样的隐式代码,$d$ 是姿态,$I$ 是生成的图像,$l$ 是真实图像和合成图像比较得出的二元标签
- 除了 $\pi$-GAN 使用的损失函数外,Pix2NeRF 还引入以下损失函数:1) 预测的隐式代码 $z_{predicted}$ 和采样的代码 $z_{sampled}$ 之间的重建损失,用于保证隐式空间的连续性;2) 真实图像和合成图像之间的重建损失,用于保证重建图像的质量;3) 条件化的对抗目标,保证不会坍塌到平凡的姿态 (具体细节参照原文 [16] 3.5 小节)
- 在条件化图像生成方面不如其基石 $\pi$-GAN
联合优化的隐式模型
这一类的模型将隐式编码作为视角合成的关键,但同时使用场景模型对隐式编码进行优化。在这个小节中的模型都不是生成式的模型,而是使用隐式编码计算场景中不同变化。
这类模型通常使用 Generative Latent Optimization (GLO) [17] 进行优化,在 GLO 中,一组随机采样构建的隐式编码 ${\mathbf{z_1},\cdots,\mathbf{z_n}}$ 通常和对应图像 ${I_1,\cdots,I_n}$ 构成键值对并一般呈现正态分布。随后隐式编码作为生成器 $G$ 的输入,并且与生成器 $G$ 的参数使用同样的损失函数进行联合优化,通常损失函数格式如下:
$$
\min_{G,\mathbf{z_i},\cdots,\mathbf{z_n}} \sum^n_{i=1}L(G(\mathbf{z_i}, \mathbf{u_i}), I_i)
$$
其中 $\mathbf{u_i}$ 表示未优化的其他输入。根据 GLO 作者所言,该方法可以被看作为一个无判别器的 GAN
Edit-NeRF
- 允许使用用户输入来条件化合成图像
- Edit-NeRF 使用 categor specific shared shape network $F_{share}$ 和 instance specific shape network $F_{inst}$ 进行优化,其中 $F_{inst}$ 使用 $\mathbf{z_s}$ 进行条件化,而 $F_{share}$ 不进行条件化。
- 将 NeRF 的光度损失函数分别用于优化隐式编码、MLP 权重,最后再次进行 GLO 联合优化
CLIP-NeRF
- 从 Edit-NeRF 上进行创新,优化训练速度
- 使用基本的隐式编码构建的神经辐射场(即形状和外观均使用隐式编码)
- 使用 Contrastive Language Image Pre-training (CLIP) [18] 通过形状和外观映射网络 (mapper networks) 从用户输入的文字或图片中提取隐式空间位移,用于修改场景的 NeRF 表示
- 训练过程分为两步:首先进行对抗训练,而后使用自监督对 CLIP 形状和外观映射进行训练
- 当将 CLIP-NeRF 应用于具有未知姿态和潜在编码的图像时,作者使用了期望最大化算法使其可以使用 CLIP-NeRF 隐式编码编辑
扩散 NeRF 模型
扩散模型是一类最近受到广泛关注的生成式模型,其基本思想是正向扩散过程来系统地扰动数据中的分布,然后通过学习反向扩散过程恢复数据的分布,这样就了产生一个高度灵活且易于计算的生成模型
正向扩散过程,也就是使用预先设计的噪声进度向数据逐渐加入高斯噪声,直到数据的分布趋于先验分布,即标准高斯分布。反向扩散过程,也就是从给定的先验开始并使用参数化的高斯转换核,学习逐步恢复原数据分布
扩散模型通过可以使用特定领域的编码器使用以文本和图像构建的提示,从而提供对生成过程的高度控制,近期的工作提出了一种基于扩散模型的扩散 NeRF 模型,使得扩散模型能在合适的提示下生成相同物体的不同姿态的视图用于训练 NeRF
DreamFusion
- 作为一个 text-to-3D diffusion NeRF 模型被提出
- 使用 2D 扩散模型中生成的图像作为 NeRF 的训练集
- 对于每一个需要生成的场景,将提示词输入扩散模型 Imagen [19] 中生成图片,后使用这些图片从头开始训练一个基于 [mip-NeRF 360](#mip-NeRF 360) 的 NeRF 模型,而输入的文字提示允许我们控制扩散模型生成的图像的视角
- 其中有一个关键的修改,论文中表面颜色由 MLP 进行参数化而不是辐射
- 由于 Imagen 只能生成 64x64 分辨率的图像,所以生成的 NeRF 模型细节不佳
Latent-NeRF
- 本论文中 NeRF 模型被训练用于输出一个 64x64x4 的隐式特征,后使用 Stable Diffusion [20] 输出 512x512x3 的 RGB 图像
- 这种方法既允许文本引导,也允许形状引导
Magic3D
- 由 DreamFusion 改进而来,旨在解决扩散模型生成图像质量不高导致 NeRF 生成效果不佳的问题
- 提出使用两阶段 “coarse-fine”的方法,在“coarse”阶段,Magic3D 使用 Instant-NGP [21] 作为 NeRF 模型的实现,使用图像扩散模型 eDiff-I [22] 从文字提示中生成图像
- 在“精细”阶段,将从 Instant-NGP 中提取出的“coarse”几何结构生成网格体,使用从 latent diffusion [20] 模型中生成的图片优化该网格体
RealFusion
- 专注于单图生成场景,使用 Stable Diffusion [20] 作为扩散模型的实现并使用 Instant-NGP [21] 作为 NeRF 模型的实现
- 作者使用单图像文本反演作为替代视角,通过增强输入 2D 图像并将其与新的词汇标记关联起来以优化扩散损失,确保辐射场能在单视角生成中表示目标物体
- 场景使用 NeRF 的光度损失函数,以 ”coarse-fine” 的方法进行重建
无边界场景及场景合成
对于试图将 NeRF 应用于无边界场景的模型,分割前景和后景是一项重要的任务。同时,还面临着图片之间光照和外观的变化,本小节中的模型使用了多种方法来解决这些难题
NeRF in the Wild (NeRF-W)
- 解决了标准 NeRF 模型中的两个关键问题:同一场景的真实照片可能因照明条件导致的每幅图像的外观变化,以及每幅图像中不同的瞬时对象 (transient objects)
- 使用统一的密度 MLP 来表示场景的密度,但使用外观嵌入层 (embedding) 对颜色 MLP 进行条件化,使用瞬态嵌入层来预测每一张图片中瞬态对象的颜色和密度。这些隐式的嵌入层使用 GLO [17] 进行创建
NeRF++
- 专注于无边界场景新视角合成
- 使用一个球体将场景分割为两部分,球内场景包含所有前景里的对象以及所有虚构的相机视角,球外场景包含背景里的对象。球外的对象使用逆球面空间 (inverted sphere space) 进行参数化。
- 对两部分单独计算 NeRF
- 提供了关于NeRF模型如何解决某些形状-颜色模糊的理论依据
GIRAFFE
- 基于 GRAF ,使用生成式隐式编码和前背景分割来优化场景合成
- 对场景中的每一个对象分配一个 MLP,其生成一个标量密度 (scalar density) 和深度特征向量 (替代颜色)。这些 MLP 之间互相共享结构和权重,作为输入形状、外观和姿态的隐向量。背景除了拥有自己的 MLP 和 权重外,和其余物体相同
- 随后使用密度加权的特征和组合出场景的三维特征体积,使用体渲染得到二维特征图。将二维特征图输入进上采样 CNN来得到最终的图片
- GIRAFFE 使用一个二维 CNN 判别器和上述步骤合成的图像进行对抗训练,得到的模型包含一个解耦 (每一维度表示具体的、不相干的信息) 的隐式空间 ,允许生成时的精细控制
Fig-NeRF
- 用于场景合成,但专注于物体插值和模型分割
- 前景和背景使用两个独立的 NeRF 模型和不同的损失函数
- 前景模型使用可变形 Nerfies [23] ,背景模型使用由外观隐式编码条件化的 NeRF 模型
Object-NeRF
- 提出了第一个可编辑的神经场景渲染系统,给定一个 posed images 集合和二维实例掩模,支持高质量的新视图渲染和对象操作。
- 设计了一种新的双路径架构来学习对象组合神经辐射场,可以很好地适应物体聚集摆放的真实世界的场景,可以解决遮挡区域渲染结果的模糊问题
- 基于体素进行实现,使用一个体素特征网格来优化 MLP 参数。对于场景和物体,使用两个不同的 NeRF 模型进行计算,但两个模型均使用体素特征插值进行条件化。对于物体 NeRF,额外使用物体激活隐式编码集进行条件化
- 该方法使用 inhouse ToyDesk 和 ScanNet [24] 数据集上带 “instance segmentation” 标签进行训练和评估,并且将标签和以下损失函数融合:
- $ w(\mathbf{r})_k \left \Vert \hat{O}(\mathbf{r})_k - M(\mathbf{r}) \right \Vert_2^2$
- 其中 $ \hat{O}(\mathbf{r})_k = \sum_i=1^N T_i \alpha_i $ 为物体的透明度,$ M(\mathbf{r}) $ 为第 $k$ 个物体的遮罩,$ w(\mathbf{r})_k $ 是遮罩的平衡权重
- 作者首先从场景 NeRF 中获取背景颜色和密度,对物体位置的采样点进行剪枝,然后从物体 NeRF 中获取物体的颜色和密度并根据用户的操作进行转换。最后将获得的颜色和密度通过标准 NeRF 的离散体渲染方程式(4)进行聚合和渲染
NeRFReN
- 解决合成中表面反射的问题
- 将辐射场分成两个部分:投射辐射场 $(\sigma^t, \mathbf{c}^t)$ 和反射辐射场 $(\sigma^r, \mathbf{c}^r)$。最终的像素颜色计算为 $ I = I_t + \beta I_r$
- 其中 $\beta$ 是反射因子,由透射辐射场的几何定义确定:
- $ \beta = \sum_i T_{\sigma^t_i} (1-\exp(-\sigma^t_i \delta_i)) \alpha_i $
- 其中 $ T_{\sigma^t_i} $ 由式(3)确定,而 $\alpha_i$ 由式(5)确定
- 除了标准的光度一致性损失,作者还定义了深度平滑度损失 $L_d$ 来促使透射辐射场得到正确的结果。同样的,对于反射辐射场,定义了 深度连续性损失 $L_{bdc}$
- 该方法可以替换和去除场景中的反射
姿态估计
NeRF 模型需要图像和相机姿态用于训练。在原文中,作者使用 COLMAP [3] 进行姿态估计。这个方法也应用于许多后续工作中。通常,构建同时进行姿态估计和隐式场景表达的 NeRF 模型被看作是离线的运动结构恢复 (Structure from motion, SfM) 问题。在这个问题中,时常使用光束平差法 (Bundle Adjustment, BA) 对姿态和模型进行联合优化。然而一些方法也将这个问题表述为在线同步定位与建图 (Simultaneous Localization and Mapping, SLAM) 问题
iNeRF
- 将姿态估计视为逆问题
- 对给定的预训练 NeRF 模型进行姿态优化,而不是优化网络中的参数,作者使用一个兴趣点检测器,并进行基于兴趣区域的采样
- 进行了半监督实验,使用 iNeRF 对未标记图像进行姿态估计,用于增强 NeRF 训练集并进一步训练 NeRF。结果表面这种半监督方法可以减少 25% NeRF 训练所需的标记图片数量
NeRF–
- 同时估计 NeRF 模型参数和相机参数,这使得模型能够以端到端的方式构建辐射场并合成仅基于图像的新视角
- 由于姿态初始化方面的限制,NeRF– 较适合于前向场景,并且在旋转运动和物体跟踪移动方面存在不足
Bundle Adjusted Neural Radiance Field (BARF)
- 同样在训练时同时估计姿态
- Bundle Adjusted 意为光束平差法
- BARF 用于使用 “coarse-fine” 的配置方式,使用与 Nerfies [23] 类似的自适应地遮蔽位置编码技术
self-calibrating joint optimization model for NeRF (SCNeRF)
- 作者提出的相机标定(camera calibration)模型不仅可以优化未知姿态,还可以优化鱼眼镜头模型等非线性相机模型的相机内参。
- 通过课程学习(Curriculum Learning, CL),将非线性相机/噪声参数逐渐引入进行联合优化。这种相机优化模型也是模块化的,可以很容易与不同的 NeRF 模型一起使用
GNeRF
- 将姿态作为生成式隐式编码
- 首先使用粗糙相机姿势和辐射场进行对抗训练,生成器将进行随机采样,并使用类 NeRF 的渲染方式合成新视角。判别器将比较合成图像和训练图像之间的区别。
- 一个逆向网络将生成的图像逆向成为相机姿态,并和采样姿势进行比较
- 图像和姿态将使用光度一致性损失进行混合优化
GARF
- 将位置编码替换成高斯激活函数,并联合使用光束平差法 (bundle adjustment) 进行姿态估计
SLAM 中的应用
iMAP
- 首个基于 NeRF 的在线 SLAM 模型
- 以 NeRF 的形式同时优化相机姿态和隐式场景表达
- 使用了跟踪 (针对 NeRF 的姿势优化) 和映射 (姿势和 NeRF 模型参数的“束调整”联合优化) 的迭代两步方法
- iMAP 使跟踪和映射过程并行运行,从而实现了接近相机帧率的姿态跟踪速度
- 在稀疏和逐步选择的一组图像上优化场景,从而使用关键帧选择 (keyframe selection)
NICE-SLAM
- 基于 iMAP,对 keyframe selection 和 NeRF 架构等方面进行了改进
- 使用了基于分层网格的场景几何表示,能够填充 iMAP 在大规模未观测场景特征(墙壁、地板等)中的空白
NeRF-SLAM
- 使用 Instant-NGP [21] 作为 NeRF 模型
体渲染相关优化
快速无 MLP 体渲染
Plenoxel
- 与 Plenoctree 思路一致,将场景进行体素化,存储密度标量并以方向相关的球谐函数系数来表示颜色
- 但 Plenoxel 完全跳过 MLP 训练的环节,而是直接在体素网格上拟合这些特征
- HDR-Plenoxels [25] 将这个想法应用到了 HDR 图像
Direct Voxel Grid Optimiztion (DVGO)
- 同样使用体素化并使用体素网格存储标量密度
- DVGO 使用十二维和二十四维的特征以及一个小而浅的解码器 MLP 表示颜色
- 使用类似 NeRF 原文中 “coarse-fine” 的策略,先建立 “coarse” 体素网格,在根据该网格的几何形状训练 “fine” 网格
TensoRF
- 在一个三维体素矩阵中存储标量密度和一个特征向量 (可以和 SH 系数一起使用,或可以用 MLP 进行解码),并表示为秩为 $3$ 的张量 (Tensor) $T_\sigma \in R^{H \times W \times D}$ 和秩为 $4$ 的张量 $T_\sigma \in R^{H \times W \times D \times C}$,其中 $H, D, C$ 分别表示三维网格的长、宽、高,而 $C$ 代表通道的维度
- 作者们使用了两种分解方法:CANDECOMP-PARAFAC (CP) 将张量分解为纯向量外积,Vector Matrix (VM) 将张量分解为向量/矩阵外积。这些分解使得内存需求比 Plenoxels 减少了 200 倍
Streaming Radiance Field
- 专注于从视频中训练 NeRF 的显式表达,并对标准显式方法进行了改进
- 使用基于模型差异的压缩 (model difference based compression) 优化显式表达需要的内存需求
- 使用窄带调谐 (narrow band tuning) 和其余多种方法进行训练加速
其他体渲染改进
IBRNet
- 用于视图合成
- 从训练集中选择 $N$ 个视角最相近的视图,使用 CNN 从中提取特征
- 对于要查询的单个采样点,对于每一个输入视角 $i$,使用已知的相机矩阵来投影相应的图像以从中提取颜色 $c_i$ 和特征 $f_i$ 。而后使用一个 MLP 来优化这些特征 $f’_s$ ,使其可以多视角感知并且产生池化权重 $w_i$
- 在所有采样点计算完成后,将结果输入光线 Transformer [10] 得到密度。而后将 $f’_s$ 和 $w’_s$ 与相对视角 $\Delta \mathbf{d}_i$ 输入 MLP 得到颜色混合权重,最后将每个图像的颜色 $c_i$ 使用颜色混合权重相加得到最终颜色
Scene Rendering Transformer (SRT)
- 使用 CNN 从场景图像中提取特征块,后将其和相机光线与视角向量 ${\bf o,d}$ 一起输入到 Encoder-Decoder Transformer [10] 中获取颜色。这使得 SRT 一次查询整条射线,而不像 NeRF 一样需要查询多个采样点
- SRT 不生成几何信息,也不生成密度函数
NeRFormer
- 使用 Transformer [10] 用于体渲染
NeRF相关应用
这一小节的内容主要专注于 NeRF 在某一特定领域的创新
上一节中的某些模型也拥有明显的特定应用:基于 SLAM 的模型应用于导航,生成式模型在三维图像和电子娱乐方面有潜在的应用场景。另外,专注于高分辨率的几何重建的 NeRF 模型在图像学方面有着广泛的应用场景。这一小节中介绍的方法都针对某一特定的应用场景如不同环境的场景(城市、人脸、数字角色和人体)、三维重建或特定的图像处理任务。以下是一些有趣的应用:
NeRF-Nav
- 侧重于定位和导航
- 使用预训练的 NeRF 模型表示环境,将机器人近似为有限点集用于碰撞检测
Dex-NeRF
- 使用 NeRF 学习出的深度信息帮助机器人抓取物体,特别是透明物体
- 使用固定的经验密度值来在射线上计算深度
- 使用 Dex-Net [26] 来规划抓取动作
- Evo-NeRF [27] 对 Dex-NeRF 进行了改进,通过在顺序抓取中重用权重、早期终止以及改进的辐射调整抓取网络,实现了对不可靠几何体的抓取规划
在接下来的几个小节中,我们将分别介绍几类不同领域的应用方法
城市重建
目前自动驾驶和城市摄影测量的大力发展,致使城市 NeRF 模型的发展得到了长足进步,无论是从街道级别或是从遥感视角进行建模。训练城市NeRF模型面临一些独特的挑战:首先,室外环境是无边界的;其次,相机姿态通常缺乏变化;第三,需要大规模的场景。本小节详细介绍了这些模型是如何克服其中的一些或全部挑战
Urban Radiance Fields
- 从稀疏多视角的图像和补充的 LiDAR 数据中对城市环境进行三维重建
- 除了基本的光度一致性损失外,还使用了基于 LiDAR 的深度损失 $L_{depth} = \mathbb{E} \left[ (z-\hat{z}^2) \right]$和视觉损失 $L_{sight} = \mathbb{E} \left[ \int_{t_1}^{t_2} (w(t) - \delta(z))^2 dt \right]$ 与基于天空盒的分割损失 $L_{seg} = \mathbb{E} \left[ S_i(\mathbf{r}) \int_{t_1}^{t_2} (w(t) - \delta(z))^2 dt \right]$
- 其中 $w(t)$ 和式 (2) 中的 $T(t)\sigma(t)$ 定义一致,$z, \hat{z}$ 分别为 LiDAR 的测量深度和估计深度,$\delta(z)$ 为狄拉克函数 (Dirac delta function),$S_i(\mathbf{r})$ 的值为光线是否能走到预训练的分割模型分割出的第 $i$ 张图像,可以时为 $1$ ,反之为 $0$
- 深度损失使得估计的深度 zˆ 与激光雷达获取的深度匹配;视觉损失使得辐射集中在测得深度的表面上;分割损失使得通过射向天空像素的射线上的点样本的密度为零
- 进行三维重建时,从 NeRF 模型中提取点云,并为虚拟相机中的每个像素投射一条射线。然后,使用估计的深度将点云放置在 3D 场景中。后采用泊松表面重建法 (Poisson Surface Reconstruction) 从点云中重建 3D 网格
Mega-NeRF
- 从无人机拍摄的图像中进行大规模城市三维重建
- 采用 NeRF++ 的反球面参数化分割前景和背景的思想,但在实际中进一步的扩展,使用椭球体来适配航拍视角
- 将 NeRF-W 的嵌入层整合使用,把大型的城市场景划分为多个单元,每个单元由自己的 NeRF 模块表示,并且仅在相关的像素上进行训练
- 在渲染过程中,该方法还将密度和颜色的粗糙渲染缓存在八叉树中。在进行动态飞越渲染时,快速产生粗糙的初始视图,并通过额外的模型采样进行动态细化
Block-NeRFs
- 从 280w 张照片中生成城市三维重建
- 对于每一个独立的 Block-NeRF 模块,使用 mip-NeRF 中的 Integrated Positional Encoding (IPE) 技术以及 NeRF-W 的隐式外观编码优化
- 在训练过程中,作者使用了语义分割来遮挡瞬态对象,比如行人和汽车。并且并行地训练了一个可见性 MLP,使用 NeRF MLP 生成的密度值和透射函数式(3)来监督,用于舍弃可见性较低的 Block-NeRFs
- 对 Block-NeRF 进行训练时,对相邻的重叠 Block-NeRF 中采样图像,然后通过外观编码匹配优化后使用反距离加权法合成图像
人脸、角色以及可移动物体重建
人物重建是 NeRF 模型的一种关键应用,为 NeRF 模型在虚拟/增强现实、电子娱乐已经线上交流等领域找到了应用场景。有两类的 NeRF 模型以在这些场景的应用为目标:一类专注于重建面部信息,而另一类专注于重建/描述身体
人脸重建需要在不同面部表情的变化下完成,而不同表情下拓扑结构会发生改变,这要求该类 NeRF 模型拥有较好的鲁棒性。这类模型通常使用一个附加 MLP 作为参数化的形变场,来控制从标准人脸模型到所要模型的变化。
身体重建则需要 NeRF 模型在不同姿态下具有鲁棒性,通常使用形变场来描述目标人体模型和标准人体模型的差距
Nerfies
- 使用形变场,极大的增强了场景中出现非刚体变换 (non-rigid transformations) 时的性能
- 通过引入额外的 MLP 将输入从观察帧下的坐标转换到标准坐标
- 引入弹性正则化 (elastic regularization)、背景正则化和基于适应性遮罩位置编码的粗糙-精细的变形正则化
- 通过以上优化,Nerfies 得以准确重建非静态场景
NerFace
- 专注于面部重建
- 使用每帧中学习到的隐式编码并将面部表情作为 Face2Face [28] 构建的可变形模型的76 维参数
HyperNeRF
- 专注于面部重建
- 基于 Nerfies,将其中的规范空间扩展至更高维度
- 添加了一个额外的切片 MLP 描述如何从环境空间坐标返回 3D 表示
- 规范坐标和环境空间坐标用作对 NeRF 模型中的颜色和密度进行条件化
CoNeRF
- 专注于面部重建
- 基于 HyperNeRF,但允许通过滑块控制照片编辑
- 滑块的值会为每个属性提供 Hypermap 形变场,由 MLP 参数化。通过滑块值和图像块掩码的稀疏监督注释 (sparse supervised annotation) 、滑块属性值的 L2 损失项,掩码监督中的交叉熵损失 (cross entropy loss) 来构成的
- 在作者的示例数据集中可以使用滑块调整面部表情,在虚拟人头像方面可能有广泛的商业应用
RigNeRF
- 专注于面部重建
- 使用由可变 3D 脸部模型指导形变场 MLP,创建可控制姿态和表情的面部 3D 描述
Neural Body
- 从视频中渲染带有动作的人体模型
- 首先,作者使用输入的视频来锚定基于顶点的可变形人体模型 (SMPL [29]),而后对于每一个顶点,附加一个 16 维的隐式编码 $\mathbf{Z}$
- 人体姿态参数 $\mathbf{S}$ 在训练时从视频进行初始估计 (也可以在推理时输入) ,用于对标准人物模型进行变形
- 人物模型在网格中进行体素化并使用一个 3D CNN 进行处理,从每一个被占据的栅格中提取一个 128 维的隐式编码 (特征) $\psi$ ,并用于 MLP 计算密度
- 颜色 MLP 额外再接收三个参数:坐标的位置编码 $\gamma_x(\mathbf{x})$ 、视角方向 $\gamma_d(\mathbf{d})$ 和隐式外观代码 $\mathbf{l_t}$ (考虑视频每一帧的不同)
- 论文最终计算公式:$ \sigma (\mathbf{x}) = M_\sigma (\psi(\bf{x}|Z,S)) $$\quad c(x) = M_c(\psi(\mathbf{x|Z,S}), \gamma_x(\mathbf{x}), \gamma_d(\mathbf{d}), \mathbf{l_t})$
- A-NeRF, AnimatableNeRF, DoubleField, HumenNeRF, NeuMan, TAVA 同样在此方面进行了创新
LISA
- 专注于手部建模,将人手近似为一组刚性部件
- 将查询点输入 MLP 来推测几何形态 (通过有向距离场 (Signed Distance Field, SDFs) [30]) 和颜色
图像处理
PREF
- 使用正则化估计的动作条件化隐式嵌入,从而从图像序列中获取动态物体和动作
RawNeRF
- 将 Mip-NeRF 调整适配高动态范围 (High Dynamic Range, HDR) 图像视角合成和降噪的模型
- 在线性色彩空间中使用线性 Raw 格式的图像作为训练数据,使得 RawNeRF 可以接受不同的曝光和色调映射曲线。
- 使用来自 Noise2Noise [31] 的相对 MSE 损失进行训练用于嘈杂HDR 路径的追踪,公式为:$ L = \sum_{i=1}^N \left( \dfrac{\hat{y_i}-y_i}{sg(\hat{y_i})+\epsilon} \right)^2 $ ,其中 $sg(.)$ 表示梯度停止 (gradient-stop) (将其参数视为具有零梯度的常数)
- RawNeRF 使用变曝光图像进行监督训练,其中 NeRF 模型的曝光通过训练图像的快门速度进行缩放并学习每个通道的缩放因子
HDR-NeRF
- 同样为 HDR 视角合成,但与 RawNeRF 不同,使用低动态范围下不同曝光的训练图片即可合成 HDR 新视角
- 建模一个 HDR 辐射场,并使用 3 个 MLP $f$ (每个通道单个 MLP 独立处理) 将辐射场转换为颜色数据,模拟典型的线性和非线性 (例如白平衡) 图像处理
其余方法如 NaN [32]、DeblurNeRF [33] 和 NeRF-SR [34] 分别关注图像处理的根本问题如降噪、去模糊 (deblurring) 和超分辨率 (super-resolution)
语义 NeRF 模型
语义分割和实例分割是计算机视觉中最重要且研究最多的任务之一,训练能够具有语义理解或进行语义视图合成的 NeRF 模型是 NeRF 研究的关键领域之一
Semantic-NeRF
- 为新视角合成语义标签
- 在原版 NeRF 计算出密度后,开辟新分支。使用一个独立的方向无关的额外 MLP,输入位置以及密度特征,生成该点的语义标签 $\mathbf s$
- 也通过体渲染生成语义标签:$S(r)=\sum_i^N T_i \alpha_i \mathbf{s}_i$
- 语义标签通过分类交叉熵 (cross-entropy) 损失进行监督学习。该方法能够使用稀疏语义标签(10% 标记的)训练数据进行训练,并从像素级噪声(pixel-wise noise)和区域/实例级噪声(region/instance-wise)中恢复语义标签
Panoptic NeRF
- 专注于城市场景下 3D 到 2D 的标签传播
- 计算两个语义场,一个从语义头中学习而来;另一个刚性语义场由 3D 场景边界决定
- 刚性边界使模型可以学习正确的几何信息,学习语义头使模型更好的理解语义
Panoptic Neural Field
- 将 “staff” (原文中指代背景静态物体) 和 “thing” (原文中指代场景中动态物体) 分离计算
- 使用单个独立 MLP 计算 “staff” (对于大场景为两个,分别计算前景和背景),输出颜色、密度和语义逻辑
- 对于每个动态 “thing” 在动态边界框内由自己的辐射场表示
- 损失函数为光度损失函数和每像素交叉熵函数之和
SS-NeRF
- 产生多种输出
- 使用一个编码函数、两个位置解码函数 (其中一个方向相关,另一个方向无关) ,均由 MLP 表示
- 网络训练用于产生多种不同的场景资产:颜色、语义标签、表面法线、着色、关键点和边缘
- 损失函数由颜色和法线的 MSE,着色、关键点和边缘的 MAE 以及语义标签的交叉熵函数组合而成
表面重建
NeRF 中的场景几何结构是隐式藏于神经网络之中的。然而,对于某些应用来说,更显式的表示,如 3D 网格,是这些应用所期望的。对于基准 NeRF,可以通过评估和阈值化密度 MLP 来提取粗略的几何形状。本小节介绍的方法采用了创新的场景表示策略改变了密度 MLP 的基本行为
UNISURF
- 应用于表面重建
- 通过将基准 NeRF 中式 (5) 第 $i$ 个采样点的 alpha 值 $a_i$ 使用离散化的占据函数 $o(x)$ 代替来重建场景,对于空白空间 $o(x) = 0$,相反 $o(x) = 1$
- 该函数同样使用 MLP 进行表示,实质上替代了体积密度。表面的位置由光线进行根查找来确定
- 一项近期的工作表示 Tesla 的自动驾驶模块中的 3D 理解使用类似的 NeRF 占据网络来驱动
Neural Surface (NeuS)
- 使用有向距离函数 (signed distance functions) 表示场景几何形态
- 将基准 NeRF 中输出体积密度的 MLP 替换成为输出有向距离函数值的 MLP
- 体渲染中的密度函数 $\sigma(t)$ 替换为 $\rho(t)=\max \left( \dfrac{-\frac{\mathbf{d}\Phi}{dt}(f(\mathbf{r}(t)))}{\Phi(f(\mathbf{r}(t)))} , 0\right)$ ,其中 $\Phi(\cdot)$ 为符号函数,导数 $\frac{\mathbf{d}\Phi}{dt}$ 为逻辑密度分布
HF-NeuS
- 基于 NeuS ,优化重建质量
- 将低频细节和高频细节分离计算,低频细节仍使用有向距离函数,高频细节改为使用置换函数
Geo-NeuS
- 基于 NeuS ,引入多视图约束
- 采用了有向距离函数的监督,包括稀疏点云的多视图几何约束和多视图光度一致性约束
SparseNeuS
- 基于 NeuS ,优化稀疏重建
- 使用几何编码体积和可学习的图像特征作为混合表示方法来进行稀疏视图重建
TL; DR Table
论文 | 目标 | 方法 | 实验集 |
---|---|---|---|
Mip-NeRF | 优化生成质量 | 将光线追踪替换为锥体追踪 | 待补充 |
Mip-NeRF 360 | 优化无边界场景生成质量 | 重参数化高斯分布并预测深度 | 待补充 |
Ref-NeRF | 获取更好的模型表面反射 | 修改原MLP的输出,并使用球谐函数确定方向向量 | Shiny Blender, original NeRF, Real Captured Scene |
RegNeRF | 优化较少训练图像输入下生成质量 | 使用正则化优化颜色和深度计算 | DTU, LLFF |
RapNeRF | 用外推的方法去优化图像生成 | 使用已有视图外推可能视图 | Synthetic NeRF, own MobileObject |
Depth-Supervised NeRF | 解决NeRF几何与深度计算不准确 | 提取点云并在MLP添加深度相关项 | DTU, NeRF, RedWood-3DScan |
NerfingMVS | 使用NeRF进行深度重建 | 使用点云训练预计算模型生成深度图优化体渲染 | 待补充 |
PointNeRF | 优化训练速度 | 使用特征点云优化体渲染范围,加速体渲染过程 | DTU |
SNeS | 优化几何生成 | 学习场景中局部和部分隐藏场景对象的可能对称性 | 待补充 |
$S^3$-NeRF | 优化几何生成 | 通过场景中阴影和着色推测几何形状 | 待补充 |
Sparse Neural Voxel Grid | 优化推理速度 | 预计算漫反射、密度和特征向量 | 待补充 |
PlenOctree | 优化推理速度 | 使用球谐函数计算颜色,训练MLP输出球谐函数系数 | 待补充 |
FastNeRF | 优化推理速度 | 将颜色分解为两个部分,易于存储,并且引入硬件光追 | 待补充 |
KiloNeRF | 优化推理速度 | 将场景分解成数千个小部分进行计算 | 待补充 |
Fourier Plenoctree | 优化推理速度 | 太难真没懂,待补充 | 待补充 |
MobileNeRF | 优化推理速度 | 将体素表示修改为多边形表示,并使用额外较小MLP进行着色 | 待补充 |
NeLF | 优化推理速度 | 将 MLP 训练神经辐射场改为训练光场 | 待补充 |
EfficientNeRF | 优化训练及推理速度 | 只计算采样点中密度大于某值的部分,并使用 NeRF tree 缓存训练场景 | 待补充 |
Nerual Sparse Voxel Fields (NSVF) | 优化训练及推理速度 | 基于体素构建 NeRF,并存储体素顶点间的特征向量用于获取颜色和密度,并且使用稀疏体素交点进行采样 | 待补充 |
AutoInt | 优化训练及推理速度 | 通过 Automatic Intergration 优化积分过程 | 待补充 |
Deterministic Integration for Volume Rendering (DIVeR) | 优化训练及推理速度 | 在 NSVF 的基础上使用确定性积分优化采样过程 | NeRF Synthetic, Blended MVS, Tanks and Temple |
Instant Neural Graphics Primitives (Instant-NGP) | 极大的优化训练和推理速度以及场景生成质量 | 使用全新的位置编码技术,并且优化体渲染时的光线行进方式 | 待补充 |
pixelNeRF | 稀疏输入训练NeRF | 使用图像特征作为输入,学习场景先验 | 待补充 |
MVSNeRF | 稀疏输入训练NeRF | 提取图像特征并建立 3D 特征体积,学习场景几何结构,无需 NeRF 进行三维重建 | DTU |
DietNeRF | 稀疏输入训练 NeRF | 引入基于从 Clip-ViT[9] 中提取的图像特征语义一致性损失 $L_{sc}$ | NeRF synthetic, DTU |
NeuRay | 稀疏输入训练NeRF | 使用特征图和加权和 sigmoid 函数优化训练,计算采样点命中概率优化采样效率 | NeRF synthetic |
GeoNeRF | 稀疏输入训练NeRF | 对于每个视图构建级联损失体积并使用 Transformer[10] 优化,再使用自编码器计算颜色和密度 | DTU, NeRF synthetic, LLFF Forward Facing |
NeRFusion | 稀疏输入训练NeRF | 每一帧均使用稀疏三维卷积神经网络计算局部特征,后将每帧计算的局部特征通过 GRU 网络聚合成为全局特征 | ScanNet, DTU, NeRF synthetic |
AutoRF | 无背景物体的新视角合成 | 使用全景分割提取物体三维边框和掩码,并使用边框定义标准物体坐标空间,引入占用损失优化训练和计算 | nuScene, SRN-Cars, Kitti |
SinNeRF | 单图生成NeRF | 使用图像变换以及相机内参监督深度、使用对抗训练提供纹理监督,并使用预训练的 ViT 从参考和不可见块中提取图像特征进行比较 | NeRF Synthtic, DTU, LLFF Forwoad Facing |
GeoAug | 稀疏输入训练NeRF | 使用DS-NeRF 作为基准生成新的噪声图像作为增强输入 | 待补充 |
NeRF-VAE | 泛化至新场景 | 使用基于 Iterative Amortized Inference[12] 和 ResNet [13] 的潜在编码对 NeRF 渲染器进行条件化 | 待补充 |
GRAF | 生成 3D 模型 | 使用对抗式生成网络训练 NeRF | 待补充 |
$\pi$-GAN | 优化生成质量 | 将 GAN 优化为周期性隐式生成对抗网络 SIREN | Celeb-A, CARLA, Cats |
EG3D | 优化生成速度 | 引入显隐混合表示三平面 | FFHQ |
StyleNeRF | 使用 NeRF 优化 StyleGAN 网络 | 将 NeRF 作为 SytleGAN 中的生成器网络 | 待补充 |
Pix2NeRF | 在没有 3D 表示、多视角或相机参数的情况下生成 NeRF | 基于$\pi$-GAN,优化其网络结构和损失函数 | CelebA, CARLA, ShapeNet |
Edit-NeRF | 使用用户输入条件化合成图像 | 使用 GLO 结构进行联合优化 | 待补充 |
CLIP-NeRF | 优化训练速度(对比 Edit-NeRF) | 使用 Contrastive Language Image Pre-training (CLIP)[18] 通过形状和外观映射网络 (mapper networks) 从用户输入的文字或图片中提取隐式空间位移 | 待补充 |
DreamFusion | text-to-3D | 使用 2D 扩散模型中生成的图像作为 NeRF 的训练集 | 待补充 |
Latent-NeRF | 风格化 NeRF | NeRF 仅输出隐式特征,使用 SD [20] 输入最终的图像,可以使用文本或形状引导最终图像结果 | 待补充 |
Magic3D | 解决扩散模型生成图像质量不高导致 NeRF 生成效果不佳 | 将生成分为两个阶段,第一个阶段使用粗糙图像生成粗糙的模型,第二个阶段用精细图像对粗糙模型进行优化 | 待补充 |
RealFusion | 单图生成场景 | 作者使用单图像文本反演作为替代视角,通过增强输入 2D 图像并将其与新的词汇标记关联起来以优化扩散损失,确保辐射场能在单视角生成中表示目标物体 | 待补充 |
NeRF in the Wild (NeRF-W) | 解决两个 NeRF 的关键问题 | 使用嵌入层对每张图像进行优化,具体看上面详细结束 | 待补充 |
NeRF++ | 无边界场景新视角合成 | 使用球体将场景分割为两部分,球体外部空间使用逆球面空间进行参数化 | Tanks and Temples |
GIRAFFE | 优化场景合成 | 对每一个对象都创建 MLP 进行训练,输出值为密度和三维特征体积,再求和并使用体渲染得到二维特征图,使用 CNN 网络计算图片 | 待补充 |
Fig-NeRF | 模型分割 | 将前景和背景使用两个不同的 NeRF 模型进计算,使用不同的损失函数 | ShapeNet Gelato, Objectron |
Object-NeRF | 可编辑 NeRF,可以对场景中的物体进行移动或是复制 | 基于体素, 将场景和物体分开至两个不同 NeRF 模型进行计算,使用体素特征优化这两个模型。对于物体 NeRF 模型,额外使用物体激活隐式编码进行优化 | ScanNet, ToyDesk |
NeRFReN | 优化表面反射 | 将辐射场分成透射和反射两部分进行计 | RFFR (作者的数据集) |
iNeRF | 姿态估计 | 使用兴趣点检测并基于兴趣点进行采样 | 待补充 |
NeRF– | 姿态估计 | 同时估计模型的参数和相机的参数 | 待补充 |
Bundle-Adjusted Neural Radiance Field (BARF) | 姿态估计 | 同时估计模型的参数和相机的参数,并使用 “粗糙-精细” 的模式 | LLFF forward facing |
self-calibrating joint optimization (SCNeRF) | 姿态和相机参数估计 | 通过使用课程学习(Curriculum Learning, CL),将非线性相机/噪声参数逐渐引入进行联合优化 | LLFF |
GNeRF | 姿态估计 | 使用粗糙相机姿势和辐射场进行对抗训练,后使用逆向网络将图像逆向生成为姿态进行比较,并使用混合优化方案同时考虑图像和姿态进行优化 | Synthetic-NeRF, DTU (具体看上文详细,每个数据集和不同方法进行比较) |
GARF | 姿态估计 | 使用高斯激活函数联合光束平差法进行优化 | 待补充 |
iMAP | SLAM应用 | 以 NeRF 的形式同时优化相机姿态和隐式场景表达并使用迭代两步方法 | 待补充 |
NICE-SLAM | SLAM应用 | 基于 iMAP,对 keyframe selection 和 NeRF 架构等方面进行了改进,使用了基于分层网格的场景几何表 | 待补充 |
NeRF-SLAM | SLAM应用 | 使用Instant-NGP [21] 作为 NeRF 模型 | 待补充 |
Plenoxel | 体素网格快速无 MLP 体渲染 | 完全跳过 MLP 训练的环节,而是直接在体素网格上拟合特征 | 待补充 |
Direct Voxel Grid Optimiztion (DVGO) | 体素网格渲染优化 | 同样使用体素化方法,但使用12/24维特征和规模较小 MLP 解码器表示颜色 | 待补充 |
TensoRF | 体素网格渲染优化 | 将体素网格表示成3/4维张量并分解,加速计算 | 待补充 |
Streaming Radiance Field | 视频训练 NeRF 显式表达 | 使用模型差异压缩优化内存,使用多种方法进行训练加速 | 待补充 |
IBRNet | 视图合成体渲染改进 | 选取视角相近视图提取特征,使用 Transformer 计算最终颜色 | 待补充 |
Scene Rendering Transformer (SRT) | 体渲染改进 | 将光线、视角向量和特征一次性输入 Transformer 计算,一次性查询整条射线,无需生成几何信息 | 待补充 |
NeRFormer | 体渲染改进 | 使用 Transformer 优化 | 待补充 |
论文 | 应用领域 | 方法 |
---|---|---|
NeRF-Nav | 定位与导航 | 使用预训练的 NeRF 模型表示环境,将机器人近似为有限点集用于碰撞检测 |
Dex-NeRF | 抓取物体,特别是透明物体 | 使用固定的经验密度值来在射线上计算深度,并使用 Dex-Net 规划动作 |
Urban Radiance Field | 稀疏多视角城市环境三维重建 | 从 NeRF 中提取点云,使用计算出的深度信息将点云放置在 3D 场景中后重建网格 |
Mega-NeRF | 航拍城市三维重建 | 使用 NeRF++ 以及 NeRF-W 的部分思想并将城市划分成多个单元进行重建 |
Block-NeRFs | 超大规模城市三维重建 | 使用 mip-NeRF 和 NeRF-W 的编码方式,并从相邻 block 中采样进行生成优化 |
Nerfies | 人物及可移动物体重建 | 引入形变场优化场景中出现非刚体变换时的性能 |
NerFace | 面部重建 | 使用 NeRF 生成隐式编码作为 Face2Face[28] 形变场参数 |
HyperNeRF | 面部重建 | 将 Nerfies 扩展至高维进行计算 |
CoNeRF | 面部重建 | 为 HyperNeRF 添加滑块控制照片编辑 |
RigNeRF | 面部重建 | 使用 NeRF 计算 3D 形变场 |
Neural Body | 带动作人体重建 | 使用输入视频确定人体模型和估计姿态,并使用 3D CNN 从体素中提取特征计算密度,最后使用类 NeRF 体渲染进行渲染 |
LISA | 手部建模 | 使用 MLP 推测有向距离场近似几何模型 |
PREF | 获取图像序列中动态物体和动作 | 使用正则化估计的动作条件化隐式嵌入 |
RawNeRF | HDR 图片合成与降噪 | 将Mip-NeRF 扩展到 HDR |
HDR-NeRF | HDR 图片合成与降噪 | 使用 LDR 下不同曝光训练图片合成 HDR 新视角 |
Semantic-NeRF | 为新视角合成语义标签 | 在计算密度后将原 NeRF 流程分支,一端使用新 MLP 计算语义标签,另一端延用原方法计算颜色 |
Panoptic NeRF | 城市场景下 3D 到 2D 的标签传播 | 计算两个语义场,一个从语义头中学习而来;另一个刚性语义场由 3D 场景边界决定 |
Panoptic Neural Field | 标签传播 | 将 “staff” (原文中指代背景静态物体) 和 “thing” (原文中指代场景中动态物体) 分离计算 |
SS-NeRF | 新视角下场景资产计算 | 使用一个编码 MLP、两个解码 MLP 表示场景,输入各种资产并用组合后的损失优化网络 |
UNISURF | 表面重建 | 使用占据函数代替基准 NeRF 中的体积密度 |
Neural Surface (NeuS) | 表面重建 | 将密度替换为有向距离函数计算表面位置 |
HF-NeuS | 表面重建 | 基于 NeuS,将低频细节和高频细节分离计算,优化重建质量 |
Geo-NeuS | 表面重建 | 采用了有向距离函数的监督,包括稀疏点云的多视图几何约束和多视图光度一致性约束 |
SparseNeuS | 表面重建 | 使用几何编码体积和可学习的图像特征作为混合表示方法来进行稀疏视图重建 |
参考文献
[2] Levoy, M.: Efficient ray tracing of volume data. ACM Transactions on Graphics (1990)