本来想逐字翻译 DeepFake Clud 的这篇教程,但是在翻译了其 Google Cloud FakeApp Tutorial在 Google Cloud 上使用 FakeApp)之后有点累。那就简要地说明一下好了,哈哈。网上也有其他详细文字及视频教程可供参考。

如果你还不知道"DeepFakes""FakeApp"到底是什么,自己搜索一下。简言之就是利用深度学习来给视频中的人物换脸。

深度学习依赖 GPU 的计算能力,所以要么得有相应的设备(钱),要么得有获得相应计算能力(云等)的途径。云的话可以考虑一下 Google Cloud.

准备好硬件之后,可以开始玩耍。

注: FakeApp 仅支持 Windows,但很多基于 DeepFakes 的应用支持在 Python 下使用,可在 Github 上看看。

1.软件安装

CUDA Toolkit 8.0

Toolkit 可以帮你安装显卡的驱动及相关运算平台。一般深度学习框架都基于CUDA 7.5 或 8.0版本,所以装了最新的9.1版可能会无法使用哦。此处下载,一个主体一个补丁,依次安装。一般装完就可以了,如果有问题再按此文检查环境变量。

FakeApp

FakeApp 最新版本为2.1,提供更为便利的操作,可以自动从视频中提取截图、自动拼合换脸后的图片,推荐小白安装此版本。我之前安装的是1.1版的,需要手动对训练数据进行提取。

可以在下载1.1版或在下载2.1版。

下载完后解压,我使用的是 Google Cloud 的 Windows 实例,只有一个分区,就解压到了C盘根目录下。然后,在C盘根目录下创建 fakes 文件夹,在其下创建两个新文件夹:data_Adata_B. 然后把刚才解压的 FakeApp 目录下的 model 文件夹复制到这个文件夹下,最后的文件夹结构是这样的。


<center>图:DFC</center>

Visual C++ Redistributable for Visual Studio 2015

并不需要安装 Visual Studio,有这个运行库就行了。未安装可能会报错。

ffmpeg

如果你选择的是2.1版本的 FakeApp,那么你可以用其自带功能进行截图和整合。如果是其他版本,可以利用第三方软件来操作。小白推荐使用PotPlayer 等软件在图形界面下进行操作(参考这个图解)。可以的话,在命令行界面下用 ffmpeg 可以进行更随心所欲的操作。

如果截取 png,图片清晰,但体积较大;如果截取 jpg,默认设置压缩比较严重,画面不清,要自行设置图片质量参数 -qscale:v 2~31,数字越小质量越高。

我使用的命令是(作为参考):

1
ffmpeg -i VideoName.mp4 -qscale:v 2 -vf fps=10 &quot;ImageName%04d.jpg&quot;

训练时可以斟酌每秒截几帧,但要替换的视频的请每帧截取(不然合成视频之后会很奇怪)。

2.准备训练数据集

从上面的文件夹结构就可以看出,至少得准备两个数据集。简单说来,A是想被替换原始视频的数据(身子),B是想用来替换脸的理想视频的数据(脸)。但一般放在A里用来训练的数据并不限于要被替换的视频([被替换]是[训练]的子集),有些人甚至一开始用不同人的脸来训练模型,此处不做展开。

理论上,换与被换的两人最好本身就长得比较像,两个视频的拍摄环境也最好相似(光线、角度)。素材的选取很大程度上决定了模型的质量以及最后换脸的效果。一般来说每个数据集要有几百上千张图片才能构建一个比较理想的模型。在我的测试中,A用了750张图片,B用了1600张图片,但是两人的角度都不是正面,且比较单一,对合成效果有所影响。

2.1版本的 FakeApp 可以直接在软件用视频进行截取,我所使用的1.1版本需要手动将视频转化为截图之后再进行脸部提取。用 ffmpeg 将两个视频片段进行截图后,将截图文件分别放入 data_Adata_B 文件夹。

3. 提取脸部数据

进入 FakeApp 目录下,点击 fakeapp.bat 运行程序。在第一个选项卡 Extract 中,设置数据集的路径、图片格式( jpg 或 png 等)、是否含有多张脸。记得处理器要选 GPU 噢,CPU 也可以跑但是速度,呵呵。分别对数据集 A 和 B 进行操作。

这一操作会将每张数据集图片中的脸部提取(并对齐)为 256256 的小图放置在 aligned* 子目录下。

4. 模型训练

将 A 和 B 两个数据集都进行脸部提取之后就可以进行训练了。

在第二个选项卡 Train 中,可以调整模型参数。一般来说默认的设置在跑够时间、损失函数达到一个较小的值之后可以获得一个还不错的效果。所以当程序提示内存不足的时候,要么缩小数据集原图的尺寸,要么将 Batch Size 缩小至32或16(最小为16)。还不行再缩小层级和节点。

设置完之后按 “Start” 就会开始训练啦。训练过程中能看到损失函数在逐渐缩小,而预览图中的A会越来越像B。


图:Vox

原理大概是,在A和B间构建一个神经网络,里面有若干层级,每层都有若干神经元,各层神经元依不同权重进行连接。而训练的目的,就是找到最合适的权重,使得A能够尽可能地接近B。

模型的训练是可以中断的,数据集也是可以进行修改的。相信不久以后,就会有很多网友共享已经训练好的模型,节省训练时间。

5. 换脸

模型训练好之后(模型训练是没有自动终止点的,练到你满意的效果即可,一般来说需要耗费16~30个小时),就可以进行换脸了。

如果A中的训练数据和要替换的素材是一样,那直接进行转化即可,否则要先将要替换的数据放入A目录中并进行提取。要注意这里A目录下的截图应为要替换视频的每帧截图(比如一个10秒的25 fps 的片段就得有250张截图)。

合成的参数可以自己折腾一下。Convert 选项卡中按 “Start” 开始合成,合成后的图片会被存储在 merged 子目录下。

6. 生成视频

FakeApp 2.1版本会自动合成图片、生成视频。若是1.1版本,在上一步合成了所有视频帧之后,可以用 ffmpeg 来将图片转化为视频。

借用 DFC 一句命令:

1
ffmpeg -f image2 -i ImageName%04d.jpg -vcodec libx264 -crf 15 -pix_fmt yuv420p Output_VideoName.mp4

之后再配上原视频的音轨或自己配音即可。

如果想看详细教程可以看DFC的这篇文章(英文)。

还是那句话,技术无罪,请谨慎使用!