1. 简介
很多人刚开始换脸的时候会不知所措,而且会犯很多错误。错误是好的,这是我们学习的方式,但有时在深入学习之前对相关过程有一点了解会有所帮助。
在这篇文章中,我将详细介绍我们如何训练模型,有几种models
可供选择,我不会把所有内容都讲完,但希望这些内容能够帮助您做出明智的决定。如果你还没有为训练生成你的人脸数据集,那么现在就停止阅读这篇文章,并前往提取指南生成它们。
这本指南中有相当多的背景知识,我建议你熟悉这一切。机器学习是一个复杂的概念,但我试图把它分解成尽可能简单的理解。对神经网络的工作原理有一个基本的了解,以及从看到的数据类型中受益,将大大提高您成功实现swap
的可能性。
在本指南中,我将使用GUI
,但是对cli
(命令行)而言是完全相同的(GUI
中出现的所有选项都可以在cli
中使用)。
2. 什么是Training?
2.1 综述
从高水平上分析,训练是教我们的神经网络(NN)如何去重建一张人脸,大多数模型主要由两部分组成:
- Encoder(编码器)- 它的工作是将一堆人脸作为输入,并将它们“encoding”成一个“vector”的表示形式。需要注意的是,它并不是在学习你输入给它的每一张人脸的精确表示,而是试图创建一种算法,可以在以后尽可能通过接近输入图像,来重建人脸。
- Decoder(解码器)- 它的任务是将编码器(Encoder)创建的向量转换成人脸,尽可能与输入图像匹配。
有些模型的构造略有不同,但基本前提是相同的。
神经网络需要知道它对人脸进行编码和解码的效果如何,它使用两种主要参数来实现这一点:
- Loss(损失)- 对于每一批输入到模型中的人脸,神经网络将查看它试图通过当前的编码和解码算法重建的人脸,并将其与输入的实际人脸进行比较。根据它认为自己做得有多好,它将给自己一个分数(损失值),并相应地更新权重。
- Weights(权重)- 一旦模型评估了人脸重建的效果,它就会更新权重,这些权重将输入到编码器/解码器算法中。如果它在一个方向调整了权重,但感觉重建的效果比以前差,那么它就知道权重在向错误的方向移动,所以它会将权重向相反的方向调整。如果它感觉自己有了进步,那么它就会知道继续朝着它前进的方向调整权重。
然后,该模型会重复这个动作很多很多次,不断更新基于损失值的权重,理论上会随着时间的推移而改进,直到你觉得它已经学会了有效地重建一张人脸,或者损失值停止下降。
现在我们已经了解了神经网络的基本功能以及它是如何学习创建人脸的,如何应用于人脸交换?你可能已经注意到,在上述模型中,这个神经网络学会了如何获取一个人的大量人脸,然后重建这些人脸。这不是我们想要的……,我们想要用大量的人脸来重建别人的脸,为了实现这一点,我们的NN做了以下几件事:
- Shared Encoder(共享编码器) – 当我们训练模型时,我们给它输入两组人脸。A集合(我们想要替换的原始人脸)和B集合(我们想要放到场景中的交换人脸),实现这一点的第一步是为A和B集合共享编码器。通过这种方式,我们的编码器学习一个算法,为2个不同的人脸,这是极其重要的,因为我们最终将告诉我们的神经网络,把一张人脸的编码,解码到另一张人脸。因此,编码器需要看到,并学习交换所需的两组人脸。
- Switched Decoders(切换解码器) – 在训练模型时,我们训练了 2 个解码器。 解码器 A 使用编码向量并尝试重新创建人脸 A,解码器 B 使用编码向量并尝试重新创建人脸 B。当最终交换人脸时,我们切换解码器,因此我们提供模型的人脸 A是通过解码器 B得到的。由于编码器已经在两组人脸上进行了训练,因此模型将对 A 的输入人脸进行编码,然后尝试从解码器 B 中重建它,从而导致我们的模型输出交换的人脸。
2.2 术语
在使用 Faceswap 时,您会看到一些常见的机器学习术语。 为了让我们理解起来更简单,这里显示了术语表:
- Batch –
Batch
是同时通过神经网络输入的一组人脸。 - Batch Size –
Batch Size
是指同时通过神经网络输入的batch
的大小。Batch Size
为64的图像意味着64张人脸同时通过神经网络输入,然后计算这批图像的损失和权值更新。更大的Batch Size
将训练得更快,有更高的泛化能力。较小的Batch Size
将训练得更慢,能更好地区分人脸之间的差异。在训练的各个阶段调整Batch Size
会有所帮助。 - Epoch – 例如:如果你有一个文件夹有5000个人脸,1 个
epoch
是模型已经训练了所有5000个人脸。2个epoch
是模型已经训练了所有5000个人脸两次,以此类推。就faceswap
而言,Epoch
实际上并不是一个有用的衡量标准。因为一个模型是在两个数据集(A人脸和B人脸)上训练的,除非这些数据集的大小完全相同(非常不可能),否则不可能计算一个Epoch,因为每一人脸的数据都不一样。 - Example – 就
Faceswap
而言,一个example
是“Face”的另一个名称。它基本上是通过神经网络传递的一张人脸,如果模型看到了10个examples
,那么它就看到了10张人脸。 - EG/s – 这是神经网络每秒看到的样本数量,或者就
Faceswap
而言,就是模型每秒处理的人脸数量。 - Iteration –
Iteration
是通过神经网络处理的一个完整batch
。 因此,batch size
为 64 的 10 次Iteration
意味着模型已经看到了 640 (64 * 10) 张人脸。 - NN – 是神经网络的缩写。
3. Training Data(训练数据)
数据质量对模型的重要性再怎么强调也不过分。一个较小的模型可以在良好的数据下表现得很好,同样,没有一个模型会在糟糕的数据下表现得很好。在你的模型的每一边至少应该有500个不同的图像,但是在一定程度上,数据越多,变化越多,越好……。要使用的合理数量的图像在 1,000 到 10,000 之间,添加更多的图像实际上会损害训练。
太多类似的图片对你的模型没有帮助,你需要尽可能多的不同角度、表情和光照条件。这是一个常见的误解,即模型是为特定的场景训练的,这是“记忆”,而不是你想要达到的目的。你要试着训练模型去理解一张在所有情况下,所有角度,所有表情的人脸,然后把它换成另一张在所有情况下,所有角度,所有表情的人脸。因此,您需要从尽可能多的不同来源为A和B数据集构建一个训练集。
不同的角度是非常重要的,神经网络只能学习它看到的东西。如果95%的脸是直视着相机的,5%是侧着的,那么模型将需要很长时间来学习如何创建侧着的脸。它可能根本无法创造它们,因为它很少看到侧面的脸。理想情况下,你希望脸部角度、表情和光照条件尽可能均匀分布。
同样,在人脸A和人脸B之间拥有尽可能多的匹配角度、表达式、光照条件也是很重要的。如果你有大量的配置文件图像为人脸A,而没有配置文件图像为人脸B,那么模型将永远不能在配置文件中执行交换,因为解码器B将缺乏创建配置文件镜头所需的信息。
训练数据的质量一般不应模糊,而应高质量(清晰和详细)。然而,在训练集中有一些模糊或者部分模糊的图像是好的。在最终的交换中,一些人脸将会模糊/低分辨率/不清楚,所以对神经网络来说,看到这些类型的图像也是很重要的,这样它就可以做一个准确可靠的再现。
更多关于创建训练集的详细信息可以在提取指南中找到。
4. Choosing a model(选择一个模型)
Faceswap
中有几种可用的模型,随着时间的推移将添加更多模型。每一个的质量都可能是非常主观的,因此这将提供每个(当前)可用的简要概述。最终,最适合您的模型可以归结为许多因素,因此没有明确的答案。每种方法都有利有弊,但是如上所述,最重要的一个因素是数据的质量,没有模型可以解决数据问题。
您将看到下面提到的输入和输出大小(例如 64px
输入,64px
输出)。这是输入模型的人脸图像的大小(输入)和模型生成的人脸的大小(输出),输入模型的所有人脸都是方形的,所以 64px
的图像将是 64 像素宽、64 像素高。一种常见的误解是,更高分辨率的输入会得到更好的交换,虽然它可以提供帮助,但情况并非总是如此。神经网络正在学习如何将人脸编码为算法,然后再次解码该算法。它只需要足够的数据就可以创建一个可靠的算法,输入分辨率和输出质量没有直接联系。
值得注意的是,模型越大,训练所需的时间就越长。使用Nvidia GTX 1080
进行训练需要12-48小时,Villain
可以在相同的硬件上工作一周。通常认为,一个具有两倍输入大小的模型将花费两倍的时间,这是不正确的,这至少需要4倍的时间,甚至可能更久。这是因为64px
的图像有4,096个像素。然而,128像素的图像有16,384像素,这是原来的4倍,除此之外,还需要对模型进行缩放,以处理增加的数据量,训练时间可以很快累积起来。
- Lightweight(轻量级,64px输入,64px输出)- 这是一个极其精简的模型,可以在具有 <= 2GB 虚拟内存的 GPU 上运行。它不是您所说的“production ready”,但它使具有低端硬件的用户能够训练模型。在更高端的 GPU 上,它的训练速度非常快,因此在转向更繁重的模型之前,它有助于快速查看交换的工作情况。
- Original(64px输入,64px输出)- 启动这一切的模型。仍然可以提供很好的结果,并且有助于了解您的数据集质量是真正成为交换质量的最大驱动因素之一。
- IAE(64px输入,64px输出)- 与其他模型结构略有不同的模型。它有一个共享的编码器和一个共享的解码器,但有 3 个中间层(一个用于 A,一个用于 B,一个共享)位于编码器和解码器之间。它以这种方式构建以尝试更好地分离特性,可以在此处阅读有关此模型的更多信息:Add Improved AutoEncoder model. by acsaga · Pull Request #251 · deepfakes/faceswap
- Dfaker (64/128px输入,128/256px输出) – 该模型利用了与原始模型不同的一些技术,并且还侧重于将输入升级为更高分辨率的输出。尽管已经存在了一段时间,这个模型仍然取得了很好的效果,同时它缺乏定制选项,这使得它很容易成为一个“’fire and forget”的模型。
- Unbalanced(64-512px输入,64-512px输出)- 这是一个强大的模型,有很多方法可以自定义和改进模型,但需要更多的专业知识和诀窍才能获得良好的结果。可以说已被“RealFace”取代。值得注意的是,该模型更加强调 B 解码器,因此反转交换(即交换 B>A 而不是 A>B)将导致不太令人满意的结果。
- DFL-H128(输入128像素,输出128像素)- 该模型实际上使用与
Original
完全相同的编码器和解码器,但随后使用128px
输入而不是64px
,然后尝试将图像压缩为原始人脸一半大小的表示。 较小的“latent space”在质量上与原始文件相比存在一些缺点,从而否定了较大的输入大小。 - DFL-SAE (64-256px输入,64-256px输出)- 该模型包含两种不同的网络结构,一种基于原始共享编码器/拆分解码器模型,另一种基于 IAE 模型(共享中间层)。有许多自定义选项,提供了很好的细节,但可能会导致一些特性流失(即 A 的某些特征可能在 B 中仍然可见)。
- Villain(128px输入,128px输出)-
Villain
可能是最详细的模型,但VRAM
非常密集,并且在有限的资源上进行训练时,可以提供低于标准的颜色匹配,是the viral Steve Buscemi/Jennifer Lawrence Deepfake
的来源。由于此模型没有任何自定义选项(除了低内存变体),如果您想要更高分辨率的模型而无需调整任何设置,这是一个不错的选择。 - Realface (64-128px输入,64-256px输出)-
Unbalanced
模型的继承者。从该模型和 Dfaker 中学习,同时寻求进一步发展。此模型是高度可定制的,但最好在您对自己正在做什么以及设置将产生什么影响有所了解时调整选项。与unbalanced
模型一样,该模型更加强调 B 解码器,因此反转交换(即交换B>A
而不是A>B
)将导致不太令人满意的结果。 - Dlight(128像素输入,128-384px输出)- 基于
dfaker
变体的更高分辨率模型,专注于使用自定义放大器放大人脸。这是最新的模型,很容易配置。 - Phaze-A(完全可配置的分辨率)-
Phaze-A
与其说是模型,不如说是模型构建器。它目前可用于定时访问Patreons
。这是一个极其复杂的模型,如果您刚开始使用,则不是最佳选择。Phaze-A
有自己的线程来解释它是如何工作的:[Guide] Introducing – Phaze-A
5. Model configuration settings(模型配置设置)
好了,你已经选择了你的模型,让我们来训练!等一下,我钦佩你的热心,但你可能想先设置一些模型的特定选项。为此,我将使用GUI,但配置文件(如果使用命令行)可以在faceswap
文件夹中的faceswap/config/train.ini
位置找到。
我不会详细介绍每个模型的选项,因为这些选项各不相同,并且为新模型保持更新会很困难,但我将概述一些更常见的选项,我们将更多地关注适用于所有模型的全局选项。所有选项都有工具提示,因此将鼠标悬停在选项上以获取有关其功能的更多信息。
要访问模型配置面板,请转至 Settings > Configure Settings …或选择Train Settings
的快捷方式以直接转到正确位置:
5.1 Global Settings(全局设置)
这些选项适用于所有模型,并被分为Global模型选项和Loss选项。
- Global:可以通过选择“Train”节点访问全局选项。 此页面上的所有选项(
Learning Rate
、Epsilon Exponent
、Convert Batchsize
、Allow Growth
和NaN Protection
除外)仅在创建新模型时生效。 一旦您开始训练模型,此处选择的设置将“locked”到该模型,并且在您恢复训练时会重新加载,无论此处配置的是什么。
- Face:适用于输入模型的人脸的选项
- Centering – 要训练的人脸将从您的提取图像中裁剪出来。
Legacy
是传统的训练方法,但它往往会非常靠近脸部(切掉前额)。Face
稍微缩小人脸并重新居中靠近头部中心以更好地捕捉更多角度。如果您正在训练输出尺寸小于128px
的模型,那么您可能应该选择Legacy
,否则选择最适合您的项目的centering
。下图显示了提取图像的示例,黄色框显示Legacy
居中裁剪的位置,绿色框显示Face
居中裁剪的位置:
- Coverage – 这是将输入模型的源图像的数量,根据给定的数量从中心裁剪图像的百分比。覆盖率越高,将进入的人脸越多。裁剪图像量的说明如下所示,左侧图像采用
Legacy
居中,右侧图像采用Face
居中:
- 通常,您不希望将人脸覆盖率设置为低于 75%,因为它与传统的人脸中心不同,并且可能会导致问题,任何高于 62.5% 的值都适用于传统居中。虽然从直觉上讲,似乎更高的覆盖率总是更好,但实际上并非如此,这是一种权衡。虽然更高的覆盖率意味着更多的人脸被交换,但模型的输入大小始终保持不变,因此结果交换可能不太详细,因为需要将更多信息打包到相同大小的图像中。为了说明,下面是同一图像的一个极端示例,具有 62.5% 的覆盖率和 100% 的覆盖率,两者的大小均为
32px
。如您所见,100% 覆盖率图像包含的细节远少于 62.5% 版本。 最终,此选项的正确选择取决于您,注意:以Face
为中心的人脸已经比以Legacy
为中心的人脸缩小得更多,因此收集的细节更少。对于输出小于128px
的模型,最好使用Legacy
居中:
- Initialization:适用于初始化模型的选项
- 正如训练概述中所讨论的,模型具有在每次迭代结束时更新的权重。初始化是首先设置这些权重的过程,您可以将其视为帮助模型入门。由于我们知道我们的神经网络将用于什么,我们可以将这些权重设置为有助于模型快速启动的值。
- 初始化的默认方法是“he_uniform”,这从均匀分布中抽取样本。本指南的目标不是介绍不同的初始化方法及其含义,但此默认值可以被本节中公开的选项覆盖。
- 需要注意的是,有些模型在内部为模型的某些层设置了初始化方法,因此这些层不会受到此设置的影响。但是,对于尚未明确设置的层和模型,初始化程序将更改为所选选项。
- 两个现有的初始化器可以一起使用(即它们都可以启用而不会产生不良影响)。我倾向于同时启用它们。
- ICNR Init – 此初始化程序仅适用于高层。当它们在神经网络中被放大时,标准初始化可能会导致输出图像中出现“棋盘”伪影,此初始化程序旨在防止这些伪影。可以在本文中阅读有关此方法的更多信息:Checkerboard artifact free sub-pixel convolution: A note on sub-pixel convolution, resize convolution and convolution resize
- Conv Aware Init –
Convolutional Aware Initialization
(卷积感知初始化)应用于模型内的所有卷积层。这个初始化器背后的前提是它考虑了卷积网络的目的并相应地初始化权重。从理论上讲,这会导致更高的准确度、更低的损失和更快的收敛速度。可以在以下论文中阅读有关此初始化程序的更多信息:Convolution Aware Initialization - 注意:此初始化程序在启动时可能会占用更多 VRAM,因此建议从较小的
batch size
开始,启动模型,然后以所需的batch size
重新启动模型。 - 注意:此初始化程序不会在启用多 GPU 模式的情况下运行,因此如果使用多个 GPU 进行训练,您应该在 1 个 GPU 上开始训练,停止模型,然后在启用多 GPU 的情况下继续。
- Optimizer:与优化器相关的选项,优化器控制模型的学习方式和学习速度:
- Optimizer – 要使用的学习方法。将其保留为默认的“Adam”可能是最好的选择,但您可以随意尝试不同的优化器。描述列出的每种方法超出了范围,但互联网上有大量信息。 一个例外是
AdaBelief
,它是一种较新的优化器,旨在加快训练和提高收敛速度(参考:https://arxiv.org/abs/2010.07468),它是否成功取决于您自己的判断。如果使用AdaBelief
,请确保调整Epsilon Exponent
(您可以在该部分阅读原因)。 - Learning Rate – 对于大多数模型,这通常应该保持不变,除非模型正在崩溃(所有图像变为纯色块,并且损失达到高水平并且永远不会恢复)。对于一些更复杂的模型(例如 Phaze-A 和 DLight),您可能需要降低此值。一般来说,模型越复杂,成功开始训练所需的学习率就越低。与此页面上的许多其他参数不同,可以针对现有模型调整此值。
- 学习率决定了在每次迭代中可以向上或向下调整权重的程度。直觉会说学习率越高越好,但事实并非如此。该模型正在尝试学习尽可能降低损失值,设置太高的学习率将不断在最低值上下摆动,并且永远不会学到任何东西。将学习率设置得太低,模型可能会遇到低谷并认为它已经达到最低点,并且将停止改进。
- 把它想象成从山上走下来,你想深入到谷底,所以你应该一直往下走。然而,下山的路并不总是下坡,途中有较小的丘陵和山谷,学习率需要足够高才能走出这些较小的山谷,但又不能高到你最终会到达下一座山峰。
- Epsilon Exponent – 为了防止 ‘divide by zero errors’ ,在梯度中添加了一个非常小的数字。
Epsilon exponent
指示要添加的此数字的大小(默认值-7
将添加 1∗10−7 ,即:0.0000001)。如果您的模型不断崩溃,或者您不断遇到 NaN 并且您无法通过降低学习率或更改批量大小来解决问题,那么增加Epsilon exponent
的值应该是您绝对的最后手段,可以针对现有模型调整Epsilon exponent
。- 默认值
-7
应该适用于所有优化器,但AdaBelief
除外。这个优化器在这个值下训练会非常缓慢,所以应该降低到-16
左右的值。您可以在作者自己的实现中阅读有关此超参数的更多信息。 - 在使用混合精度训练时,增加
Epsilon exponent
特别有用。使用混合精度时的数值范围会减少,因此您更有可能遇到 NaN。将Epsilon exponent
增加到-5
或-4
可以帮助防止这些。请注意,增加Epsilon exponent
会导致模型精度降低,并且需要更长的时间来完全训练您的模型。
- 默认值
- Network:适用于整个模型的选项,此处的选项适用于模型中使用的某些层:
- Reflect Padding – 某些模型,尤其是
Villain
,以及较小程度上的DFL-SAE
,在最终交换中的交换区域边缘周围有一个显着的“灰色框”。此选项更改卷积层中使用的填充类型以帮助减轻这种伪影。我只建议为这两个模型(Villain
和DFL-SAE
)启用它,否则我会忽略它。 - Allow Growth – [仅限
Nvidia
] 仅当您收到cuDNN
无法初始化的持续错误时,才启用此功能,这发生在一些没有真正模式的人身上。此选项根据需要分配VRAM
,而不是一次分配所有。虽然这更安全,但它可能导致VRAM
碎片化,因此除非您需要,否则不要使用它。可以为现有模型更改此选项。 - Mixed Precision – [仅限
Nvidia
] 优化了一些计算,以便能够加载更大的模型并使用更大的batch sizes
。在RTX+
卡上,这也可以加快训练速度。如果需要,请启用它。 - NaN Protection – 深度学习以“unbound”的方式执行计算,这意味着没有什么可以停止计算,从而产生超出特定数据类型所能容纳的数值范围的数字。当这种情况发生时,
NaN
(非数字)将开始出现在您的模型中。如果发生这种情况,则您的模型已死并且无法保存(一旦出现NaN
,它将开始像病毒一样传播,直到它最终出现在您的损失值内)。如果NaN
值出现在您的损失输出中,则启用NaN Protection
将立即停止训练。这意味着导致NaN
的迭代不会保存到您的模型中,您可以努力纠正这种情况。- 值得注意的是,当损失值中出现
NaN
时,仅仅降低学习率或提高Epsilon exponent
,并从您停止的地方继续训练可能不足以保存模型。损失值中出现的NaN
是NaN
出现在之前某个时间梯度内的征兆。如果您确实遇到了NaN
,那么正确的做法是回滚到较早的snapshot
(通常我回滚 100k 次迭代,但您可能回滚的次数可能少于这个),并从那里降低学习率。 - 从
NaNs
中命中和恢复可能是一种非常令人沮丧的经历,并且在混合精度训练中似乎更频繁地发生,有些模型比其他模型更容易受到NaNs
的影响。希望随着时间的推移,您将学会如何提前预防这些问题。
- 值得注意的是,当损失值中出现
- Convert:模型用于转换时的选项,这些选项仅影响转换过程,而不影响训练过程。因此,它们可以针对现有模型进行更改:
- Convert Batchsize – 转换过程中通过模型输入的人脸数量。您通常不需要更改此设置,除非您在运行转换时
VRAM
用完。
5.2 Loss Settings(损失设置)
用于控制要使用的损失类型和数量的选项。通过展开“Global”节点并选择“Loss”来访问这些选项:
就像全局设置一样,一旦您开始训练,这些选项中的大多数都会“locked”到模型。这是除了Eye Multipliers
和Mouth Multipliers
以及 L2 Reg Term
,可以针对现有模型进行调整。
- Loss:使用的损失函数。有多种不同的方法来计算损失,或者让神经网络辨别它在训练模型方面的表现。我不会详细介绍每个可用的功能,因为这将是一个有点冗长的过程,而且互联网上有大量关于这些功能的信息。
- Loss Function – 最常用的损失方法是
MAE
(平均绝对误差)和SSIM
(结构相似性),我个人的偏好是使用SSIM
。 - Mask Loss Function – 如果您打算学习
mask
,请使用该方法。默认的均方误差 (MSE) 没问题。 - L2 Reg Term – 如果使用结构相似性损失(例如
SSIM
),则应应用 L2 正则化。此选项仅影响兼容损失,除非您知道自己在做什么,否则应保留默认设置。 - Eye Multiplier – 赋予眼部区域的“weight”量。只有在启用了“Penalized Loss”的情况下才能使用此选项。值为 2 意味着眼睛的重要性是人脸其余部分的两倍,这有助于学习精细的细节,但将其设置得太高会导致像素化。由于可以针对现有模型调整此设置,因此通常可以训练出问题。
- Mouth Multiplier – 给予嘴部区域的“weight”量。只有在启用了“Penalized Loss”的情况下才能使用此选项。值为 2 意味着嘴巴的重要性是人脸其余部分的两倍。这有助于学习精细的细节,但将其设置得太高会导致像素化。由于可以针对现有模型调整此设置,因此通常可以训练出问题。
- Penalized Mask Loss – 此选项决定了位于人脸区域之外的图像区域的重要性,是否应低于位于人脸区域内的区域,此选项应始终启用。
- Mask:适用于带
mask
训练的选项。
- 设置
mask
是指示图像的哪个区域重要的一种方式,在下面的例子中,红色区域被 “masked out”(即:它被认为是不重要的),而清晰区域被 “masked in”(它是人脸,所以是我们感兴趣的区域):
- 训练
mask
有两个目的:- 它将训练集中在人脸区域,迫使模型对背景的重要性降低。这可以帮助模型更快地学习,同时还确保它不会占用学习不重要的背景细节的空间。
- 学习到的
mask
可以在转换阶段使用。在当前的实现中,学习的mask
是否比在转换时,使用标准mask
提供任何好处是有争议的,但使用mask
进行训练可确保您可以选择使用它。 - Mask Type – 用于训练的
mask
类型。要使用mask
,您必须将所需的masks
添加到生成训练集的原始对齐文件中,您可以使用mask
工具添加/更新mask
。有关每个mask
的详细说明,请参阅 [Guide] Extraction – A Workflow - Mask Blur Kernel – 这会对
mask
的边缘,应用轻微的模糊。实际上,它去除了mask
的硬边缘,并从人脸到背景逐渐混合,这可以帮助计算不佳的mask
。是否要启用此功能以及要使用的值取决于您,默认值应该没问题,但您可以使用mask
工具进行试验。 - Mask Threshold – 此选项不会影响基于对齐的
masks
(extended
,components
),因为它们是二进制的(即mask
是“on”或“off”)。对于基于NN
的masks
,masks
不是二进制的,并且具有不同级别的不透明度。在某些情况下,这可能会导致masks
出现斑点,提高阈值会使masks
部分接近透明、完全透明,而masks
部分接近实心、完全实心。同样,这将因情况而异。 - Learn Mask – 如前所述,学习
mask
是否有任何好处是有争议的。启用此选项将使用更多VRAM
,因此我倾向于将其关闭,但如果您希望预测mask
在转换中可用,那么您应该启用此选项。
5.3 Model Settings(模型设置)
这些是特定于每个模型插件的设置。您可以通过单击“Model”节点来访问这些:
如前所述,我不会详细介绍模型特定的设置,这些因插件而异。但是,我将介绍您可能在每个插件中看到的一些常见选项。与往常一样,每个选项都有一个工具提示,可以为您提供更多信息。
- lowmem – 一些插件具有“lowmem”模式。这使您能够运行模型的精简版本,占用更少的
VRAM
,但代价是保真度较差。 - input size – 一些插件允许您调整输入模型的输入大小。输入始终是方形的,因此这是输入模型的图像的宽度和高度的大小(以像素为单位)。不要相信更大的输入总是等于更好的质量,这并非总是如此,还有许多其他因素决定模型是否具有良好的质量。更高的输入尺寸需要成倍增加的
VRAM
来处理。 - output size – 一些插件允许您调整模型生成的图像的大小。输入大小和输出大小不必相同,因此某些模型包含升级器,返回比输入图像更大的输出图像。
5.4 Trainer Settings(训练器设置)
配置设置页面中的部分用于Trainer
或“Data Augmentation”选项。展开“Trainer”节点并选择“Original”:
神经网络需要看到很多很多不同的图像。为了更好地学习人脸,它对输入图像执行各种操作,这称为“数据增强”。如注释中所述,标准设置适用于 99% 的用例,因此只有在您知道它们会产生什么影响时才更改这些设置。
- Evaluation – 评估训练状态的选项。
- Preview Images – 这是预览窗口中显示的交换人脸A和人脸B的人脸数量。
- Image Augmentation – 这些是对输入模型的人脸进行的操作。
- Zoom Amount – 人脸在输入神经网络之前,被放大或缩小的百分比。帮助模型处理错位。
- Rotation Range – 人脸在被送入神经网络之前,顺时针或逆时针旋转的百分比量。帮助模型处理错位。
- Shift Range – 人脸在被送入神经网络之前,向上/向下、向左/向右移动的百分比量。帮助模型处理错位。
- Flip Chance – 水平翻转人脸的机会。帮助创建更多角度供神经网络学习。
- Color Augmentation – 这些增强处理输入模型的人脸的颜色/对比度,使神经网络对颜色差异更加鲁棒:
- 这是色彩增强在幕后所做的说明(您不会在预览/最终输出中看到它,它仅用于演示的目的):
- Color Lightness – 上下调整输入图像亮度的百分比,有助于应对不同的光照条件。
- Color AB – 在 Lab 颜色空间的 A/B 标度上调整颜色的百分比量,帮助神经网络处理不同的颜色条件。
- Color CLAHE Chance – 图像将应用对比度受限的自适应直方图均衡化的百分比机会。
CLAHE
是一种尝试定位对比度变化的对比度方法,这有助于神经网络处理不同的对比度量。 - Color CLAHE Max Size – CLAHE 算法的最大“grid size”,这被缩放到输入图像。更高的值将导致更高的对比度应用,这有助于神经网络处理不同的对比度量。
5.5 Configuration Presets(预设配置)
某些模型具有预设,可轻松加载不同情况的配置选项。预设加载和保存是一个仅限 GUI
的功能,可以从页面顶部的保存和加载图标访问:
可以为具有配置选项的任何页面保存或加载预设。这使您能够为各种情况保存已知的良好设置,并能够轻松加载它们。预设不仅限于训练选项,您可以为 Faceswap
的任何部分保存预设(例如提取/训练/转换等)。
请记住点击配置页面底部的Save
按钮,以应用您可能已加载的任何预设。
注意:CLI
用户:如果您使用的是 cli
,那么您可以通过导航到 Faceswap
文件夹中的 lib/gui/.cache/presets
来访问现有的预设值,但是您需要手动将这些值复制到您的 train.ini
文件中,或者您可以在有显示器的机器上安装 Faceswap
,在这台机器上加载/保存您的预设,然后将更新的 train.ini
文件复制到您将实际运行 Faceswap
的机器上。
一旦你有了你想要的模型设置,点击OK保存配置并关闭窗口。
注意:点击OK会保存所有选项卡上的选项,所以一定要仔细检查它们。您可以按Cancel取消任何更改,或按Reset将所有值恢复为默认设置。
6. Setting up
现在您已经准备好了您的人脸,您已经配置了您的模型,是时候开始工作了!
转到GUI
中的Train
标签:
我们会在这里告诉Faceswap
所有东西都存储在哪里,我们想用什么,并开始训练。
6.1 Faces
这是我们告诉facesswap
人脸存储在哪里的地方:
- Input A – 这是包含您在提取过程中提取的人脸A的文件夹的位置。这些是将从原始场景中移除的人脸,以替换为您的交换人脸,此文件夹中应该有大约 1,000 – 10,000 张面孔。
- Input B – 这是包含您在提取过程中提取的人脸B的文件夹的位置。这些是将被交换到场景中的人脸,此文件夹中应该有大约 1,000 – 10,000 张面孔。
6.2 Model
与您将要接受训练的模型有关的选项:
- Model Dir – 这是模型文件将被保存的地方。如果您要启动新模型,则应选择一个空文件夹,如果要从已启动的模型恢复训练,则应选择包含模型文件的现有文件夹。
- Load Weights – 您可以从之前训练过的模型加载权重。这可以通过基于先前训练的数据初始化权重来帮助“启动”您的模型,只有在您开始新模型时才会使用加载权重。如果您要恢复现有模型,则此选项将被忽略。
- 通常,这只会为编码器加载权重,尽管某些模型(例如
Phaze-A
)为您提供了将权重加载到模型其他部分的选项。 - 如果您正在加载权重,那么您通常还需要选择“Freeze Weights ”选项。原因是当您启动模型时,梯度更新将立即开始。未能冻结权重意味着您加载的权重,将被来自模型其余部分的随机初始化数据污染,这将抵消您从加载权重中获得的任何好处。
- 通常,这只会为编码器加载权重,尽管某些模型(例如
- Trainer – 这是您要为交换训练的模型,上面提供了不同模型的概述。
- Summary – 启用摘要选项只会显示您将训练的模型的摘要,并退出该过程,训练将不会开始。当您使用更复杂的模型,并希望在开始训练课程之前快速检查布局时,这非常有用。如果启用此选项,则不需要提供输入数据。
- Freeze Weights – 可以冻结模型特定部分的权重。这意味着您冻结的部分将不会继续学习。当您为模型的某个部分加载了权重,或者您只想将训练重点放在模型的特定部分时,这会很有用。通常,当您冻结权重时,您会希望降低学习率。
- 对于大多数模型,选择这个选项只会冻结编码器(这通常是模型中您希望冻结的部分)。然而,有些模型(例如
Phase-A
)也允许你冻结模型的其他部分。
- 对于大多数模型,选择这个选项只会冻结编码器(这通常是模型中您希望冻结的部分)。然而,有些模型(例如
6.3 Training
训练的具体设置:
- Batch Size – 如上所述,
Batch Size
是指一次通过模型输入的图像数量。增加这个数字将增加VRAM
的使用。增加Batch Size
将加速训练到某个点,小Batch Size
提供了一种有助于模型泛化的规则形式。虽然Batch Size
生产的速度更快,但8到16个Batch Size
的产品质量可能更好。其他形式的监管能否取代或消除这种需求,仍是一个有待解决的问题。 - Iterations – 在自动停止训练之前要执行的迭代次数。这实际上只是为了自动化,或者确保训练在一定时间后停止。通常,当您对预览的质量感到满意时,您会手动停止训练。
- Distributed – [仅限
NVIDIA
] 启用Tensorflow
的镜像分布策略,以在多个GPU
上进行训练。如果您的系统中有多个GPU
,那么您可以利用它们来加速训练。请注意,这种加速不是线性的,您添加的GPU
越多,收益递减的就越多。最终,它允许您通过将它们拆分到多个GPU
来训练更大的批次大小。您将始终受到最弱GPU
的速度和VRAM
的限制,因此在相同GPU
上进行训练时效果最佳。您可以在此处阅读有关 Tensorflow 分布策略的更多信息。 - No Logs – 提供了损失和模型日志,以便能够在 TensorBoard 和 GUI 中分析数据。关闭此功能将意味着您无权访问此数据。实际上,没有理由禁用日志记录,因此通常不应检查此项。
6.4 Saving
计划保存模型文件的选项:
- Save Interval – 模型应保存到磁盘的频率。当一个模型被保存时,它并没有被训练,所以你可以提高这个值以获得训练的轻微速度提升(即它不会经常等待模型被写出到磁盘)。您可能不想将其提高得太高,因为它基本上是您的“故障安全”。如果模型在训练期间崩溃,那么您将只能从上次保存继续。注意:如果使用
Ping Pong
内存节省选项,则不应将其增加到 100 以上,因为这可能会损害最终质量。 - Snapshot Interval – Snapshots 是模型在某个时间点的副本。如果您对模型的进展方式不满意,这使您可以回滚到较早的Snapshots ,或者如果您的保存文件已损坏且没有可用的备份,则可以回滚。通常,这应该是一个很大的数字(在大多数情况下默认值应该没问题),因为创建Snapshots 可能需要一段时间,并且在此过程完成时您的模型将不会进行训练。
- 在一段很长的训练过程中,会拍摄很多Snapshots ,所以你可能想要注意这一点,并随着时间的推移删除不需要的Snapshots ,因为它们会占用空间并造成混乱。Snapshots 将保存在您实际的模型文件夹旁边,名称
_snapshot
和迭代次数附加到文件夹名称的末尾。 - 要从Snapshots 中恢复,很简单,只需删除实际的模型文件夹,并将Snapshots 文件夹重命名为原来的模型名称(即从文件夹名称的末尾删除
_snapshot_xxxxx_iters
)。
- 在一段很长的训练过程中,会拍摄很多Snapshots ,所以你可能想要注意这一点,并随着时间的推移删除不需要的Snapshots ,因为它们会占用空间并造成混乱。Snapshots 将保存在您实际的模型文件夹旁边,名称
6.5 Preview
显示训练进度预览窗口的选项:
如果您使用的是 GUI,那么通常您不会想要使用这些选项。预览是一个弹出的窗口,显示训练的进度。GUI 将此信息嵌入到“Display”面板中,因此弹出的窗口将只显示完全相同的信息并且是多余的。每次保存迭代时,预览都会更新。
- Preview Scale – 弹出预览的大小与训练图像的大小相同。如果您的训练图像为 256 像素,则完整预览窗口将为 3072×1792。这对于大多数显示器来说太大了,所以这个选项会按给定的百分比缩小预览。
- Preview – 启用弹出预览窗口,禁用不弹出预览窗口。对于GUI的使用,通常不要检查这个。
- Write Image – 这将把预览图像写入
faceswap
文件夹。如果在没有窗口的系统上训练是有用的。
6.6 Timelapse(延时)
生成一组延时图像的选项:
Timelapse 选项是一项可选功能,可让您查看一段时间内在一组固定人脸上的训练进度。在每次保存迭代时,将保存一张图像,显示当时所选人脸的训练进度。请注意,延时图像占用的磁盘空间量,会随着时间的推移而累积。
- Timelapse Input A – 包含要用于为人脸A(原始)生成延时的人脸的文件夹,仅使用找到的前 14 个人脸。如果您希望从训练集中选择前 14 张人脸,您可以将其指向您的“Input A”文件夹。
- Timelapse Input B – 包含要用于为人脸B(交换)侧生成延时的人脸的文件夹,仅使用找到的前 14 个人脸。如果您希望从训练集中选择前 14 张人脸,您可以将其指向您的“Input B”文件夹。
- Timelapse Output – 您希望保存生成的延时图像的位置。如果您提供了 A 和 B 的源,但将此留空,则这将默认为您选择的模型文件夹。
6.7 Augmentation
数据增强特定选项:
- Warp To Landmarks – 如前所述,数据被扭曲,以便神经网络可以学习如何重新创建人脸。
Warp to Landmarks
是一种不同的变形方法,它尝试将人脸随机变形为另一侧的相似人脸(即对于 A 组,它从 B 组中找到一些相似的人脸,并应用变形,并进行一些随机化)。关于这是否比标准随机变形有任何好处/差异,目前还没有定论。 - No Flip – 图像被随机翻转,以帮助增加神经网络将看到的数据量。在大多数情况下,这很好,但人脸不对称,因此对于某些目标,这可能是不可取的(例如,人脸一侧的痣)。通常,这应该不受检查,并且在开始训练时,当然应该不受检查。稍后在
session
期间,您可能希望为某些交换禁用此功能。 - No Augment Color –
Faceswap
执行颜色增强(前面有详细说明)。这确实有助于匹配A
和B
之间的颜色/照明/对比度,但有时可能不是理想的,所以它可以在这里禁用。色彩增强的影响如下:
- No Warp – 扭曲图像对于神经网络正确学习是非常重要的,所以总是确保在开始一个模型时,禁用这个选项,以及在大部分训练中。然而,当你快要训练结束的时候,你可以关闭这个功能,把细节展现出来。
6.8 Global
全局Faceswap
选项:
这些选项不仅适用于训练,而且适用于Faceswap
的每个部分:
- Exclude GPUs – 如果你有多个
gpu
,你可以选择在Faceswap
中隐藏它们。将鼠标悬停在项目上,查看每个索引适用于哪个GPU
。 - Configfile – 您可以指定自定义
train.ini
文件,而不是使用存储在faceswap/config
文件夹中的文件。如果您希望在多个不同的已知良好配置之间进行切换,这会很有用。 - Loglevel –
Faceswap
将记录的级别。通常,这应始终设置为INFO
。如果开发人员要求您这样做,您应该仅将其设置为TRACE
,因为它会显着减慢训练速度,并生成大量日志文件。注意:控制台只会记录到VERBOSE
级别。日志级别的DEBUG
和TRACE
只写入日志文件。 - Logfile – 默认情况下,日志文件存储在
faceswap/faceswap.log
中。 如果您愿意,可以在此处指定不同的位置。
一旦锁定所有设置后,请查看它们以确保您满意,然后点击Train
按钮开始训练。
7. Monitoring Training(监控训练)
一旦你开始训练,这个过程将花费一到两分钟来建立模型,预加载数据并开始训练。一旦它开始,GUI
将进入训练模式,在底部放置一个状态栏,并在右边打开一些tabs
:
7.1 Status Bar(状态栏)
他出现在右下角,给出了当前训练的概述。它更新每一次迭代:
你不需要太关注这里的损失数字,对于换脸,它们实际上毫无意义。这些数字给出了神经网络认为它重新创建人脸 A 的程度,以及它重新创建人脸 B 的程度的概念。然而,我们对模型根据人脸 A 的编码创建人脸 B 的情况感兴趣,这是不可能得到一个损失值的,因为没有真实世界的例子可以让神经网络进行比较。
- Elapsed – 此训练过程已经运行的时间。
- Session Iterations – 在此训练
session
期间,已处理的迭代次数。 - Total Iterations – 已为此模型的所有
session
处理的迭代总数。 - Loss A/Loss B – 当前迭代的损失。注意:可能有多个损失值(例如
face
、mask
、多输出等)。该值是所有损失的总和,因此此处的数字可能相差很大。
7.2 Preview Tab(预览Tab)
可视化模型的当前状态。这是模型重新创建和交换人脸的能力的表示,每次模型保存时它都会更新:
了解模型是否完成训练的最佳方法是观看预览,最终,这些显示了实际交换的样子。当您对预览感到满意时,就该停止训练了。眼睛眩光和牙齿等精细细节将是最后的事情,一旦定义了这些,通常是训练即将完成的良好迹象。
- 预览将显示 12 列。前 6 个是人脸“A”(原始人脸),第二个 6 是人脸“B”(交换人脸)。每组 6 列分为 2 组,每组 3 列。对于这些列中的每一列:
- 第1列是输入模型的未改变的人脸
- 第2列是试图重建那张人脸的模型
- 第3列是试图交换人脸的模型
- 这些表情一开始会是纯色,或者非常模糊,但是随着时间的推移,随着神经网络学会如何重建和交换表情,这些表情会得到改善。
- 不透明的红色区域表示人脸被
mask
的区域(如果使用mask
训练)。 - 如果训练覆盖率低于 100%,您将看到红色框的边缘。这表示“交换区域”或神经网络正在训练的区域。
- 您可以保存当前预览图像的副本与保存按钮在右下角。
- 可以取消勾选右下角的“Enable Preview”框来禁用预览。
Graph Tab:此选项卡包含一个图表,显示随时间的损失。每次模型保存时它都会更新,但可以通过点击“Refresh”按钮进行刷新:
你不需要太关注这里的数字,对于换脸,它们实际上毫无意义。这些数字给出了神经网络认为它重新创建人脸 A 的程度,以及它重新创建人脸 B 的程度的概念。然而,我们对模型根据人脸 A 的编码创建人脸 B 的情况感兴趣,这是不可能得到一个损失值的,因为没有真实世界的例子可以让神经网络进行比较。
损失图仍然是一个有用的工具,最终只要损失在下降,那么模型仍在学习。模型学习的速度会随着时间的推移而降低,因此到最后可能很难辨别它是否仍在学习。在这些情况下,请参阅分析选项卡。
- 根据输出的数量,可能有几个可用的图表(例如
total loss
、mask loss
、face loss
等)。每个图表都显示了该特定输出的损失。 - 您可以使用右下角的保存按钮保存当前图形的副本。
- 可以通过取消右下角的“Enable Preview”框来禁用该图形。
Analysis Tab:这个选项卡显示了当前运行和以前的训练session
的一些统计数据:
各栏如下:
- Graphs – 单击蓝色图形图标,打开选定
session
的图形。 - Start/End/Elapsed – 每次
session
的开始时间、结束时间和总训练时间。 - Batch – 每个
session
的批处理大小 - Iterations – 为每个
session
处理的迭代总数。 - EGs/sec – 每秒通过模型处理的人脸数量。
当模型未训练时,您可以通过点击右下角的打开按钮,并在模型文件夹中选择模型的 state.json
文件来打开之前训练过的模型的统计信息。
您可以使用右下角的保存图标将分析选项卡的内容保存到 csv
文件中。
如上所述,损失图对于查看损失是否下降很有用,但很难辨别模型何时训练了很长时间。分析选项卡可以为您提供更精细的视图:
- 单击最新训练
session
旁边的蓝色图表图标,将调出选定session
的训练图表。
- 选择“Show Smoothed”,将平滑量提高到0.99,点击刷新按钮,然后放大,最后5000 – 10000次迭代:
- 现在图表放大了,您应该能够判断损失是否仍在下降或是否已经“收敛”。收敛是指模型不再学习任何东西。在这个例子中,你可以看到,虽然乍一看模型似乎已经收敛,但仔细观察,损失仍在下降:
8. Stopping and Resuming(停止和恢复)
只要按下GUI
左下角的Terminate
按钮,就可以在任何时候停止训练,模型将保存它的当前状态并退出。
通过选择相同的设置并将“model dir”文件夹指向保存文件夹的相同位置,可以恢复模型。这可以通过保存你的Faceswap
配置变得更容易,从GUI
文件菜单或从选项面板下面的保存图标:
你可以重新加载配置并继续训练。
可以在 Training
文件夹中添加和删除人脸,但请确保在进行任何更改之前停止训练,然后再次恢复。
新更新的版本可以采用下面这种方式,简答快速:
你想让你的模型学习,直到在预览视图中得到你满意的图像,要停止训练,你可以:
- 命令行:在预览窗口或控制台中按“Enter”
- GUI:按终止键(Stop)
当停止训练时,模型将保存,流程将退出,这可能需要一点时间,所以要有耐心。该模型还将每250次迭代左右进行一次保存(可以手动设置,Save Interval
)。
你可以在任何时候停止和恢复训练,只要把FaceSwap
指向相同的文件夹,需要删除里面的.bk
文件,然后继续即可。
9. Recovering a Corrupted Model(恢复损坏的模型)
有时模型会损坏,这可能出于多种原因,但可以通过预览中的所有人脸变成纯色/乱码,以及损失值飙升至很高的数字并且没有恢复来证明。
faceswap
提供了一个轻松恢复模型的工具,在每次保存迭代中,当总体损失值下降时,备份就会被保存。这些备份可以通过以下方式进行恢复:
- 进入Tools>Restore:
- Model Dir – 包含损坏模型的文件夹应该在这里输入:
点击Restore
按钮。恢复后,您应该能够从上次备份继续训练。