faceswap AI换脸
一、AI换脸需求概述
AI换脸这个需求是领导给一同事的需求,在帮同事装完相关环境后,也顺便帮他一想研究了下。同事选中的是用faceswap开源软件进行测试。faceswap 项目是一个学习重建脸部特征的深度学习算法。你给它一堆的图片,它学习几个小时后,可以根据计算的模型对图片进行批量的替换。同时也可以对视频文件进行切帧成图片,进行批量替换后,再进行重新合成为新的视频(视频换脸)。开始之前先看下效果:
上面是成龙大叔的脸换到了特朗普、黄勃,还有几个我叫不出名的名人身上。发现龙叔的脸在女人身上还是比较贴合的,西方人的皮肤比较粗糙,放在西方人脸上,敷贴的痕迹相对比较明显。
二、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.),最后替换也是比较快的。
虽然知道了大概的步骤,不过当前还是不能替换的,这里还是需要另外两个包(下载会比较慢,试了下通过阿里公有云的主机下载有加速,可以通过阿里云主机中转):
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训练部分)
捐赠本站(Donate)
如您感觉文章有用,可扫码捐赠本站!(If the article useful, you can scan the QR code to donate))
- Author: shisekong
- Link: https://blog.361way.com/python-faceswap/6406.html
- License: This work is under a 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议. Kindly fulfill the requirements of the aforementioned License when adapting or creating a derivative of this work.