NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis

论文链接:NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis | Abstract (arxiv.org)

仓库链接:bmild/nerf: Code release for NeRF (Neural Radiance Fields) (github.com)

Abstract

我们将展示一种方法,可以通过稀疏的输入图片,合成复杂场景。我们的算法通过全连接的深度网络表现场景,其输入是连续的5D坐标(空间的(xx, yy, zz)以及观察方向(θ\theta, ϕ\phi)),输出是体密度(volumn density)以及该点在该视角下(view-dependent)的颜色估计值。我们合成视线的方法是通过查询从相机发出的光所经过的5D坐标,并用经典体渲染(volumn rendering)技术将输出的颜色和密度投影至2D照片。因为体渲染是可微分的,因此仅需要将带有相机位置的一系列图片作为输入。我们介绍了如何优化神经辐射场,并证明其结果优于先前的neural rendering和view synthesis方法。建议查看视频以对比。

Introduction

函数会输出发出的辐射和密度(density),密度是作为一个可微分的不透明度控制一道穿过(xx, yy, zz)的光线(ray)已经累积(accumulate)了多少辐射(radience)。我们的方法优化了一个全连接的深度网络,其不具有任何卷积层(通常被称为多层感知机MLP)。该网络代表了一个函数,从5D坐标回归(regress)至体密度和view-dependent的RGB值。

从该NeRF中渲染,我们需要:

  1. 将相机光线穿过场景,它会经过一些3D点
  2. 将这些点以及它们的2D观察方向(viewing direction)作为神经网络的输入,生成颜色和密度
  3. 用经典体渲染技术累积这些值,生成2D图片

这一过程是可微的,因此可通过梯度下降来减少误差(真实观察到的图片和我们生成的图片)。

我们发现基本的优化实现方式无法在高分辨率场景下收敛,并且出于其对于某具体光线要求的样本数量,十分低效。因此将5G坐标转换为坐标编码(positional encoding)以使MLP可以表示更高频的函数,并且我们提出了一种层级采样方法(hierarchical sampling procedure)用于减少所需的样本数。

我们的实现继承了volumetric representation的优点,都能表现复杂的真实场景,并且都适合梯度下降优化。重要的是,我们的办法克服了离散体素网格(discretized voxel grid)的高成本。

计算机视觉领域中一种颇具前景的研究方向是将3D空间坐标直接映射到形状的隐式(implicit)表示,比如带符号的距离函数(signed distance function)。但在重现有复杂的高保真(fidelity)的几何图形的真实场景时,这些办法不如像三角网格(triangle mesh)或者体素网格(voxel grid)那些用离散表示的方法。

  • Neural 3D shape reprensentation

    通过隐式方法表示连续的3D形状,比如带符号的距离函数。这些模型被ground truth 3D geometry所限制。之后的工作将限制放宽至用2D图片进行优化。

    虽然这些技术也能表示复杂的高分辨率的几何图形,但它们仍仅限于简单形状的使用

  • View synthesis and image-based rendering

    一种方式是用基于网格的(mesh-based)表示方法。Differentiable rasterizer或者pathtracer可以通过梯度下降的方法直接优化网格表示法(mesh representation). 但是基于梯度的优化很难做到,并且这种策略需要模板网格,这在无限制的真实世界是无法实现的。

    另一种方法是volumetric representation. 该方法可以表现复杂形状,并且很适合基于梯度优化,并且比基于网格的方式产生更少的artifact. 缺点是糟糕的时间和空间复杂度。而我们通过对连续的体积(continuous volumn)进行编码,不仅能有更高质量的渲染,还只需要之前的一部分存储开销。

Neural Radiance Field Scene Representation

为使representation具有多视角一致性(multiview consistent),对网络进行限制,使得密度仅是坐标的函数,而RGB color则是坐标和观察方向的函数。

Volume Rendering with Radiance Fields

σx\sigma_x可以被理解为光线停止在x处的无穷小粒子的可微分概率,则光线r(t)=o+tdr(t) = o + td产生的颜色C(r)C(r)是:

C(r)=tntfT(t)σ(r(t))c(r(t),d)C(\pmb{r}) = \int^{t_f}_{t_n} T(t) \sigma(\pmb{r}(t)) \pmb{c}(\pmb{r}(t), \pmb{d})

其中T(t)=exp(tntσ(r(s))ds)T(t) = exp(-\int^t_{t_n} \sigma(\pmb{r}(s))ds),代表光线不碰到从tn到t上的粒子的概率。

我们通过quadrature的方法估算该积分。Deterministic quadrature会限制该representation的分辨率,因为MLP只需要一个固定的离散坐标列。因此采用分层采样法(stratified sampling approch),将[tn,tf][t_n, t_f]分成N段,每段采一个点:

tiU[tn+i1N(tftn),tn+iN(tftn)]t_i \sim U[t_n + \frac{i-1}{N}(t_f - t_n), t_n + \frac{i}{N}(t_f - t_n)]

用这些采样点估算积分:

C^(r)=i=1NTi(1exp(σiδi))ci\hat{C}(\pmb{r}) = \displaystyle\sum_{i=1}^N T_i (1-exp(-\sigma_i \delta_i))\pmb{c}_i

其中Ti=exp(j=1i1σjδj)T_i = exp(- \displaystyle\sum^{i-1}_{j=1} \sigma_j \delta_j), δi=ti+1ti\delta_i = t_{i+1} - t_i

Optimizing a Neural Radiance Field

两种优化方法,一种是对输入坐标进行positional encoding以协助MLP产生高频函数,另一种是hierarchical sampling procedure来有效采样高频的representation.

Positional encoding

尽管神经网络是通用函数模拟器(universal function approximator),但实际上在高频部分表现不好。最近的研究表明更倾向于学习低频函数,此外,如果在传给网络前将输入先通过高频函数映射到更高维空间,则可以更好地拟合含有高频的数据。形式上,我们采用的encoding function:

γ(p)=(sin(20πp),cos(20πp),,sin(2L1πp),cos(2L1πp))\gamma(p) = (sin(2^0 \pi p), cos(2^0 \pi p), \cdots, sin(2^{L-1} \pi p), cos(2^{L-1} \pi p))

该函数将分别作用于x\pmb{x}的三个坐标分量以及观察方向单位向量d\pmb{d}的三个分量。

Hierarchical volome sampling

与其只用一个网络表示场景,我们同时使用粗粒度(coarse)和细粒度(fine)两个网络。

用之前的stratified sampling先采NcN_c个点,初步估算颜色:

C^c(r)=i=1Ncwici\hat{C}_c(\pmb{r}) = \displaystyle\sum_{i=1}^{N_c} w_i \pmb{c}_iwi=T(i)exp(j=1i1σjδj)w_i = T(i) exp(- \displaystyle\sum^{i-1}_{j=1} \sigma_j \delta_j)

之后再通过w^i=wi/wj\hat{w}_i = w_i / \sum{w_j}获得piecewise-constant PDF(probability distribution function),并通过该概率密度函数用inverse transform sampling再次采样NfN_f个点。最后用这Nc+NfN_c + N_f个采样点一起输入到fine网络用于计算最终的颜色。这种方法的特点是非均匀地离散采样整个积分域。

Implementation details

我们想要为每一个场景优化一个独立的神经连续volume representation网络。这需要捕获的RGB照片数据集,相对应的相机方位(pose),内部参数(intrinsic parameters),以及scene bound. 每一轮优化迭代中,从数据集的所有像素点随机采样一批(a batch of)相机光线,然后按照之前的hierarchical sampling,从coarse网络查询NcN_c个点,从fine网络查询Nc+NfN_c+N_f个点,定义损失函数为:

L=rR[C^c(r)C(r)22+C^f(r)C(r)22]L = \displaystyle\sum_{r\in R}[||\hat{C}_c(\pmb{r}) - C(\pmb{r})||_2^2 + ||\hat{C}_f(\pmb{r}) - C(\pmb{r})||_2^2 ]

这样既优化了最终fine网络的渲染结果,也减少了coarse网络的误差,这有助于后面在fine网络中采样。

Results

采用RSNR/SSIM(越高越好),和LPIPS(越低越好)跟Neural Volumes, Scene Representation Networks, Local Light Field Fusion比较。

消融实验表明:

  1. positional encoding和view-dependence比hierarchical sampling提供了更多的好处。
  2. 就算为NeRF模型提供更少的照片也能比提供更多照片的NV, SRN, LLFF效果更好。
  3. 关于positional encoding所用到的最大频率LL,只用5个频率会降低性能,但用10到15个频率也不会增加性能。我们相信增加LL带来的好处在2L2^L超过某范围时会受限。

Conclusion

我们的工作通过MLP用连续函数表示物体和场景,解决了之前工作的一些缺陷。证明了将场景表示为5D神经辐射场比先前占支配地位的用深层卷积网络输出离散体素表示(discretized voxel representation)更加优秀。

尽管我们提出了层级采样策略,还有很多工作可以做。未来工作的一种方向是可解释性(interpretability):sampled representation允许对渲染试图和故障模式的预期质量进行推理。


其他参考资料:

都2022年了,我不允许你还不懂NeRF - 知乎 (zhihu.com)

Neural Radiance Fields (NeRF) - 知乎 (zhihu.com)

“图形学小白”友好的NeRF原理透彻讲解 - 知乎 (zhihu.com)

一文带你入门NeRF:利用PyTorch实现NeRF代码详解(附代码) - 知乎 (zhihu.com)