可微分渲染:Learning to Predict 3D Objects with an Interpolation-based Differentiable Renderer

目录

  • 1. 可微渲染简介
  • 2. DIB-R原理
  • 3. 可微渲染进行三维重建流程

1. 可微渲染简介

三维的物体渲染成二维图像的时候,其实本质上是进行了一系列矩阵变换,插值等操作,这和神经网络有一定的相似之处,渲染相当于前向传播,得到渲染图,而渲染图和输入图像相比较可以定义loss,从而进行反向传播,去优化三维物体的形状与纹理,从而实现基于单张图像的三维重建,并且不再受3D数据集依赖。
当然渲染的过程实现方法有很多,可以自己写shader,也有很多优化,并且是不支持可微操作的,因此可微分渲染的主要难点是去定义一个整个流程下来都能够顺利求导的渲染管线,并且尽可能地有扩展性(比如各种光照模型,支持纹理坐标等)
文章《Learning to Predict 3D Objects with an Interpolation-based Differentiable Renderer》出自NIPS2019,可以看做是目前最先进的可微渲染模型,简称DIB-R,与其他的可微渲染模型相比,能够支持更多的可微分属性,如下图所示:
可微分渲染:Learning to Predict 3D Objects with an Interpolation-based Differentiable Renderer_第1张图片

2. DIB-R原理

在整个渲染管线阶段,其实只有栅格化着色器这一步骤是无法可微的,在这一步,需要计算每个三角形覆盖了多少像素,每个像素从这个三角形中获取到了多少的信息。一般流程来说,需要进行深度测试来判断哪个三角形在最上面,之后遍历这个三角形的包围框里的像素判断是在三角形里面还是外面,而应该就是这个遍历判断的过程,被作者认为是不可微的:
可微分渲染:Learning to Predict 3D Objects with an Interpolation-based Differentiable Renderer_第2张图片
以上面图片为例,三角形覆盖了7个像素,在正常渲染的时候,我们当然可以用循环算法轻易计算出是这7个像素被覆盖,但是在进行反向传播的时候,我们却无法有一种通用的准则去判断这7个像素到底对这个三角形三个顶点以及这三个顶点各自的属性产生怎样的影响,因为在渲染的时候就缺乏这样一个函数式子,更别说求导了。
而在本文中,作者将这一光栅化的步骤进行了改进,使其支持可微分渲染(为了支持可微分渲染,就要尽量找函数式子来给光栅化这一步骤搭桥)。
首先在光栅化这一步骤是可以将所有像素分为两个部分的,一部分是被三角形覆盖的像素,每个像素对应特定的某一个三角形,一部分是不被任何三角形覆盖的像素。

  • 经过深度测试后,如果一个像素被三角形覆盖,那么可以建立如下的插值函数关系:
    i
    w
    其实就是通用的重心坐标插值,而这个权重w可以通过一个可微分函数 Ω \Omega Ω计算(作者说函数在appdedix里,但是找了一圈的这篇论文都没有appendix)
  • 对于没有被三角形覆盖的像素,肯定对每个三角形顶点的属性是没有影响的,但是对于三角形顶点的位置就不一定了,我们想象一下那些没有被三角形覆盖的像素肯定是限制了三维物体网格的范围的。所以有如下式子:
    aj
    ai
    A i A_i Ai指的就是像素 i i i的alpha通道, p i p_i pi是像素, f j f_j fj是某个三角形面,d是距离,n是所有三角形的个数。上面的式子表示的就是根据每个像素到每个三角形的距离,通过某种函数来计算每个像素的alpha通道。我们可以定性地分析下式子:
  1. 当三角形面数越多的时候,未被三角形覆盖的像素越不透明(有更多小于1的数相乘,1减去它们的积使得alpha越接近1)
  2. 如果有一个像素被三角形覆盖,或者说与三角形距离为0,那么最终式子乘积部分为0,这个像素是完全不透明的(alpha=1)
  3. 当像素与所有三角形的距离越远, A j A^j Aj越接近0,最终的式子越接近0,这个像素越透明,反之越不透明
  4. 渲染的时候,可以通过这种方式求出不透明的像素(被三角形覆盖),alpha恒为1,这些像素进一步进行插值操作计算相应的颜色值,对于透明的像素(未被三角形覆盖),这些像素不会进一步进行插值操作,没有相应的颜色,只有alpha通道,尽可能地去接近0,而并非等于0
  5. 反向传播的时候,那些被三角形覆盖的像素由于插值函数,与三角形的顶点位置与顶点属性建立了梯度上的链接,可以反过来去计算他们的梯度了;对于那些未被三角形覆盖的像素,通过alpha通道与面之间的函数关系也建立了梯度上的链接,可以进一步去优化各个三角形面了。

在正常的渲染管线里是不考虑alpha通道的,而在这里作者将alpha通道引进了栅格化着色器,通过设计的函数解决了无法进行反向传播的难题,从而使得整个渲染过程可微。

3. 可微渲染进行三维重建流程

可微分渲染:Learning to Predict 3D Objects with an Interpolation-based Differentiable Renderer_第3张图片
有了可微分渲染器,那么三维重建工作就可以建立以上的处理流程。
对于一张输入的图像,经过神经网络后,去预测得到一系列的mesh,light,texuture这三个三维属性。如果没有可微渲染的话,可以通过三维数据集来优化神经网络得到尽量准确的预测结果,有了可微渲染,就可以抛弃数据集了,在这些三维属性之后进行可微分渲染,根据loss优化三维属性,得到三维重建结果。而如果输入的图像足够多(如GAN生成),我们甚至可以把重建好的三维属性当做真实值去优化那个预测三维属性的神经网络!
其中有两个损失函数:

  1. IOU损失,用于优化形状:
    iou
    其中的S是我们输入图像的alpha通道矩阵(要求输入图像得是支持RGBA,并且非主体的背景部分alpha通道为0), S ~ \widetilde{S} S 是渲染图像的alpha通道矩阵,上面的loss其实就是操作了个交并比,使得两个alpha通道尽量一致,对应着就是渲染出的图像轮廓尽量与输入图像的轮廓相同。
  2. 颜色损失,用于优化纹理
    col
    这里简单地比较渲染图像与输入图像的RGB通道的l1损失即可,很容易理解

你可能感兴趣的:(#,三维重建,深度学习,计算机视觉,人工智能)