刘春平,高翔,张建伟,陈虎
(四川大学计算机学院,成都 610065;四川川大智胜软件股份有限公司,成都 610065)
计算机视觉即使用计算机及相关设备对生物视觉的一种模拟,模拟人类视觉处理和反馈的过程。随着人工智能热潮,计算机视觉也融入了人工智能的强大新技术,进而发展迅猛,应用广泛。其中就有大家熟知的人脸检测[1]、人脸识别[2]、人脸表情迁移[3]等对于人脸的计算机视觉研究。通过摄像头获取人脸信息,计算机对这些信息进行检测、跟踪和识别,再对这些结果进行分析和应用。摄像头相当于电脑的眼睛,计算机就是处理从摄像头获取的信息的大脑,用以模拟人的视觉全过程,完成相关的动作和任务。二维人脸表情迁移,就是让一个目标人脸图片,根据摄像头所获取的目标人脸表情的变化而改变其表情、神态和面部动作。人脸表情的动态迁移的相关应用很广泛,例如加入人工智能设计成可视化人工智能客服、虚拟远程老师、动画设计、影视演员特效和可视化人机交互等。正是未来应用的广泛和计算机视觉技术的发展,吸引了国内外大量的研究者对人脸表情迁移的研究。现有的二维人脸表情迁移[1],是基于一张人脸图片到另一张人脸图片的,没有动态实时的效果,没有神态和面部动作的变化。还有一种二维人脸表情的迁移是基于gan生成对抗网络的face2face[4],虽然可以实时动态生成表情迁移视频,但是,生成的视频的每一帧都很模糊和变型,而且算法实现过程较为复杂,需要硬件来支持训练模型。本文介绍了一种让静态的人脸跟着动态的视频或者摄像头生动流畅地动起来的方法,即表情的实时动态迁移。就是在dlib[5]的人脸关键点[3]检测模型的基础上,利用二维人脸有效的信息,实时动态逼真展现人脸表情动态迁移,算法简单,表情动态迁移的结果比较准确自然。本文将从以下四个方面来介绍基于人脸关键点的表情实时动态迁移核心方法:
(1)利用dlib人脸检测,提高人脸识别和关键点[6]检测精度和速度。
(2)实时视频获取,实时生成,实现动态人脸表情迁移显示。
(3)纹理映射时对关键点进行Delaunay三角剖分[7],提高纹理映射效果。
(4)关键点的优化调整,利用曲线拟合方法调整关键点的个数和位置,使脸部细节表现更准确。
首先从摄像头或者本地视频获取帧,然后通过dlib的人脸检测检测出人脸,从人脸上获取68个关键点存入shapes。68个关键点获取后通过本文的嘴部曲线拟合调整嘴部关键点的个数和位置,生成最终72个关键点。连续捕获三帧,获取帧间变化量dx,然后将目标图片人脸上获取的关键点作为基本点,融合dx,生成目标关键点,从目标图片获取纹理信息,以目标关键点为基础进行纹理映射最后显示。连续如上处理,即可获得表情动态迁移效果。总体算法描述请看图1。总体算法要求每一步的处理效率高,使得最后的视频流畅性和实时性好,而且关键点的检测准确度必须很好,所以本文选用了关键点检测准确度高的dlib库,在其公开的人脸关键点检测模型的基础上进行实验和研究。
图1 总体算法描述图
dlib是一个现代的C++工具包,包含机器学习算法和工具,它广泛应用于工业界和学术界,在C++中创建复杂的软件来解决实际问题,例如嵌入式设备、机器人、人工智能和大型高性能计算环境等。本文使用dlib的人脸检测和人脸关键点的检测,在准确率和效果上明显优于OpenCV的人脸检测算法,但是在单纯的人脸检测方面,后者稍微快一些,为了提人脸检测和人脸关键点的精度,本文采用dlib库,使用dlib官方提供的特征提取器预训练模型,用于获取人脸的68个关键点,如图2。检测效果如图3。
图2 dlib 68个关键点分布
图3 关键点的检测
对于人脸表情迁移来说,嘴部动作的细节表现能够影响到整个脸部的表情逼真程度,所以嘴部轮廓的处理需要细化处理。由于原始获得的68个关键点嘴部只有20个关键点,而且在分布上有4个点对于嘴部动作的表示粗略,所以,本文首先对20个嘴部关键点进行分组,然后进行曲线拟合实验,最终找到一个简单而且误差较小的拟合方式,请看图4嘴部轮廓曲线拟合。
由于dlib的嘴部20个点密度太低,嘴部连线不光滑,在嘴部动作模拟的时候,细节表现不好。所以,本文在处理嘴部贴图的时候,进行了嘴部曲线拟合。通过已有的20个嘴部关键点,拟合出6条平滑曲线,效果如上图所示。经过分析和实验,将上嘴唇分成4条曲线,下嘴唇分为两条曲线。
曲线①②⑤⑥拟合的方程为y=Ax2+Bx+C;
③④最后拟合的曲线为y=Ax3+Bx2+Cx+D。
图4 嘴部轮廓曲线拟合
三角剖分的目的是为了在仿射变换的过程中确定纹理坐标点和目标坐标点之间的一一对应关系,当然,三角剖分的方法很多,本文利用Delaunay三角剖分算法,提高贴图的准确性和贴图细节表现。Delaunay三角剖分算法的特性[8]:以最近的三点形成三角形,且各线段(三角形的边)皆不相交。不论从区域何处开始构建,最终都将得到一致的结果。任意两个相邻三角形形成的凸多边形的对角线如果可以互换的话,那么两个三角形六个内角中最小的角度不会变大。如果将三角网中的每个三角形的最小角进行升序排列,则Delaunay三角网的排列得到的数值最大。新增、删除、移动某一个顶点时只会影响临近的三角形。三角网最外层的边界形成一个凸多边形的外壳。
本文将获取的68个关键点进行了Delaunay三角剖分,发现嘴部的4个点有问题,没有将嘴唇和牙齿分开,如图5为原始68个点的Delaunay三角剖分,图6为嘴部有缺陷的4个点。于是本文对68个关键点进行处理后获得的72个关键点的Delaunay三角剖分,图7所示,增加了4个点。如图7是调整后嘴部的点的Delaunay三角剖分结果,解决了原来关键点的嘴部缺陷。图8为整个脸部的三角剖分最后的图,图9为纹理映射效果对比图。
图5 68个关键点的Delaunay三角剖分结果
图6 嘴部有缺陷的关键点Delaunay三角剖分结果
图7 调整后嘴部的点的Delaunay三角剖分结果
图8 最终纹理三角剖分效果
最后,每一帧的纹理映射结果如图9所示。
图9纹理映射结果
由于本文是二维表情的动态迁移,所以利用了一些动态迁移的实现过程算法。首先,需要解决的问题是,视频(摄像头)的两帧之间关键点的动态捕获需要准确及时,获取之后两帧之间的变化差d(xi,yi)需要进行叠加到目标关键点上。公式如下:
Gj(xi,yi)是目标当前关键点坐标,Gj-1(xi,yi)表示前一帧的坐标,Dj(xi,yi)表示两帧的变化量。为了让Dj(xi,yi)更能表现目标前后两帧的变化量,采用了帧间平滑处理,本文的Dj(xi,yi)是通过捕获源视频的连续3帧的关键点坐标,然后进行加权平均作平滑。减少了关键点的抖动和误差,提高了输出视频的流畅性。算法演示如图10所示。由于不同的人脸的脸型差别很大,所以,在关键点运动的时候,每个点的移动量Dj(xi,yi)不同步,需要对每一个点的Dj(xi,yi)加一个偏移量,这个偏移量需要准确计算。
图10 D(x,y)和G(x,y)
图11所示,第二张图片里面的关键点时目标关键点经过计算后生成的结果,未改变原有目标人脸的脸型。
图11 源帧关键点和处理后目标关键点对比图
根据图12可知,在68个关键点和本文通过曲线拟合方法扩展的点的区域内,表情迁移的效果准确和真实。包括源视频(摄像头)中的头的便宜和旋转。但是,由于二维图像的局限性,使得源人脸的旋转角度过大,如果偏转过于明显,脸部表情会有一些误差。由于表情迁移过程中牙齿的变化很大,不能单一的通过纹理变换贴图的方式表现牙齿变化,可以通过深度学习和图像融合的方式进行下一步设计和实验。
图12 动态人脸表情迁移效果演示
该程序运行的界面效果如图13所示,在Qt平台上作的可视化界面,左上角为源视频(摄像头)获取的帧的显示,左下角为源视频(摄像头)关键点的实时显示,右下角为目标人脸纹理,右上角为动态表情迁移的结果显示,软件上面有4个按钮,getImage是获取纹理,camara是打开摄像头,video获取本地视频。
图13 动态演示程序界面
本文在dlib人脸检测和关键点获取的基础上扩展了其他关键点,通过动态获取视频(摄像头)人脸关键点,设计了二维人脸表情的动态迁移。达到了实时的流畅的人脸表情的变化和仿真,实时生动。将二维静态的表情迁移进行了动态展示,为了提高流畅性,使用了帧间平滑处理,效果明显。最后把动态表情迁移效果用Qt、C++进行了实现和展现。在后续的研究中,将对人脸背景和人物说话时嘴巴牙齿部分的研究,使得迁移效果更加逼真和准确。二维人脸信息的二维局限使得表情迁移和动作的表现不能很好表示三维的信息,例如,深度和旋转角度,但是本文在二维有限的信息量的基础上,利用了纹理映射的变化,例如,压缩、拉伸、位移、二维旋转、仿射变换等,比较生动地迁移了视频(摄像头)的表情、神态和脸部动作。