AI换脸项目faceswap研究报告

缘起

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!目前只有论文没有代码,希望有大佬可以开发出来并开源,造福万千程序员!

免责声明

文中人物图片来自网络,如果有侵权行为,请留言作者删除。

全文结束

发布了13 篇原创文章 · 获赞 6 · 访问量 729

猜你喜欢

转载自blog.csdn.net/jiakai82/article/details/103875363