富强 民主 文明 和谐
自由 平等 公正 法治
爱国 敬业 诚信 友善
文章目录
服务器环境:centos7,conda4.8
项目介绍
项目地址
github地址:https://github.com/deepfakes/faceswap
gitee镜像仓库地址:https://gitee.com/mirrors/faceswap
由于项目较大,Q内用户下载速度过慢,建议使用gitee仓库,该仓库每日定时更新
数据获取
在整个测试项目的过程中,数据获取是耗费我时间最多的环节,网上给出的一些Google开源数据集地址,我都没法使用,数据主要来源于两方面
- 1、在百度图片使用爬虫爬取https://www.jianshu.com/p/c23684942a72
- 2、找一些视频进行训练
建议使用方法二。测试下来发现,用爬虫爬取的图片都比较小,而且还需要耗费大量的时间进行人工筛选,为了方便快速出结果,直接找一些视频会更好些。
环境搭建
conda和tensorflow
这部分网上的教程很多,在这里略过了,有一点要说明的是,对于使用gpu的玩家,如果用的conda,并没有必要单独安装cuda,直接conda install tensorflow-gpu=1.12
,会自动安装对应的cuda,我当时在这里白费了好多时间
速度过慢的话,记得修改源地址
项目环境
# 拉取项目
git clone https://gitee.com/mirrors/faceswap
cd faceswap
# 安装以来环境
conda install -r _requirements_base.txt
安装ffmpeg
ffmpeg可以很方便的进行视频与图片之间的转换,centos安装介绍参考
https://blog.csdn.net/weixin_44598071/article/details/103177910
另外,ffmpeg在centos中可能会不支持png格式的文件操作,据说在windows和ubuntu中不会出现这个问题,这种互转可以借助python的pillow
模块进行操作,在安装环境的时候已经装上了pillow
- ffmpeg常用命令
# 从视频input.mp4中,裁剪出从1分30秒开始的一分钟视频
ffmpeg -ss 0:1:30 -t 0:1:0 -i input.mp4 -vcodec copy -acodec copy out.mp4
# 视频转图片,-r:每秒钟提取的帧数,默认为30
ffmpeg -i input.mp4 -r 10 output/video_%d.jpg
# 图片转视频,-b:v:控制视频码率,默认为200,所以合成的视频像素很低
ffmpeg -i input/video_%04d.jpg -b:v 5626k out.mp4
# 视频合成,分为两步,先把每个视频转成ts流,再合成一个视频
ffmpeg -i input1.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb input1.ts
ffmpeg -i input2.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb input2.ts
ffmpeg -i "concat:input1.ts|input2.ts" -acodec copy -vcodec copy -absf aac_adtstoasc concat.mp4
工作流程
文件夹规则定义
此处要把gakki的脸换成刘亦菲
- gakki:被换脸的人原图,即从爬虫爬的图片
- gakki_video:被换脸的人视频
- gakki_ready:被换脸的人,原始图片/视频进行脸部特征抽取后,放置的文件夹
- lyf:要换脸的人原图,即从爬虫爬的图片
- lyf_video:要换脸的人视频
- lyf_ready:要换脸的人,原始图片/视频进行脸部特征抽取后,放置的文件夹
- gakki_lyf_model:放置训练的模型文件
- convert:放置模型跑出来的最终结果,即已经换脸后的文件
操作步骤
1、抽取脸部特征
# 抽取图片的脸部特征,传入的是文件夹,会保留原本的格式,即jpg文件抽取后的图片依然是jpg
python faceswap.py extract -i gakki -o gakki_ready
python faceswap.py extract -i lyf -o lyf_ready
# 抽取视频里每帧图片的脸部特征,传入的是视频文件,默认保存为png格式
python faceswap.py extract -i gakki_video/gakki.mp4 -o gakki_ready
python faceswap.py extract -i lyf_video/lyf.mp4 -o lyf_ready
- 若是从网上下了多个短视频,可以使用上面的
ffmpeg命令
进行视频合并 - 对于有强迫症的,必须要把文件名变成一致的,这里可以使用
python
非常方便的进行批量替换文件名,主要就是os.listdir(); os.rename()
- 若传入的是视频,则提取面部特征后的图片数量一般会比较巨大,若是想自己控制输出图片的数量,可以使用
ffmpeg
将视频切成图片,然后当作图片进行处理。不过我的ffmpeg
无法操作png
格式,只能转成jpg
格式,会导致丢失很多信息。png格式的文件一般要比jpg格式文件大得多,模型的效果也要好些
2、人工筛选
图片进行面部特征抽取后,会变成下面这种大头照。
这时候就需要进行人工筛选了,这一步是最耗时的,因为最后入模型的就是这些图片,因此需要仔细的筛选。
3、训练模型
python faceswap.py train -A /gakki_ready -B /lyf_ready -m /gakki_lyf_model/
模型训练没什么说的,这里的模型是手动停止的,自己觉得模型不再收敛,时间有差不多的时候,直接在命令行敲回车就可以直接停止了
- 这里有个点要额外注意一下,我在使用
nohup
进行后台运行的时候,程序直接崩了,我也没搞清楚是什么问题,如果出现了这种情况,建议使用jupyter-lab --port 9999 --allow-root
开启jupyter,然后在本地windows浏览器打开jupyter的终端,然后在这里进行模型训练。就不用担心关电脑后程序自动终止。
4、调用模型进行换脸
- 对图片进行换脸
python faceswap.py convert -i /gakki -o /convert -m /gakki_lyf_model/
这一步只能对图片进行操作,而且必须是提取过面部特征之后的图片,即进行过第一步后的图片,因为当进行面部抽取的时候,会在当前文件夹生成一个识别文件。
- 对视频进行换脸
- 如果想对视频进行换脸,必须调用
ffmpeg
把视频切成图片,然后再调用上面的命令,最后再自己把图片拼成视频。涉及的ffmpeg命令
都在上面。 - 换脸后生成的文件是png格式,如果ffmpeg操作不了png格式图片,就需要先转成jpg
- 如果想对视频进行换脸,必须调用
from PIL import Image
img = Image.open('lyf_1.png')
img.save('lyf_1.jpg')
直接将png格式读进去,然后保存为jpg即可,再配合os模块即可批量转换
补充
使用频繁的linux命令
# 查看当前文件下的文件数量(仅文件)
ls -l | grep "^-" | wc -l
# 解压zip文件,可能会把一大堆文件直接解压在当前文件夹,建议在一个空文件夹内解压zip文件
unzip lyf.zip
# 压缩文件夹lyf内的所有文件
tar -zcvf lyf.tar.gz ./lyf
# 查看当前目录下所有的文件大小
du -sh *