缘起
deepfakes是利用AI技术换脸的开源项目,目前基于deepfakes的开源项目很多,而faceswap认可度很高,到目前为止有28.5千Star,可以说是换脸这类项目最火的了。小弟在当下有换脸需求,选取了这个项目进行研究尝试,将自己的经验和体会记录下来,希望对你有所帮助!
感谢公司、领导、一切关心支持我的人!
效果
先上一些效果,增加一些趣味性!
官方换脸效果1
官方效果2,小扎在国会舌战群儒的场景
第一次尝试换脸,演讲者左右换姿势,似乎是为不冷落两边的观众
另外一个换脸后的效果
尝试了很多此换脸,不在此一一列举。
+++++++++++++++++++++++
准备
需要一块好的nvidia显卡,最低是1080或以上,众所周知,机器学习是费时的,一块好的显卡可以帮助你节省大量的时间,我用的机器配置了4块TITAN xp显卡,这个项目训练时大部分小弟用到其中两张显卡,在训练villain模型时,用到了其中三张,villain很吃显存,基本上一天可以训练出一个比较清晰的模型。
如果只有CPU,我建议还是放弃尝试,据说训练时间是以周为单位的,训练出一个结果,可能需要数周,那就需要极大的耐性。训练中你机器CPU100%的被烧数周,不能干其他事情。而训练一个模型可能并不让人满意,每次调整参数,又的继续等待数周。大概你周游完欧洲各国后,回家一看结果还没出来!
如果在linux上运行程序,需要一些ffmpeg知识、一些shell脚本经验
该项目在windows上可以直接运行图形,我只有ssh命令行连接的ubuntu服务器,所以自己写了写脚本来处理,很羡慕GUI版本
后来突然领悟可以在我的mac笔记本上运行图形界面,用来查看配置选项。
图形界面是这样:
能运行图形界面操作起来更方便,但是如果像我一样在服务器上通过ssh登陆,也无妨。
在本地调整好参数,同步到服务器上就行啦。
安装好CUDA 10.0 和 anaconda,这个到处都是教程,在此不累叙。
安装faceswap
下载项目https://github.com/deepfakes/faceswap
需要注意的是这个项目经常更新,有时可能不稳定,所以我clone了一份在自己的github里https://github.com/hnjiakai/faceswap ,幸运的是我用clone的这个版本,训练和转换等整个过程都很顺利,没有出现论坛里讨论的各种奇奇怪怪的问题。
1、利用conda创建好运行faceswap的虚拟环境
conda create -n face tensorflow=1.14 python=3.6
2、切换到虚拟环境
conda activate face
3、安装依赖环境
pip -r requirements.txt
conda install opencv
这些其实已经完整99%的安装,剩下1%用到时提示缺少可以用conda install xxx安装。详细的安装过程可以参照https://github.com/deepfakes/faceswap/blob/master/INSTALL.md
人脸资源准备
A人脸,以后简称A脸,从需要变脸的视频中得到,我用ffmpeg将视频A转换成图片到A-src文件夹,然后利用faceswap抽取人脸到A-desc文件夹为后续训练做准备。
B人脸,以后简称B脸,从另外一个视频中得到,同样用ffmpeg抽取帧B-src文件夹,然后利用faceswap抽取人脸到B-desc文件夹。
抽取的配置图:
抽取人脸的配置截图中,红框部分做调整就可以,其他默认就OK
1++++抽取帧的ffmpeg命令
ffmpeg -i a_movie.mp4 -qscale:v 2 -f image2 -r 1 zhubo-src/img_%d.jpg
更多ffmpeg用法请看https://blog.csdn.net/jiakai82/article/details/103288726
2++++利用faceswap抽取人脸图片
A脸提取
faceswap.py extract -i A-src -o A-desc -D s3fd -A fan -M extended
其中-M extended我选择是增强,其他参数选择默认就行,我尝试了很多参数,走了不少弯路,最后发现这个最适合我
B脸提取
faceswap.py extract -i B-src -o B-desc -D s3fd -A fan -M extended
抽取时的截图:
最下方会显示抽取进度,可以看到当前进度8%。
实际操作过后,抽取思路其实比较清晰了,有上面这些其实已经够啦。
在抽取过程中您仍然可能碰到各种问题,可以在下面连接里获取更多信息
最全的人脸抽取指导在这个https://forum.faceswap.dev/viewtopic.php?f=5&t=27
个人觉得-M extended 选项最有用,可以根据自己需要调整extended或者是其他,剩余的选项其实大多默认就行
extended增强模版,用意在尽量包含眉毛。
A-src A-desc B-src B-desc 这四个目录最好换成你的工作目录路径,便于管理
我的某个模型的工作目录大概这样
目录文件一目了然,train.ini放置的是本模型训练的配置文件,my_conf.sh放置的是训练时的命令行参数配置信息,
train75-original,75表示的是比例、original表示的是模型插件名。
我使用的人脸全都是正面的,项目需求是这样安排的,视频中始终只有一人,所以不用考虑人脸清理等操作,也节省了不少时间。
下图是需要换脸的A脸其中的一张
A脸我大概收集了5000张,是从一段3分钟视频中截取
下图是B脸图片其中的一张
B脸图片大概也收集了5000张,同样是从另外一段三分钟视频中截取。
人脸准备很快就说完了,其实为了整理人脸,费了不少时间,包括人脸视频选取,下载处理,美容等。
在没有美容前,B脸偏暗,是这样的:
训练出来的结果总是灰头土脸,后来提亮肤色后,好很多。
参数调整
现在人脸图片已经准备好了,接下来就是准备训练train了。
train的最全指南在这里https://forum.faceswap.dev/viewtopic.php?f=6&t=146
+++++++++++++++++++++++++++++++++++++++++
用默认参数完全可以开始训练了,但是考虑到训练是个漫长的过程,在调整好你想要的参数后再训练,可以节省无谓的时间浪费。
train的参数大概有几十个吧,这么多参数各种组合起来数量还是很多的,如果都要实验一遍的话,可以玩很久。
+++++主要参数
train的参数有很多,包括Plugins部分的参数(Configure Train Plugins )和train阶段时用到的命令行参数,大部分参数其实默认就挺好,有些特定参数,做些调整,
从而可以训练出更好的结果。
首先说下Plugins参数
Global部分,最有调整性的是Coverage,我尝试了很多,从62%到100%都有,最后得出结果是68%到75%之间的效果最好
Coverage并不是越大越好,自己可以尝试调整。
MaskType用none,其他我也有尝试,但是并没有什么进步,还是回到none。
Train Plugins之model标签:
我最常用的是original和villain,GPU内存够用就没勾选 lowmem。
下面这些选项可以根据自己需要调整,我基本不调整他
下面是命令行参数选项卡
我更关心红色部分,这是些主要的选项
各个选项都很好理解,其中WriteImage可以将图片中间结果保存,可以随时查看训练结果,觉得满意啦就可以停止训练
图片是这样的:
在选择好你的参数后,将faceswap项目目录下的config里的几个.ini文件,拷贝到服务器上,如果是本地训练可以忽略
点击generate按钮,会生成命令行,可以粘贴到服务器上运行,如果是本地直接点击train按钮运行
训练
上面已经开始训练了,训练中可以随时查看faceswap目录下的training_preview.jpg文件,觉得不错就可以停止。
重要的事情再说一遍,看到training_preview.jpg文件,效果不错了,就可以停止了
++++++++并不是迭代次数越多越好,也不是看lose越小越好
肉眼直接看training_preview.jpg图片是最好的方法
model文件夹里的文件结构
如果中间训练时出错,无法继续训练,可以通过.bk文件还原
为了防止过分迭代,比如,可以加入-it 100000,迭代10万次会自动停止
接下来是个漫长的过程,时间长短取决于你的GPU性能。。。。。。。。。。。。。。。。
转换
在觉得训练结果已经不错,或者想看看结果如何,都可以停止训练,开始转换人脸,就是将A脸换成B脸
train是个很重要的过程,有很多参数,convert也同样挺重要,也有很多参数,不同参数影响结果也挺大
conver命令行参数:
在尝试很多参数变更后,最后回到调整红色部分的主要参数
ColorAdjustment 主要调整avg-color和seamless-clone
ColorAdjustment如果支持组合模式,我觉得可能更完美些,已经向作者提出建议
++单纯用seamless-clone五官抖动厉害,单独用其他的融合很不完美
seamless-clone效果图:
不用seamless-clone效果更不好
MaskType主要用到extended和predicted
extended能解决眉毛问题,但是下巴有问题
predicted眉毛有问题
++extended能够将眉毛包含覆盖,predicted要差些,眉毛总有问题
++++如果换脸时有多人,可以用排除法,或者包含法,避免替换了额外的人脸。
我尝试很多组合,大概训练了2位数那么多的模型,花费了无数时间,但是始终没找到完美的组合!
这些模型占用磁盘达到383GB,GPU在日夜不停的训练
所以我觉得,faceswap完成完美的替换在某些情况下还是比较困难的。
faceswap有很多参数可以选择,可玩性很强,可选很多,容易陷入选择泥团。
虽然有不完美但是faceswap是个不平凡的项目!
合成视频
转换后的图片,我通过ffmpeg合成视频,暂时没考虑语音,语音也可以通过ffmpeg后期合成
"ffmpeg -i ./converted-$convert_name/img_%0d.png -c:v libx264 -vf "fps=25,format=yuv420p" convert-movie-$convert_name-$dname.mp4"
合成了文章开头那些视频
+++++++++
总结
这次换的有瑕疵,原因有多种可能:
第一、可能是选择的AB肤色有关系,图片中女性脸都非常白,稍有差池就能看到暇疵,我觉得肤色比较黑的可能更好;
第二、可能也和算法有很大关系,期待作者出更完美的算法,包括在学习部分和脸部融合部分,在convert阶段,如果支持多种融合的组合,比如semaless-clone加vag-color组合,等,效果可能更好,我以向作者提出这个建议,他们考虑会加上,但是可能时间比较长;
第三、可能是要找到适合AB脸的参数,需要更多的尝试,比较费时,每个换脸的参数可能都不同;
第四、可能是人脸始终是正脸,光影很单调,我觉得如果是经常左右动的脸(有些演讲人会),可能更好些;
机器学习是个学习过程,没有完美答案,也不能1+1=2那么直接,更多是概率,这次没成功可能下次会成功。
时间有限,关注那些重要的参数。
小弟接触换脸时间不长,能力也有限,希望大牛不吝赐教,万分感谢!
感谢
感谢公司、感谢领导、感谢一切关心支持我的人!
后记
期待faceswap的进步,让换脸更完美!
近闻微软和北大搞出了个新的换脸算法,https://mp.weixin.qq.com/s/gGCyMq4PM_Whv-Ssiwt-HA,据说可以秒杀faceswap!目前只有论文没有代码,希望有大佬可以开发出来并开源,造福万千程序员!
免责声明
文中人物图片来自网络,如果有侵权行为,请留言作者删除。
全文结束