博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计一个适合三维网格重建的卷积神经网络
阅读量:2242 次
发布时间:2019-05-09

本文共 5419 字,大约阅读时间需要 18 分钟。

点击蓝字

关注我们

AI TIME欢迎每一位AI爱好者的加入!

普通的神经网络不适用于比较大的网格(因为参数会过多),而传统的卷积神经网络又没法应用在拥有不规则结构的三维网格上。因此,我们把传统的卷积神经网络加以改进,使其可以拓展到任意结构的网格上。和近年来出现的许多其他的网格(图)卷积神经网络相比,我们的网络能更好地重建全局和局部信息,拥有更强大的生成能力,并且支持所有诸如上下采样的传统卷积神经网络所拥有的操作。

周易:本科和硕士毕业于上海交通大学,导师是肖双九,2020年博士毕业于南加州大学,导师是黎颢(Hao Li)。主要研究3D虚拟人类合成。现就职于Adobe  Research。

一、三维网格重建的意义与现状

通过计算机来创造虚拟、智能且拥有自主行为的三维的或真实或卡通的人物涉及了Digital Human以及Autonomous 3D Characters等技术。实现这一目标,首先需要把真实事件中获取的信息在虚拟的三维世界中重新还原为人形。然后,当获得了虚拟的人类或者卡通角色的外壳之后,让他们自主的行动起来。

但不论是三维模型重建和渲染,亦或者是运动的合成都有着同一个问题,那就是哪一种Representation可以用来表示三维时空信息,并且这些数据又应该采用怎样的深度学习网络结构去处理呢?这就引出了本次的主题Deep Representation Learning。

本次分享文章的题目是Fully Convolutional Mesh Autoencoder using Spatially Varying Kernels。这篇论文的主要目的是如何在mesh数据上做一个fully convolutional autoencoder。

是什么促成了这个研究的产生呢?在Digital human的研究过程中,会获得大量的真实人体模型。之后通过一系列算法把模型处理成registered 3D mesh,其特征是拥有这相同的拓扑结构、相同节点数和连接关系,但是形状具有差别的一系列3D网络模型。

以上图所展现的人群为例,第一步:获得其registered 3D mesh;第二步:从这些数据中获得一个低维的latent code;第三步:通过获得的latent code生成新的三维人体模型。在过去的方法中,主要采用PCA来实现以上过程,但是其缺陷也很明显,会丢失很多细节。

随着技术的发展,越来越多的人尝试通过Deep Learning获得latent code。但是类似于传统的CNN这类普通的神经网络无法直接作用于三维网格模型,这需要新的解决方法。

一种常见的方法是通过剪切和变形将三维模型参数化的映射到2D图片上。这种参数化3D模型的方法被称为UV Mapping。基于以上的2D UV图片,就能够通过传统的CNN来构建一个Autoencoder,之后通过CNN获得的UV图片可以通过相应的映射方式转换成三维的Mesh。

但是这样的方式并不是完美的,它有着两个缺陷,第一个:沿着剪开的缝隙方向,会出现严重的Artifact;第二个:CNN网络对于局部的信息,例如褶皱以及高低突起有着较好的重建效果,但在全局的结构方面,例如身体姿态,就无法实现重建。

二、模型理论设计

既然现有的方法无法满足实际的需求,就需要设计一个新的CNN网络结构,使得其可以应用于Mesh数据。但是设计这样的一个Mesh CNN不是一蹴而就的,CNN能够用于拥有规则网络结构的数据上,但是却很难扩展到不规则的网格上。

在右边的Mesh CNN上,可以看到每个节点可能拥有不同数量的相邻节点,这意味着对于所有的局部区域是无法使用固定形状的卷积核。即便是理想状态下相邻节点的个数保持相同,也无法保持每个局部区域的采样方式,例如相邻节点的方向和位置也会有差异。因此相同卷积核的设计理念并不适合这样的不规则网格结构。

对近些年的研究工作整理对比,能够发现他们的工作大多关注于Mesh或者说是Graph CNN网络设计。当然也有人专注于Surface Mesh,但是他们的方法用于Mesh Autoencoder的效果并不能符合要求,这些方法的Reconstruction Accuracy不够高,Generalizability不够好,甚至有些计算方式使得运算缓慢。而且这些方法都不约而同的回避了全局特征抽取,卷积核的设计对于抽取局部特征比较擅长,但这样的结果使得一些方向和位置信息丢失。因此这些方法可能很适合做分类或Segmentation方面的任务,但对于重建几何信息并不擅长。

作者提出的方法能实现更准确的还原,不论是局部还是全局,不管是几何还是颜色等信息。而且从对比图中也能够看出本次分享的方法在准确度方面是最高的。而且这个Autoencoder拥有更强大的生成能力,突破了其他方法对于CNN网络的功能的限制,使其更加接近于传统的CNN所拥有的功能和性质,例如stride、kernel size、pooling、unpooling、receptive field等。

接下来看看这里的Autoencoder是怎么解决上述问题的。观察上面的Mesh Model,可以了解到一个mesh其实是对一个连续空间的离散表示。那么在一个连续的空间中,如果假设通过一个连续的kernel处理整个连续空间的信息,那么相应的就有可能通过对连续的kernel采样出离散的网格上的局部信息。

这项工作的主要目的可以简述为把传统的卷积操作扩展到不规则的mesh上使用。最右边的图片展示了一个圆形的网格,称之为weight basis,可以看作一个固定且结构规则的卷积核。当需要在不规则的mesh上做卷积操作的时候,就可以对上述的卷积核做线性采样。那么最终实际使用的每个节点的卷积权重是通过一组interpolation参数对权重偏差的线性采样结果。并且这组interpolation参数在每个局部区域都有着各自的值。因此在训练网络的过程中,网络要同时学习全局相同的权重偏差和局部不同的采样参数。

最终完成的卷积操作函数如上图所示。参数B是每一个卷积网络层的权重偏差。参数A代表着每个局部区域的每一条边。因此每条边的权重计算就是以A为参数的对B中的原数的线性相加。最终的输出特征函数就是输入特征x和对应边的权重相乘的总和,并且加入偏差bias,其输出的特征与传统的CNN是一样的。在这个函数中,权重偏差B以及局部系数A都是模型训练的参数,而且对于整个数据集里面的所有模型都是相同的。

解决了特征提取的操作,接下来就是池化的问题。对比传统CNN网络中,池化是统一的,即每个节点的权重相同。而在不规则Mesh上,因为每个点的采样密度都不统一,所以uniform integration是不合适的。因此作者在池化的设计中使用了蒙特卡洛积分。每个节点的密度系数是有差异的,因此系数的获取就可以通过模型训练自动获得,之后在函数中对学习得到的密度系数取绝对值,并且做归一化,保证其值为正,且每个局部的总和都为一。

处理完池化之后,又有一个新的问题摆在了Autoencoder网络面前,即网格的上采样和下采样,这在之前的对mesh处理的论文中是没有解决的,尤其是上采样处理。作者在这里不仅给出了stride的卷积和池化方法,还提供了transpose convolution和unpooling的方法。

总的来说这一系列上采样和下采样的方法仅仅取决于mesh的topology,而不是mesh的任何特征。这意味着可以在正式开始训练之前,对图进行上采样和下采样的预处理,并且这样的方法使得最后每个节点的感受野能够实现以传统CNN那样逐层均匀递增的效果。

三、模型结构具体实现

上表总结了可以提供的一系列CNN网络中的operation和attributes,可以看到基本涵盖了普通CNN的所有功能。

解决了以上问题之后,就可以利用定义的CNN layers 设计一个fully convolutional的mesh encoder。以一个人体模型为例作为详细说明,在这个模型中通过四层具有下采样的残差块将一个接近有7000个点的mesh压缩到了7个点,其中每个点有着9个通道的latent code。之后再用另外四层具有上采样的残差块将这些latent vertex还原成一个接近7000点的mesh。采用fully convolutional,而不是中间有全连接层的结构,是为了使得中间的7个latent vertex上的latent feature在空间上具有不同的含义。

为了更好的说明latent vertex的作用,上图展示了一组对比。左图显示的是latent vertex会负责身体某个区域的feature,其receptive field即感受野是从定点开始逐渐向外延伸的。而右侧图片则是之前一些论文中采用的上下采样方式,称为Quadric Mesh Simplification的方法,这种方法很明显不具备这种优势。

网络的设计究竟有没有效果还得在不同的数据集上进行测试。左上角的图是在D-Faust人体数据集上的测试结果,期间还对比了the state-of-the-art in Nerual 3DMM,可以看到本文的模型在准确度上有着明显的优势。这个数据集中的人体模型属于surface mesh,但实际应用中获得的数据有可能并非surface mesh的结构,因此the state-of-the-art in Nerual 3DMM无法处理一些非surface mesh结构,即其具有一定的局限性。

除了人体模型外,本文的模型还应用于其他形式的网格结构上,例如左边由多个四面体构成的体网格三维模型结构的动态小龙,这个模型展现了模型对于运动过程重建的能力。右边的树则是展现了模型的多部件组成能力,甚至在非流形的结构情况也能够有很好的表现。

基于现在运算过程都通过GPU实现并行运算,所以能够快速的处理规模大,细节多的三维模型。例如左边的示例是训练在Facebook内部的高清人体数据集上的结果,可以看到一些身体的细节,比如说衣服上的褶皱,手臂上的纹路,比如说血管等结构。右边则是训练在手的数据上的测试结果,结果中的三维坐标和颜色都是通过CNN网络重建获得的。

本文中独特的fully convolutional结构下,每个latent vertex都能够掌握某一部分的形成,这给了模型新的可操作空间。这些latent feature可以用于局部区域的插值和替换。上图中有两个mesh,一个Man A,一个Man B。传统的autoencoder只能对两个mesh做全局渐变,但是本文的网络则能够做到把A的左腿上的latent code替换为B的,然后获得新的mesh就同时具有了A的形态和B的动作。

前面介绍了替换的例子,这里还有一个插值的例子。在对手的autoencoder进行训练时,把latent vertex部署在了5个手指端部以及手腕处。所以当给定一个source mesh和一个target mesh的时候,模型不仅能够如同其他方法一样实现全局的插值,还能够对不同手指做分别的插值,结果如右侧图所示。因此即便只有两个手的模型,依然能够模拟出足够多的手部变化。

四、从现阶段看未来的研究方向

最后,阐述一下研究方法的局限和未来的工作。在上图中显示的是本文的方法和其他方法的优劣对比。横轴是Reconstruction Accuracy,纵轴是方法的灵活性。

本文的方法有着很高的Reconstruction Accuracy,并且对于任意网格结构都有很好的适应性,但所有训练和测试数据必须是预处理好的register mesh即connectivity具有一致性,这限制了其发挥。

而有的方法灵活性很高,例如GAT,FeaST,MoNet,它们可以用在任意不同的Graph上,但是其Reconstruction Accuracy很低。所以说如何能够设计出坐标在右上角的兼具灵活性和准确性的mesh CNN的方法会是未来的研究点。

相关资料

代码:

https://github.com/facebookresearch/VCMeshConv

论文链接:

https://zhouyisjtu.github.io/project_vcmeshcnn/vcmeshcnn.html

  e           m     t

往期精彩

 AI                i

整理:闫昊

审稿:周易

排版:白雪

AI TIME欢迎AI领域学者投稿,期待大家剖析学科历史发展和前沿技术。针对热门话题,我们将邀请专家一起论道。同时,我们也长期招募优质的撰稿人,顶级的平台需要顶级的你!

请将简历等信息发至yun.he@aminer.cn!

微信联系:AITIME_HY

AI TIME是清华大学计算机系一群关注人工智能发展,并有思想情怀的青年学者们创办的圈子,旨在发扬科学思辨精神,邀请各界人士对人工智能理论、算法、场景、应用的本质问题进行探索,加强思想碰撞,打造一个知识分享的聚集地。

更多资讯请扫码关注

 

(直播回放:https://b23.tv/X4cMQX)

(点击“阅读原文”下载本次报告ppt)

转载地址:http://zggbb.baihongyu.com/

你可能感兴趣的文章
Java Guava中的函数式编程讲解
查看>>
Eclipse Memory Analyzer 使用技巧
查看>>
tomcat连接超时
查看>>
谈谈编程思想
查看>>
iOS MapKit导航及地理转码辅助类
查看>>
检测iOS的网络可用性并打开网络设置
查看>>
简单封装FMDB操作sqlite的模板
查看>>
iOS开发中Instruments的用法
查看>>
强引用 软引用 弱引用 虚引用
查看>>
数据类型 java转换
查看>>
"NetworkError: 400 Bad Request - http://172.16.47.117:8088/rhip/**/####t/approval?date=976
查看>>
mybatis 根据 数据库表 自动生成 实体
查看>>
C结构体、C++结构体、C++类的区别
查看>>
进程和线程的概念、区别和联系
查看>>
CMake 入门实战
查看>>
绑定CPU逻辑核心的利器——taskset
查看>>
Linux下perf性能测试火焰图只显示函数地址不显示函数名的问题
查看>>
c结构体、c++结构体和c++类的区别以及错误纠正
查看>>
Linux下查看根目录各文件内存占用情况
查看>>
A星算法详解(个人认为最详细,最通俗易懂的一个版本)
查看>>