手头刚好有个3080,就选用DFL3.0 1120 RTX30版本。DFL由版本+日期+适配显卡组成。
1 安装
Windows下基本是解压开箱即用。
主要是安装驱动,下载驱动:
https://www.nvidia.cn/Download/index.aspx?lang=cn
查看CUDA版本:NVIDIA控制面板 - 菜单 - 帮助 - 系统信息 - 组件 - NVCUDA64.DLL。如果需要安装cuda和cudnn,参考:
https://developer.nvidia.com/zh-cn/cuda-downloads
https://developer.nvidia.com/rdp/cudnn-archive # 复制到文件夹
2 使用
2.0 准备视频
源视频的素材可得好好选取准备,越清晰越好!因为清晰的可以变模糊,但模糊的想要清晰可就难了。近景远景正脸侧脸死亡角度白天黑夜喜怒哀乐各种有代表性的,可以用格式工厂之类的进行截取、拼接、转化,最终存为data_src.mp4
。
目标视频处理比较简单些,看作者的成品想法,最终存为data_dst.mp4
。为了换脸丝滑,src和dst尽可能选择表情、角度、光源接近的,src的数据量可以多一些。
2.1 src切图
- 点击运行
2) 源视频转图片 extract images from video data_src.bat
。 - 输入自定义帧率,推荐值10,以减少重复图片。
- 选择格式,有两种,PNG无损清晰,JPG文件小,要求不高的就用JPG吧。
回车开始切图,40分钟的视频,不到1分钟就切完了,存在workspace\data_src
根目录。这些图片只是为了后面切脸,所以切完脸可以删掉。甚至有的第三方切脸软件可以直接从视频开始,那就省略这一步了。
2.2 dst切图
- 点击运行
3) 目标视频转图片 extract images from video data_dst FULL FPS.bat
。 - 选择格式,比如JPG。
回车开始切图,这个根目录下的图片千万别删除,没人脸也别删,因为每一张图最后都是用来合成视频的,所以不需要输入帧率。
2.3 src切脸
点击运行4) 提取源头像 data_src faceset extract.bat
。会有参数需要设置,如图:
- 选择脸型:有全脸(f)、整脸(wf)、头(head)。wf比f替换面积更大,覆盖额头和胡子,f只替换到眉毛上方一点点。一般选择默认的wf。
- 设置最多识别几个人,如果视频大部分时间就1个人,那就选1;如果不少时候都是两人同框,且可能都需要,那就选2。
- 设置图片大小:一般256够了,当然分辨率当然越高越好,但也耗资源。不过如果源视频质量不怎样,就算512也没啥用。
- 图片质量就默认90。
- 调试图片也没啥好看的,错切的到时候删掉就是。
设置完毕,回车运行脚本,3080切脸速度大概2张/秒。会生成到workspace\data_src\aligned
目录。
如果希望加快切脸速度,可以网上找一些专业提脸软件,速度能提升10倍左右。
接下来是重要的整理工作:
推荐使用第三方软件MVE(Machine Video Editor)
进行切图纠错、蒙板管理,很强大,有兴趣的自行研究。
- 可用VisiPics软件去除掉无意义的重复的图。
- 点击运行
4.2) 源头像排序 data_src sort.bat
将图片排序,一般选择5-颜色直方图排序。筛选下,删除掉模糊的、旋转的(基本是因为识别失败)、残缺的、有遮挡的、有黑边裁切的、刘海太大的、不相干人物的、以及光照差异大的。如果是普通的遮挡物且素材奇缺,可以保留着用作遮罩训练。 - 识别不准的如果很珍贵,可以进行手删补切。就是删除掉debug目录里对应的错图,然后运行手动提取脚本
data_src faceset extract MANUAL.bat
再来一次,素材多就直接删了吧。 - 还可以运行排序脚本按1-模糊程度排个序,然后删除,不过也有观点认为适当模糊的其实也可以留着训练,自行探索吧。
如果aligned里有多个人(初始会带着不同的文件名后缀,如_0、_1,一般按照同一张图里头像大小排序的),直接训练会产生混血儿。建议使用颜色直方图做排序,然后把不同的人归类到不同的文件夹备用,或者删除掉不需要换脸的人。这一步可配合人脸筛选工具进行,类似于iphone照片的人物识别归类,会方便许多。
https://github.com/MachineEditor/MachineVideoEditor
2.4 dst切脸
点击运行5) 目标头像提取 data_dst faceset extract.bat
。参数如下:
切完后进行整理。
- 建议用颜色直方图做排序,归类不同人到不同的文件夹备用,或删除掉不想换脸的,特别模糊看不清的。
- 极限仰脸/侧脸之类的都看不清谁是谁的,可以干脆删掉不换了。还有一个做法是,复制一份到src的aligned目录用于自己训练自己。或者想办法去src里补充下极限角度素材。
- 有遮挡的别删,因为也需要换脸。
- 对于脸部轮廓识别错误的、图片旋转但脸部清晰的,别直接删!需要人工修改下。先在Debug目录删除掉对应的图片,然后运行
data_dst extract faces MANUAL RE-EXTRACT DELETED RESULTS DEBUG.bat
,会提示发现一张图片,等加载完毕后,移动和滚动鼠标来调整区域,单击鼠标进行解锁或锁定,最后回车确认,就会开始提取,debug目录和aligned都会生成更新图片。
记住一点,这个aligned目录下的所有人脸,最终都是要被src的人脸替换的。比如如果留着多个人,会产生多胞胎。
2.5 处理遮罩(可选)
2.5.1 绘制
有时候dst图片脸上有遮挡物,如果不处理,到时候就直接把src整个糊上去。那会产生奇怪的效果,比如脸上没眼镜却有两个眼镜腿。
- 运行
data_dst mask for XSeg trainer - edit.bat
,会跳出界面绘制dst遮罩,就是框框抠抠,这是个细活儿,挺累的。 - 运行
train.bat
训练遮罩,设置脸型和batch_size,训练个几十上百万,回车结束。 - XSeg遮罩训练素材是不区分是src和dst。
2.5.2 使用Xseg模型(推荐)
网上有一些现成的遮罩模型,注意这跟换脸模型不一样,虽然也是放到model目录。有两种使用方式:
- 训练前先推理遮罩。运行
data_src/dst trained mask - apply.bat
,将遮罩写入图片并学习非遮罩区域。 - (推荐)合成merge时,在交互窗口,按X,实时选择遮罩并预览,新手就用这个吧,别训练了,效果略差,但也差不到哪里去。
在别的基础上训练,比直接拿来用好一些。是否重新训练
Xseg模型可复用,手工画完的遮罩图可运行data_dst mask for XSeg trainer - fetch.bat
搜集起来,增量训练。不过新手用不到。
2.6 训练
入门或者配置低可使用轻量级的train Quick96.bat
,不需要设置参数。这里重点说下重量级的SAEHD
。
首先,新手务必找个预训练模型(仙丹)来继续训练,会大大减少时间、提升效果!!!
使用仙丹后再训个几万次迭代吧,后期打开LRD和GAN。使用仙丹,分辨率没法改。
- batch_size默认可能是4,如果是沿用已有模型,启动训练后2秒内回车,可以修改batch_size等,比如16,单次迭代时间应该会变长。
- 模型架构:DF五官结构保留的更像,LIAE光影处理的更好,-u增加人脸相似度,-d分辨率不错,推荐LIAE。
- 几个层的宽度,根据配置选择,比如中间瓶颈层为256、编码解码层为64,而遮罩层一般是三分之一解码层宽度。
- 如果有闭眼、张嘴的素材,可以开启Eyes and mouth priority。
- 训练没进步了可以开启学习率丢弃(Use learning rate dropout)。
- Enable random warp of samples可以前期开启,提高训练难度,后期关闭。
- 配置高可以开一点GAN power ,比如0.1。GAN dimensions大概16。
- 变色处理:color transfer选RCT和LCT,可弥补光影变化不足,当然最好是收集更多全角度不同光影下的SRC素材。
- Enable gradient clipping梯度裁剪必须开启!
- src/dst loss都刷进0.2就差不多了,预览图蓝色和黄色分别代表src和dst。
- 或者,预览界面第5列足够清晰,且表情接近第4列,就可以回车结束了。
- masked_training: True。意思是只学习蒙板内的?待确认。
喜欢src的脸型,就打开true_face_power
,否则打开face_style_power
。不要同时开,一般是0.001。
最后,来自dfldata网站的一组从0开始训练的推荐参数:
# 先开这组参数训练10-60W
face type : WF
random_flip : off # 防止左右脸不一样的翻来翻去
random warp:y
adabelief : on
Eyes and mouth priority : on
color transfer mode: lct
# 再开这个训练10-30W,开了就别关了!
learning rate drop:y
# 再关闭随机扭曲训练10-30W
random warp:n
# 最后开GAN训练10-30W
GAN power: 0.1 # 此时loss比较低了,比如0.1,打开前可以备份下,容易崩
训练效果差一般就是因为src素材缺乏,没好料。
2.7 应用模型
本步骤将图片换脸,以前老版本叫convert吧。
- 入门可使用
merge Quick96.bat
,另有SAEHD(高质量)、AMP(实时换脸,用于DeepFaceLive)。 - 选择交互模式,输入法切换成英文;
- 线程数根据CPU确定;
- 显示快捷键后,按Tab切换合成预览界面/帮助;
- 快捷键修改调整,然后可以按
shift+?
,将这组参数配置应用到剩余所有帧,再按shift+>
,自动合成剩余所有帧,会出现沙漏。过程中可以暂停进行调整,然后继续应用、合成。 - 按住shift调整,参数每次±5。
各种参数自行试一试,多按一按,就找到感觉了!!!
2.7.1 覆盖模式
1-overlay,2-hist-match,3-hist-match-bw,4-seamless,5-seamless-hist-match,6-raw-rgb,7-raw-rgb-mask,8-raw-mask-only ,9-raw-predicted-only。
其中,4-seamless(泊松克隆)比较适配遮挡的情况,缺点:闪烁、抖动、偏暗。一般推荐2-hist-match的色彩比较接近,配合erode和blur使用。
2.7.2 直方图匹配阈值
Hist match threshold. [0..255] (default – 255): 快捷键QA
设定需要的亮度,适当降低该值,可以解决亮斑,比如238。
2.7.3 侵蚀
快捷键WS
调整被替换区域,值变大增大遮罩向内收缩程度,有时会出现亮色边。
2.7.4 模糊
Choose blur mask modifier [-200..200]: 快捷键ED
设定平滑度,羽化边缘,看起来模糊自然。如果不处理遮挡,hist-match (erode: 100, blur: 100);如果遮挡比较大,seamless (erode: 30, blur:0)。
2.7.5 运动模糊
快捷键RF
调节运动模糊程度,前后帧脸部变化越大,模糊程度越大。使用前确保aligned_dst的每一帧只有一个人脸。
2.7.6 超分辨率
快捷键TG
调节超分辨率效果,可以让人脸更清晰,可以设定为100。
2.7.7 锐化
快捷键YH
调节锐化程度,按N更改锐化模式,选择gaussian模式,按Y增加参数到5。
2.7.8 放大缩小
快捷键UJ
调节人脸大小。
2.7.9 背景劣化
有时候人脸不清晰,干脆降低背景画质,大家一起摆烂。其中,快捷键IK
调节图片降噪效果(和磨皮差不多),快捷键OL
调节双三次插值劣化效果,快捷键P;
调节颜色劣化效果。
2.7.10 遮罩与颜色控制区
- Z 直方图匹配对遮罩区域起效
- X 遮罩模式,记得是prd-dst效果比较好,多试试
老版本的还有:
Mask mode: (1) learned, (2) dst, (3) FAN-prd, (4) FAN-dst (5) FAN-prd * dst (6) learned * FAN-prd * FAN-dst help (?) . Default – 1:
一般选2,速度快。其他效果好,但慢,且在使用了Fanseg模型遮罩之后,必须使用FAN模型。
如果要处理遮挡,转换启动后启用动态交互,然后按Tab键盘进入预览窗口,按两次X,切换成Fan-dst。
- C 颜色转化模式
- V 查看遮罩范围
2.8 合成视频
设置下码率即可,比如3。
3 经验
3.1 复用模型
也就是使用预训练模型(灵丹)。先将其复制到model文件夹,然后src和dst放自己想要换脸的素材,开启训练后2秒钟内按回车,最后把“是否启用预训练模式 use pretrain mode”改为N。注意,这选项千万不需要Y,否则会调用内置的外国人数据进行训练。然后训练,基本一开始就能看到人影。如果看不到,就按回车结束训练,把预训练模型的.npy文件复制替换到模型文件夹中,重来一次。
预训练模型跟正式训练模型本质上都是模型,只不过预训模型使用了大量素材进行炼丹,学会了很多绘画技法。在其基础上再去专门学习画某个人,速度就快了。也有做法将正训素材也加到预训素材里一起炼丹,普通玩家就别随便炼丹了。
3.2 素材不够
- DF架构,src和dst素材互换进行训练,学习到dst的极限角度。
3.3 多人切脸
- 为了避免多人影响切脸,可以用PR蒙板圈出dst脸,并且路径跟踪脸部,然后导出data_dst.mp4,再切图切脸,速度快很多。然后把data_dst根目录的切图给删掉,将没有蒙板的原始视频拷贝成data_dst.mp4,切图即可,不要再切脸了!
- 合成换脸时,src dst的aligned目录只能有一个人!否则会出现双胞胎、混血儿。先把闲杂人先移走,换好一对脸,把帧图保存下来继续换下一个,最后合成视频。
- 最好一人一丹,更好是一对一丹,费点事。
4 问题
4.1 报错
大部分是因为驱动太旧、显存太少。如CUDA driver version is insufficient for CUDA runtime version
,Could not create cudnn handle
,可以升级驱动解决。
4.2 视频抖动
- 可能是dst切脸轮廓不统一,参考之前的手删补切解决。
- 侵蚀过大,调到比如50试试。
- 打开颜色转移CT,比如lct。
- 试试增加训练时间,或者增加LRD的时间,以稳定像素映射。
4.3 视频闪烁
- 有可能是dst漏切脸了,导致视频在src和dst两张脸间闪烁,可以去aligned目录检查一下并补充。
- 视dst切脸的准确程度,也可能造成局部闪烁,手删补切吧。
- 还可能是dst光影丰富,而src光影不足,可以换成LIAE架构,或者想办法补充src素材吧。
4.4 肤色不统一
- 训练时间不够
- 缺少src素材
- 建议开启颜色转移CT,不停按C看看效果
- 软件后期
4.5 皮肤太光滑
- 训练充分后,关闭随机扭曲random warp,开启GAN0.01-0.1,提高清晰度
- 合成时再加超精细和锐化(box),按T加大超分辨率