我选的工程实践是完成一款类似于facerig的软件;
所谓的facerig,即:
-
实时读入你的脸部和表情动作以及音频输入。
-
对跟踪数据进行动态动画重定向,并将动画应用于用户选择的3d模型上,并进行音频处理(语音修改)
-
在用户选择的背景下实时渲染光源动画模型。
-
对呈现的视频进行编码,并将其作为虚拟摄像头的输出发送到软件视频输出(它基本上拦截摄像头的输入,并在进一步发送之前将真实摄像头捕捉到的图像与精彩的内容进行交换)。
-
提供用于调优上述所有操作的参数的接口。
-
可定制的角色。
-
开放创建平台:您可以创建自己的模型(在FaceRig之外),导入并使用它们作为您的化身。模型需要根据一组已发布的规范创建。
最先看到这个选题,我想到的是使用ai换脸实现这个功能,于是搜集了一个著名的ai换脸学习模型deepface,以及衍生出的换脸视频,术语Deepfake通常用于指代使用某种算法进行编辑的视频,以便以使视频看起来真实的方式用其他人(尤其是公众人物)替换原始视频中的人。也就是通过深度学习训练,将替换的脸做成面具一样,戴到视频中被替换的人脸上,理论上达到足够的训练量,换脸就能足够的自然(当然这个技术主要用于一些娱乐或者不讲康的视频中)。而且这样子与需求的facerig有着很显著的区别,其一是facering需要建立3D模型,并且实时换到使用者的脸上,与deepfake对一段视频花大量时间进行加工有着很大的不同。
于是转变思路,进而深入理解facerig的原理,我找到了一个简化版的facerig,主要实现人脸的姿势捕捉和模拟。根据人脸识别及人脸特征点的检测,由特征点的二维信息还原出人脸姿势的旋转角,再控制模型,让模型做出相同的姿势。
-
实时预览
使用API camera 在运行时动态获取摄像头权限。CameraPreview类继承SurfaceView,用来预览相机数据。首先获取设备支持的预览图片格式、大小等信息,初始化前置摄像头。利用setPreviewCallbackWithBuffer函数来获取到预览的数据,在Callback函数中将YUVImage转换为Bitmap。使用带有Buffer的回调函数可以加快程序的运行速度,确保实时的预览。
-
人脸识别与特征点检测
这里采用了dlib库中的68点检测人脸功能。而dlib是一个C++库,因此需要将它移植到Android上,使用了tzutalin编译好的dlib-android。作者将C++接口用Java包装好了,我们可以直接调用Java接口。
人脸姿势估计
ive2D模型
Live2D是一种应用于电子游戏的绘图渲染技术,技术由日本Cybernoids公司开发。通过一系列的连续图像和人物建模来生成一种类似三维模型的二维图像,对于以动画风格为主的冒险游戏来说非常有用,现在也经常用来制作动态壁纸。缺点是Live 2D人物无法大幅度转身,3D效果其实很差。新的Live2D官方说可以显示360度图像,如转身之类大幅度的动作,但是目前还未有试用版。它本质上是二维图片,所以对性能要求较低,非常适合Android设备使用。
以上只是一个简化的facerig的demo,实现的方法较为简单,而且效果也不尽如人意,所以需要改进,无奈我暂时还没有能力去进行改进操作,只能一边看一边学。