人脸重建速览,从3DMM到表情驱动动画-程序员宅基地

技术标签: 人工智能  游戏  移动开发  

欢迎关注收藏或分享,转载请注明出处。
个人专栏


人脸重建是计算机视觉比较热门的一个方向,3d人脸相关应用也是近年来短视频领域的新玩法。不管是Facebook收购的MSQRD,还是Apple研发的Animoji,底层技术都与三维人脸重建有关。

同时,实现人脸重建及相关应用需要深入了解优化算法等,工程量也不小,是学习cv的一个很好切入点。

▲ Apple推出Animoji[0]

▲ Facebook收购MSQRD[1]

这里的人脸重建指,通过二维人脸图像重建出该人脸的三维模型。 大概有以下几种方法: 通过多视图几何来重建,这个需要采集不同角度的人脸,对设备的要求也比较高; 通过RGBD或RGB相机,用3D Morphable Model(3DMM)方法来重建。这种方法也有局限性,由于模型特点所致,无法生成模型细节(皱纹等); 还有近年来出现的使用深度学习方法来重建(有的是结合传统3DMM方法,训练其人脸模型参数)。

本文主要讲讲单目RGB相机的3DMM方法。这种方法对设备要求低,算法简单,易于移动端实现实时重建。这里的前提是我们已经有了图像人脸检测的关键点。输入图像及检测到的人脸关键点,输出人脸三维网格。

概述

3DMM方法由Blanz[2]99年首次提出,往后的改进通常是基于他们的工作。这种方法有一个关于人脸模型的”先验知识“,即可形变模型。因此不管人脸处于什么角度,都能得到较完整的人脸。

现在比较常见的人脸模型有Basel Face Model(BFM)、Surrey Face Model(SFM)、FaceWarehouse、Large Scale Facial Model (LSFM)等。其中,LSFM可能是如今最精准的模型。BFM比较容易获取,很多人用它进行实验。SFM的开源框架也为社区做出了巨大贡献。同时,浙大团队的FaceWarehouse以及一系列相关的文章都值得一读。

▲1999年提出的3DMM方法[2]

首先需要了解参数化人脸模型blendshape模型两个概念。

参数化人脸模型

在Blanz的方法中,他们扫描200张成年人的人头模型,每个模型包含大约70000个顶点。经过PCA处理,制作成参数化人脸模型,每张人脸模型的拓扑结构相同,只是顶点位置或颜色有所差异。你可以把各个特征向量看作是人脸不同的特征,比如脸的长短,胖瘦等。

这里人脸模型分成两个向量:

形状:S = (X_1, Y_1, Z_1, X_2, ..., Y_n, Z_n)^T \in R^{3n}
纹理:T = (R_1, G_1, B_1, R_2, ..., G_n, B_n)^T \in R^{3n}

因此任意新的一个人脸都可由这些特征向量线性组合生成:

S = \bar S + \sum_{i=1}^{m}a_iS_i
T = \bar T + \sum_{i=1}^{m}b_iT_i
\sum_{i=1}^{m}a_i = \sum_{i=1}^{m}b_i = 1

▲参数化人脸模型[2]

blendshape表情模型

blendshape是3d软件里用来做模型形变的一种技术,通过调整权重,设计师可以将目标模型变化成一系列预定义的模型,或者这些模型的任意线形组合。

▲blendshape模型,调整权重形成新的表情

在数字制作行业,通常用blendshape来制作表情,即用一组脸部基本表情合成新表情。同样,这些模型的拓扑结构一致,改变的只是顶点位置。为了不出现崩坏扭曲的表情,对权重做限制。

B = \sum_{i=0}^{m}w_iB_i; \sum_i = 1

在人脸重建时,通常会使用delta blendshape,即各个表情与正常表情的差值。

B = B_0 + \sum_{i=1}^mw_i(B_i - B_0) = B_0 + \sum_{i=1}^mw_iD_i

将blendshape和参数人脸模型结合起来就有:

S = \bar S + \sum_{i=1}^{m}a_iS_i + \sum_{i=1}^mw_iD_i

S表示一张有着某人脸特征和某表情的脸部模型。

​ ▲包含形状特征和表情的人脸模型[3]

重建

根据给定图像来“估计”人脸模型,有点像渲染的逆过程。因此,除了人脸模型,还得考虑相机参数。

这里采用弱透视投影

弱透视投影使用与正交投影相同的原则,但乘以一个缩放参数来实现近大远小的效果。

可看作透视投影和正交投影的混合体。[4]

​ ▲三维模型的弱透视投影

重建算法的关键在于找出合适的参数 s, R, t, \vec a, \vec b, \vec w,使三维人脸模型在平面的投影尽可能接近原图像。如果不考虑纹理,可简化为**“使人脸模型关键点在平面上的投影与2d人脸关键点的位置尽可能接近”**。

▲人脸图像与模型关键点一一对应

有一点需要注意,常见的人脸关键点检测结果一般是二维点。也就是说,脸的朝向不同,检测到的脸部边缘点也会不一样,2d人脸边缘点并不在真正的脸颊边缘线上

详情可看下图。上排图像的蓝点是二维人脸检测点(2d)。下排图像蓝点是模型关键点(3d),红点是对应的2d点。可以清楚看出,图像检测出的2d边缘点与模型本身3d边缘点不同。因此,在迭代过程中,需要不断更新模型的3d边缘点索引,使二者一一对应。

▲三维模型边缘点与人脸检测边缘点不同[5]

有很多方法可以找出三维模型在当前视角下的边缘点。

可以用凸包算法求出边缘线,也可以根据法线与视线夹角,求出脸部切线。或者参考[5]中描述,在一组预先保存的脸部线条上求出最外侧的点。

通过以上描述,我们已经将重建问题转为最优化问题。

E = \sum_{i=0}^n ||(s*R*S + t)_{i_{3d}} - Y_{i_{2d}}||_2^2

其中,S是人脸模型,s是缩放尺度,R是旋转矩阵,t是位移向量,Y是人脸检测点,n为人脸关键点个数。i_{2d}i_{3d}分别是人脸图像关键点及人脸三维模型点的索引。

由于投影变化存在,这是个非线性最小二乘问题。可以用Gauss-Newton ,Levenberg-Marquardt等算法求解,这里不展开讲。

还有另外一种比较简单的方法。

先利用2d与3d点集估计出模型的相机参数,带入上式转为线性问题。然后分阶段求出人脸参数和表情参数。整个迭代过程都是固定一部分参数,更新其他参数。

人脸形状特征参数和表情参数都需要控制在一定范围内(视模型而定),不然可能会出现不合理的模型形状。在视频场景中,还需要考虑帧间稳定性以及前后人脸特征一致等问题。

▲重建出人脸模型

应用

完成重建后,我们可获得人脸三维网格、模型在图像中的位置,以及当前人脸的blendshape表情参数。 基于以上信息,可以实现各种有意思的效果,下面根据这几组参数分别举一些例子。

三维网格和空间位置

有了三维模型和位置信息,我们可以在渲染时把人脸模型遮挡掉,做出三维贴纸的效果,诸如戴头饰、眼镜之类。

▲在三维建模工具中建好模型,调整与人脸的相对位置

▲实时效果

模型和纹理

绘制模型uv贴图,再把人脸模型渲染出来。可以利用这种方法给人脸加上胡子、彩绘、面具等。

▲模型的uv贴图

​ ▲渲染出带有贴图的人脸模型

人脸模型参数与表情参数

可以将计算出的表情权重迁移到相同设置的blendshape模型上,用人脸去驱动模型动画,实现类似animoji的效果。也可以改变人脸原有的表情参数,让照片动起来。

▲模型的blendshape需要与人脸的blendshape一致(表情相同)[6]

▲人脸驱动模型动画

▲让照片“活”起来

大概写到这,其他方法或细节以后有机会再补充。


参考

[0] Apple just unveiled 'Animoji' — emojis that talk and sync to your face
[1] Facebook buys popular face swapping app for silly selfies
[2] A Morphable Model For The Synthesis Of 3D Faces
[3] Face Transfer with Multilinear Models
[4] 3D projection
[5] High-Fidelity Pose and Expression Normalization for Face Recognition in the Wild
[6] iPhone X Facial Capture – Apple blendshapes

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_33923148/article/details/91371213

智能推荐

艾美捷Epigentek DNA样品的超声能量处理方案-程序员宅基地

文章浏览阅读15次。空化气泡的大小和相应的空化能量可以通过调整完全标度的振幅水平来操纵和数字控制。通过强调超声技术中的更高通量处理和防止样品污染,Epigentek EpiSonic超声仪可以轻松集成到现有的实验室工作流程中,并且特别适合与表观遗传学和下一代应用的兼容性。Epigentek的EpiSonic已成为一种有效的剪切设备,用于在染色质免疫沉淀技术中制备染色质样品,以及用于下一代测序平台的DNA文库制备。该装置的经济性及其多重样品的能力使其成为每个实验室拥有的经济高效的工具,而不仅仅是核心设施。

11、合宙Air模块Luat开发:通过http协议获取天气信息_合宙获取天气-程序员宅基地

文章浏览阅读4.2k次,点赞3次,收藏14次。目录点击这里查看所有博文  本系列博客,理论上适用于合宙的Air202、Air268、Air720x、Air720S以及最近发布的Air720U(我还没拿到样机,应该也能支持)。  先不管支不支持,如果你用的是合宙的模块,那都不妨一试,也许会有意外收获。  我使用的是Air720SL模块,如果在其他模块上不能用,那就是底层core固件暂时还没有支持,这里的代码是没有问题的。例程仅供参考!..._合宙获取天气

EasyMesh和802.11s对比-程序员宅基地

文章浏览阅读7.7k次,点赞2次,收藏41次。1 关于meshMesh的意思是网状物,以前读书的时候,在自动化领域有传感器自组网,zigbee、蓝牙等无线方式实现各个网络节点消息通信,通过各种算法,保证整个网络中所有节点信息能经过多跳最终传递到目的地,用于数据采集。十多年过去了,在无线路由器领域又把这个mesh概念翻炒了一下,各大品牌都推出了mesh路由器,大多数是3个为一组,实现在面积较大的住宅里,增强wifi覆盖范围,智能在多热点之间切换,提升上网体验。因为节点基本上在3个以内,所以mesh的算法不必太复杂,组网形式比较简单。各厂家都自定义了组_802.11s

线程的几种状态_线程状态-程序员宅基地

文章浏览阅读5.2k次,点赞8次,收藏21次。线程的几种状态_线程状态

stack的常见用法详解_stack函数用法-程序员宅基地

文章浏览阅读4.2w次,点赞124次,收藏688次。stack翻译为栈,是STL中实现的一个后进先出的容器。要使用 stack,应先添加头文件include<stack>,并在头文件下面加上“ using namespacestd;"1. stack的定义其定义的写法和其他STL容器相同, typename可以任意基本数据类型或容器:stack<typename> name;2. stack容器内元素的访问..._stack函数用法

2018.11.16javascript课上随笔(DOM)-程序员宅基地

文章浏览阅读71次。<li> <a href = "“#”>-</a></li><li>子节点:文本节点(回车),元素节点,文本节点。不同节点树:  节点(各种类型节点)childNodes:返回子节点的所有子节点的集合,包含任何类型、元素节点(元素类型节点):child。node.getAttribute(at...

随便推点

layui.extend的一点知识 第三方模块base 路径_layui extend-程序员宅基地

文章浏览阅读3.4k次。//config的设置是全局的layui.config({ base: '/res/js/' //假设这是你存放拓展模块的根目录}).extend({ //设定模块别名 mymod: 'mymod' //如果 mymod.js 是在根目录,也可以不用设定别名 ,mod1: 'admin/mod1' //相对于上述 base 目录的子目录}); //你也可以忽略 base 设定的根目录,直接在 extend 指定路径(主要:该功能为 layui 2.2.0 新增)layui.exten_layui extend

5G云计算:5G网络的分层思想_5g分层结构-程序员宅基地

文章浏览阅读3.2k次,点赞6次,收藏13次。分层思想分层思想分层思想-1分层思想-2分层思想-2OSI七层参考模型物理层和数据链路层物理层数据链路层网络层传输层会话层表示层应用层OSI七层模型的分层结构TCP/IP协议族的组成数据封装过程数据解封装过程PDU设备与层的对应关系各层通信分层思想分层思想-1在现实生活种,我们在喝牛奶时,未必了解他的生产过程,我们所接触的或许只是从超时购买牛奶。分层思想-2平时我们在网络时也未必知道数据的传输过程我们的所考虑的就是可以传就可以,不用管他时怎么传输的分层思想-2将复杂的流程分解为几个功能_5g分层结构

基于二值化图像转GCode的单向扫描实现-程序员宅基地

文章浏览阅读191次。在激光雕刻中,单向扫描(Unidirectional Scanning)是一种雕刻技术,其中激光头只在一个方向上移动,而不是来回移动。这种移动方式主要应用于通过激光逐行扫描图像表面的过程。具体而言,单向扫描的过程通常包括以下步骤:横向移动(X轴): 激光头沿X轴方向移动到图像的一侧。纵向移动(Y轴): 激光头沿Y轴方向开始逐行移动,刻蚀图像表面。这一过程是单向的,即在每一行上激光头只在一个方向上移动。返回横向移动: 一旦一行完成,激光头返回到图像的一侧,准备进行下一行的刻蚀。

算法随笔:强连通分量-程序员宅基地

文章浏览阅读577次。强连通:在有向图G中,如果两个点u和v是互相可达的,即从u出发可以到达v,从v出发也可以到达u,则成u和v是强连通的。强连通分量:如果一个有向图G不是强连通图,那么可以把它分成躲个子图,其中每个子图的内部是强连通的,而且这些子图已经扩展到最大,不能与子图外的任一点强连通,成这样的一个“极大连通”子图是G的一个强连通分量(SCC)。强连通分量的一些性质:(1)一个点必须有出度和入度,才会与其他点强连通。(2)把一个SCC从图中挖掉,不影响其他点的强连通性。_强连通分量

Django(2)|templates模板+静态资源目录static_django templates-程序员宅基地

文章浏览阅读3.9k次,点赞5次,收藏18次。在做web开发,要给用户提供一个页面,页面包括静态页面+数据,两者结合起来就是完整的可视化的页面,django的模板系统支持这种功能,首先需要写一个静态页面,然后通过python的模板语法将数据渲染上去。1.创建一个templates目录2.配置。_django templates

linux下的GPU测试软件,Ubuntu等Linux系统显卡性能测试软件 Unigine 3D-程序员宅基地

文章浏览阅读1.7k次。Ubuntu等Linux系统显卡性能测试软件 Unigine 3DUbuntu Intel显卡驱动安装,请参考:ATI和NVIDIA显卡请在软件和更新中的附加驱动中安装。 这里推荐: 运行后,F9就可评分,已测试显卡有K2000 2GB 900+分,GT330m 1GB 340+ 分,GT620 1GB 340+ 分,四代i5核显340+ 分,还有写博客的小盒子100+ 分。relaybot@re...

推荐文章

热门文章

相关标签