作者:LongwayDate:2020-04-25
代码网址:https://github.com/hiroharu-kato/neural_renderer
论文名称:Neural 3D Mesh Renderer(CVPR2018)
概述
对于二维图像背后的三维世界建模,哪一种三维表示最合适?现在常见的表示方法有点云、体素和网格,其中多边形网格具有良好的紧致性和几何性质。但是使用神经网络直接由多边形网格生成图像比较困难,因为光栅化的过程阻止了反向传播。因此,作者提出了一个近似的梯度栅格化,使渲染集成到神经网络。使用这个渲染器,可以执行带有轮廓图像监督的单图像三维网格重建,并且该系统比现有的基于体素的方法更好。此外,作者还首次在2D监督下执行基于梯度的3D网格编辑操作,如2D到3D风格迁移和3D DeepDream。
简介
从二维图像理解三维世界是计算机视觉的基本问题之一。人类在大脑中使用视网膜上的图像来模拟3D世界,机器也可以通过在2D图像背后显式地建模3D世界来更智能地工作。从3D世界生成图像的过程叫做渲染,这在计算机视觉里面非常重要。哪种3D表示方法是最适合建模3D世界?通常有体素、点云和多边形网格。体素难以生成高质量的体素,因为他们是在三维空间有规律地进行采样,并且记忆效率比较低。点云存在纹理和照明难以应用的问题,因为点云没有表面。多边形网格由一系列顶点和表面组成,因此它们是可伸缩的,并且有面,进而作者采用了这种方式。
使用网格这种表示方式有两个好处,第一个是表示三维模型时,需要的参数少,模型和数据集也相应比较小。第二个就是它适合几何变换。对象的旋转、平移和缩放由顶点上的简单操作表示。这篇文章提出了两个应用,如下图所示。第一个是单图像三维网格重建,第二个是基于梯度的3D网格编辑,包括风格迁移和DeepDream。
![](https://pic1.zhimg.com/80/v2-f5396a34aafbfbf3a815381433762d1d_720w.png)
这篇论文主要有三个方面的贡献:
1.提出了一个近似的梯度网格渲染,使渲染集成到神经网络;
2.实现了从单图像实现三维网格重建,并且没有3D监督;
3.实现了基于梯度的三维网格编辑操作,例如风格迁移和3D DeepDream。
相关工作
1.神经网络中的三维表示:三维表示有很多方法,比如前面提到的体素、点云等,但是它们都有一定的不足,或者不适合三维重建。其中,多边形网格具有存储效率高、适用于几何变换且具有曲面等特点,因此它实际上是计算机图形学(CG)和计算机辅助设计(CAD)中的标准形式。然而,由于多边形网格的数据结构是一个复杂的图形,很难集成到神经网络中。
2.单图片三维重建:从图像中估计三维结构是计算机视觉中的一个传统问题,大多数方法使用真实的三维模型来学习2D到3D的映射函数,有些作品通过深度预测重建三维结构,有些则直接预测三维形状。实际上,无需3D监督即可实现三维预测,只需要待重建物体的轮廓即可。
3.通过梯度下降编辑图像:利用可微特征提取器和损失函数,通过反向传播和梯度下降,可以生成损失最小的图像,DeepDream就是这样一个例子。初始图像被反复更新,使得其图像特征的大小变得更大,通过这个过程,像狗和汽车这样的物体逐渐出现在图像中,图像风格转换可能是最熟悉和最实际的例子了,给定内容图像和样式图像,将生成具有指定内容和样式的图像。
该渲染器提供图像相对于网格顶点和纹理的渐变。因此,利用二维图像的损失函数就可以实现网格的DeepDream和风格转换。
渲染的近似梯度
1.渲染通道及其派生:一个3D网格由一组顶点和面组成,每个顶点No是一个三维向量,表示这个顶点在3D物体空间中的坐标,每个面F是由三个顶点所围成的三角形。为了生成这个对象,物体空间中的顶点No被转化为屏幕空间中的顶点Ns,这个顶点Ns是一个二维向量。
通过采样从屏幕空间的顶点Ns和面F生成图像,这个过程叫做光栅化。下图说明了单个图像的光栅化:
![](https://pic1.zhimg.com/80/v2-3b44934fec8b15f6fece487b2ccd128f_720w.png)
2.单面光栅化:这一部分主要讲解了当像素点在里面或者外面时,如何定义偏导函数。涉及到的公式比较多,后面将以视频的方式呈现,如果想要提前了解的可以联系我。
3.多面光栅化:如果有多个面,光栅化器只在每个像素处绘制最前面的面,这与标准方法相同。在向后传递的过程中,首先检查是否绘制了交叉点Iij、Iaij和Ibij,如果它们被不包括Vi的表面遮挡,则不流动梯度。
4.纹理:纹理可以映射到面上。在这个项目中,每个面都有自己的大小为St×St×St的纹理图像。使用质心坐标系确定纹理空间中对应于三角形{V1,V2,V3}上位置P的坐标。换句话说,如果P表示为P=W1V1+W2V2+W3V3,则让(w1,w2,w3)成为纹理空间中的相应坐标。
5.照明:照明系统可以直接应用于网格上,在这项工作中,使用了简单的环境光和无阴影的平行光。设la和ld分别为环境光和平行光的强度,nd为指示平行光方向的单位矢量,nj为面的法向矢量。然后,将表面像素Ilj的修改颜色定义为:
![](https://pic2.zhimg.com/80/v2-d36d9350cc7d2deb9102305cf2bf9d1d_720w.webp)
神经渲染器的应用
1.单图像三维重建:基于体素的方法能够直接生成一个3D模型,但是对于网格来说比较困难。因此,在这项工作中,作者不是从头生成网格,而是将预定义网格变形以生成新网格。具体地说,使用一个有642个顶点的各向同性球体,并使用局部偏置向量Bi和全局偏置向量C将每个顶点Vi变成Vi+Bi+C的形式。分别定义轮廓损失Lsl和平滑度损失Lsm如下所示:
![](https://pic1.zhimg.com/80/v2-a64edc47fe07e72413f0e2a501b38f87_720w.webp)
轮廓损失中的S表示的是二进制mask,平滑度损失中的θ表示相邻两个面的夹角度数,两个损失函数分别保证了渲染后的效果和模型的光滑。
2.基于梯度的三维网格编辑:在这项工作中,基于其渲染图像R来优化由顶点Vi、面Fi和纹理Ti组成的3D网格m,而不是生成图像进行编辑。
2D到3D的风格迁移:在本节中,作者提出了一种将图像Xs的样式传输到网格Mc上的方法。对于二维图像,风格迁移是通过同时最小化内容损失和风格损失来实现的。在这里,作者把内容指定为三维网格Mc。为了使生成的网格形状与Mc相似,假设两个网格的顶点到面的关系相同,我们重新定义了如下内容损失函数:
![](https://pic3.zhimg.com/80/v2-50dbcf4cef4d7cf96ae756902d49ca75_720w.webp)
作者使用了与2D应用中相同的风格损失,如下所示:
![](https://pic4.zhimg.com/80/v2-0906beb4654b50000e1f9a735f93d2bb_720w.webp)
同时使用正则化器来降低噪声,设P表示图像R中所有相邻像素对的一组颜色:
![](https://pic4.zhimg.com/80/v2-306815837ddbe76cbdd85e8ec65e6e79_720w.webp)
3D DeepDream:设f(x)为输出图像x特征图的函数。对于2D图像来说,通过从x=x0开始的梯度下降最小化-|f(x)|2F来实现图像x0的DeepDream。在类似的过程中,将-|f(R(m,φ))|2F相对于Vi和Ti最小化来实现DeepDream。
结果展示
![](https://pic2.zhimg.com/80/v2-7df36a4ceca314c00cca6289261e4911_720w.png)
![](https://pic3.zhimg.com/80/v2-99ea21e3b798ac6c69f0f8e5fe1dc197_720w.png)
![](https://pic1.zhimg.com/80/v2-0ca84e746fb15dbf9e4f7678e97ebdc2_720w.png)
![](https://pic3.zhimg.com/80/v2-6a4997494ab60e7310717543db8cf6a5_720w.png)
![](https://pic3.zhimg.com/80/v2-fb954c2ea52cb5029b0136b314e17d8d_720w.png)