热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

人脸重建速览,从3DMM到表情驱动动画

欢迎关注收藏或分享,转载请注明出处。个人专栏人脸重建是计算机视觉比较热门的一个方向,3d人脸相关应用也是近年来短视频领域的新玩法。不管是Facebook

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


人脸重建是计算机视觉比较热门的一个方向,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



推荐阅读
  • 阿里Treebased Deep Match(TDM) 学习笔记及技术发展回顾
    本文介绍了阿里Treebased Deep Match(TDM)的学习笔记,同时回顾了工业界技术发展的几代演进。从基于统计的启发式规则方法到基于内积模型的向量检索方法,再到引入复杂深度学习模型的下一代匹配技术。文章详细解释了基于统计的启发式规则方法和基于内积模型的向量检索方法的原理和应用,并介绍了TDM的背景和优势。最后,文章提到了向量距离和基于向量聚类的索引结构对于加速匹配效率的作用。本文对于理解TDM的学习过程和了解匹配技术的发展具有重要意义。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • Android日历提醒软件开源项目分享及使用教程
    本文介绍了一款名为Android日历提醒软件的开源项目,作者分享了该项目的代码和使用教程,并提供了GitHub项目地址。文章详细介绍了该软件的主界面风格、日程信息的分类查看功能,以及添加日程提醒和查看详情的界面。同时,作者还提醒了读者在使用过程中可能遇到的Android6.0权限问题,并提供了解决方法。 ... [详细]
  • 本文详细介绍了在Linux虚拟化部署中进行VLAN配置的方法。首先要确认Linux系统内核是否已经支持VLAN功能,然后配置物理网卡、子网卡和虚拟VLAN网卡的关系。接着介绍了在Linux配置VLAN Trunk的步骤,包括将物理网卡添加到VLAN、检查添加的VLAN虚拟网卡信息以及重启网络服务等。最后,通过验证连通性来确认配置是否成功。 ... [详细]
  • [转载]从零开始学习OpenGL ES之四 – 光效
    继续我们的iPhoneOpenGLES之旅,我们将讨论光效。目前,我们没有加入任何光效。幸运的是,OpenGL在没有设置光效的情况下仍然可 ... [详细]
  • 3年半巨亏242亿!商汤高估了深度学习,下错了棋?
    转自:新智元三年半研发开支近70亿,累计亏损242亿。AI这门生意好像越来越不好做了。近日,商汤科技已向港交所递交IPO申请。招股书显示& ... [详细]
  • Apple iPad:过渡设备还是平板电脑?
    I’vebeenagonizingoverwhethertopostaniPadarticle.Applecertainlydon’tneedmorepublicityandthe ... [详细]
  • navicat生成er图_实践案例丨ACL2020 KBQA 基于查询图生成回答多跳复杂问题
    摘要:目前复杂问题包括两种:含约束的问题和多跳关系问题。本文对ACL2020KBQA基于查询图生成的方法来回答多跳复杂问题这一论文工作进行了解读 ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • IB 物理真题解析:比潜热、理想气体的应用
    本文是对2017年IB物理试卷paper 2中一道涉及比潜热、理想气体和功率的大题进行解析。题目涉及液氧蒸发成氧气的过程,讲解了液氧和氧气分子的结构以及蒸发后分子之间的作用力变化。同时,文章也给出了解题技巧,建议根据得分点的数量来合理分配答题时间。最后,文章提供了答案解析,标注了每个得分点的位置。 ... [详细]
  • 推荐系统遇上深度学习(十七)详解推荐系统中的常用评测指标
    原创:石晓文小小挖掘机2018-06-18笔者是一个痴迷于挖掘数据中的价值的学习人,希望在平日的工作学习中,挖掘数据的价值, ... [详细]
  • 怀疑是每次都在新建文件,具体代码如下 ... [详细]
  • 花瓣|目标值_Compose 动画边学边做夏日彩虹
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Compose动画边学边做-夏日彩虹相关的知识,希望对你有一定的参考价值。引言Comp ... [详细]
author-avatar
陈协莹隆心
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有