目录
Toggle介绍
很多人在开始 Faceswapping 时不知所措,并且犯了很多错误。错误是好的。这就是我们学习的方式,但有时在深入了解之前对所涉及的过程有一些了解会有所帮助。
在这篇文章中,我将详细介绍我们如何训练模型。有多种型号可供选择。我不会涵盖所有内容,但希望这会给您足够的信息,让您自己做出明智的决定。如果您还没有生成用于训练的面部集,请立即停止并前往摘录指南现在生成它们。
本指南中有相当多的背景信息。我建议您熟悉这一切。机器学习是一个复杂的概念,但我试图将其分解为尽可能简单易懂的概念。对神经网络的工作原理以及从中受益的数据类型有基本的了解将大大提高您实现成功交换的机会。
我将在本指南中使用 GUI,但前提与 cli 完全相同(GUI 中存在的所有选项在 cli 中可用)。
什么是培训?
概述
在高层次上,训练是教我们的神经网络 (NN) 如何重建人脸。大多数模型主要由两部分组成:
- 编码器——它的工作是将大量面部作为输入,并将它们“编码”为“矢量”形式的表示。重要的是要注意,它不是学习你输入的每张脸的精确表示,而是试图创建一种算法,该算法可用于稍后重建尽可能接近输入图像的人脸。
- 解码器——它的任务是获取编码器创建的向量,并尝试将此表示转换回人脸,尽可能与输入图像匹配。
- 有些模型的构造略有不同,但基本前提保持不变。
NN 需要知道它在人脸编码和解码方面做得如何。它使用 2 个主要工具来执行此操作:
- 损失——对于输入模型的每批人脸,NN 将查看它试图通过其当前编码和解码算法重新创建的人脸,并将其与输入的实际人脸进行比较。基于它认为它的好坏完成后,它会给自己一个分数(损失值)并相应地更新其权重。
- 权重– 一旦模型评估了它重新创建面部的程度,它就会更新其权重。这些输入编码器/解码器算法。如果它在一个方向上调整了它的权重,但感觉它在重建面部方面做得比以前差,那么它就知道权重在错误的方向上移动,所以它会以另一种方式调整它们。如果感觉有所改善,那么它就知道要继续朝着前进的方向调整权重。
- 然后模型重复这个动作很多次,根据损失值不断更新权重,理论上会随着时间的推移而改进,直到它达到你认为它已经学会了足够有效地重新创建一张脸的程度,或者损失值停止下降。
现在我们了解了神经网络的基本功能以及它如何学习创建面孔,这如何应用于面孔交换?你可能已经注意到在上面的分解中,这个神经网络学习了如何加载一个人的脸,然后重建这些脸。但这不是我们想要的……我们想要加载大量面孔并重建其他人的面孔。为了实现这一点,我们的神经网络做了几件事:
- 共享编码器——当我们训练我们的模型时,我们给它提供了 2 组面孔。A 集(我们要替换的原始面孔)和 B 集(我们希望放置在场景中的交换面孔)。实现这一目标的第一步是为 A 和 B 集共享编码器。这样我们的编码器就可以为两个不同的人学习一个算法。这非常重要,因为我们最终将告诉我们的神经网络采用一张脸的编码并将其解码到另一张脸。因此,编码器需要查看和学习我们交换所需的两组人脸。
- 切换解码器——训练模型时,我们训练 2 个解码器。解码器 A 正在获取编码向量并尝试重新创建面部 A。解码器 B 正在获取编码向量并尝试重新创建面部 B。当最终交换面部时,我们切换解码器,因此我们提供模型面部 A,但是通过解码器 B 传递它。由于编码器已经在两组人脸上进行了训练,因此模型将对 A 的输入人脸进行编码,然后尝试从解码器 B 重建它,从而导致我们的模型输出交换的人脸。
- 术语
- 使用 Faceswap 时,您会看到一些常见的机器学习术语。为了让生活更简单,这里显示了术语表:
- 批处理– 批处理是同时通过神经网络输入的一组面孔。
- 批量大小– 批量大小是同时通过神经网络馈送的批次的大小。批量大小为 64 意味着一次通过神经网络输入 64 张人脸,然后计算这批图像的损失和权重更新。更大的批量会训练得更快,但会导致更高的泛化。较小的批次大小训练速度较慢,但会更好地区分人脸之间的差异。在训练的各个阶段调整批量大小会有所帮助。
- Epoch – 一个 epoch 是通过神经网络提供的数据的一个完整表示,例如:如果你有一个包含 5000 张面孔的文件夹,则当模型已经看到所有 5000 张面孔时,将是 1 个 Epoch。2 个纪元将是模型将所有 5000 张面孔都看过两次的时间,依此类推。就 Faceswap 而言,Epoch 实际上并不是一个有用的衡量标准。由于一个模型是在 2 个数据集(A 侧和 B 侧)上训练的,除非这些数据集的大小完全相同(极不可能),否则不可能计算一个 Epoch,因为每一侧都不同。
- 示例– 一个示例,就 Faceswap 而言,是“Face”的另一个名称。它基本上是通过神经网络传递的一张脸。如果模型看到了 10 个例子,那么它就看到了 10 张面孔。
- EG/s – 这是神经网络每秒看到的示例数量,或者就 Faceswap 而言,模型每秒处理的面孔数量。
- 迭代– 迭代是通过神经网络处理的一个完整批次。因此,批量大小为 64 的 10 次迭代意味着模型已经看到 640 (64 * 10) 张面孔。
- NN – 神经网络的缩写。
训练数据
数据质量对您的模型的重要性怎么强调都不为过。较小的模型可以在体面的数据上表现很好,同样,没有模型可以在糟糕的数据上表现良好。在你的模型的每一侧至少应该有 500 张不同的图像,但是数据越多,越多样化越好……在一定程度上。要使用的合理数量的图像介于 1,000 到 10,000 之间。添加比这更多的图像实际上会损害训练。
太多相似的图像对您的模型没有帮助。您需要尽可能多的不同角度、表情和照明条件。一个常见的误解是模型是针对特定场景训练的。这是“记忆”,而不是你想要达到的目的。您正在尝试训练模型以在所有角度、所有条件下的所有表情下理解一张脸,并将其与所有角度、所有条件下的所有表情的另一张脸交换。因此,您希望从尽可能多的不同来源为 A 集和 B 集构建训练集。
每边的不同角度非常重要。NN 只能学习它看到的东西。如果 95% 的面孔直视相机而 5% 的面孔是侧面的,那么模型将需要很长时间才能学会如何创建侧面。它可能根本无法创建它们,因为它很少看到面部的侧面。理想情况下,您希望面部角度、表情和光照条件的分布尽可能均匀。
同样,在 A 侧和 B 侧之间尽可能多地匹配角度/表情/照明条件也很重要。如果您有很多 A 面的个人资料图像,而 B 面没有个人资料图像,那么模型将永远无法执行个人资料交换,因为解码器 B 将缺少创建个人资料照片所需的信息。
训练数据的质量一般不应模糊,应该是高质量的(清晰且详细)。然而,在训练集中有一些模糊/部分模糊的图像是可以的。最终在最终交换中,一些面孔将变得模糊/分辨率低/模糊,因此对于神经网络来说,看到这些类型的图像也很重要,这样它才能进行忠实的重建。
可以找到有关创建训练集的更多详细信息在提取指南中.
选择模型
Faceswap 中有多种模型可用,并且会随着时间的推移添加更多模型。每一个的质量都可能是非常主观的,因此这将提供每个(当前)可用的简要概述。最终,最适合您的模型可以归结为许多因素,因此没有明确的答案。各有利弊,但如上所述,最重要的一个因素是数据质量。没有模型可以解决数据问题。
你会看到下面提到的输入和输出大小(例如 64px 输入,64px 输出)。这是提供给模型(输入)的人脸图像的大小和从模型(输出)生成的人脸的大小,所有提供给模型的人脸都是正方形的,所以 64px 的图像将是 64 像素宽 x 64 像素高。一个常见的误解是更高分辨率的输入会导致更好的交换。虽然它可以提供帮助,但情况并非总是如此。NN 正在学习如何将面部编码为算法,然后再次解码该算法。它只需要足够的数据就可以创建可靠的算法。输入分辨率和输出质量没有直接关系。
值得注意的是,模型越大,训练所需的时间就越长。在 Nvidia GTX 1080 上训练原始模型可能需要 12-48 小时。Villain 在相同硬件上可能需要一周以上的时间。通常认为输入大小加倍的模型需要两倍的时间。这是不正确的。这至少需要 4 倍的时间,甚至可能更长。这是因为一张 64 像素的图像有 4,096 个像素。然而,一张 128 像素的图像有 16,384 个像素。这是 4 倍之多,此外还需要对模型进行缩放以处理这种增加的数据量,并且训练时间会很快增加。
- 轻量级(64px 输入,64px 输出)——这是一个极其精简的模型,设计用于在 VRAM <=2GB 的 GPU 上运行。它不是您所说的“生产就绪”,但它使具有低端硬件的用户能够训练模型。在更高端的 GPU 上,它的训练速度非常快,因此在转移到更费力的模型之前,它对于快速了解交换的效果可能很有用。
- 原始(64px 输入,64px 输出)- 启动这一切的模型。仍然可以提供很好的结果,并且有助于了解您的数据集质量如何真正成为交换质量的最大驱动因素之一。
- IAE(64px 输入,64px 输出)- 结构与其他模型略有不同的模型。它有一个共享的编码器和一个共享的解码器,但在编码器和解码器之间有 3 个中间层(一个用于 A,一个用于 B,一个共享)。它以这种方式构建,以尝试更好地分离身份。可以在此处阅读有关此模型的更多信息:https://github.com/deepfakes/faceswap/pull/251
- Dfaker(64/128px 输入,128/256px 输出)——这个模型利用了一些与原始模型不同的技术,并且还专注于将输入放大到更高分辨率的输出。尽管已经存在了一段时间,但该模型仍然取得了很好的效果,同时由于缺少定制选项,使其成为一个简单的“即发即弃”模型。
- 不平衡(64-512px 输入,64-512px 输出)——这是一个强大的模型,有很多方法可以自定义和改进模型,但需要更多的专业知识和知识才能获得好的结果。可以说已被“RealFace”取代。值得注意的是,该模型更加强调 B Decoder,因此反转交换(即交换 B>A 而不是 A>B)将导致不太令人满意的结果。
- DFL-H128(128px 输入,128px 输出)——该模型实际上使用了与 Original 完全相同的编码器和解码器,但使用 128px 输入而不是 64px,然后尝试将图像压缩为与 Original 一半大的面部表示. 与原始空间相比,较小的“潜在空间”在质量上存在一些缺点,从而抵消了较大的输入尺寸。
- DFL-SAE(64-256px 输入,64-256px 输出)——该模型包含两种不同的网络结构,一种基于原始共享编码器/拆分解码器模型,另一种基于 IAE 模型(共享中间层)。有许多定制选项。提供了很好的细节,但会导致一些身份流失(即,A 的某些特征可能在 B 中仍然可见)。
- Villain(128px 输入,128px 输出)- Villain 可能是最详细的模型,但 VRAM 非常密集,并且在有限源上训练时可以提供低于标准的颜色匹配。是病毒式传播的 Steve Buscemi/Jennifer Lawrence Deepfake 的来源。由于此模型没有任何自定义选项(除了低内存版本),如果您想要更高分辨率的模型而无需调整任何设置,它是一个不错的选择。
- Realface(64-128px 输入,64-256px 输出)- Unbalanced 模型的继承者。从该模型和 Dfaker 中吸取教训,同时希望进一步发展它们。此模型是高度可定制的,但最好在您了解自己在做什么以及设置将产生什么影响时调整选项。与不平衡模型一样,该模型更加强调 B 解码器,因此反转交换(即交换 B>A 而不是 A>B)将导致不太令人满意的结果。
- Dlight(128px 输入,128-384px 输出)- 基于 dfaker 变体的更高分辨率模型,专注于使用自定义放大器放大面部。这是最新的型号,非常容易配置。
- Phaze-A(完全可配置的分辨率)- Phaze-A 与其说是一个模型,不如说是一个模型构建器。这是一个极其复杂的模型,如果您刚开始使用它并不是最好的选择。Phaze-A 有自己的线程来解释它是如何工作的:viewtopic.php?f=27&t=1525
-
模型配置设置
好的,你已经选择了你的模型,让我们开始训练吧!好吧,等一下。我很钦佩你的热心,但你可能想要先设置一些特定于模型的选项。我将为此使用 GUI,但可以在faceswap/config/train.ini位置的 faceswap 文件夹中找到配置文件(如果使用命令行)。
我不会详细介绍每个模型的选项,因为这些选项各不相同,并且很难针对新模型进行更新,但我将概述一些更常见的选项。我们将更多地关注适用于所有模型的全局选项。所有选项都有工具提示,因此将鼠标悬停在一个选项上可获得有关其功能的更多信息。
要访问模型配置面板,请转到“设置” > “配置设置…”或选择“训练设置”快捷方式以直接进入正确的位置:
全局设置
这些是适用于所有模型的选项,分为全局模型选项和损失选项。
-
-
全局
-
可以通过选择“训练”节点来访问全局选项。此页面上的所有选项,除了Learning Rate、Epsilon Exponent、Convert Batchsize、Allow Growth和NaN Protection仅在创建新模型时生效。开始训练模型后,此处选择的设置将“锁定”到该模型,并且无论此处配置什么,都会在您恢复训练时重新加载。
- 适用于初始化模型的初始化选项。
正如在培训概览该模型具有在每次迭代结束时更新的权重。初始化是首先设置这些权重的过程。您可以将此视为帮助模型入门。正如我们知道我们的神经网络将用于什么,我们可以将这些权重设置为有助于模型快速启动的值。
默认的初始化方法是“he_uniform”。这从均匀分布中抽取样本。进入不同的初始化方法及其含义不是本指南的目标,但是可以通过本节中公开的选项覆盖此默认值。
需要注意的是,有些模型在内部为模型的某些层设置了初始化方法,因此这些层不会受到此设置的影响。但是,对于未明确设置的图层和模型,初始化程序将更改为所选选项。
两个现有的初始化器可以一起使用(即它们可以同时启用而没有不良影响)。我倾向于同时启用它们。
- ICNR Init – 此初始化程序仅适用于高档层。当输出图像在 NN 中放大时,标准初始化会导致输出图像中出现“棋盘”伪影。此初始化程序旨在防止这些人工制品。可以在本文中阅读有关此方法的更多信息:https://arxiv.org/abs/1707.02937
- Conv Aware Init – 卷积感知初始化应用于模型中的所有卷积层。这个初始化器背后的前提是它考虑了卷积网络的目的并相应地初始化权重。从理论上讲,这会导致更高的精度、更低的损失和更快的收敛。可以在以下论文中阅读有关此初始化程序的更多信息:https://arxiv.org/abs/1702.06295注意:此初始化程序在启动时可能会占用更多 VRAM,因此建议以较小的批大小开始,启动模型,然后以所需的批大小重新启动模型。
注意:此初始化程序不会在启用多 GPU 模式的情况下运行,因此如果使用多个 GPU 进行训练,您应该在 1 个 GPU 上开始训练,停止模型,然后继续启用多 GPU。
- 与优化器有关的优化器选项。
优化器控制模型的学习方式和学习速率。
- 优化器– 要使用的学习方法。将其保留为默认的“Adam”可能是最佳选择,但您可以随意尝试不同的优化器。描述列出的每种方法超出了范围,但 Internet 上有大量信息。一个例外是 AdaBelief,它是一种更新的优化器,旨在加速训练和提高收敛性(参考:https://arxiv.org/abs/2010.07468). 它是否成功取决于您。确保
Epsilon Exponent
使用 AdaBelief 调整 if(您可以在该部分阅读原因)。 - 学习率——对于大多数模型,这通常应该保持不变,除非在模型崩溃的情况下(所有图像变为纯色块,并且损失达到高水平并且永远不会恢复)。对于一些更复杂的模型(例如 Phaze-A 和 DLight),您可能需要降低此值。一般来说,模型越复杂,成功开始训练所需的学习率就越低。与此页面上的许多其他参数不同,此值可以针对现有模型进行调整。学习率决定了在每次迭代中可以向上或向下调整多少权重。直觉会说学习率越高越好,但事实并非如此。该模型正在尝试学习获得尽可能低的损失值。学习率设置得太高会不断地在最低值上下摆动,永远学不到任何东西。将学习率设置得太低,模型可能会遇到低谷并认为它已达到最低点,并且会停止改进。把它想象成走下一座山。你想到达底部,所以你应该一直往下走。不过,下山的路并不总是下坡,途中还有较小的丘陵和山谷。学习率需要足够高才能走出这些较小的山谷,但又不能高到让你最终到达下一座山顶。
- Epsilon Exponent – 为了防止“除以零错误”,在梯度中添加了一个非常小的数字。epsilon 指数指示要添加的此数字的大小(默认值
-7
将添加 1 * 10 -7,即:0.0000001
)。如果您的模型不断崩溃,或者您不断击中NaNs
并且无法通过降低学习率或更改批量大小来解决问题,那么增加 Epsilon 指数的值应该是您绝对的最后选择。可以针对现有模型调整 Epsilon 指数。-7
对于 AdaBelief 除外的所有优化器,默认值应该没问题。这个优化器在这个值下训练会很慢,所以应该降低到大约-16
. 您可以在作者自己的实现。增加 Epsilon 指数在使用混合精度训练时特别有用。使用混合精度时的数值范围会减小,因此您更有可能遇到 NaN。将 epsilon 指数增加到-5
or-4
可以帮助防止这些。请注意,增加 Epsilon 指数会导致模型准确性降低,并需要更长的时间来完全训练您的模型。下一个选项当前处于禁用状态,直到可以修复错误。 - 保存优化器– 保存优化器状态意味着模型会准确记住上次保存时的位置,因此要从已保存的模型中恢复,您将继续进行,就好像您从未停止过一样。然而,这是有代价的。保存优化器状态会使模型的文件大小增加三倍,从而导致更长的保存迭代。如果未保存优化器状态,则恢复模型将需要数百次迭代才能赶上您上次停止训练时的状态。这里有3个选项
- 从不– 从不在保存的模型文件中包含优化器状态(较小的文件大小 + 更快的保存,但永远不会保存优化器状态)
- always – 在每次保存迭代时将优化器状态保存在保存的模型文件中(更大的文件大小和更慢的保存)。
- exit – 在正常训练期间,只保存没有优化器状态的模型权重。如果已发出退出请求(即用户请求停止训练会话,或者因为已达到目标训练迭代),则在退出之前将优化器状态保存在模型文件中。
值得注意的是,无论此处如何设置,模型快照始终会将优化器状态保存在模型文件中。 - AutoClip – 训练神经网络涉及一种数学,它可以生成超出计算机可表示范围的数字。这会导致NaN(不是数字)或Inf(无穷大)错误。这些都不好,会杀死模型。理想情况下,模型的设计应限制此类错误发生的可能性,但有时它们变得不可避免,尤其是在启用混合精度训练的情况下(这进一步限制了计算机可以表示的数值范围)。AutoClip 是论文中的一个实现AutoClip:源分离网络的自适应梯度裁剪它希望根据在模型中看到的梯度分布动态更新裁剪值。这可以帮助防止 NaN,并且论文的结果证明了一些其他潜在的好处。不过,这些可能会以一些 VRAM 为代价。
- 优化器– 要使用的学习方法。将其保留为默认的“Adam”可能是最佳选择,但您可以随意尝试不同的优化器。描述列出的每种方法超出了范围,但 Internet 上有大量信息。一个例外是 AdaBelief,它是一种更新的优化器,旨在加速训练和提高收敛性(参考:https://arxiv.org/abs/2010.07468). 它是否成功取决于您。确保
- 适用于整个模型的网络选项。
此处的选项适用于模型中使用的某些层。
- Reflect Padding – 一些模型,尤其是 Villain,以及较小程度上的 DFL-SAE,在最终交换中的交换区域边缘周围有一个明显的“灰框”。此选项更改卷积层中使用的填充类型,以帮助减轻这种伪影。我只建议为这两个模型启用它,否则我会关闭它。
- 允许增长– [仅限 Nvidia] 仅当您收到无法初始化 cuDNN 的持续错误时才启用此功能。这发生在一些没有真正模式的人身上。此选项根据需要分配 VRAM,而不是一次分配所有。虽然这更安全,但它会导致 VRAM 碎片,因此除非您需要,否则请将其关闭。可以为现有模型更改此选项。
- 混合精度– [仅限 Nvidia] 优化一些计算,以便能够加载更大的模型并使用更大的批量大小。在 RTX+ 卡上,这也可以加快训练速度。如果需要,请启用它。
- NaN 保护– 深度学习以“未绑定”的方式执行计算。这意味着没有什么可以阻止计算导致超出特定数据类型可以容纳的数值范围的数字。发生这种情况时
NaNs
(不是数字)将开始出现在您的模型中。如果发生这种情况,您的模型就死了并且无法保存它(一旦出现 NaN,它将开始像病毒一样传播,直到它最终出现在您的 Loss 值内)。如果损失输出中出现一个值,启用NaN Protection
将立即停止训练。NaN
这意味着导致 NaN 的迭代将不会保存到您的模型中,您可以努力补救这种情况。值得注意的是,当损失值中出现 NaN 时,仅降低学习率或提高 Epsilon Exponent 并从中断处继续训练可能不足以挽救模型。出现在损失值中的 NaN 是之前一段时间出现在梯度中的 NaN 的征兆。如果您确实遇到了 NaN,那么正确的做法是回滚到较早的快照(通常我回滚 100k 次迭代,但您可以回滚少于此次数),降低学习率并从那里。命中 NaN 并从中恢复可能是一种极其令人沮丧的经历,而且它似乎更常发生在混合精度训练中。有些模型比其他模型更容易受到 NaN 的影响。希望随着时间的推移,您将学会如何提前预防这些问题。
适用于送入模型的面的面选项
- Coverage – 这是将输入模型的源图像的数量。按给定的数量从中心裁剪一定百分比的图像。覆盖百分比越高,输入的面部就越多。裁剪图像量的图示如下所示。
左边的图像是Legacy
居中的,右边的图像是face
居中的。通常,您不希望将
Face
覆盖率设置为低于 75%,因为它与面部居中不同Legacy
并且可能会导致问题。任何高于 62.5% 的值都适合Legacy
居中。虽然从直觉上看,似乎覆盖率越高越好,但实际上并非如此,这是一种权衡。虽然更高的覆盖率意味着更多的面部被交换,但模型的输入大小始终保持不变,因此产生的交换可能不那么详细,因为更多信息需要打包到相同大小的图像中。为了说明,下面是同一图像的极端示例,覆盖率为 62.5% 和 100%,大小均为 32px。如您所见,100% 覆盖图像包含的细节远少于 62.5% 版本。最终此选项的正确选择取决于您:
注意:
Face
居中的面孔已经比Legacy
居中的面孔缩小得更多,因此会收集到更少的细节。最好对Legacy
小于 128px 输出的模型使用居中。
居中– 将从您的提取图像中裁剪要训练的面部。
Legacy
是传统的训练方法,但它往往会非常靠近面部(砍掉前额)。Face
稍微缩小脸部并重新居中靠近头部中心,以更好地捕捉更多角度。如果您正在训练输出尺寸小于 128 像素的模型,那么您应该选择Legacy
,否则选择最适合您的项目的居中。下图显示了提取图像的示例。黄色框显示居中裁剪的位置
Legacy
,绿色框显示居中裁剪的位置Face
:
-
-
- 模型用于转换时的转换选项
这些选项只会影响转换过程,不会影响训练过程。因此,它们可以针对现有模型进行更改。
- Convert Batchsize – 转换期间通过模型输入的面数。通常不需要更改此设置,除非在运行转换时 VRAM 已用完。丢失设置
控制要使用的损失类型和数量的选项。通过展开“全局”节点并选择“损失”来访问这些选项:与全局设置不同,这些选项中的大多数都是“解锁”的,因此可以针对已创建的已保存模型进行调整。这是 Penalized Mask Loss 的例外,它必须在创建模型时定义。
- 损失
要使用的损失函数。有多种不同的方法来计算损失,或者让神经网络辨别它在训练模型时的表现。我不会详细介绍每个可用的功能,因为这会是一个有点冗长的过程,而且 Internet 上有大量关于这些功能的信息。本节中的工具提示还简要概述了每个损失函数。
值得注意的是,不同的损失函数旨在做不同的事情,因此通常最好选择几个损失函数来执行不同的任务并相应地赋予它们权重。这并不简单,您需要进行一些研究,因为不同的损失函数的缩放比例不同,并且将权重设置得太高可能会压倒所有其他损失函数,而太低可能意味着所选损失函数没有任何效果。
大多数情况下默认值都可以,但要充分利用模型,需要调整一些损失函数。在数据和模型选择之外,这是您需要做出的下一个最重要的选择。
- 损失函数——这是主要的损失函数。它的权重始终为 100%。最流行的损失方法是 MAE(平均绝对误差)和 SSIM(结构相似度)。我个人的偏好是使用 SSIM。
- 损失函数 2-4 – 这些是您可以应用的补充损失函数。如果使用诸如 SSIM 之类的感知损失,通常会添加一个L2 正则化器。比如 MSE。损失组合的选择太多,无法在本指南中涵盖
- 损失权重 2-4 – 应用于相应补充损失函数的权重。100 = 100% 输出,50 将损失输出缩放 50%,200 将其加倍。此处使用的数字将根据您使用的损失函数而有很大差异。
- Mask Loss Function – 如果您打算学习掩码,则使用的方法。默认的均方误差 (MSE) 就可以了。
- Eye Multiplier – 赋予眼部区域的“重量”量。仅当启用“惩罚损失”时才能使用此选项。值为 2 表示眼睛的重要性是面部其余部分的两倍。这有助于了解细节,但设置过高会导致像素化。由于可以针对现有模型调整此设置,因此通常可以训练出问题。
- 嘴部乘数– 给予嘴部区域的“重量”。仅当启用“惩罚损失”时才能使用此选项。值为 2 意味着嘴巴的重要性是面部其他部分的两倍。这有助于了解细节,但设置过高会导致像素化。由于可以针对现有模型调整此设置,因此通常可以训练出问题。
- Penalized Mask Loss – 此选项指示图像中落在面部区域之外的区域的重要性是否应该低于落在面部区域内部的区域。应始终启用此选项
- 适用于面罩训练的面罩选项。
设置遮罩是指示图像的哪个区域重要的一种方式。在下面的示例中,红色区域被“遮蔽”(即:它被认为不重要),而空白区域被“遮蔽”(它是我们感兴趣的面部区域):
戴口罩训练有两个目的:
- 它将训练集中在面部区域,迫使模型对背景的重要性降低。这可以帮助模型更快地学习,同时还确保它不会占用不重要的空间学习背景细节。
- 学习到的掩码可以在转换阶段使用。在当前的实现中,学习掩码是否比在转换时使用标准掩码有任何好处是有争议的,但使用掩码进行训练可确保您可以选择使用它。
- 面罩类型– 用于训练的面罩类型。要使用掩码,您必须将所需的掩码添加到生成训练集的原始对齐文件中。您可以使用蒙版工具添加/更新蒙版。看viewtopic.php?f=5&t=27#extract了解每个面具的详尽描述。
- Mask Blur Kernel – 这对蒙版的边缘应用了轻微的模糊。实际上,它移除了蒙版的硬边,并逐渐将其从脸部混合到背景。这有助于处理计算不当的掩码。是否要启用此功能以及使用什么值取决于您。默认值应该没问题,但您可以使用遮罩工具进行试验。
- 蒙版阈值– 此选项不会影响基于对齐的蒙版(扩展、组件),因为它们是二进制的(即蒙版是“开”或“关”)。对于基于 NN 的蒙版,蒙版不是二进制的,并且具有不同级别的不透明度。在某些情况下,这会导致面罩出现斑点。提高阈值会使蒙版的部分接近透明、完全透明,而蒙版的部分接近纯色、完全纯色。同样,这将视具体情况而定。
- 学习面具– 如前所述,学习面具是否有任何好处是有争议的。启用此选项将使用更多 VRAM,因此我倾向于将其关闭,但如果您希望预测掩码在转换中可用,则应启用此选项。
模型设置
这些是特定于每个模型插件的设置。您可以通过单击“模型”节点来访问这些:
如前所述,我不会详细介绍特定于模型的设置。这些因插件而异。但是,我将介绍您可能会在每个插件中看到的一些常见选项。与往常一样,每个选项都会有一个工具提示,可以为您提供更多信息。
- lowmem – 一些插件有一个“lowmem”模式。这使您能够运行模型的精简版本,占用更少的 VRAM,但代价是保真度更差。
- 输入大小– 一些插件允许您调整输入到模型中的输入大小。输入始终是方形的,因此这是输入模型的图像的宽度和高度的大小(以像素为单位)。不要相信更大的输入总是等于更好的质量。这并非总是如此。还有许多其他因素决定了模型是否具有良好的质量。更高的输入大小需要以指数方式处理更多的 VRAM。
- 输出大小– 一些插件允许您调整模型生成的图像的大小。输入大小和输出大小不必相同,因此某些模型包含放大器,可返回比输入图像更大的输出图像。
培训师设置
配置设置页面中的部分用于培训师或“数据增强”选项。展开“Trainer”节点并选择“Original”:
NN 需要看到很多很多不同的图像。为了更好地学习人脸,它对输入图像执行各种操作。这称为“数据扩充”。如注释中所述,标准设置适用于 99% 的用例,因此只有在您知道它们会产生什么影响时才更改这些设置。
- 评估– 评估培训状态的选项。
- 预览图像– 这是交换的 A 面和 B 面的预览窗口中显示的面数。
- 图像增强——这些是对输入模型的人脸进行的操作。
- Zoom Amount – 在输入 NN 之前面部放大或缩小的百分比量。帮助模型处理错位。
- Rotation Range – 在输入 NN 之前面部顺时针或逆时针旋转的百分比量。帮助模型处理错位。
- Shift Range – 在输入 NN 之前面部向上/向下、向左/向右移动的百分比量。帮助模型处理错位。
- Flip Chance – 水平翻转脸的机会。帮助为 NN 学习创造更多角度。
- 颜色增强——这些增强处理输入模型的人脸的颜色/对比度,使神经网络对颜色差异更加稳健。
这是颜色增强在引擎盖下的作用的图示(您不会在预览/最终输出中看到它,它仅用于演示目的):
- 颜色亮度– 输入图像的亮度向上和向下调整的百分比量。有助于应对不同的照明条件。
- 颜色 AB – 在L a b颜色空间的 A/B 标度上调整颜色的百分比量。帮助神经网络处理不同的颜色情况。
- Color CLAHE Chance – 图像应用对比度受限自适应直方图均衡化的概率百分比。CLAHE 是一种试图定位对比度变化的对比度方法。这有助于神经网络处理不同的对比度。
- Color CLAHE Max Size – CLAHE 算法的最大“网格大小”。这被缩放到输入图像。更高的值将导致更高的对比度应用。这有助于神经网络处理不同的对比度。
配置预设
某些型号具有预设,可以轻松加载针对不同情况的配置选项。预设加载和保存是一个仅限 GUI 的功能,可以从页面顶部的保存和加载图标访问:
可以为任何具有配置选项的页面保存或加载预设。这使您能够为各种情况保存已知的良好设置,并能够轻松加载它们。预设不限于训练选项。您可以为 Faceswap 的任何部分保存预设(例如提取/训练/转换等)。
请记住点击
Save
配置页面底部的按钮以应用您可能已加载的任何预设。注意:CLI 用户:如果您使用的是 cli,那么您可以通过导航到
lib/gui/.cache/presets
您的 Faceswap 文件夹来访问现有的预设值,但是您需要手动将这些值复制到您的train.ini
文件中。或者,您可以在有显示器的机器上安装 Faceswap,在这台机器上加载/保存您的预设,然后将更新的文件复制train.ini
到您将实际运行 Faceswap 的机器上。
一旦你有了你想要的模型设置,点击确定保存配置并关闭窗口。
注意:点击确定将保存所有选项卡上的选项,因此请务必仔细查看它们。您可以点击取消取消您的任何更改或重置将所有值恢复为默认设置。
配置
现在你已经准备好了你的脸,你已经配置了你的模型,是时候开始了!
转到 GUI 中的“训练”选项卡:
这是我们将告诉 Faceswap 一切都存储在哪里,我们想要使用什么,并真正开始训练的地方。
-
人脸
这是我们将告诉 Faceswap 人脸存储在哪里的地方。
- 输入 A – 这是包含您作为一部分提取的“A”面孔的文件夹的位置提取过程. 这些是将从原始场景中删除并由交换面替换的面。此文件夹中应该有大约 1,000 – 10,000 张面孔。
- 输入 B – 这是包含您作为一部分提取的“B”面孔的文件夹的位置提取过程. 这些是将被交换到场景中的面孔。此文件夹中应该有大约 1,000 – 10,000 张面孔。
- 与您将要训练的模型相关的模型选项:
- 模型目录– 这是保存模型文件的地方。如果您要开始一个新模型,您应该选择一个空文件夹,如果您要从已经开始的模型恢复训练,则应该选择一个包含模型文件的现有文件夹。
- 加载权重– 您可以从您之前训练过的模型加载权重。这可以通过根据先前训练的数据初始化权重来帮助“启动”您的模型。只有在开始新模型时才会使用加载重量。如果您正在恢复现有模型,则此选项将被忽略。通常,这只会为编码器加载权重,尽管某些模型(例如 Phaze-A)允许您选择将权重加载到模型的其他部分。如果您正在加载重量,那么您通常也需要选择该
Freeze Weights
选项。原因是当您启动模型时,梯度更新将立即开始。未能冻结权重意味着您加载的权重将被来自模型其余部分的随机初始化数据污染,这将首先抵消您可能从加载权重中获得的任何好处。 - Trainer – 这是您要为交换训练的模型。不同模型的概述是以上可用.
- 摘要– 启用摘要选项将只显示您将要训练的模型的摘要并退出该过程。训练不会开始。当您使用更复杂的模型并希望在开始训练之前快速检查布局时,这非常有用。如果启用此选项,则您无需提供输入数据。
- 冻结重量– 可以冻结模型特定部分的重量。这意味着您冻结的部分将不会继续学习。当您为模型的一部分加载了权重,或者您只想将训练重点放在模型的特定部分时,这会很有用。一般来说,当你冻结重量时,你会想要降低学习率。对于大多数模型,选择此选项只会冻结编码器(这通常是您想要冻结的模型部分)。然而,某些模型(例如 Phaze-A)也允许您冻结模型的其他部分。冻结权重的另一个优点是您可以增加批量大小,因为需要在 GPU 内存中保存的信息更少。此链接的第一部分很好地概述了加载重量和冷冻重量的好处:https://keras.io/guides/transfer_learning/
-
训练
训练具体设置:
- 批量大小——如上所述,批量大小是一次通过模型输入的图像数量。增加这个数字将增加 VRAM 的使用。增加批量大小会在一定程度上加快训练速度。小批量提供了一种有助于模型泛化的调节形式。虽然大批量训练速度更快,但 8 到 16 范围内的批量大小可能会产生更好的质量。其他形式的监管是否可以取代或消除这种需求仍然是一个悬而未决的问题。
- Iterations – 在自动停止训练之前要执行的迭代次数。这实际上只是为了自动化,或者确保训练在一定时间后停止。通常,当您对预览的质量感到满意时,您会手动停止训练。
- 分布策略– [仅限 NVIDIA] – 可以使用多种不同的“分布策略”对模型进行训练。这是一种配置 Tensorflow 以在 CPU 上放置模型变量以及如何处理多个 GPU 设置的方法。您可以阅读有关 Tensorflow 分布策略的更多信息这里.
- 默认[Single GPU] – 不选择特定的分配策略。这是默认选项,Tensorflow 将正常运行,使用单个 GPU 并将所有模型变量放在 GPU 上。
- 中央存储[单和多 GPU] 操作将在任何可用的 GPU 上执行,但模型变量将存储在 CPU 上。这有助于以轻微的速度成本节省 VRAM(因为需要将变量复制到 GPU 或从中复制)。此策略与单个和多个 GPU 设置兼容。但是,在多 GPU 设置中,此策略与混合精度不兼容。对于单 GPU 设置,此策略可与混合精度训练一起使用以节省更多 VRAM。
- mirrored [Multi GPU] – 使用 Tensorflow 的“镜像”策略通过在多个 GPU 上分配批次来提高训练速度。虽然可以为单 GPU 系统启用此选项,但它没有任何好处,因此不应在单 GPU 实例中使用。模型变量在每个 GPU 实例上复制,因此此方法不会节省 VRAM。请注意,这种加速不是线性的,你添加的 GPU 越多,收益递减就越多。最终,它允许你通过将它们拆分到多个 GPU 来训练更大的批次大小。您将始终受到最弱 GPU 的速度和 VRAM 的瓶颈,因此在相同的 GPU 上进行训练时效果最佳。
- 无日志– 提供损失和模型日志记录,以便能够分析数据张量板和图形用户界面。关闭此功能将意味着您无权访问此数据。实际上,没有理由禁用日志记录,因此通常不应检查此项。
-
保存
选项以安排模型文件的保存:
- Save Interval – 模型保存到磁盘的频率。当一个模型被保存时,它并没有被训练,所以你可以提高这个值来获得轻微的训练速度提升(即它不是经常等待模型被写入磁盘)。你可能不想把它提高得太高,因为它基本上是你的“故障保险”。如果模型在训练过程中崩溃,那么您将只能从上次保存的地方继续。
注意:如果使用 Ping Pong 内存节省选项,则不应将其增加到 100 以上,因为它可能会损害最终质量。 - 快照间隔– 快照是模型在某个时间点的副本。如果您对模型的进展方式不满意,这使您可以回滚到较早的快照,或者如果您的保存文件已损坏且没有可用备份,则可以回滚。通常,这应该是一个很大的数字(在大多数情况下默认值应该没问题),因为创建快照可能需要一段时间,并且您的模型不会在此过程完成时进行训练。在长时间的培训课程中会拍摄大量快照,因此您可能需要密切关注这一点并随着时间的推移删除不需要的快照,因为它们会占用空间并造成混乱。快照将保存在您的实际模型文件夹旁边,名称
_snapshot
和迭代次数附加到文件夹名称的末尾。要从快照中恢复,只需删除您的实际模型文件夹,然后将快照文件夹重命名为原始模型的名称(即_snapshot_xxxxx_iters
从文件夹名称末尾删除)
- Save Interval – 模型保存到磁盘的频率。当一个模型被保存时,它并没有被训练,所以你可以提高这个值来获得轻微的训练速度提升(即它不是经常等待模型被写入磁盘)。你可能不想把它提高得太高,因为它基本上是你的“故障保险”。如果模型在训练过程中崩溃,那么您将只能从上次保存的地方继续。
- 用于显示训练进度预览窗口的预览选项:
如果您使用的是 GUI,那么通常您不想使用这些选项。预览是一个弹出的窗口,显示训练的进度。GUI 将此信息嵌入到“显示”面板中,因此弹出的窗口只会显示完全相同的信息并且是多余的。预览在每次保存迭代时更新。
- Preview Scale – 弹出的预览大小与训练图像的大小一致。如果您的训练图像为 256 像素,则完整预览窗口将为 3072×1792。这对于大多数显示器来说太大了,所以这个选项按给定的百分比缩小预览。
- Preview – 启用弹出预览窗口,禁用不弹出预览窗口。对于 GUI 使用,通常不选中此项。
- 写入图像– 这会将预览图像写入 faceswap 文件夹。如果在无头系统上训练很有用。
- 用于生成一组可选延时图像的延时选项:
Time-Lapse 选项是一项可选功能,可让您查看一组固定面孔随时间的训练进度。在每次保存迭代中,都会保存一张图像,显示当时所选面部的训练进度。请注意,延时拍摄图像占用的磁盘空间量会随着时间的推移而增加。
- Timelapse Input A – 包含要用于生成 A(原始)面的延时的面孔的文件夹。只会使用找到的前 14 个面孔。如果您希望从训练集中选择前 14 张面孔,则只需将其指向“输入 A”文件夹即可。
- Timelapse Input B – 包含要用于生成 B(交换)侧延时的面孔的文件夹。只会使用找到的前 14 个面孔。如果您想从训练集中选择前 14 张面孔,则只需将其指向“输入 B”文件夹即可。
- Timelapse Output – 您希望保存生成的延时摄影图像的位置。如果您为 A 和 B 提供了来源但将此留空,则这将默认为您选择的模型文件夹。
-
增强
数据增强特定选项。
- Warp To Landmarks——如前所述,数据被扭曲,以便 NN 可以学习如何重新创建面孔。Warp to Landmarks 是一种不同的变形方法,它尝试将面孔随机变形为另一侧的相似面孔(即对于 A 集,它会从 B 集中找到一些相似的面孔,并应用变形,并进行一些随机化)。关于这是否比标准随机变形有任何好处/不同,尚无定论。
- 无翻转– 图像随机翻转以帮助增加 NN 将看到的数据量。在大多数情况下,这很好,但面部不对称,因此对于某些目标,这可能是不可取的(例如面部一侧有痣)。一般来说,这应该是不检查的,当然在开始训练时也应该不检查。稍后在会话期间,您可能希望为某些交换禁用此功能。
- 无增强颜色– Faceswap 执行颜色增强(前面有详细介绍)。这确实有助于匹配 A 和 B 之间的颜色/光照/对比度,但有时可能并不理想,因此可以在此处将其禁用。颜色增强的影响可以在下面看到:
- No Warp – 扭曲图像对于神经网络正确学习非常重要,因此在开始模型和大部分训练时始终确保禁用此选项。但是,当您即将结束培训课程时,关闭此功能以尝试显示更详细的信息会有所帮助。
-
全球
全球换脸选项:
这些选项对于 Faceswap 的每个部分都是全局的,而不仅仅是训练。
- 排除 GPU – 如果您有多个 GPU,您可以选择从 Faceswap 中隐藏它们。将鼠标悬停在项目上以查看每个索引适用于哪个 GPU。
- 配置文件- 您可以指定自定义 train.ini 文件,而不是使用存储在faceswap/config文件夹中的文件。如果您想要在多个不同的已知良好配置之间切换,这将很有用。
- 日志级别– Faceswap 将登录的级别。通常,这应该始终设置为INFO。如果开发人员要求,您应该只将其设置为TRACE ,因为它会显着减慢训练速度并会生成巨大的日志文件。
注意:控制台只会记录到VERBOSE级别。DEBUG和TRACE的日志级别只写入日志文件。 - 日志文件– 默认情况下,日志文件存储在faceswap/faceswap.log中。如果您愿意,可以在此处指定不同的位置。
锁定所有设置后,查看它们以确保您满意,然后点击训练按钮开始训练。
监控培训
开始训练后,该过程将花费一两分钟来构建模型、预加载数据并开始训练。启动后,GUI 将进入训练模式,在底部放置一个状态栏并在右侧打开一些选项卡:
- 状态栏
这出现在右下角,提供当前训练课程的概览。它更新每次迭代:你不需要太关注这里的损失数字。对于换脸,它们实际上毫无意义。这些数字给出了神经网络认为它重新创建面部 A 的程度以及它重新创建面部 B 的程度的想法。但是我们感兴趣的是模型从面部 A 的编码创建面部 B 的程度。不可能得到这是一个损失值,因为没有真实世界的交换面孔示例可供 NN 进行比较。
- Elapsed – 此培训课程已经过去的时间量。
- Session Iterations – 在此培训课程期间已处理的迭代次数。
- Total Iterations – 已为该模型的所有会话处理的迭代总数。
- Loss A/Loss B – 当前迭代的损失。注意:可能有多个损失值(例如面部、面具、多输出等)。该值是所有损失的总和,因此此处的数字可能相差很大。
- 预览选项卡
可视化模型的当前状态。这是模型重新创建和交换面的能力的表示。每次模型保存时它都会更新:了解模型是否已完成训练的最佳方式是观看预览。最终,这些显示了实际交换的样子。当您对预览感到满意时,就该停止训练了。眼睛眩光和牙齿等精细细节将是最后要处理的事情。一旦定义了这些,通常是培训接近完成的良好指示。
- 预览将显示 12 列。前 6 个是“A”(原始面)面,后 6 个是“B”(交换面)面。每组 6 列被分成 2 组,每组 3 列。对于这些列中的每一列:
- 第 1 列是输入模型的不变面
- 第 2 列是试图重现那张脸的模型
- 第 3 列是试图换脸的模型
- 这些将以纯色或非常模糊的形式开始,但随着神经网络学习如何重新创建和交换面孔,它们会随着时间的推移而改善。
- 不透明的红色区域表示被遮盖的面部区域(如果使用面具进行训练)。
- 如果训练覆盖率低于 100%,您将看到红色框的边缘。这表示“交换区域”或神经网络正在训练的区域。
- 您可以使用右下角的保存按钮保存当前预览图像的副本。
- 可以通过取消选中右下角的“启用预览”框来禁用预览。
- 预览将显示 12 列。前 6 个是“A”(原始面)面,后 6 个是“B”(交换面)面。每组 6 列被分成 2 组,每组 3 列。对于这些列中的每一列:
- 图表选项卡– 此选项卡包含显示随时间损失的图表。每次模型保存时它都会更新,但可以通过点击“刷新”按钮来刷新:
你不需要太关注这里的数字。对于换脸,它们实际上毫无意义。这些数字给出了神经网络认为它重新创建面部 A 的程度以及它重新创建面部 B 的程度的想法。但是我们感兴趣的是模型从面部 A 的编码创建面部 B 的程度。不可能得到这是一个损失值,因为没有真实世界的交换面孔示例可供 NN 进行比较。
损失图仍然是一个有用的工具。最终只要损失在下降,那么模型仍在学习。模型学习的速度会随着时间的推移而降低,所以到最后可能很难辨别它是否还在学习。请参阅这些实例中的“分析”选项卡。
- 根据输出的数量,可能有几个图表可用(例如总损失、掩码损失、面部损失等)。每张图都显示了该特定输出的损失。
- 您可以使用右下角的保存按钮保存当前图表的副本。
- 可以通过取消选中右下角的“启用预览”框来禁用该图。
- 分析选项卡– 此选项卡显示当前运行和之前训练课程的一些统计数据:
- 列如下:
- 图表– 单击蓝色图表图标打开所选会话的图表。
- Start/End/Elapsed – 分别为每个会话的开始时间、结束时间和总训练时间。
- Batch – 每个会话的批量大小
- 迭代– 为每个会话处理的迭代总数。
- EGs/sec – 每秒通过模型处理的面数。
- 当模型未训练时,您可以通过点击右下角的打开按钮并选择模型文件夹中模型的state.json文件来打开之前训练过的模型的统计信息。
- 您可以使用右下角的保存图标将分析选项卡的内容保存到csv文件。
如上所述,损失图对于查看损失是否正在下降很有用,但很难辨别模型何时训练了很长时间。分析选项卡可以为您提供更精细的视图。
- 单击最新训练课程旁边的蓝色图表图标将显示所选课程的训练图表。
- 选择“显示平滑”,将平滑量提高到 0.99,点击刷新按钮,然后放大最后 5,000 – 10,000 次左右的迭代:
- 现在图表已放大,您应该能够判断损失是否仍在下降或是否已经“收敛”。收敛是指模型不再学习任何东西。在此示例中,您可以看到,虽然乍一看模型似乎已经收敛,但仔细观察后,损失仍在下降:
-
停止和恢复
只需按下 GUI 左下方的终止按钮,就可以随时停止训练。该模型将保存其当前状态并退出。
可以通过选择相同的设置并将“模型目录”文件夹指向与保存文件夹相同的位置来恢复模型。通过从 GUI 文件菜单或选项面板下方的保存图标保存您的 Faceswap 配置,这可以变得更容易:
然后您可以重新加载您的配置并继续训练。
可以在训练文件夹中添加和删除面孔,但请确保在进行任何更改之前停止训练,然后再次恢复。
偶尔模型损坏。这可能有多种原因,但预览中的所有面孔都变成了纯色/乱码,并且损失值飙升到很高的数字并且没有恢复。
Faceswap 提供了一种可以轻松恢复模型的工具。每次保存迭代都会保存备份,损失值总体下降。这些备份可以通过以下方式恢复:
- 转到工具>模型:
- 模型目录– 应在此处输入包含损坏模型的文件夹。
- 作业– 选择还原作业。
点击模型按钮。恢复后,您应该能够从上次备份开始继续训练。
- 转到工具>模型:
-
- 列如下:
-
- 评估– 评估培训状态的选项。
- 损失
- Convert Batchsize – 转换期间通过模型输入的面数。通常不需要更改此设置,除非在运行转换时 VRAM 已用完。丢失设置
- 模型用于转换时的转换选项
-
如您想了解更多,可以查阅[官方指南] Faceswap训练
[…] [官方指南] Faceswap训练 […]