换脸开源项目faceswap在centos的实现

富强 民主 文明 和谐
自由 平等 公正 法治
爱国 敬业 诚信 友善


服务器环境: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、人工筛选

图片进行面部特征抽取后,会变成下面这种大头照。
面部特征抽取后.png
这时候就需要进行人工筛选了,这一步是最耗时的,因为最后入模型的就是这些图片,因此需要仔细的筛选。

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 *
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值