NeRF:用深度学习完成3D渲染任务的蹿红

论坛 期权论坛 金融     
tlih0606   2022-7-6 22:46   12347   20
在CSDN阅读
1 引言

NeRF是2020年ECCV论文。仅仅过去不到2年,关于NeRF的论文数量已经十分可观。相比于计算机视觉,尤其是相比于基于深度学习的计算机视觉,计算机图形学是比较困难、比较晦涩的。被深度学习席卷的计算机视觉任务数不胜数,但被深度学习席卷的计算机图形学任务仍然尚少。
由于NeRF及其众多follow-up工作在图形学中非常重要的渲染任务上给出了优秀的结果,可以预见未来用深度学习完成图形学任务的工作会快速增长。今年的GIRAFFE是NeRF的后续工作之一,它摘下2021CVPR的最佳论文奖对整个方向的繁荣都起到积极的推动作用。
本文希望讨论以下问题:

  • NeRF被提出的基础(2 前NeRF时代);
  • NeRF是什么(3 NeRF!);
  • NeRF的代表性follow-up工作(4 后NeRF时代);
  • 包含NeRF的更宽泛的研究方向Neural Rendering的简介(5 不止是NeRF)。
2 前NeRF时代

2.1 传统图形学的渲染

本质上,NeRF做的事情就是用深度学习完成了图形学中的3D渲染任务。那么我们提两个问题。

  • 问题1:3D渲染是要干什么?
看2个比较官方的定义。
MIT计算机图形学课程EECS 6.837对渲染(Rendering)的定义:
“Rendering” refers to the entire process that produces color values for pixels, given a 3D representation of the scene.
优秀综述论文State of the Art on Neural Rendering对渲染(Rendering)的定义:
The process of transforming a scene definition including cameras, lights, surface geometry and material into a simulated camera image is known as rendering.
也就是说,渲染就是用计算机模拟照相机拍照,它们的结果都是生成一张照片。
用照相机拍照是一个现实世界的物理过程,主要是光学过程,拍照对象是现实世界中真实的万事万物,形成照片的机制主要就是:光经过镜头,到达传感器,被记录下来。



拍照的物理过程

而渲染就是用计算机模拟这一过程,模拟“拍照”的对象是已存在的某种三维场景表示(3D representation of the scene),模拟生成照片的机制是图形学研究人员精心设计的算法。
关键前提:渲染的前提是某种三维场景表示已经存在。渲染一词本身不包办生成三维场景表示。不过,渲染的确与三维场景表示的形式息息相关;因此研究渲染的工作通常包含对三维场景表示的探讨。

  • 问题2:3D渲染是图形学问题,那么原先大家是用什么传统图形学方法实现3D渲染的呢?
主要有两种算法:光栅化(rasterization),光线追踪(ray tracing);都是对照相机拍照的光学过程进行数学物理建模来实现的。



Rrasterization,Ray Tracing

传统渲染的详细原理参阅此教材。
光栅化是一种前馈过程,几何体被转换为图像域,是上世纪比较早的算法。光线追踪则是将光线从图像像素向后投射到虚拟三维场景中,并通过从与几何体的交点递归投射新光线来模拟反射和折射,有全局光照的优势(能模拟光线的多次反射或折射)。
当下,在学术界,还在研究传统图形学的渲染算法的人应该大部分在搞优化加速,怎么用GPU实时渲染更复杂的场景之类的事儿。在工业界,不少游戏重度依赖渲染技术,所以应该也有不少游戏公司在研究更逼真、更快速、更省算力的渲染算法。去年虚拟引擎出的新款“虚拟引擎5”效果很是震撼,光照、纹理、流体的实时渲染模拟都逼真到了前所未有的新高度,可以看下虚拟引擎官方的宣传视频,真的很不错。



虚拟引擎5

2.2 神经网络侵略3D渲染任务:NeRF呼之欲出

隐式场景表示(implicit scene representation)

基于深度学习的渲染的先驱是使用神经网络隐式表示三维场景。 许多3D-aware的图像生成方法使用体素、网格、点云等形式表示三维场景,通常基于卷积架构。 而在CVPR 2019上,开始出现 使用神经网络拟合标量函数 来表示三维场景的工作。
DeepSDF

2019年CVPR的DeepSDF或许是最接近NeRF的先驱工作。
SDF是Signed Distance Function的缩写。DeepSDF通过回归(regress)一个分布来表达三维表面的。如下图所示,SDF>0的地方,表示该点在三维表面外面;SDF<0的地方,表示该点在三维表面里面。回归这一分布的神经网络是多层感知机(Multi-Layer Perceptron,MLP),非常简单原始的神经网络结构。



DeepSDF

NeRF比DeepSDF进步的地方就在于,NeRF用RGBσ代替了SDF,所以除了能推理一个点离物体表面的距离,还能推理RGB颜色和透明度,且颜色是view-dependent的(观察视角不同,同一物点的颜色不同),从而实现功能更强大的渲染。
3 NeRF!

建议前往NeRF项目网站查看视频效果图。

NeRF效果图
https://www.zhihu.com/video/1400183014215847936
3.1 Radiance Fields(RF)

NeRF是Neural Radiance Fields的缩写。其中的Radiance Fields是指一个函数、或者说映射


映射的输入是 是三维空间点的坐标, 是观察角度。
映射的输出是 是volume density(可以简单理解为不透明度), 是color,即RGB颜色值。



Radiance Fields(RF)

Radiance Fields,或者说映射 ,能对三维场景进行隐式表示(implicit scene representation)。在上一节,我们说过某种三维场景表示正是渲染的前提。实现渲染也是 作者提出Radiance Fields这一新型三维场景表示方法 的目的所在。
3.2 Neural Radiance Fields(NeRF)

Radiance Fields是映射 。那么Neural Radiance Fields则是指用神经网络拟合Radiance Fields 。论文中,该神经网络具体是多层感知机(与DeepSDF一样)。



Neural Radiance Fields(NeRF)

3.3 NeRF的体积渲染

NeRF(Neural Radiance Fields)其实是一种三维场景表示(scene representation),而且是一种隐式的场景表示(implicit scene representation),因为不能像point cloud、mesh、voxel一样直接看见一个三维模型。
NeRF将场景表示为空间中任何点的volume density 和颜色值 。 有了以NeRF形式存在的场景表示后,可以对该场景进行渲染,生成新视角的模拟图片。论文使用经典体积渲染(volume rendering)的原理,求解穿过场景的任何光线的颜色,从而渲染合成新的图像。



NeRF volume rendering

Volume density 的严谨解释是:光射线在位置 处的无穷小粒子处终止的微分概率。 于是,具有近边界 、远边界 的相机光线 的颜色


其中 表示沿光线从 累积透射率,也就是光线从 传播到 而没有碰到任何其他粒子(仍存活)的概率。


那么,从NeRF渲染合成一张完整的图片,就需要为通过虚拟相机的每个像素的光线计算这个积分 ,得到该像素的颜色值。
使用计算机求积分,必然是离散的采样,作者采用分层采样(stratified sampling)对这个连续积分进行数值估计。 算积分的具体细节见文尾附录。
3.4 NeRF的训练

训练NeRF的输入数据是:从不同位置拍摄同一场景的图片,拍摄这些图片的相机位姿、相机内参,以及场景的范围。若图像数据集缺少相机参数真值,作者便使用经典SfM重建解决方案COLMAP估计了需要的参数,当作真值使用。
在训练使用NeRF渲染新图片的过程中,

  • 先将这些位置输入MLP以产生volume density和RGB颜色值;
  • 取不同的位置,使用体积渲染技术将这些值合成为一张完整的图像;
  • 因为体积渲染函数是可微的,所以可以通过最小化上一步渲染合成的、真实图像之间的差来训练优化NeRF场景表示。
这样的一个NeRF训练完成后,就得到一个 以多层感知机的权重表示的 模型。一个模型只含有该场景的信息,不具有生成别的场景的图片的能力。
除此之外,NeRF还有两个优化的trick:

  • 位置编码(positional encoding),类似于傅里叶变换,将低维输入映射到高维空间,提升网络捕捉高频信息的能力;
  • 体积渲染的分层采样(hierarchical volume sampling),通过更高效的采样策略减小估算积分式的计算开销,加快训练速度。
4 后NeRF时代

GIRAFFE:composition方向的代表作

2021CVPR的最佳论文奖得主GIRAFFE是NeRF、GRAF工作的延申。
在NeRF之后,有人提出了GRAF(Generative Radiance Fields),关键点在于引入了GAN来实现Neural Radiance Fields;并使用conditional GAN实现对渲染内容的可控性。
在GRAF之后,GIRAFFE实现了composition。在NeRF、GRAF中,一个Neural Radiance Fields表示一个场景,one model per scene。而在GIRAFFE中,一个Neural Radiance Fields只表示一个物体,one object per scene(背景也算一个物体)。这样做的妙处在于可以随意组合不同场景的物体,可以改变同一场景中不同物体间的相对位置,渲染生成更多训练数据中没有的全新图像。



GIRAFFE实现composition

如图所示,GIRAFFE可以平移、旋转场景中的物体,还可以在场景中增添原本没有的新物体。
另外,GIRAFFE还可以改变物体的形状和外观,因为网络中加入了形状编码、外观编码变量(shape codes , appearance codes )。
其他最新相关工作

2021年CVPR还有许多相关的精彩工作发表。例如,提升网络的泛化性:

  • pixelNeRF:将每个像素的特征向量而非像素本身作为输入,允许网络在不同场景的多视图图像上进行训练,学习场景先验,然后测试时直接接收一个或几个视图为输入合成新视图。
  • IBRNet:学习一个适用于多种场景的通用视图插值函数,从而不用为每个新的场景都新学习一个模型才能渲染;且网络结构上用了另一个时髦的东西 Transformer。
  • MVSNeRF:训练一个具有泛化性能的先验网络,在推理的时候只用3张输入图片就重建一个新的场景。
针对动态场景的NeRF:

  • Nerfies:多使用了一个多层感知机来拟合形变的SE(3) field,从而建模帧间场景形变。
  • D-NeRF:多使用了一个多层感知机来拟合场景形变的displacement。
  • Neural Scene Flow Fields:多提出了一个scene flow fields来描述时序的场景形变。
其他创新点:

  • PhySG:用球状高斯函数模拟BRDF(高级着色的上古神器)和环境光照,针对更复杂的光照环境,能处理非朗伯表面的反射。
  • NeX:用MPI(Multi-Plane Image )代替NeRF的RGBσ作为网络的输出。
5 不止是NeRF:Neural Rendering

Neural Radiance Fields的外面是Neural Rendering;换句话说,NeRF(Neural Radiance Fields)是Neural Rendering方向的子集。
在针对这个更宽泛的概念的综述State of the Art on Neural Rendering中,Neural Rendering的主要研究方向被分为5类,NeRF在其中应属于第2类“Novel View Synthesis”(不过这篇综述早于NeRF发表,表中没有NeRF条目)。



Neural Rendering的5类主要研究方向

表中彩色字母缩写的含义:


在这篇综述中,Neural Rendering被定义为:
Deep image or video generation approaches that enable explicit or  implicit control of scene properties such as illumination, camera  parameters, pose, geometry, appearance, and semantic structure.
Neural Rendering包含所有使用神经网络生成可控(且photo-realistic)的新图片的方法。“可控”指人可以显式或隐式地控制生成新图片的属性,常见的属性包括:光照,相机内参,相机位姿(外参),几何关系,外观,语义分割结构。在这个大框架下,NeRF是一种比较受欢迎的可控相机位姿的Neural Rendering算法。但Neural Rendering这个方向不止于此。
在目前的Neural Rendering方向,最火的子方向就是“Novel View Synthesis”,这与NeRF的强势蹿红密不可分;第二火的子方向是“Semantic Photo Synthesis”,这主要归功于语义分割以及相关的GAN领域的成熟度。“Semantic Photo Synthesis”方向也是成果颇丰,例如2019年CVPR的Semantic Image Synthesis with Spatially-Adaptive Normalization,其效果图如下。



Semantic Image Synthesis

相关资源

Github论文收集仓库

小仓库(仅限于NeRF):
https://github.com/yenchenlin/awesome-NeRF
大仓库(neural rendering):
https://github.com/weihaox/awesome-neural-rendering
综述论文

可以说是官方综述,作者列表是目前在Neural Rendering领域最活跃的一群人。两篇分别是2021、2020年的SIGGRAPH、CVPR讲座用到的综述,很全面很有条理,值得每位从业者一读!
SIGGRAPH 2021 Course: Advances in Neural Rendering
CVPR 2020 Tutorial: State of the Art on Neural Rendering
范围限定为可微渲染方法的综述:
Differentiable Rendering: A Survey
上面小仓库的库主(MIT博士生Yen-Chen Lin)写的综述:
Neural Volume Rendering: NeRF And Beyond
论文

列论文实在挂一漏万,象征性地放上本文提到的2篇很重要的论文吧。
NeRF项目主页:
NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis
GIRAFFE项目主页:
GIRAFFE: Representing Scenes as Compositional Generative Neural Feature Fields
教材

传统图形学渲染技术:
Real-Time Rendering 3rd
计算机视觉经典教材,含有image-based rendering章节:
Computer Vision: Algorithms and Applications
两篇Georgia Tech老师写的博客

NeRF at ICCV 2021 - Prof. Frank Dellaert
NeRF Explosion 2020 - Prof. Frank Dellaert
附录

NeRF体积渲染公式的推导
连续形式



其中


要搞清楚上述积分式的来由,应当学习体渲染的基础知识。该渲染问题考虑的是光在介质中传播的问题,和物理中的比尔朗伯定律是同源的,在图形学的运用起源于1984 Kajiya的经典论文。
由于NeRF的一作Ben Mildenhall在SIGGRAPH 2021 Course Advances in Neural Rendering中从概率的角度推导了该体积渲染公式,另外这篇博文也解释得很透彻,可以去看他们的,所以我这里就不写了。
离散形式

推导一下连续形式变为离散形式的运算。
计算机求解积分式的办法一般是化为黎曼和。在这里,如果我们每次都将积分区间划分为固定的、等间距的窄长方形面积和,其实就失去了NeRF是连续场景表示的优势:因为虽然每个点的RGBσ都可以访问,但是实际上你也只用了固定点的值求积分。
所以NeRF要用分层采样,把积分区间先划分为等间距多个小区间,然后在每个小区间以均匀分布的概率分布随机采样,以随机采样的点的RGBσ值代表小区间的值,而不是每次都固定用小区间的端点或中点。用公式来表达:积分区间是 ,把他们划分为 个小区间,那么第 个小区间是 ;那么,第 个小区间随机采样的点 服从该小区间上的均匀分布


所以, 积分式的离散形式数值估计是


其中,每个小区间的积分估计是

被积函数的三项, 可以被直接近似为常数 ,可由多层感知机的输出直接给出; 也被直接近似为常数 ,也可由多层感知机的输出直接给出。但是 属于嵌套积分,它的值在小区间 随积分变量 的变化不可忽略,故暂且不能视为常数。

拆为两段后,前一段积分 中没有变量,故可近似为,后一段直接求解 。所以

其中 记为小区间的长度。
大功告成,体积渲染积分的离散形式推导完毕。

分享到 :
0 人收藏

20 个回复

倒序浏览
2#
吴宇  管理员  伦敦金丝雀码头交易员 | 2022-7-6 22:47:12 发帖IP地址来自 北京
写的言简意赅,赞!
3#
吴宇  管理员  伦敦金丝雀码头交易员 | 2022-7-6 22:47:22 发帖IP地址来自 北京
这是csdn转载?请问是您原创吗
4#
lafengadgainai  3级会员 | 2022-7-6 22:47:59 发帖IP地址来自 中国
是原创  CSDN也是我的账号
5#
吴宇  管理员  伦敦金丝雀码头交易员 | 2022-7-6 22:48:16 发帖IP地址来自 北京朝阳
[赞]
6#
吴宇  管理员  伦敦金丝雀码头交易员 | 2022-7-6 22:49:00 发帖IP地址来自 北京
写的很好
7#
暖色茶壶  3级会员 | 2022-7-6 22:49:56 发帖IP地址来自 北京
好文章,前排支持
8#
吴宇  管理员  伦敦金丝雀码头交易员 | 2022-7-6 22:50:03 发帖IP地址来自 北京
很有帮助
9#
吴宇  管理员  伦敦金丝雀码头交易员 | 2022-7-6 22:50:10 发帖IP地址来自 北京
您好,写得很棒!

只是有一处小瑕疵:
其中 [T(t)] 表示沿光线从 [t_n] 到 [t_f] 累积透射率,也就是光线从 [t_n] 传播到 [t_f] 而没有碰到任何其他粒子(仍存活)的概率。

应该为:光线从 [t_n] 到 [t] (而非[t_f])的累积透射率。
10#
594349398  1级新秀 | 2022-7-6 22:50:32 发帖IP地址来自 北京
改过来啦!感谢指正~ 看的好仔细呀
11#
吴宇  管理员  伦敦金丝雀码头交易员 | 2022-7-6 22:51:29 发帖IP地址来自 北京
请问如何根据输入的图片变成XYZ信息呢
12#
吴宇  管理员  伦敦金丝雀码头交易员 | 2022-7-6 22:52:09 发帖IP地址来自 云南
写得太好了!
13#
幽vh玖  1级新秀 | 2022-7-6 22:52:25 发帖IP地址来自 北京
感谢大佬的总结,写得很棒!补充一小点:目前Neural Rendering的最新综述可以看这篇:Advances in Neural Rendering。几乎还是State of the Art on Neural Rendering的原班人马[调皮]
14#
ghsfjsyj  1级新秀 | 2022-7-6 22:52:48 发帖IP地址来自 北京丰台
好的,已更新,多谢!
15#
吴宇  管理员  伦敦金丝雀码头交易员 | 2022-7-6 22:53:07 发帖IP地址来自 中国
赞![赞]
16#
吴宇  管理员  伦敦金丝雀码头交易员 | 2022-7-6 22:53:53 发帖IP地址来自 北京
训练NeRF一般不仅需要图片,还需要拍摄这些图片的相机位姿。有相机的位姿和内参,统一在一个共同的坐标系下 ,即可推算得每张图片的每个像素相对场景的(x, y, z, θ, φ)。
17#
吴宇  管理员  伦敦金丝雀码头交易员 | 2022-7-6 22:54:17 发帖IP地址来自 北京
感谢分享!今天终于对Neural Rendering的有了个大概的了解[调皮]
18#
吴宇  管理员  伦敦金丝雀码头交易员 | 2022-7-6 22:54:46 发帖IP地址来自 北京
请教个问题,为什么要用神经网络来实现这个任务呢? 传统方法不是挺好的么? 为了节省计算量吗?
19#
吴宇  管理员  伦敦金丝雀码头交易员 | 2022-7-6 22:55:03 发帖IP地址来自 北京
在image-based rendering任务上,传统方法并没有比nerf好呀。(nerf完成的任务是:输入几张同一场景在不同视角的图片,输出任意没见过的新视角图片。)要完成该任务的话,您说的传统方法具体是指什么算法?
20#
江湖小青蛇  2级吧友 | 2022-7-6 22:56:02 发帖IP地址来自 北京
存储上相比传统云点、网格,占用的空间大大缩小,对每个场景只需要存储训练好的网络权重,甚至比训练需要的图片还小。不过这是文章说的,我没实验过
21#
吴宇  管理员  伦敦金丝雀码头交易员 | 2022-7-6 22:56:56 发帖IP地址来自 北京大兴
这个确实,MLP权重存下来一般10M左右。而且从二维RGB图片获得点云、网格也比较难。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:
帖子:
精华:
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP