2020 年,在 CV/CG 界,一篇叫做 NeRF 的论文爆火,“只需要输入少量静态图片,就能做到多视角的逼真3D效果。”但是实际上,在这篇论文之前,学术界已经有不少这方面的尝试,相关的研究也有不少,因此本文尝试做一个简单的综述,来简单看看这篇论文及其相关的研究。

〇、背景:建模(表面、体积) & 渲染

众所周知,计算机图形学中一个长期研究目标就是将虚拟的世界尽可能的渲染的真实。这里面包括了三个方面:

  1. 建模:通过表面建模、曲面建模等方式,将真实世界中的场景在虚拟世界中还原出来
  2. 渲染:按照物理中光照的规律,将虚拟世界中建好的模型绘制成人眼可见的画面
  3. 动画:通过仿真等方式,模拟出物体真实的运动轨迹等,使得动画看起来更加自然

NeRF 及相关工作所尝试解决的,主要是建模与渲染部分,也就是重建。建模的本质,其实是构造出一个空间中描述物体的函数:传统的建模大多采用显式的表示,比如曲线、曲面等等,或是球体、长方体;而近年来,随着神经网络的发展,有人提出能否使用神经网络来表示这一函数,毕竟神经网络本质上就是一个隐式函数,只不过其形式更加复杂、表示能力也更强。

在三维建模中,两个非常重要的通用建模方式是表面建模和体积建模:表面建模是通过描述表面曲面的方式构建模型,而体积建模则是通过描述空间点(体素)的方式构建模型;在表面建模里没有三维实体,实体只是闭合表面;在体积建模里没有二维表面,表面只是很薄的体素。学界在神经网络建模方面,也进行了类似的尝试,即使用神经网络来表示曲面(神经隐式曲面)和使用神经网络表示体积(神经隐式体积)。基于这两个大的思想,人们逐渐设计出各式各样的网络,并得到了越来越好的效果。

当然,建模之后,如果不能够进行渲染是没有意义的,因此如何高效地渲染出这些隐式表示的模型,也是学术界非常热门的话题。

一、序章:神经隐式曲面

1.1 基于分类的网络

第一大类的尝试,就是使用神经网络来表示曲面(Neural Implicit Surfaces)。前面提到,对于一个物体,实际上就是一个闭合的曲面,因此最直白的表示方法,就是给空间中的点进行分类,标记它在曲面内、还是曲面外。

Occupancy as a learned classifier

Occupancy networksIM-Net 都是基于这一思想的,两者主要是网络内部结构上不同,但是输入都是一个特征向量和一个空间点坐标,输出都是一个布尔值:在曲面内或在曲面外。下图是 IM-Net 的网络结构,以作示例:

image-20210222182017395

另外还有将纹理特征一并结合的网络,如 PIFu:它除了编码了每个点是 inside 还是 outside,还将每个点的颜色信息也通过网络编码,从而实现了完整的高分辨率的着装人体数字化重建。

image-20210222193033452

1.2 基于回归的网络

使用分类模型进行的表面建模确实是一个非常大的创新,但是一个很大的缺点就是这个模型所表示的函数并不可导——它不是连续的,毕竟物体内外这一输出本身就决定了函数的值域是一个离散的二值。因此,人们尝试使用一个连续的表示方式:有符号距离场,也就是大名鼎鼎的 SDF。

The Stanford bunny rendered through a learned signed distance function (SDF)

SDF 的定义很简单,其数值就是空间中的一个点距离曲面最近的距离,而符号表示其在闭合曲面的内部还是外部。这样通过一个有符号数,就将两个信息一起编码进去了,并且得到了一个在空间上可导的量。

SDF 的形式化定义如下:

equation

DeepSDF

那么这样一个函数,非常自然的想到使用神经网络的 regression 进行解决,这也是 DeepSDF 的主要思想 —— 将一个描述物体形状特征的 Code 和空间坐标一并放入网络,然后输出该点的 SDF,从而实现利用深度网络重建一系列同类的物体。

image-20210222201532556

值得关注的一点是,这个特征 Code 的特征是利用 Auto-decoder (注意不是 Auto-encoder)优化提炼的,作者们称之为 Encoder-less Learning,因为他们觉得 encoder 在推导的时候并没有被用到,所以不如不要,实际的重建效果也是非常的好,感觉是个非常有意思的想法。

image-20210222202136185

DeepSDF 的诞生彻底引爆了这个领域,此后涌现出了大量相关的工作,如达摩院的 Curriculum DeepSDF 以及伯克利的 Extending DeepSDF,DeepSDF 本身也成为了不少工作的 baseline。

Overfit SDF

network

根据全局逼近定理(Universal Approximation Theory),一个具有充分多隐节点和采用任何激活函数的三层前馈神经网络能以任意精度逼近任何一个连续函数,因此我们其实可以直接对采样到的离散的 SDF 数据进行过拟合——即借助外部的 latent code,直接把物体的形状编码进网络的权重,一个网络对应一个物体即可。这就是 Overfit-SDF 的思想。

image-20210222230728553

相比于 DeepSDF,Overfit-SDF 面对观察角度的变化能够获得更加鲁棒的重建效果,如下图。

image-20210222230941628

1.3 渲染

对于隐式表示,一般来说常见的渲染方式是两种:方块遍历marching cube)和光线步进ray marching)。也有地方把 ray marching 称为 sphere tracing,细想想确实很形象,如下图。

raymarching2

实际上两者都是在从隐式表示中,采样表面的信息。个人认为相比起 marching cube,光线步进更能展现出这些 SDF 模型的连续性。

1.3.1 加速

但是由于前面的这些模型的网络往往层数比较深,再加上使用了 ray marching,渲染的过程不可避免的会很慢,因此 Neural Geometric Level of Detail 这篇文章提出降低网络的深度,使用简单的一个感知机来对不同的细节层次进行自适应拟合,从而达到实时渲染的效果。

image-20210222234838118

这个工作首先使用稀疏体素八叉树(Sparse Voxel Octree, SVO)对物体的几何特征进行编码—— SVO 的不同层次实际也编码了细节的不同层次,即 LOD (Level of Detail),而每个角点上的体素(可以先理解为一个数据结构,后面会解释)储存了局部的表面特征;在采样的时候,首先找到对应的几个体素,然后将其中储存的特征经过插值获得一个连续的特征,最后通过一个很简单的多层感知机来从这个综合出来的特征解码得到 SDF 的值。整个流程如下图所示:

image-20210222233643015

这个工作可以说是又快又好,既提高了渲染精度,又加快了渲染速度,还简化了网络结构。也许它也在启发着我们,真的复杂的就一定是最好的吗?有时候将一些已知的先验信息加入,往往可以达到事半功倍的效果。

二、爆发:神经隐式体积

2.1 体素渲染

但是在解释这些基于体积的建模工作之前,让我们来先看看这里的体素渲染到底是怎么回事。

事实上,关于体素渲染和体积渲染的定义已经因为很多商业游戏公司的宣传和炒作变得模糊和混淆,因此这里介绍的体素渲染是针对这两篇论文中采用的建模方法而言的。

所谓体素(Volume Pixel),就是体积像素的简称,与像素类似,每个体素包含了空间中一个最小分割单位中的信息,比如图片中的像素包含的是该点的 RGB 值,而体素则可以包含一个点的不透光性或者密度等。

基于体素的模型认为三维物体是由很多个体素构成的,每个体素包含自己的颜色和密度(或是不透明度)。那么在观察一个物体的时候,只要沿着光线方向进行积分,就可以得到这一角度所观察到的物体的最终颜色,如下图所示。

Diagram shows a basic diagram of volume rendering using single-pass GPU ray casting.

实际上仔细想想这个设定其实还有点道理,比如一个物体切的无限薄,其终将呈现出半透明乃至透明的状态。而且通过这种方式建模,天然的解决了半透明物体的重建问题。

image-20210222220827030

第一个将体积渲染与神经网络相结合的是 Neural Volumes,它将一个三维的物体,拆解为一个个体素——每个体素包含了密度信息和颜色信息,这样就得到了一个基于体素的三维物体表示方法;接下来,使用一个 Encoder + Decoder 对输入的多个角度的图片进行编码和采样,就得到了一个能够重建特定物体的 latent code,并且可以从中解码出一个三维空间的 volume;接下来,在这个 volume 中使用 ray marching 进行积分采样,即可得到重建的结果。

训练的时候,Neural Volumes 是直接进行端到端的训练的,即输入多个角度的图像,然后拿对应角度重建的图像计算 loss。

“Neural Volumes 的成功很大程度上归功于这种‘半透明’的几何表示方式,因为它使得梯度能够沿着射线的积分分散开来,进而更加容易收敛到一个较好的结果上”,一篇引用了 Neural Volumes 的论文如是说。

2.2 NeRF

NeRF 是神经辐射场(Neural Radiance Fields)的缩写,它彻底引爆了整个领域。

本质上来说,NeRF 与 DeepSDF 的网络结构差不多,但是与 DeepSDF 所回归的 SDF 函数不同,NeRF 回归的是体素的密度和颜色,也就是说,NeRF 将体素信息视作了一个函数,然后使用神经网络去拟合它。

image-20210222223550599

值得注意的是,NeRF 的输入是一个 5 维的向量——它包含了一个体素的位置 和观察它的角度 (所以采集的时候还要带上相机的外参),这是因为按照图形学中物体材质相关的理论,一个物体的同一位置(同一材质)在不同的光照角度之下确实会观察到不同的颜色;NeRF 考虑到了这一点,因此直接把材质信息也直接包含了进去;当然,场景的光照信息也被不可避免的烘焙了进去。

另外为了解决高频信息丢失的问题,比如特定角度下的高光(如下图),NeRF 对 voxel position 和 view position 都进行了 embedding,也就是把他们映射到一个高维空间中,进而大大增强了模型对于细节的重建能力。

image-20210222224836594

另外 NeRF 的渲染中还利用到了重要性采样,也就是先对一条光线上大致的密度分布进行估计,然后按照这个估计的密度曲线进行重要性采样,这样可以加快采样时收敛的速度。

NeRF 以其简单的原理、简单的模型、超好的重建效果引爆了整个学术界,大量基于 NeRF 的改进工作,如 Relighting、性能提升、动态场景等都被悉数完成,而大量基于 NeRF 的应用也在涌现,比如人物肖像重建、形状重建、场景组合、姿态估计等。这些 NeRF-style 的工作无一不证明着 neural volume 的巨大潜力。

三、展望

近年来,采用神经网络来代替传统表示的工作越来越多,如 SLAM 中接替 Kinect Fusion 的 Neural Fusion,再如使用网络表示纹理的 Neural Textures,还有上文的各种工作。神经网络黑箱的属性正在逐渐退去,其函数的本质正在被逐步挖掘。充分利用网络的拟合能力,并融入足够的先验知识,可能才是解锁神经网络潜力的钥匙。

另一方面,neural volume 相关的工作中,人们最终还是不可避免的尝试恢复表面本身,体素会不会只是一种目前效果最好的中间表示?LOD 的工作是否意味着未来人们会重新回归到基于 SDF 的方法?这些问题的答案从目前看来还是未知的。

令人振奋的是,这些工作基本都是近年完成的;也许随着研究的深入、资金的投入,这些问题很快就会得到解答。这一切的一切,都非常值得我们期待。

参考文献

  1. NeRF Explosion 2020 https://dellaert.github.io/NeRF/
  2. Tewari, Ayush, Ohad Fried, Justus Thies, Vincent Sitzmann, Stephen Lombardi, Kalyan Sunkavalli, Ricardo Martin-Brualla, et al. “State of the Art on Neural Rendering.” ArXiv:2004.03805 [Cs], April 8, 2020. http://arxiv.org/abs/2004.03805.
  3. Mildenhall, Ben, Pratul P. Srinivasan, Matthew Tancik, Jonathan T. Barron, Ravi Ramamoorthi, and Ren Ng. “NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis.” ArXiv:2003.08934 [Cs], August 3, 2020. http://arxiv.org/abs/2003.08934.
  4. Williams, Jon. “Occupancy Networks: Learning 3D Reconstruction in Function Space | Autonomous Vision.” Max Planck Institute for Intelligent Systems. Accessed February 22, 2021. https://is.mpg.de.
  5. Saito, Shunsuke, Zeng Huang, Ryota Natsume, Shigeo Morishima, Angjoo Kanazawa, and Hao Li. 2019. “PIFu: Pixel-Aligned Implicit Function for High-Resolution Clothed Human Digitization.” ArXiv.org. 2019. https://arxiv.org/abs/1905.05172.
  6. Park, Jeong Joon, Peter Florence, Julian Straub, Richard Newcombe, and Steven Lovegrove. 2019. “DeepSDF: Learning Continuous Signed Distance Functions for Shape Representation.” Thecvf.com, 165–74. https://openaccess.thecvf.com/content_CVPR_2019/html/Park_DeepSDF_Learning_Continuous_Signed_Distance_Functions_for_Shape_Representation_CVPR_2019_paper.html.
  7. Davies, Thomas, Derek Nowrouzezahrai, and Alec Jacobson. “On the Effectiveness of Weight-Encoded Neural Implicit 3D Shapes.” ArXiv:2009.09808 [Cs], January 17, 2021. http://arxiv.org/abs/2009.09808.
  8. Takikawa, Towaki, Joey Litalien, Kangxue Yin, Karsten Kreis, Charles Loop, Derek Nowrouzezahrai, Alec Jacobson, Morgan McGuire, and Sanja Fidler. “Neural Geometric Level of Detail: Real-Time Rendering with Implicit 3D Shapes.” ArXiv:2101.10994 [Cs], January 26, 2021. http://arxiv.org/abs/2101.10994.
  9. “Neural Volumes: Learning Dynamic Renderable Volumes from Images - Facebook Research.” 2019. Facebook Research. 2019. https://research.fb.com/publications/neural-volumes-learning-dynamic-renderable-volumes-from-images/.
  10. Mildenhall, Ben, Srinivasan, Pratul P, Matthew Tancik, Jonathan T Barron, Ravi Ramamoorthi, and Ren Ng. 2020. “NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis.” ArXiv.org. 2020. https://arxiv.org/abs/2003.08934.
  11. Weder, Silvan, Johannes L. Schönberger, Marc Pollefeys, and Martin R. Oswald. “NeuralFusion: Online Depth Fusion in Latent Space.” ArXiv:2011.14791 [Cs], November 30, 2020. http://arxiv.org/abs/2011.14791.
  12. Thies, Justus, Michael Zollhöfer, and Matthias Nießner. “Deferred Neural Rendering: Image Synthesis Using Neural Textures.” ArXiv:1904.12356 [Cs], April 28, 2019. http://arxiv.org/abs/1904.12356.