该paper是由普林斯顿大学3个英特尔实验室4个复旦大学数据科学学院以及5个腾讯人工智能实验室研究员合作的。来自于复旦大学计算机科学学院上海市智能信息处理重点实验室。该论文已经投中ECCV2018。
图1 最左侧为输入图像,最后一个是改论文框架的Mesh结果,中间两个是对比别人的结果
一句话概括
这篇文章是三维重建领域的一篇比较新颖的paper,其新颖点就在于其3D模型并不需要借助点云、深度或者其他更加信息丰富的数据信息,而是直接从单张彩色图片直接得到3D mesh(图1是结果对比)。
摘要导读
本文提出了一种端到端的深度学习架构,它可以从一张彩色图像生成三角形网格中的三维形状。受深度神经网络性质的限制,以往的方法通常以体积或点云的形式表示三维形状,将其转化为更易于使用的网格模型并非易事。与现有的方法不同,本文的网络在基于图卷积神经网络中表示三维网格,并利用从输入图像中提取的感知特征,通过逐步变形椭球面来生成正确的几何形状。我们采用由粗到精的策略使整个变形过程稳定,并定义各种网格相关的损耗来捕获不同层次的属性,以保证视觉上的吸引力和物理上准确的3D几何。
大量的实验表明,本文的方法不仅能定性地生成具有更好细节的网格模型,而且与现有方法相比,还能获得更高的三维形状估计精度。
总结一下:
- 本文用端到端的神经网络实现了从单张彩色图直接生成用mesh表示的物体三维信息;
- 采用GCN来表示3D mesh信息,利用从输入图像提到的特征逐渐对椭圆进行变形从而产生正确的几何形状;
- 为了让整个形变的过程更加稳定,文章还采用coarse-to-fine从粗粒度到细粒度的方式;
- 为生成的mesh设计了几种不同的损失函数来让整个模型生成的效果更加好。
接下来,我们一起去看看这篇论文主要是怎么实现的这个变换的过程的,而各部分又是如何进行表示的。go~!
模型方法介绍
首先是框架结构图:
图2 框架结构图 分为上下两层,上层是图像处理层,下面的是网格变形层
具体怎么工作的呢?我们先来看一下流程:
首先是输入部分,给定一张普通的图像Input Image(飞机) ,为任意的输入图像都初始化一个椭球体作为其初始三维形状:Ellipsoid Mesh(椭球) 。整个网络可以大概分成上下两个部分:
- 上面部分负责用全卷积神经网络提取输入图像的特征信息;
- 下面部分负责用图卷积神经网络来表示三维mesh,并对三维mesh不断进行形变,目标是得到最终的输出(最后边的飞机)。
此时我们很好奇,如何将二维(图像卷积)和三维(Mesh)联系在一起的呢?大家是否注意到图中的由上到下的淡蓝色箭头没有?对,就是 Perceptual Feature pooling 层,它将上面的2D图像信息和下面的3Dmesh信息联系在一起了,即通过借鉴2D图像特征来调整3D mesh中的图卷积网络的节点状态。这个过程可以看成是mesh deformation 。如果您观察的仔细的话,肯定会看到在 Mesh deformation 旁边还杵着一个层结点 Graph Unpooling 的,这个是一个关键的组成部分,不可小看它,文章提出 Graph Unpooling层是为了让图节点依次增加,从图中可以直接看到节点数是由156vertices,628vertices到2466vertices变换的,这其实就是coarse-to-fine的体现。
框架关键点
通过上面的框架结构体的学习,大家应该对该框架有个整体的了解了吧!接下来我们就来看一下比较关键的几个部分,比如怎么表示3D mesh,又是怎么从2D图像信息中提取信息来帮助3D mesh的转变?
1.GCN
做三维建模少不了你要了解图卷积,因为相比于更加适合欧几里得空间的数据表示和学习的普通的CNN和RNN,GCN在表示3D结构上具有天然的优势。我们知道3D mesh是由顶点v,边e,面 face来描述三维对象的,这正好对应于与图卷积神经网络M = (V, E, F)一一对应:V (N个顶点),E (E条边),F(N个顶点的特征向量)。
图卷积的定义如下:
- f(p,l), f(p,l 1)分别表示顶点p在卷积操作前后的特征向量;
- N(p)指顶点p的邻居节点;
- W1,W2表示待学习的参数;
整个公式就是表达了图卷积神经网络的节点是根据其自身的特征和邻居节点的特征来进行更新的,这样3D mesh的表示以及节点状态更新问题就解决了。
2.Mesh Deformation Block & Perceptual Feature Pooling (网格变形块 & 感知特征池)
图3 (a) 网格变形块 (b) 感知特征池
根据图中的从左到右的顺序,我们逐个的来看:(a)Mesh Deformation Block ,首先是输入:C(i-1) 表示三维顶点坐标,P表示图像特征,F(i-1)表示原始三维顶点特征;再看输出:Ci 新的三维坐标,Fi新的三维顶点特征。也就是说这个网格变形块主要目的就是根据P来改变C和F的,也就是通过图像改变三维点特征和位置。具体的改变方式是依赖于Percepptual Feature Pooling 和 G-ResNet。Percepptual Feature Pooling层负责根据三维顶点坐标C(i-1)从图像特征P中提取对应的信息,然后将提取到的各个顶点特征再与上一时刻的顶点特征F(i-1)做融合,作为G-ResNet(graph-based ResNet)的输入;G-ResNet输出 新的三维坐标Ci和新的三维顶点特征Fi。
接下来让我们详细的去看一下Percepptual Feature Pooling 和 G-ResNet,弄懂了这两点,也就明白了问题所在。
2.1 perceptual feature pooling
如上图中(b)所示,该组件负责给定三维坐标点以及图像特征的情况下,获取到三维点对应的特征信息。首先将3D坐标信息映射回2D坐标点,然后取2D坐标点边上最近的四个点进行双线性插值,其结果作为这个顶点的特征;特别的文章中取了VGG中的conv3_3(256维),conv4_3(512维),conv_5_3(512维)的特征进行连接,那么每个顶点就有1280维的特征。除了最开始的block没有F(i-1)的信息外,其他的block都还能利用上一时刻的128维度的F信息,一共1408维。
2.2 G-ResNet
如上图 (a)中间的部分。前面为每个顶点都得到了1408维的特征(除了第一个block)通过G-ResNet就能得到新的位置坐标C和每个顶点的形状特征F;这就需要节点之间有效的信息交换,但每次图卷积网络只能交换邻居节点的信息,很影响新的交换效率,有点类似2D CNN的小感受野。所以为了解决这个问题,就在深层网络中增加了shortcut连接结构并把它定义为G-ResNet,其中每个block的G-ResNet的结构都是一样的(14个conv 1 shortcut),输出128维3D特征,这样就产生新的128维的节点形状信息。另外在特征输出部分,有一个分支将一个额外的图形卷积层应用到最后一层特征上,输出顶点的三维坐标。这样就满足了节点坐标和特征的更新。
优化
1.Graph unpooling
做三维最头疼的就是数据量太大,硬件跟不上。(心有余而设备不足,余额也不足!)为了减少了内存成本并产生更好的结果,本文引入了Graph unpooling layer。Graph unpooling layer的目标是增加GCNN中的顶点数量,降低训练难度。主要有face-based和edge-based这2种方式:1)face-based方式:在每个三角形的中心添加一个顶点,并将其与三角形的三个顶点连接起来,但这会导致顶点度数不平衡,即顶点上的边数。2)edge-based方式(本文采用的):受计算机图形学中网格细分算法的顶点添加策略的启发,在每条边的中心添加一个顶点,并将其与这条边的两个端点连接起来,将新添加顶点的3D特征设为其两个相邻顶点的平均值。我们也连接三个顶点,如果它们被添加到同一个三角形(虚线)图 4a。
2.loss损失
本文定义了四种损失来约束输出形状的性质和变形过程,以获得满意的结果。采用倒角损失(Chamfer loss)[9]来约束网格顶点的位置;采用法向损失(Normal loss)来加强曲面法向的一致性,采用拉普拉斯正则化(Laplacian regularization)来保持变形过程中相邻顶点之间的相对位置,采用边缘长度正则化(Edge length regularization)来防止离群点。
2.1 Chamfer loss
Chamfer distance是指两点之间的距离 lc,将顶点回归到其正确的位置是合理的,但是并不足以产生良好的3D网格。
2.2 Normal loss
本文进一步定义了表面法向损耗来表征高阶特性 ln,其中k取自于N(p),q是计算倒角损失时找到的p的最近点,k 是 p 的邻点。<.,.>是求内积,nq是来自于网格真实区域观测到的表面法线。从本质上说,这种损失需要一个顶点与其相邻顶点之间的边垂直于从网格真实区域观测到的。可能会发现,这种损失不等于零,除非在平面上。然而,优化这一损失相当于强迫局部拟合切平面的法线与观测值一致,这在其实验中得到了很好的效果。此外,这种正常损耗是完全可微的,易于优化。即使有倒角损失和法向损失,优化也很容易陷入局部极小值。更具体地说,网络可能会产生一些超大的变形,从而有利于局部的一致性,这在一开始的时候尤其有害,因为估计距离真实区域很远,会导致顶点飞起。
2.3 Laplacian regularization
为了解决这些问题,本文首先提出一个拉普拉斯项来防止顶点过于自由移动,从而避免网格自交。拉普拉斯术语用作局部细节保留操作符,它鼓励相邻的顶点具有相同的移动。在第一个变形块中,由于该变形块的输入为处处光滑的椭球体,故其表现为表面光滑项;从第二个块开始,它可以防止3D网格模型变形太多,因此只向网格模型添加细粒度的细节。为了计算这种损失,我们首先为每个顶点p定义一个拉普拉斯坐标:
拉普拉斯正则化定义为:
δ‘p和δp一个顶点在一个变形块之前之后的拉普拉斯坐标。
2.4 Edge length regularization
通常在长边,为了约束偏差过大的顶点,本文增加了一个边缘长度正则化损失:
总损失是所有四项损失的加权和:
其中λ1 = 1.6e - 4, λ2 = 0.3 和 λ3 = 0.1,它们是所有实验中平衡损耗和固定的超参数。
总 结
本文中主要讲述了如何直接从单张彩色图片直接得到3D mesh,并在每一步详细的分析了特征的提取与2D和3D的匹配和融合,方法新颖,做法很不错!值得我们去学习和研究!
论文链接:
http://openaccess.thecvf.com/content_ECCV_2018/papers/Nanyang_Wang_Pixel2Mesh_Generating_3D_ECCV_2018_paper.pdf
代码链接:https://github.com/nywang16/Pixel2Mesh