©NeRF
计算机图形学系列讲座主持人:张然
Postdoc@HPI
渲染作为电影特效和产品设计的重要一环,是一个实打实的“时间就是金钱”的行业。各种特效软件,渲染工厂等等已经几乎将硬件性能压榨到极限。那还有没有什么新的办法能继续加速甚至颠覆原有的渲染思路呢?没错,已经战胜人类棋手,解决蛋白质折叠,甚至能做风格迁移创作的机器学习它又来了。有了神经网络加持的渲染技术能做到成倍的速度提升,各大影视巨头例如Disney和工业光魔等早已在第一时间部署了神经渲染模型,包括《超级破坏王2》和《玩具总动员4》中都有神经渲染的身影。本文将从MIT的neural rendering课程出发带领大家一睹神经渲染的强大实力和广阔前景。
本文为全球知识雷锋第179篇讲座。
本文整理自于2020年1月31号在MIT举行的系列讲座Introduction to Deep Learning第9讲Neural Rendering(https://www.youtube.com/watch?v=BCZ56MU-KhQ),由Lambda Labs Chuan Li主讲,讲座由宾大硕士汤浩恒翻译记录,剑桥大学硕士李宇琳、清华大学文弘博校对,清华大学计算机图形学高端博士推荐,特别感谢奥地利计算机图形学张然博士的帮助。
记录者:汤浩恒
在学科边缘试探的建院学生
宾大MUSA硕士
华南理工城乡规划本科
推荐人:高端
清华大学计算机系博士生,研究方向为真实感渲染、神经渲染、材质建模等。本科毕业于南京大学计算机系。
主讲人:
Chuan Li
 (Lambda Labs) 
Lambda Labs首席科学官,2013年起先后在德国萨尔布吕肯地区(Saarbrücken Area)和荷兰乌得勒支地区(Utrecht Area)担任博士后研究员,并于2017年4月加入Lambda Labs。擅长计算机图形学、计算机视觉、机器学习等领域。
在此推荐Chuan Li老师的论文:《Precomputed real-time texture synthesis with markovian generative adversarial networks》
文章全长10000字,阅读完需要12分钟
导语
本篇讲座由清华大学计算机图形学高端博士推荐
随着计算机图形学渲染技术的进步和发展,数字化的高真实感图片或视频的生成被广泛应用于各个行业,例如动画及电影的特效制作, 图中展示了2019年上映的《狮子王》3D重制版的幕后渲染分享:
渲染即是从3D场景生成2D图片的过程,传统的图形学渲染技术可以分为实时渲染和离线渲染。前者被广泛应用于游戏、可视化展览等对于时间效率要求非常高的场景,而后者主要用于电影特效制作等对于质量要求非常高的领域。无论是实时渲染还是离线渲染,业内均已发展出一套成熟的管线和配套的工具链可用于3D内容的制作和生成。然而传统的渲染依赖于专业人员利用复杂的专业软件进行大量繁琐的手工操作(图中展示了一些常见的3D制作软件,例如Unreal engine、Substance painter、Maya和ZBrush等),难以满足各行各业从业者对于三维内容生成及其可视化渲染的需求,因此研究和发展更加轻量化、自动化且用户友好的计算机图形学方法迫在眉睫。
另一方面,近年来深度学习技术在计算机视觉领域取得了巨大成功,数据驱动的自动化方法取代了人工的特征设计,使得基于深度学习的计算机视觉方法迅速发展为图像分类、图像检测和图像分割等领域的主流方法。因此,将深度学习技术与计算机图形学的结合(即神经渲染)是非常自然的研究方向,一方面可以充分利用深度学习从大量数据中提取数据先验,实现传统渲染流程中某一个模块的加速和轻量化;另一方面,全新的基于深度学习的三维场景表达和对应的神经渲染管线可以在特定任务中发挥作用,为我们带来全新的思考图形学渲染过程的视角。

逆渲染是渲染过程的逆向过程,即从一系列输入的2D图片中重建3D场景(下图展示了正向渲染和逆向渲染的关系)。简单来说,逆渲染需要求解一个优化问题,优化好的三维场景所渲染的图片要尽可能和输入的图片接近。
近年来,神经网络方法和逆渲染的结合突飞猛进,主要体现在两点:1. 基于物理的可微分渲染方法逐渐发展并成熟,使得整个渲染过程可以微分,进而可以融入到基于梯度的优化过程中,实现端到端的优化(或结合到神经网络中实现端到端的训练);2. 神经网络擅长于从数据中提取数据先验,可以为优化过程提供正则约束,实现更加轻量和鲁棒的逆渲染。
神经渲染还是一个非常年轻且富有活力的研究方向,Chuan Li博士的关于神经渲染的精彩讲座相信一定会给大家带来更多关于神经渲染的了解和思考。
讲座正文
介绍
感谢邀请。今天我要讲的是神经(网络)渲染(neural rendering)。由于渲染是一个很宏大的话题,我想先阐明,在这个讲座中渲染指的是正反两个过程。
前向渲染(forward rendering)是指通过计算物体形状、物体颜色、表面材质和光源等三维参数来生成图像。长久以来,前向渲染都是计算机图像领域的研究重点。与之相反的是逆渲染(inverse rendering),它研究的是如何利用若干图像构建这些图像所代表的三维形体。逆渲染与计算机视觉息息相关,其应用包括三维重建、动作捕捉等。前向渲染和逆渲染本质上是相联系的,因为高质量的视觉呈现不应该看起来像是简单的电脑图像。在这个讲座里,我将谈谈如何应用机器学习改进这两种渲染。在我们细讲神经网络之前,我先简短说一下传统的(渲染)方法。
这是光线追踪的示例,光线追踪是前向渲染中广泛采用的技术。想象一下,你处在一个洞穴里,红色光带是光源,网格是图像平面。光线追踪的工作原理是,从一个虚构的眼睛出发,向图像的每个格子投射光线,计算人眼通过每条光路看到的物体颜色。在这一例子中,光线直接打在了光源上,所以我们把光源的颜色赋予给该像素点。
但是,更多的情况下,光线会先打在物体表面,经过多次反射才到达光源,此时我们需要计算物体表面入射光角度的定积分[1](integral of the incident radians)[2]作为物体表面的颜色。
直接分析计算它是比较困难的,所以人们常用蒙特卡罗(Monte Carlo)采样法[3]:在整个积分域[4](integral domain),也就是物体表面上随机投射光线,并采样计算这些光线的平均值作为整个物体表面的近似值。
我们还可以改变采样函数来模拟物体材质,使物体看起来更有光泽或更粗燥。
多数情况下,光线经过多次反射才能到达光源,这类递归问题很快就会需要巨大的运算量。
【注释】
入射光角度的定积分:立体角是单位球(半径为1的球)面上的一块面积,以观测点为球心,构造一个单位球面,任意物体投影到该单位球面上的投影面积,即为该物体相对于该观测点的立体角。
数学上的立体角积分是:
蒙特卡罗方法:也称统计模拟方法,是1940年代中期由于科学技术的发展和电子计算机的发明,而提出的一种以概率统计理论为指导的数值计算方法。是指使用随机数(或更常见的伪随机数)来解决很多计算问题的方法。-维基百科

非权重蒙特卡罗积分:也称确定性抽样,是对被积函数变量区间进行随机均匀抽样,然后对抽样点的函数值求平均,从而可以得到函数积分的近似值。此种方法的正确性是基于概率论的中心极限定理。-维基百科
人们发明了许多先进的光线追踪方法来解决这一问题,我不会在此细讲。
总的来说,蒙特卡罗采样法需要的运算量很大,尤其对于这种复杂问题,该方法的波动性很大而收敛速度(convergence rate)[5]很慢,需要计算成百上千甚至数十亿条光线来完成渲染。是否能用机器学习来加速这一过程呢?答案是肯定的。我将在讲座中细讲这一问题,但在此之前,我想说说逆渲染。
【注释】
收敛速度:在数值分析中, 一个收敛序列向其极限逼近的速度称为收敛速度。该概念多用于最优化算法中;其被定义为一个迭代序列向其局部最优值逼近(假设计算过程收敛,并能达到最优值)的速度,是评价一个迭代法于该问题中发挥性能的一个重要指标。-维基百科
这是一个经典的三维形体合成问题——利用同一物体的两张图片合成该物体的三维形体。
我们可以先在两张图像里找到相同特征(点),然后计算拍摄两张图片之间的相机动作。相机动作常常被参数化为一个旋转变换和一个位移变换。
如果想要达到更好的效果,可以用上更多机位的图片。
以现在的技术甚至能用到千上万张图片,着实惊人!
只不过,这类计算机视觉系统的产出成果往往有很多噪点,计算机图像应用却需要非常干净的数据,需要图像有非常清晰的细节。因此,很多时候还是需要人工清理数据,有时候我们还需要从粗糙的图像手动制作(成更高清的图像)。所以,每次你听到“手动制作(handcraft)”这个词的时候,就应该意识到,这是机器学习介入并将这个过程自动化的好机会。
接下来,我将讲讲神经网络如何作为前向渲染中的子模块(submodule)和端到端流水线[6](end-to-end pipeline),以及它如何作为可微分渲染器(differentiable renderer),为许多有趣的逆渲染应用创造可能。
【注释】
端到端学习:在一些复杂任务中,传统机器学习方法需要将一个任务的输入和输出之间人为地切割成很多子模块(或多个阶段),每个子模块分开学习。这种学习方式有两个问题:一是每一个模块都需要单独优化,并且其优化目标和任务总体目标并不能保证一致。二是错误传播,即前一步的错误会对后续的模型造成很大的影响。这样就增加了机器学习方法在实际应用的难度。端到端学习,也称端到端训练,是指在学习过程中,一般不需要明确地给出不同模块或阶段的功能,中间过程不需要人为干预。端到端学习的训练数据为“输入-输出”对的形式,无需提供其他额外信息。因此,端到端学习和深度学习一样,都是要解决“贡献度分配”问题。目前,大部分采用神经网络模型的深度学习也可以看作是一种端到端的学习。-邱锡鹏《神经网络与深度学习》
前向渲染
子模块
先说前向渲染。正如我们之前所说,蒙特卡罗采样法需要很大的运算量。
这一页的左上角是一张充满噪点的渲染图,图中每个像素仅一个光线样本,从左到右、从上到下,图像中的样本数量依次翻倍,可以看到图像的效果越来越好,但计算所需的成本也越来越高。
这里我想进行一个类比:在座的各位应该多数都知道阿尔法围棋(AlphaGo)吧?阿尔法围棋采用了策略网络(policy network)和评价网络(value network)来加速蒙特卡罗树搜索[7]过程。
评价网络可以预测棋子下在棋盘任意位置上赢棋的可能性,因此它能有效减小蒙特卡罗树的搜索深度。
类似地,策略网络以棋盘上任意位置作为输入值,输出(对手)下一步落子位置的概率分布,它能有效减小蒙特卡罗树的搜索宽度。
策略网络和评价网络同样可以加速渲染中的蒙特卡罗树搜索,它能用带噪点的(图像)数据作为输入,输出尽可能正确的预测值。
有了策略网络,我们就能制定一种策略进行智能光线采样,使渲染(计算过程)收敛更快。
我们先看基于评价网络的方法。这是我们最近做的降噪蒙特卡罗渲染,左边呈现的是带有噪点的图片,图中每个像素只有四个样本;中间是降噪结果;右边是32,000样本/像素的渲染图片,即真实值。右边的图片用12核CPU渲染了90分钟才完成,而中间的降噪图片只需要商用GPU跑大概1秒钟就能得到,可以说它很好地实现了(渲染)速度与质量的平衡。
整个网络被训练成包含两个损失(函数)[8]的端到端自编码器[9],第一个损失函数(Loss)计算VGG模型L1特征提取后产出图像的误差,第二个损失函数则计算GAN[10](生成对抗网络)的误差。很明显,这里加入GAN的损失(函数)是为了尝试填补图像缺失的细节。
【注释】
损失函数: 在最优化、统计学、计量经济学、决策论、机器学习和计算神经科学的领域中,损失函数或成本函数是指一种将一个事件(在一个样本空间中的一个元素)映射到一个表达与其事件相关的经济成本或机会成本的实数上的一种函数,借此直观表示一些"成本"与事件的关联。一个最佳化问题的目标是将损失函数最小化。一个目标函数通常为一个损失函数的本身或者为其负值。当一个目标函数为损失函数的负值时,目标函数的值寻求最大化。-维基百科
生成对抗网络:简称GAN,是非监督式学习的一种方法,通过让两个神经网络相互博弈的方式进行学习。该方法由伊恩·古德费洛等人于2014年提出。生成对抗网络由一个生成网络与一个判别网络组成。生成网络从潜在空间中随机取样作为输入,其输出结果需要尽量模仿训练集中的真实样本;判别网络的输入则为真实样本或生成网络的输出,其目的是将生成网络的输出从真实样本中尽可能分辨出来。生成网络要尽可能地欺骗判别网络,两个网络相互对抗、不断调整参数,最终目的是使判别网络无法判断生成网络的输出结果是否真实。该方法常用于生成以假乱真的图片。-维基百科
自编码:也称自动编码器,是一种人工神经网络,在无监督学习中用于有效编码。自编码的目的是对一组数据学习出一种表示,通常用于降维。最近,自编码的概念广泛地用于数据的生成模型。自2010年以来,一些先进的人工智能在深度学习网络中采用了堆叠式稀疏自编码。-维基百科
这两组图展现了网络训练时采用或不采用GAN损失渲染的图像差别。自然图像的降噪研究进行已久,但是对蒙特卡洛渲染产生的图像进行降噪还是有些新颖的。
我们可以将图像中的漫反射和镜面反射部分分开,分别输入(神经)网络,将输出结果合并作为最终结果,这样能大大改善渲染效果。
此外,该流水线还能顺带输出反照率贴图(albedo map)、法线贴图(normal map)和深度贴图(depth map)等,这些贴图可以用作辅助特征指导机器应该着重处理什么地方的噪点。至于具体怎么把这些特征喂给流水线,目前还是一个开放性研究话题,我们在这篇论文里给出的是逐元素的偏差[11]与缩放法(element-wise biasing and scaling)。
逐元素偏差法中,辅助特征经过一连串卷积层计算,计算结果逐个加入输入特征X,这是特征融合(feature concatenation)的等价操作。
逐元素缩放法中,辅助特征与输入特征X逐个相乘。这里之所以同时进行偏差与缩放是为了捕捉每两个输入值之间不同层面的联系。我们可以把逐元素偏差法看作“或”运算器,它能检查是否两个输入中至少一个拥有某一特征;逐元素缩放法则是“和”运算器,它能检查是否两个输入都具备某一特征。通过结合两种运算器,我们能够更好地利用辅助特征。
这是对4样本/像素、有噪点图片的降噪结果。将我们的降噪结果与其他方法的产出结果比较,可以看出我们的方法整体上噪点更少且细节更丰富。
接下来我们谈谈基于策略网络的方法。
先看这个最新的研究——神经(网络)权重采样[13](Neural Importance Sampling)。
我不想在此展开太多,只想指出它的要点在于,为场景中的每个位置找到一个好的策略来智能化采样光线,缩短收敛时间。实践中,最好的策略就是该点的入射辐亮度图[14](incident radiance map),因为它能直接告诉你光从哪儿来。那么,我们可以用新的网络根据局部表面特征生成入射辐亮度图吗?答案是:可以。
就像当下能用任意有噪点的图片产出新图片一样,我们也可以尝试使用(神经)网络,根据位置、入射光线方向、表面法线等局部特征生成入射辐亮度图。
该方法的缺陷在于,对于不同的场景,局部表面特征与入射辐亮度图之间的关系各不相同,所以(神经)网络需要从一些随机策略开始,慢慢学习场景的结构以制定更好的策略。
这就是渲染结果,左边采用了传统光线追踪方式,右边则用了结合神经(网络)重要性采样法的光线追踪,可以看出来,它的渲染速度要快得多。
端到端流水线
前面一直在讲神经网络如何用作前向渲染的子模块,现在我要开始讲如何将神经网络用作端到端的流水线。
还记得我们讲的光线追踪吧,这一过程需要从一个像素投射光线到三维场景中,这种以图像为基础元素的方法实际上很难用神经网络学习,一方面因为它是递归的,另一方面因为它需要离散采样(discrete sampling),而离散采样是很难分析的。
与之相对的是以物件为基础元素的方法,也称栅格化(rasterization)。该方法中,每个三维点都向图片投射一条光线,不涉及递归也不需要采样,因此更易于神经网络学习。栅格化包含两个主要步骤:第一步是将每个原始三维物件投射到图像平面上,根据它们距离图像的远近进行堆叠,这样一来能保证最前面的物体总会在最终渲染图中出现。
第二步是阴影计算,它基本上用插入三维原语,例如顶点的颜色来计算像素颜色的。栅格化往往比光线追踪要更快一些,而且正如我们之前提到的,它不涉及递归和离散采样所以更易于神经网络学习。听起来不错吧?
三维数据表示
接下来我要讲另一个方面——输入数据格式。主流的三维(数据)格式包括:深度图、体素(voxel)[15]、三维点云(3D point cloud)和网格面(mesh)。其中,有的格式对于神经网络来说不太友好,从使用策略网络的表现来看,今天还是不讲它们为好。
我们先说深度图吧,它可能是最容易学习的格式,只需改变输入通道的数量,就可以放在任意神经网络中进行计算了。而且它一点也不占内存,因为现在有许多专门跑图像的加速器可以用。深度图好用还有另一个原因——不需要额外计算可见性。因为深度图中包含的信息都是最前面物体表面的,我们只需要计算阴影就好了。将深度图渲染成图片还需要很多别的工作,我不准备在这里细讲。
现在来说体素。体素对于神经网络来讲也是比较友好的,因为所有数据都按网格排布。但由于体素比一般的图像数据量要大一级,它非常占内存,我们只能用神经网络跑低分辨率的体素。现在渲染很少用到体素,毕竟它既要计算可见性又要计算阴影,但这反倒提供了神经(网络)渲染学习端到端流水线的机会。
RenderNet渲染体素
我们尝试的这种端到端神经(网络)体素渲染叫做RenderNet,它能将输入的体素转换成相机坐标(camera coordinate)。像这类三维刚体(3D rigid body)的变换我们一般不直接用神经网络学习,因为它很难进行卷积运算却很容易进行坐标转换,我们会把神经网络学习放在后面。
将输入体素变换进相机框内了,下一步是让神经网络学会用体素表现三维形体。我们可以对输入体素进行一系列三维卷积运算,使输出体素具备用于阴影和可见性计算的深度特征(deep features)。
再下一步是计算可见性,我们可以尝试采用标准深度缓存算法[16](depth-buffer algorithm),但那么做会遇到一些困难,因为经过三维卷积后,你不再能区分体素网格中的任一值,之后便无法判断哪一格是排在最前面的了。与此同时,由于每个体素都包含深度特征,须将所有通道整合起来才能计算可见性。
为了解决这一问题,我们应用了投影单元(projection unit)。投影单元接受四维张量[17],即神经(网络)体素,通过压缩最后两个维度、深度维度还有特征通道维度,将其转换成三维张量。紧接着,可以用多层感知机[18](multi-layer perceptron, MLP)学习如何用被压缩的最末通道计算可见性。从更高级层面上讲,你可以将多层感知机视为一个初始网络,它能学会整合可见性到步骤和特征中。
最后一步是用一系列二维反卷积运算将投影的神经网络体素渲染成图片。我们对整个神经网络进行端到端训练,使用像素级别的均方误差[19](mean squared error)作为损失函数。
【注释】
深度缓存算法:一种常用的判定对象表面可见性的物空间算法,它在投影面上的每一像素位置比较场景中所有面的深度。由于通常沿着观察系统的z轴来计算各对象距观察平面的深度,该算法也称为z缓存(z-buffer)算法。该算法需要两个缓存器,一个是用来存放颜色的颜色缓存器,另一个是用来存放深度的深度缓存器。利用深度缓存器,可以进行可见性的判断,消除隐藏对象。-百度百科
均方误差(mean-square error, MSE)是反映估计量与被估计量之间差异程度的一种度量。设t是根据子样确定的总体参数θ的一个估计量,(θ-t)2的数学期望,称为估计量t的均方误差。它等于σ2+b2,其中σ2与b分别是t的方差与偏倚。-百度百科
这是(训练)结果,第一行是输入体素而第二行是神经网络RenderNet输出的图片。可以看出,RenderNet能够对可见性与阴影的计算进行调节。
我们还可以用RenderNet生成各种渲染效果,包括线框图(contour map)、卡通渲染[20](toon shading)、环境光遮蔽(ambient occlusion, AO)等。
在普适性上,用椅子模型训练的RenderNet可以渲染一些未出现在训练集中的物件,如兔子、包含多个物件的场景等。
处理受污染数据与低分辨率数据也不在话下,这里的第一行是用受污染数据渲染的,第二行是用比训练数据分辨率低50%的数据渲染的。
RenderNet还能渲染带肌理的模型。这一例子中,我们多加了一个肌理网络,能将肌理编码成神经(网络)肌理体素。这些肌理体素会逐个通道与形体体素串联,串联后的体素会输入(神经)网络渲染。
这是一些肌理体素的渲染结果:第一行是输入的体素;第二行是参考图片,即真实值;第三行是RenderNet输出结果。可以看出参考图片有更多清晰的细节,但总的来说RenderNet已经能捕捉主要面部特征,对可见性和阴影做出正确计算了。
我们还尝试混合不同的形体和肌理。这里,第一行图片是用相同形体、不同肌理渲染的,第二行图片则是用相同肌理、不同形体渲染的。
基于点数据的神经网络图像(渲染三维点云)
好了,现在开始讲三维点云吧。三维点云事实上对于神经网络来说也不是那么友好,一方面它的数据不是按网格排布的,另一方面点数据的数量和顺序会随表面点采样方式的变化而变化。
我只想简单说一下这个基于点数据的神经网络图像(neural point-based graphics)的最新研究。在展开之前,先说下三维点云栅格化的传统方法:对三维场景中的每个点,我们都将它以方块的形式投影到图像上,方块的大小与点到图像的距离成反比,同时按照深度排列。接着,用三维点的RGB颜色为方块着色。按照这种方法渲染的图像会有很多空缺,而且可以看到大量色块。神经网络点基础图像所做的就是用学习到的神经(网络)描述子(neural descriptor)替代原来的RGB颜色。这里的神经网络描述子是一个与输入点关联的8维向量,也可以视作填补点云空缺的深度特征。
这是用神经(网络)描述子用主成分分析(PCA)前三个成分可视化的结果。我们先对场景中每个点的神经(网络)描述子进行随机初始化,然后针对那个场景进行优化。显然,我们不能用这个场景的描述子去描述其他场景,每个场景都需要各自在训练和测试阶段进行优化。
【注释】
主成分分析:在多元统计分析中,主成分分析(Principal components analysis,PCA)是一种统计分析、简化数据集的方法。它利用正交变换来对一系列可能相关的变量的观测值进行线性变换,从而投影为一系列线性不相关变量的值,这些不相关变量称为主成分(Principal Components)。具体地,主成分可以看做一个线性方程,其包含一系列线性系数来指示投影方向。PCA对原始数据的正则化或预处理敏感。-维基百科
该文章的作者还用自编码器将投影的神经(网络)描述子编码成图片,神经(网络)描述子训练优化阶段,渲染网络也同时接受训练,而且还能在测试阶段派上用场。
成果令人惊叹!第一行是用传统RGB描述子渲染的,而第二行是用神经(网络)描述子渲染的,你们可以看到,第二行(图片)没有空隙而且更加清晰。最酷的是,这个神经(网络)能适应多视角,也就是说,一旦它对一个场景完成了优化,就能渲染该场景各个角度的图片,这真的很酷!
网格模型渲染
最后,还有网格面模型没讲到。网格面模型很难用神经网络学习,在此我只想快速介绍一下两篇论文。第一篇论文有关延迟神经(网络)渲染(deferred neural rendering),其中所用方法与我们提到的神经(网络)点基础图像类似,只不过这篇论文将它应用在了网格面模型渲染上。另一篇论文有关三维网格面渲染器,它的厉害之处在于能够做三维形式转换,但这篇文章中神经网络主要用于改变顶点颜色和位置,不太涉及渲染。
逆渲染
前面一直在讲前向渲染,现在开始我们进入到逆渲染。
所谓逆渲染要解决的问题就是,在已有图片的条件下,怎么构建生成该图片的三维场景。
今天我要讲的方法是可微分渲染[21](differentiable rendering[22]),它的工作流程是这样的:从目标图片开始,我们构建一个近似的三维场景,不需要多么精确但要能渲染。
接着我们将渲染结果与目标图片进行比较,并定义衡量两者差异的量化指标。如果渲染过程是可微分的,我们就能进行反向传播(back propagate)计算损失(loss),不断更新模型。
重复这一过程,模型最终有望收敛于某点,成为真正可用的模型。此处关键点在于,前向渲染的模型必须是可微分的,以便进行反向传播计算。
这一迭代优化计算所需的成本很高,神经网络的作用因此体现,它能够通过学习模拟这一迭代优化过程。
例如,通过一个自动化编码器将输入图片编码成某种隐(空间)表示[24],为后期新视角合成[25](novel view synthesis)等提供可能。
【注释】
可微分渲染:逆向图像(生成)通过传感器数据推断三维形态、照明、材料和运动状态,以便图形渲染器可以真实地再现观察到的场景。一般的渲染器旨在进行图像合成的前向过程,我们提出了一种近似可微渲染器 (DR),它能对模型参数与呈现图像之间的关系进行精确建模。-OpenDR: An Approximate Differentiable Renderer
反向传播:是“误差反向传播”的简称,是一种与最优化方法(如梯度下降法)结合使用的,用来训练人工神经网络的常见方法。该方法对网络中所有权重计算损失函数的梯度。这个梯度会反馈给最优化方法,用来更新权值以最小化损失函数。反向传播要求有对每个输入值想得到的已知输出,来计算损失函数梯度。因此,它通常被认为是一种监督式学习方法,虽然它也用在一些无监督网络(如自动编码器)中。它是多层前馈网络的Delta规则的推广,可以用链式法则对每层迭代计算梯度。反向传播要求人工神经元(或“节点”)的激励函数可微。-维基百科
隐空间表示:隐空间是压缩数据的一个表示。隐空间的作用是为了找到模式(pattern) 而学习数据特征并且简化数据表示。这种压缩后的状态就是数据的隐空间表示。
为了让编码器学习有意义的表示,我们需要采用归纳偏置[26](inductive bias)。我很感兴趣的一种归纳方式是——将姿态与外表分开,这将大大简化学习过程,而且我相信这就是我们人类的学习方式。
这是我四岁的儿子,他正在玩图形拼图。游戏的任务是用三角形、正方形这样的基础图形拼出一个组合图形,为了完成这个任务,他需要对这些原始图形做三维刚体变换,使它们能与画板所需的图形匹配。人类可以毫不费力地完成这个任务,但神经网络做起来却比较痛苦——二维卷积或者一般的卷积运算是针对局部的计算,它们不能做全局变换;全连接层[27](fully connected layer)或许可以做到,但要占据很大的网络参数容量(network capacity),因为它得记住同一物件的各种组合。试问,能否用简单的坐标变换对物体姿态进行编码,将姿态与外表分开?这样能否简化学习过程?
holoGAN
对此,我们尝试的方法叫holoGAN,它在无三维监督的条件下也能学习自然图像的三维表示。所谓“无三维监督”指的是训练过程中没有输入任何三维数据,也就不存在物件姿态(pose)分类的标准答案,一切都用无标签的二维数据学习到,整个学习过程都靠归纳偏置驱动,与监督学习相反。
我们先看传统生成网络(generative network)。传统生成网络仅依靠少许对三维空间的假设,用二维卷积运算生成图像。
例如,这个条件对抗生成网络[28](Conditional GAN)能够串联姿态向量(concatenate pose vectors)或进行逐个特征转换,来控制生成图片中物件的姿态。最后,正确分类标签也会在训练过程中派上用场。这一过程中,姿态被当作一种难以诠释的潜在变量来学习,与此同时,生成三维运动过程的二维卷积运算也做出一些图像合成(artifact)[29]
相比之下,holoGAN通过分离姿态与运动过程,能生成更好(更自然)的图片。holoGAN的关键点在于,采用了神经网络体素作为隐(空间)表示。
我们用三维生成网络学习神经网络体素,并用RenderNet渲染三维体素。
这里的三维生成网络基本上就是styleGAN在三维的应用,包含两个输入。第一个输入是四维张量,它是一个常数张量,也是学习特定类别对象的模板,经过一系列三维卷积运算后最终成为神经网络体素表示。第二个输入是用作控制器的随机向量,它将被转换为自适应实例归一化[30](Adaptive Instance Normalization, AdaIN)的仿射参数(affine parameter)。学习到的三维体素表示一般由RenderNet进行渲染。
【注释】
AdaIN接收内容输入x和样式输入y,转换x每个通道的均值及方差,使其之y匹配。与BN、IN或CIN不同,AdaIN没有可学习的仿射参数,而是根据样式输入自适应地计算仿射参数:
这里只需用σ(y)缩放归一化的内容输入,并移动μ(y)的距离。与IN类似,这些统计值是由空间各处数据计算得来的。- Huang, Xun, and Serge Belongie. “Arbitrary Style Transfer in Teal-time with Adaptive Instance Normalization.” ICCV 2017.
为了能在无监督条件下训练该(神经)网络,我们用判别网络(discriminative network)分辨渲染图片和真实图片。
这一步的关键点在于,我们要在训练过程中进行随机刚体变换以形成体素表示。这里要用到归纳偏置,因为这样(神经)网络才能对任意姿态学习足够强的表示。如果不在学习过程中用到随机变换的话,(神经)网络就无法学习。
这些是训练结果。可以看到,holoGAN很擅长进行视角变换及处理复杂背景图片,但它的限制在于只能学习训练数据集中已有的姿态。例如,这个数据集的汽车照片基本拍摄于同一高度,所以(神经)网络无法推断不同视角高度的汽车照片应该是怎么样的。不过,只要训练集数据量足够大,(神经)网络就可以学到。
看这个例子,我们用ShapeNet生成了足够多的椅子姿态(作为训练集),(神经)网络因此能在垂直方向上做180度旋转(渲染)。
我们尝试还用(神经)网络学习一些很有挑战的数据集。比如这个背景数据集,它的难度在于各个图片的外表存在很大差异,几乎找不出两个类似的卧室,捕捉图片中的姿态信息因此很有必要。我们的(神经)网络依旧能生成一些看似合理的合成图片,这真的十分有趣!
(神经)网络带给我们的另一个惊喜是,它还能将外表分解为形体和肌理。我们曾试过训练过程中采用两个不同的控制向量,一个控制(神经)网络的三维部分,一个控制二维部分,结果显示控制三维部分的向量事实上控制了形体,控制二维部分的向量则控制了肌理。
这一页中,同一行图片用了相同的肌理控制器、不同的形体控制器,同一列图片用了相同的形体控制器、不同的肌理控制器。这让我想起了传统计算机图像管线中的顶点着色器(vertex shader)和片元着色器[31](fragment shader),其中顶点着色器控制几何形状而片元着色器负责上色。
总结
我想是时候给讲座做个总结了。今天的讲座,我们从一个问题出发:神经网络能否辅助前向渲染和逆渲染?我认为答案是肯定的。
正如我们之前看到的,神经网络可以作为子模块加速光线追踪过程,相关例子包括基于价值网络的方法和基于策略网络的方法。此外,神经网络还可用作端到端系统,辅助三维栅格化。在逆渲染问题上,神经网络作为强大的可微分渲染器,为视角合成等有趣应用打开大门,其关键点在于神经网络能依靠正确的归纳偏置学习强大的表示。
在结束讲座前,我想再重申一次,本次讲座关注的是一个前沿的开放话题,它还有很大发展空间。比如,端到端渲染和传统物理渲染在质量上还存在巨大差距,神经网络还不能很好地用作网格面渲染器……尽管有这样那样的问题,我们已经看到学习强大的表示带来了鼓舞人心的结果。接下来我们可以研究发展更有效的归纳偏置和神经网络结构,推动学习进程。
最后,我还要感谢我的同事和合作方,他们在论文中做出很大贡献。特别感谢Thu,RenderNet和HoloGAN的相关工作大多是她完成的;还有Bing,完成了大部分蒙特卡罗降噪工作。
谢谢大家!
讲座地址:
https://www.youtube.com/watch?v=BCZ56MU-KhQ
注:文中图片均来自讲座PPT截屏
END
进阶阅读
https://www.youtube.com/watch?v=otly9jcZ0Jg
张然博士推荐:应该是最前沿最完整的课程了,基本上所有做neural rendering的研究者都在。
https://arxiv.org/pdf/2004.03805.pdf
高端博士推荐论文:State of the Art on Neural Rendering
雷锋福利
“AI算法和建筑应用交叉雷锋群”来了!
由计算机图形学系列主持人ori博士坐镇,
高端博士、Simon博士、Elsa博士客座主持,
可不定期围观学术活动与最新AI创作作品
欢迎扫码入群!欢迎点播选题!
推荐公众号“Seminar of HCI”, 由数位计算机博士发起,展示人机交互前沿动态,激发和鼓励新的研究,并为社区创造一个定期的经常性机会,以满足和交流思想。
继续阅读
阅读原文