单图像三维重建、2D到3D风格迁移和3D DeepDream

项目网址:http://hiroharu-kato.com/projects_en/neural_renderer.html

代码网址: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。

单图像三维重建、2D到3D风格迁移和3D DeepDream_第1张图片

 

这篇论文主要有三个方面的贡献:

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生成图像,这个过程叫做光栅化。下图说明了单个图像的光栅化:

单图像三维重建、2D到3D风格迁移和3D DeepDream_第2张图片

(Vi是面的一个顶点,Ij是像素Pj的颜色值。Xi现在的位置是x0。当Xi向右移动,面的边与Pj的中心碰撞时,X1是Xi的位置。当Xi=X1时,Ij变成Iij)

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:

神经渲染器的应用

1、单图像三维重建:基于体素的方法能够直接生成一个3D模型,但是对于网格来说比较困难。因此,在这项工作中,作者不是从头生成网格,而是将预定义网格变形以生成新网格。具体地说,使用一个有642个顶点的各向同性球体,并使用局部偏置向量Bi和全局偏置向量C将每个顶点Vi变成Vi+Bi+C的形式。

分别定义轮廓损失Lsl和平滑度损失Lsm如下所示:

单图像三维重建、2D到3D风格迁移和3D DeepDream_第3张图片

轮廓损失中的S表示的是二进制mask,平滑度损失中的θ表示相邻两个面的夹角度数,两个损失函数分别保证了渲染后的效果和模型的光滑。

2、基于梯度的三维网格编辑:在这项工作中,基于其渲染图像R来优化由顶点Vi、面Fi和纹理Ti组成的3D网格m,而不是生成图像进行编辑。

2D到3D的风格迁移:在本节中,作者提出了一种将图像Xs的样式传输到网格Mc上的方法。对于二维图像,风格迁移是通过同时最小化内容损失和风格损失来实现的。在这里,作者把内容指定为三维网格Mc。为了使生成的网格形状与Mc相似,假设两个网格的顶点到面的关系相同,我们重新定义了如下内容损失函数:

作者使用了与2D应用中相同的风格损失,如下所示:

同时使用正则化器来降低噪声,设P表示图像R中所有相邻像素对的一组颜色:

3D DeepDream:设f(x)为输出图像x特征图的函数。对于2D图像来说,通过从x=x0开始的梯度下降最小化-|f(x)| 2F来实现图像x0的DeepDream。在类似的过程中,将-|f(R(m,φ))|2F相对于Vi和Ti最小化来实现DeepDream。

结果展示:

单图像三维重建、2D到3D风格迁移和3D DeepDream_第4张图片

从单个图像重三维网格。第一列:输入图像;第二至第四列:网格重建;第五至第七列:体素重建。

单图像三维重建、2D到3D风格迁移和3D DeepDream_第5张图片

通过体素IoU测量重建精度,越高越好。可以看到基于网格的方法在13个类别中有10个类别的性能优于基于体素的方法。

单图像三维重建、2D到3D风格迁移和3D DeepDream_第6张图片

网格在风格转换和DeepDream中的初始状态

单图像三维重建、2D到3D风格迁移和3D DeepDream_第7张图片

2D到3D风格迁移。风格图片有汤姆森5号(黄色日落)、巴别塔、尖叫和毕加索肖像

单图像三维重建、2D到3D风格迁移和3D DeepDream_第8张图片

3D网格的DeepDream

本文仅做学术分享,如有侵权,请联系删文。

更多关于三维重建的内容可以关注我的公众号:记不得曾经

单图像三维重建、2D到3D风格迁移和3D DeepDream_第9张图片

你可能感兴趣的:(三维重建,深度学习,pytorch,神经网络)