之前负责了一个数字人应用平台的建设,其中一个核心功能是用摄像头实时捕捉用户的脸部图像,然后通过表情识别算法分析出用户的表情信息,驱动数字人做出同样的表情。这个功能已经在动画电影制作和游戏动画人物制作中频繁使用,目前更多的是穿戴专业的动捕服在专业的动捕篷中完成,制作成本很高。现在希望能做出使用更简单、价格更便宜的方案。
1. FaceShift介绍
经过前期大量考察,FaceShift的实现方案是很理想的参考方案。这里有必要先对FaceShift公司和产品做个简单介绍。
Faceshift是位于瑞士苏黎世的一家实时动作捕捉技术创业公司,成立于2011年,公司诞生于瑞士联邦科技学院的计算机图形与几何实验室。
Faceshift公司的产品Faceshift Studio通过3D传感技术,无需穿戴专业动捕服,也不需要在脸上打标志点,就可以实现面部动作及表情实时捕捉,Faceshift生成的动画人物表情可与真人保持一致。这项技术被应用到了《星球大战》电影制作中。
FaceStudio动捕界面(图片来自于互联网)
由于Faceshift的出色表现,2015年被苹果收购,后来这项技术被用到了苹果的产品上。如果你正好用过Animoji动画表情App,就已经对他有了了解,因为Animoji动画表情正是来自于Faceshift的动捕技术。
Apple iPhone X提供Animoji动画表情(来源:Apple)
2. 表情动捕实现思路
回归主题,我们的方案就是复制FaceShift动捕的思路。但前方的道路是困难重重,FaceShift被苹果收购后,官网关闭了,在苹果官网中也找不到任何技术资料,目前我们手里有的唯一资料就是FaceShift被收购前发行的FaceShift Studio可运行版本,所以只能尝试通过分析FaceShift Studio的使用方法,逆向工程出FaceShift动捕原理的实现思路。实现的一些细节就不放上来了,只是把整体的思路整理一下分享出来。
2.1 表情训练
FaceShift里提供了50多个基础表情,比如闭眼、张嘴、皱眉等,人的丰富的表情可以通过这50多个基础表情线性组合表达出来。
FaceShift Studio中的组合表情制作(图片来自于互联网)
FaceShift Studio中内置了一个标准人脸3DMM模型(3DMM模型概念参考链接文章,这里不展开介绍了),这个标准模型上制作了50多个标准的BlendShape(BlendShape概念自行网上搜索),每个BlendShape对应一个基础表情。在表情动态捕捉阶段,其实就是通过算法不断计算这50多个基础表情的权重值,然后根据权重值组合出来最终的表情。
世界上很难找到两个长得完全一样的人,每个人都有自己的脸部特征,有的人胖一点,有的人脸长一点,有的人眼睛大,有的人眼睛小...,各不一样。所以用同一套基础表情(BlendShape)去带入动捕算法,不考虑每个用户的脸部特征,会为算法带来偏差,也就影响最终的识别效果。
在FaceShift Studio中提供了基础表情训练功能,训练阶段的任务就是要把标准人脸上的基础表情(BlendShape)转变成带有用户自己脸部特征的基础表情,这样每个用户都拥有一套自己特有的基础表情(BlendShape),在进行表情识别的时候,减少输入误差,让识别结果更准确。
基础表情训练过程主要通过4个步骤实现:
1、通过深度摄像头获得用户人脸的3维点云;
2、将3维点云转换成3维网格,这个网格信息已经包含用户脸部特征;
3、通过包裹变形算法用第2步得到的3维网格影响标准脸的3维网格,将用户脸部特征传递到标准脸的3维网格上;
4、从第3步得到的标准脸3维网络中把当前基础表情影响区域的点数据取出来生成新的基础表情(BlendShape),这样就得到了带有用户脸部特征的基础表情。
经过训练中立表情(图片来自于互联网)
特别说明
中立表情是脸部保持正常,不带有任何微表情的状态,被认为是表情识别中的‘0’状态。所有其他微表情都是在中立表情基础上做出来的。从脸部几何体构成的角度看,任何微表情都是在中立表情的基础上,脸部某些网格点在空间发生了位移带来的视觉效果。
2.2 表情识别
有了用户自己的一套微表情BlendShape,那表情识别的过程就转化为通过优化算法求解50多个BlendShape的权重值(权重值取值范围0~1),让这50多个BlendShape线性组合得到的复合表情与摄像头拍摄的每帧图像上用户的表情相吻合。
- 人脸关键点检测
对摄像头拍摄的每帧图像检测人脸关键点(包括:脸部轮廓,五官关键点),这些关键点带着用户的表情特征。网上可以找到不少做人脸关键检测方案,比如:dlib库、Google的Mediapipe都能做到。在实际应用过程中,不同方案检测到脸部关键点的准确度是有区别的,我们总是希望找到能够及时准确表达用户脸部特征的关键点检测方案。比较过很多方案,Google的Mediapipe方案和Intel Realsence深度摄像头SDK自带的检测方案相对更好。
2. 人脸模型关键点投影
在基础表情训练阶段提到FaceShift Studio内置了一个人脸模型,先在这个人脸模型中找到与脸部关键点一一对应的网格点。然后将这些网格点通过坐标变换投影到二维屏幕上,得到在二位屏幕上的像素坐标。通过优化算法得到一套基础表情(BlendSahpe)系数,让组合起来的复合表情投影到屏幕,得到的二维像素坐标与人脸关键点检测得到的屏幕坐标距离平方和最小。
网格点投影到二维屏幕的过程涉及到几个坐标系的转换:世界坐标系-->相机坐标系-->屏幕物理坐标系-->屏幕像素坐标系。经过转换得到的优化公式:
其中,S是人脸模型,s是缩放尺度,R是旋转矩阵,t是位移,Y是人脸检测点,n为人脸关键点个数。和
分别是人脸图像关键点及人脸三维模型点的索引。
这是个非线性最小二乘问题,可以用Gauss-Newton,Levenberg-Marquardt等算法求解,这里不展开讲,这部分可以参考“人脸重建速览,从3DMM到表情驱动动画”这篇文章。
通过求解得到每帧图像对应的基础表情(BlendShape)系数,也就实现了表情识别,但为了不让得到的表情失真,基础表情(BlendShape)系数限制在0~1之间。
3. 后续工作
表情识别的整个流程走通了,但识别精度和实时性上与FaceShift还是有明显差距,这个也是后面工作的重点,不断的调优,让表情识别精度和实时性不断提高。