一、AI换脸需求概述

AI换脸这个需求是领导给一同事的需求,在帮同事装完相关环境后,也顺便帮他一想研究了下。同事选中的是用faceswap开源软件进行测试。faceswap 项目是一个学习重建脸部特征的深度学习算法。你给它一堆的图片,它学习几个小时后,可以根据计算的模型对图片进行批量的替换。同时也可以对视频文件进行切帧成图片,进行批量替换后,再进行重新合成为新的视频(视频换脸)。开始之前先看下效果:

faceswap02
faceswap02

faceswap03
faceswap03

faceswap05
faceswap05

faceswap04
faceswap04

上面是成龙大叔的脸换到了特朗普、黄勃,还有几个我叫不出名的名人身上。发现龙叔的脸在女人身上还是比较贴合的,西方人的皮肤比较粗糙,放在西方人脸上,敷贴的痕迹相对比较明显。

二、faceswap安装配置

安装提供的有基于docker的安装,也有直接基于物理机下的安装方式。我这里使用的一台带有GPU资源的服务器进行安装,如下:

1git clone https://github.com/deepfakes/faceswap
2cd faceswap
3python setup.py (这个会交互式进行docker方式进行安装)

如果直接主机上使用,直接运行python faceswap.py即可。不过这时候还是不能直接使用的,还需要先安装AI计算的相关包,这个会根据自己主机的平台进行安装。在目录下有如下四个目录:

1$ ls -l faceswap-master|grep requir|awk '{print $NF}'
2requirements_amd.txt
3_requirements_base.txt
4requirements_cpu.txt
5requirements_nvidia.txt

我这里选择的带amd这个的,安装方式为:pip install -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements_amd.txt ,其会安装tensorflow 和 plaidml 相关的包。不过也是没有requirements_nvidia这个效率高的,查看请求的文件所会现,nvidia的这个安装的是tensorflow-gpu。nvidia GPU支持的,安装过相关驱动和软件后,运行 nvidia-smi 命令出输出类似如下信息:

 1$ nvidia-smi
 2Thu Jun 11 17:47:29 2020
 3+-----------------------------------------------------------------------------+
 4| NVIDIA-SMI 418.39       Driver Version: 418.39       CUDA Version: 10.1     |
 5|-------------------------------+----------------------+----------------------+
 6| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
 7| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
 8|===============================+======================+======================|
 9|   0  Tesla P4            Off  | 00000000:3B:00.0 Off |                    0 |
10| N/A   26C    P8     6W /  75W |      0MiB /  7611MiB |      0%      Default |
11+-------------------------------+----------------------+----------------------+
12|   1  Tesla P4            Off  | 00000000:86:00.0 Off |                    0 |
13| N/A   24C    P8     6W /  75W |      0MiB /  7611MiB |      0%      Default |
14+-------------------------------+----------------------+----------------------+
15|   2  Tesla P4            Off  | 00000000:AF:00.0 Off |                    0 |
16| N/A   27C    P8     6W /  75W |      0MiB /  7611MiB |      0%      Default |
17+-------------------------------+----------------------+----------------------+
18|   3  Tesla P4            Off  | 00000000:D8:00.0 Off |                    0 |
19| N/A   27C    P8     6W /  75W |      0MiB /  7611MiB |      0%      Default |
20+-------------------------------+----------------------+----------------------+
21+-----------------------------------------------------------------------------+
22| Processes:                                                       GPU Memory |
23|  GPU       PID   Type   Process name                             Usage      |
24|=============================================================================|
25|  No running processes found                                                 |
26+-----------------------------------------------------------------------------+

三、AI训练和脸部替换

faceswap替换的步骤大致分为三步:提取 extract、训练 train、替换 convert 。其中提取会根据opencv相关的算法识表脸部并截图为脸部图片集,训练这一部是最耗时的操作,我测试的这个计算过程大概要一天(官方给出的说法为 However, a ballpark figure is 12-48 hours on GPU and weeks if training on CPU.),最后替换也是比较快的。

faceswap-gui
faceswap-gui

虽然知道了大概的步骤,不过当前还是不能替换的,这里还是需要另外两个包(下载会比较慢,试了下通过阿里公有云的主机下载有加速,可以通过阿里云主机中转):

1wget https://github.com/deepfakes-models/faceswap-models/releases/download/v1.11.1/s3fd_keras_v1.zip
2wget https://github.com/deepfakes-models/faceswap-models/releases/download/v1.9.1/face-alignment-network_2d4_keras_v1.zip

下载后需要放到对应的目录里,如下:

1$ ls /home/aiface/faceswap-master/plugins/extract/detect/.cache/
2s3fd_keras_v1.h5
3$ ls /home/aiface/faceswap-master/plugins/extract/align/.cache
4face-alignment-network_2d4_keras_v1.h5

1、提取

现在可以正常工作了,图片的提取,可以通过视频文件提取,也可以直接走百度、bing、google等平台进行下载,我这里使用的是百度上批量下载的图片,如下:

1from BaiduImagesDownload.crawler import Crawler
2# original为True代表优先下载原图
3net, num, urls = Crawler.get_images_url('黄渤', 100, original=True)
4Crawler.download_images(urls)

执行上面的操作,会下载黄渤的100张原图,并保存在download目录里。同样,下载其他人的,换下名字即可。有了原图像后,就可以从图片集里提取头像,官方的示例里提取的是懂神特朗普和凯奇的,命令如下:

1# To extract trump from photos in a folder:
2python faceswap.py extract -i ~/faceswap/src/trump -o ~/faceswap/faces/trump
3# To extract trump from a video file:
4python faceswap.py extract -i ~/faceswap/src/trump.mp4 -o ~/faceswap/faces/trump
5# To extract cage from photos in a folder:
6python faceswap.py extract -i ~/faceswap/src/cage -o ~/faceswap/faces/cage
7# To extract cage from a video file:
8python faceswap.py extract -i ~/faceswap/src/cage.mp4 -o ~/faceswap/faces/cage

上面分别列出了直接图片提取和视频提取的方法,-o参数为提取头像保存的路径。

提取出的头像最好再做一个人工复检,把一些不是人脸或者质量不高的人脸图片删掉,否则影响后面的训练效果

2、训练

训练学习指令如下:

1python faceswap.py train -A ~/faceswap/faces/trump -B ~/faceswap/faces/cage -m ~/faceswap/trump_cage_model/
2# or -p to show a preview
3python faceswap.py train -A ~/faceswap/faces/trump -B ~/faceswap/faces/cage -m ~/faceswap/trump_cage_model/ -p 

最后生成的模型目录结构类似如下:

1original_decoder_A.h5
2original_decoder_B.h5
3original_encoder.h5
4original_logs
5original_state.json

上面decoder的A和B分别对应上面训练中的特朗普和凯奇。

3、转换

转换操作就比较简单了,指定原文件,并指定训练的模型目录,即可进行转换,如下:

1python faceswap.py convert -i ~/faceswap/src/trump/ -o ~/faceswap/converted/ -m ~/faceswap/trump_cage_model/

还可以使用-M 参数指定遮罩替换算法类型, -s进行A-B角色互换(A换B,改为B换A)。

同样,这时候也可以选取第三人进行替换。

四、其他

faceswap功能是比较牛X的,除了上面说的步骤,其还提供有tool功能,可以进行视频处理,如下:

1python tools.py effmpeg  -i cage.mp4 -o input -s 00:0148 -e 00:0156
2####将视频1分48秒可以到1分56秒结束的部分转化为图片
3python tools.py effmpeg -a extract -i video/guodegang.mov -o video/guodegang/
4上面是全部视频转换的指令

tool工具调用的ffmpeg功能,同样其也可以把换脸后的照片合重新合成为视频,如下:

1python tools.py effmpeg  -i output -r input/cage.mp4 -o modified/cage.mp4 -a gen-vid

本篇提的内容相对比较皮毛,有兴趣的,可以看官方文档及后面使用的AI方法及原理。可以查看以下链接进行拓展:

https://forum.faceswap.dev/viewtopic.php?f=5&t=27 (extract提取部分)

https://forum.faceswap.dev/viewtopic.php?f=6&t=146 (train训练部分)