本篇攻略的主题,是在 GPU 云主机上安装 DeepFaceLabv2,并通过远程桌面 vnc,远程操作素材的编辑,和模型的训练,最后生成换脸视频。
DeepFaceLabv2 是全球领先的视频换脸开源软件,对于算力和存储空间的要求都很大,所以,笔记本电脑无法胜任,要么买一台 GPU 台式电脑,要么通过远程桌面 VNC,远程操控 GPU 云服务器。
DeepFaceLabv2 的使用,不难,但是不直观。程序员看着都费劲儿,普通用户很可能会望而生畏。
本篇攻略,我参考了三篇文章,
《 Easy Deepfake Tutorial: DeepFaceLab 2.0 Quick96 》。这是官网教程,有视频,直观,但是文字说明不详细。 《 Project Aksel: Deepfake Head Replacement 》。不仅有截图,而且文字说明详细。主要参考的是这篇攻略。 《 简书:DeepFaceLab 3.0 使用总结 》。中文,文字说明详细,但是没有截图。必须边做边读,否则不解其意。一. 租赁 GPU 云主机
远程操控 GPU 服务器有三个办法,但是只有一个办法在国内行得通。
使用 Google Colab,但是因为防范不良内容,避免争议。所以 Google Colab 对于 DeepFaceLab 做了特别限定。加上需要翻墙,还需要支付美元,所以 Google Colab 的办法,在国内不太方便。
买一台 GPU 台式电脑,放在家里,然后通过 VNC,远程遥控家里的 GPU 台式机。
租赁 GPU 云主机。我尝试了三个 GPU 云平台,MistGPU、恒源云、和矩池云。这三家都提供 VNC 远程桌面服务,这次选择了矩池云。
在矩池云上租用 GPU 服务器,有很多机型可供选择。DeepFaceLab 官网教程上,对于机型的选择,说得很详细。
矩池云上有很多种 GPU 机型,似乎选谁都可以。但是对于矩池云来说,他们家的 GPU 服务器上,跑的 OS,全部是 Ubuntu Linux,所以,似乎哪一款机型都能运行 DeepFaceLab v2。推荐使用 NVIDIA GeForce RTX 2080 Ti ,不推荐使用 NVIDIA Tesla K80。
租赁了 GPU 服务器以后,接下去就是在笔记本电脑上安装 VNC Viewer。我用的是 MacBook Pro,所以,直接从 AppStore 下载 VNC Viewer。Viewer 是免费的,而矩池云需要花钱购买 VNC Server。
下载安装了 VNC Viewer 以后,接下去要把 VNC Viewer 连接到矩池云的 GPU 服务器上去。矩池云的 VNC 使用指南写得很详细,亦步亦趋照着做,顺利完成连接。
二. 安装 DeepFaceLabv2 for Linux
租用矩池云的 GPU 服务器时,需要选择系统镜像环境。其中有一个选项是 DeepFaceLabv2,点选之。不过,理论上来说,不选 DFL2 的系统镜像环境,自己安装部署,也可以。我暂时没试过。
租用矩池云 GPU 服务器时,要点选系统镜像环境 DeepFaceLab v2。进入 GPU 云主机环境后,发现有些机器上,已经安装了 DFLv2,有些机器没有。我用的服务器上,已经安装了 DFLv2,如下截图所示,但是我没有用它,担心被前人用过后,DFLv2 的 scripts 等文件,可能会被修改过。
最安全的做法,是从 Github 上自行 DeepFaceLab,然后自行安装。整个过程不麻烦。
2. 根据 DeepFaceLab_Linux 的指示,安装 DeepFaceLab。
DeepFaceLab_Linux 的 Github 官网主页第一步 “conda create …” 和第二步 “conda active …”,这两个指令将在当前文件夹下,创建一个虚拟环境,避免与其它项目环境冲突。
在执行第一个指令时,可能会遭遇报错,报错内容如下。
报错原因是 conda 在清华的 channel,404 挂掉了,所以需要另选 channel。
根据 Stackoverflow 上的讨论,执行以下步骤,即可修复。
接着执行后续 DeepFaceLabv2 安装指令,
在矩池云上下载工具包,是一个非常缓慢的过程,通常只有不到 100 KB/s;凌晨 1:00 以后,或许会提速到 100~300 KB/s。
当运行 “bash env.sh” 的时候,如果遭遇报错,”Your shell has not been properly configured to use conda activate”,可以参考 Stackoverflow 上的讨论,和修改记录,执行以下指令:
如果仍然遭遇不能 conda activate 的报错,那就可以考虑修改 vim env.sh,注释掉下面这句 # conda activate deepfacelab,把 env.sh 改为,
三. 收集素材
素材分两类,一个是 src,可以是视频,也可以是照片,另一个是 dst,必须是视频。任务是,把 src 中视频或照片中的人脸,贴到 dst 视频中去。
插一句嘴,是否可用 DeepFaceLab,自动给一张照片换脸,而不是给视频换脸?
理论上来说,应该是可以的,因为视频无非是一堆照片而已。不过,仍然需要查阅 DFLv2 源码,才能确切地知道,DeepFaceLab 是否支持照片换脸。
收集素材:
我从 DeepFaceLab 中文论坛上,下载了刘亦菲 2550 张照片作为 src,又从同一个网站,下载了俄剧中的女皇登基的片段,作为 dst。2. 放置素材:
DSLv2 的完整操作,由很多步骤组成,每个步骤需要执行相应的 script。
DSLv2 的完整操作,由很多步骤组成,每个步骤需要执行 sh 脚本。先执行第一个脚本 “1_clear_workspace.sh”,
短暂的运行结束后,会在 ~/DeepFaceLab_Linux 文件夹下,生成 workspace 文件夹,以及子文件夹,data_src 和 data_dst,还有孙文件夹,aligned 和 aligned_debug 等等。
DeepFaceLabv2 文件夹结构四. 切图
脚本 2_extract_image_from_data_src.sh 的功能,是假设我们的 src 素材是一段视频,脚本 2 从视频中,把包含人脸的画面,截取出来。
下面解释一下,如何执行脚本 2 。但是对于本篇攻略的案例来说,不需要执行脚本 2。
为了方便脚本 2 工作,我们需要把视频的文件名称,改为 data_src。如果 src 视频是 mp4 格式,名称改成 data_src.mp4;如果 src 视频是 avi 格式,名称就改成 data_src.avi。
改名后,要把 data_src.* 视频,放置在 ~/DeepFaceLab_Linux/workspace/data_src.*
执行脚本 2 时,需要设置几个参数,我们参考了《 Project Aksel: Deepfake Head Replacement 》这篇文章里的 merge 参数的设置,效果不错。执行完脚本 2 后,它会从视频中截取包含人脸的画面,放置于 ~/DeepFaceLab_Linux/workspace/data_src 文件夹中。这是 src 文件夹中,会出现很多很多 jpg 或者 png 照片。
我们从 DeepFaceLab 中文论坛上,下载的刘亦菲 2550 张照片,实际上已经完成了脚本 2 的工作。
只需要把这些照片放置在 ~/DeepFaceLab_Linux/workspace/data_src/ 文件夹中,即可,不需要额外执行脚本 2。
执行完脚本 2 以后,可以删除 ~/DeepFaceLab_Linux/workspace/data_src.* 视频文件。2. 脚本 3_extract_image_from_data_dst.sh 的功能,与脚本 2 类似,只不过它是用来处理 dst 视频的。
对于本篇攻略的案例来说,不需要执行脚本 3。
我们从 DeepFaceLab 中文论坛上,下载的俄剧中的女皇登基的片段,实际上已经完成了脚本 3 的工作。
只需要把这些照片放置在 ~/DeepFaceLab_Linux/workspace/data_dst/ 文件夹中,即可,不需要额外执行脚本 3。然后,把俄皇登基的视频文件,改名成 data_dst.*,例如data_dst.mp4,并放置在 ~/DeepFaceLab_Linux/workspace/data_dst.*
可以删除 ~/DeepFaceLab_Linux/workspace/data_src.* 视频文件,但是不可以删除 ~/DeepFaceLab_Linux/workspace/data_dst.* 视频文件。因为在后续合成换脸视频时,需要再次用到 data_dst.* 视频文件。
五. 抠脸
名称以序号 4 和 5 开头的脚本,数量很多。它们的任务,是从 src 和 dst 的每一张照片中,抠出人脸。
名称以序号 4 和 5 开头的脚本,都是用于抠脸任务。对 src 照片进行抠脸。
脚本 4_data_src_extract_faces_S3FD.sh 的任务,是从 workspace/src/ 文件夹中一大堆照片中,自动挑选质量好,角度丰富的照片,然后从中抠脸。抠脸生成的照片,被自动放置于 workspace/src/aligned 文件夹中。
脚本 4.2_data_src_util_faceset_enhance.sh 的任务,是改进抠脸的照片质量。
脚本 4.2_data_src_sort.sh 的任务,是改变 workspace/src/aligned 文件夹中的照片的文件名。如果需要对多个人物进行抠脸,就需要执行这个脚本。对于本篇攻略的案例来说,这一步可做可不做。在执行脚本 4_data_src_extract_faces_S3FD.sh 时,需要设置几个参数,根据《 DeepFaceLab 3.0 使用总结 》,各个参数设置为,
选择脸型:有全脸(f)、整脸(wf)、头(head)。wf 比 f 替换面积更大,覆盖额头和胡子,f 只替换到眉毛上方一点点。一般选择默认的 wf。
设置最多识别几个人,如果视频大部分时间就 1 个人,那就选1;如果不少时候都是两人同框,且可能都需要,那就选 2。
设置图片大小:一般 256 够了,如果源视频质量不怎样,就算512也提升不了效果。
图片质量就默认 jpg 90。在执行脚本 4.2_data_src_sort.sh 时,需要设置排序方法,选择 5 histogram similarity。
2. 对 dst 照片进行抠脸。
文件名以序列号 4 开头的脚本,针对 src 照片进行抠脸;文件名以序列号 5 开头的脚本,主要针对 dst 照片进行抠脸。
如果把从 src 照片中抠出来的脸,生搬硬套贴到 dst 照片上去,效果不那么丝滑。例如,刘亦菲有刘海,而俄皇没刘海,而且前额很大。如果直接把刘亦菲的脸,贴到俄皇身上,俄皇的额头就会出现不和谐的光斑。
文件名以序列号 5 开头的脚本中,有若干以 5_XSeg_data_src_ 和 5_XSeg_data_dst_ 开头的脚本,它们的任务是对比 src 照片和 dst 照片,自动或者手工对 src 和 dst 照片,进行抠脸细节的再优化;然后训练 XSeg 模型,从而保障贴脸的效果更丝滑。
在本篇攻略中,暂时跳过 5_XSeg_data_* 脚本,不优化贴脸效果。所以,最后生成的视频中,刘亦菲出演的俄皇,前额的效果不够丝滑。
在执行脚本 5_data_dst_extract_faces_S3FD.sh,也需要设置几个参数。设置的参数值,与4_data_src_extract_faces_S3FD.sh 一致。
六. 画脸
所谓训练模型,实际上是训练画脸的模型。画脸模型,根据 src 照片中人脸的要素,同时根据 dst 照片中,dst 人脸的角度和表情和光线,在 dst 照片中绘制 src 人脸应该呈现长什么样。
整个训练过程很长,但是可以窥探过程中的效果。当效果满意时,可以按键 Ctrl-C,强行终止训练过程。
本篇攻略,我们选用了轻量级的贴脸模型 Quick96,训练速度较快。如果重质量,不在乎训练速度,可以选用重量级的 SAEHD 模型。对比两个模型的贴脸效果,可以参阅 Reddit 上的帖子。
以下截屏,是 ~/DeepFaceLab_Linux/workspace/merged 下的几张照片,分别是训练了几千次,和几万次回合后的画脸效果。我们发现,把 Quick96 模型训练 20000 万以上,模型的质量就趋于稳定,也就没有必要再继续训练了。
DeepFaceLab Quick96 训练迭代过程七. 贴脸
模型训练好了以后,就可以根据 dst 的每一帧照片,绘制在这帧照片的角度、表情、和光线场景下,src 人脸应该长成什么样,这是 7_merge_Quick96.sh 的任务。
每一帧 dst 的照片都绘制完成后,把所有绘制的照片合成在一起,成为完整的视频,这是 8_merged_to_mp4.sh 的任务。
在执行脚本 7_merge_Quick96.sh 的时候,需要设置若干参数。参数设置不正确,贴脸就不正确,最后合成出的视频,也就不正确,所以这一步设置参数很重要。
我们参考了《 Project Aksel: Deepfake Head Replacement 》这篇文章里的 merge 参数的设置,效果不错。
在执行脚本 8_merged_to_mp4.sh 时,需要用到原生的 dst 视频。如本文第三节所述,不可以删除俄皇登基的原生视频,而是把它改名为 data_dst.mp4,放置于 ~/DeepFaceLab_Linux/workspace/data_dst.mp4
执行完成脚本 8_merged_to_mp4.sh 后,在 ~/DeepFaceLab_Linux/workspace/ 文件夹下,自动生成两个视频文件,result.mp4 和 result_mask.mp4。
result.mp4 是我们需要的换脸后的视频,而 result_mask.mp4 展示的是,在视频的每一帧中,换脸的区域。下面的视频,对比了 result.mp4 的一个片段,和相应的 result_mask.mp4 片段,result_mask.mp4 展示了换脸的区域。
暂无评论内容