一、AI换脸需求概述
AI换脸这个需求是领导给一同事的需求,在帮同事装完相关环境后,也顺便帮他一想研究了下。同事选中的是用faceswap开源软件进行测试。faceswap 项目是一个学习重建脸部特征的深度学习算法。你给它一堆的图片,它学习几个小时后,可以根据计算的模型对图片进行批量的替换。同时也可以对视频文件进行切帧成图片,进行批量替换后,再进行重新合成为新的视频(视频换脸)。开始之前先看下效果:
上面是成龙大叔的脸换到了特朗普、黄勃,还有几个我叫不出名的名人身上。发现龙叔的脸在女人身上还是比较贴合的,西方人的皮肤比较粗糙,放在西方人脸上,敷贴的痕迹相对比较明显。
二、faceswap安装配置
安装提供的有基于docker的安装,也有直接基于物理机下的安装方式。我这里使用的一台带有GPU资源的服务器进行安装,如下:
git clone https://github.com/deepfakes/faceswap
cd faceswap
python setup.py (这个会交互式进行docker方式进行安装)
如果直接主机上使用,直接运行python faceswap.py即可。不过这时候还是不能直接使用的,还需要先安装AI计算的相关包,这个会根据自己主机的平台进行安装。在目录下有如下四个目录:
$ ls -l faceswap-master|grep requir|awk '{print $NF}'
requirements_amd.txt
_requirements_base.txt
requirements_cpu.txt
requirements_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 命令出输出类似如下信息:
$ nvidia-smi
Thu Jun 11 17:47:29 2020
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 418.39 Driver Version: 418.39 CUDA Version: 10.1 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
|===============================+======================+======================|
| 0 Tesla P4 Off | 00000000:3B:00.0 Off | 0 |
| N/A 26C P8 6W / 75W | 0MiB / 7611MiB | 0% Default |
+-------------------------------+----------------------+----------------------+
| 1 Tesla P4 Off | 00000000:86:00.0 Off | 0 |
| N/A 24C P8 6W / 75W | 0MiB / 7611MiB | 0% Default |
+-------------------------------+----------------------+----------------------+
| 2 Tesla P4 Off | 00000000:AF:00.0 Off | 0 |
| N/A 27C P8 6W / 75W | 0MiB / 7611MiB | 0% Default |
+-------------------------------+----------------------+----------------------+
| 3 Tesla P4 Off | 00000000:D8:00.0 Off | 0 |
| N/A 27C P8 6W / 75W | 0MiB / 7611MiB | 0% Default |
+-------------------------------+----------------------+----------------------+
+-----------------------------------------------------------------------------+
| Processes: GPU Memory |
| GPU PID Type Process name Usage |
|=============================================================================|
| No running processes found |
+-----------------------------------------------------------------------------+
三、AI训练和脸部替换
faceswap替换的步骤大致分为三步:提取 extract、训练 train、替换 convert 。其中提取会根据opencv相关的算法识表脸部并截图为脸部图片集,训练这一部是最耗时的操作,我测试的这个计算过程大概要一天(官方给出的说法为 However, a ballpark figure is 12-48 hours on GPU and weeks if training on CPU.),最后替换也是比较快的。
虽然知道了大概的步骤,不过当前还是不能替换的,这里还是需要另外两个包(下载会比较慢,试了下通过阿里公有云的主机下载有加速,可以通过阿里云主机中转):
wget https://github.com/deepfakes-models/faceswap-models/releases/download/v1.11.1/s3fd_keras_v1.zip
wget https://github.com/deepfakes-models/faceswap-models/releases/download/v1.9.1/face-alignment-network_2d4_keras_v1.zip
下载后需要放到对应的目录里,如下:
$ ls /home/aiface/faceswap-master/plugins/extract/detect/.cache/
s3fd_keras_v1.h5
$ ls /home/aiface/faceswap-master/plugins/extract/align/.cache
face-alignment-network_2d4_keras_v1.h5
1、提取
现在可以正常工作了,图片的提取,可以通过视频文件提取,也可以直接走百度、bing、google等平台进行下载,我这里使用的是百度上批量下载的图片,如下:
from BaiduImagesDownload.crawler import Crawler
# original为True代表优先下载原图
net, num, urls = Crawler.get_images_url('黄渤', 100, original=True)
Crawler.download_images(urls)
执行上面的操作,会下载黄渤的100张原图,并保存在download目录里。同样,下载其他人的,换下名字即可。有了原图像后,就可以从图片集里提取头像,官方的示例里提取的是懂神特朗普和凯奇的,命令如下:
# To extract trump from photos in a folder:
python faceswap.py extract -i ~/faceswap/src/trump -o ~/faceswap/faces/trump
# To extract trump from a video file:
python faceswap.py extract -i ~/faceswap/src/trump.mp4 -o ~/faceswap/faces/trump
# To extract cage from photos in a folder:
python faceswap.py extract -i ~/faceswap/src/cage -o ~/faceswap/faces/cage
# To extract cage from a video file:
python faceswap.py extract -i ~/faceswap/src/cage.mp4 -o ~/faceswap/faces/cage
上面分别列出了直接图片提取和视频提取的方法,-o参数为提取头像保存的路径。
提取出的头像最好再做一个人工复检,把一些不是人脸或者质量不高的人脸图片删掉,否则影响后面的训练效果。
2、训练
训练学习指令如下:
python faceswap.py train -A ~/faceswap/faces/trump -B ~/faceswap/faces/cage -m ~/faceswap/trump_cage_model/
# or -p to show a preview
python faceswap.py train -A ~/faceswap/faces/trump -B ~/faceswap/faces/cage -m ~/faceswap/trump_cage_model/ -p
最后生成的模型目录结构类似如下:
original_decoder_A.h5
original_decoder_B.h5
original_encoder.h5
original_logs
original_state.json
上面decoder的A和B分别对应上面训练中的特朗普和凯奇。
3、转换
转换操作就比较简单了,指定原文件,并指定训练的模型目录,即可进行转换,如下:
python 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功能,可以进行视频处理,如下:
python tools.py effmpeg -i cage.mp4 -o input -s 00:0148 -e 00:0156
####将视频1分48秒可以到1分56秒结束的部分转化为图片
python tools.py effmpeg -a extract -i video/guodegang.mov -o video/guodegang/
上面是全部视频转换的指令
tool工具调用的ffmpeg功能,同样其也可以把换脸后的照片合重新合成为视频,如下:
python 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训练部分)