最近刚好接触深度学习的一些项目,又比较清闲,所以研究了一下faceswap的使用。faceswap可以用来实现换脸,由于并非专业学习,具体原理没有做深入研究,仅仅做了两天,了解了一下使用过程,在这里做个记录。
我这里用的是linux云服务器,个人windows笔记本、台式机也可以,大同小异。个人亲测阿里云学生服务器1核2GB运行不了,训练过程中总会终止。服务器这一块大家自行准备,这里仅供参考。如果有人阿里云学生服务器成功了可以评论交流一下。
现在时间是2020.11.29。faceswap会不断更新,可能不同时间略有差异。
这里没什么好说的,直接github下载就可以了:
git clone https://github.com/deepfakes/faceswap
下载后放到faceswap目录下。如果太慢可以考虑手动下载。
这里用了个简单的python爬虫爬取的百度图片。代码网上很多,可以自行搜索。我这里用的是
https://blog.csdn.net/qq_40774175/article/details/81273198 这位作者的代码,表示感谢。我这里爬取了两个人的图像,每人1000张左右,分别放在两个/data/liu 和 data/ma下。
# 提取人物A的人脸
python faceswap.py extract -i ../data/liu/ -o ../data/liu/face
# 提取人物B的人脸
python faceswap.py extract -i ../data/ma/ -o ../data/ma/face
# -i -o 后分别为输入图片的相对路径和对应的输出人脸的相对路径
这里可能会报错,提示你缺少各种包,总之缺什么装什么就可以了。
人脸提取完后会在data/liu和data/ma下会生成一个face文件夹和一个alignments.fsa文件。
这里注意:
提取完后需要将alignments.fsa文件移动到或者复制face文件夹下才可训练,否则训练会提示缺少文件。
至此,数据集准备完毕。
切换到下载的faceswap文件夹下,会发现很多文件,不需要管,执行以下命令开始训练
python faceswap.py train -A ../data/liu/facet -B ../data/ma/face -m ./models/
# -A -B 后为人脸A和人脸B的相对路径,-m后为模型保存的相对路径
这里注意:
模型训练过程中会不断输出loss值,一般在0.03左右效果不错。我这里仅仅达到了0.05左右基本不降了,具体原因还没找到,效果的话大概能看出更换之后的样子,只是有点模糊。
训练过程中每隔一段时间会保存一次模型,程序中断后再次执行会在上次的模型基础上训练,具体操作可以看他的提示。训练需要手动停止,一般看loss下降到合适的值或者基本不降了之后就可以手动停止了,训练完后模型保存在上面指定的路径下。
训练完后,可以用模型换一下试试效果,可以给图片换脸,也可以给视频换脸。
假定在data/liu_test目录下有几张人物A的图片用以测试。
python faceswap.py extract -i ../data/liu_test/ -o ../data/liu_test/face
# 首先提取测试集人脸
pthon faceswap.py convert -i ../data/liu_test/ -o ../data/liu_test/output/ -m ./models/
# 转换人脸参数分为别为输入测试集图像路径、输出图像路径和所用模型路径
这里注意:
转换完之后在/data/liu_test/output后会看到换脸后的效果图。
视频换脸的本质仍然是图片,只是将视频抽帧成许多图片,将图片换脸,再合成视频。
python tools.py effmpeg -i ./liu.mp4 -o ./video_output -s 00:0148 -e 00:0156
参数分别为:视频路径、输出抽帧图片路径、需要抽帧的时间段
抽帧后会在video_output目录下看到抽帧的后的图片,然后将其按上述图片换脸方法处理得到换脸后的图片。
图片合成:
图片合成也有一条命令,不过我这里没有运行成功。所以我直接用了windows自带的视频剪辑器将
图片合成了视频,只是没有配置。关于怎么合成视频,网上有很多方法,可以自行搜索,如有好的方法欢迎留言。
至此这个记录就结束了,不能算个教程,因为没有涉及任何原理,仅仅学习了如何使用,记录一下两天做的事情。后续如有其他研究会继续更新。
最后附上我训练的模型和数据:
模型:https://github.com/YWonchall/faceswap
数据:https://download.csdn.net/download/weixin_45821421/13203882
如果觉得不错,点个star~