简友广场

Faceswap中文使用指南

2020-07-20  本文已影响0人  半箩筐

FaceSwap 使用指南

翻译自:
https://faceswap.dev/forum/viewtopic.php?f=5&t=27
https://forum.faceswap.dev/viewtopic.php?f=6&t=146

github地址:
https://github.com/liafuzho/faceswap-doc-cn/blob/master/faceswap-guide-cn.md


内容

“提取” 流程

介绍

很多人在开始 "Faceswap" 时不知所措,并且犯了许多错误。错误是好的,这是我们的学习方式,但有时在深入学习之前对所涉及的过程有一点了解可能会有所帮助。

在本节中,我将详细介绍 “抽取” 的工作流程。 我并不是说这是最好的工作流程,但是它对我很管用,希望在您创建自己的工作流程时提供一个良好的起点。

我将在本指南中使用 “GUI”,在 “cli” 中也完全相同(“GUI”中存在的所有选项在“cli”中都是可用的)。

为什么要提取

“提取” 包括三个阶段: “检测”、 “匹配”、 和 “遮罩生成” 。每个阶段都有几个插件。它们的优缺点在工具提示(针对“GUI”)或帮助文本(针对“cli”)中都有详细说明,因此不再赘述。 然而,“检测” 是在每一帧中查找人脸的过程,“匹配” 是在人脸中查找 “特征” 并一致地确定人脸位置的过程。最终,“遮罩生成” 将创建一个 “遮罩”,即识别出图像中哪些是人脸,哪些不是。

提取有两个主要目的:

  1. 生成一组 “人脸集”,以及可选的 “匹配文件” 和 “遮罩”,以训练模型
  2. 为转换帧中的人脸生成 “匹配文件” 和 “遮罩”

从技术上讲还有第三个目的,当您为转换提取人脸时,也需要一些人脸进行训练,这些我都会讲到。

虽然转换时不需要提取人脸(仅需要“匹配文件”),但是提取出来将是很有用的,以便我们可以为转换过程清理 “人脸集”。

匹配文件 [1]

“匹配文件” 保存了每帧中所有的人脸信息,特别是人脸位置,以及人脸的68个 “特征点” 位置:

该文件还保存了为每个人脸提取的所有 “遮罩”

“匹配文件” 的目的有三点:

  1. 训练:如果启用了 “Warp to Landmarks” [2],它将提供人脸特征。
  1. 转换:它告诉 “转换” 程序在原始帧中要替换的人脸位置。
  2. 训练和转换:它存储了所有可能用于这两个阶段的 “遮罩”。

因此,现在我们知道了为什么需要提取人脸,如何确定一个良好的工作流程?

提取

第一步,无论您创建 “人脸集” 的原因是什么,实际上都需要从帧中提取人脸。

分类 [3]

现在我们已经提取了脸部,我们需要整理 “数据集” 和 “匹配文件”。 “提取器” 在获取人脸方面做得很好,但并不完美。 它将有一些误报,将无法匹配某些面孔,还会提取出我们不想交换的人。 如果您转至 “faces” 文件夹,最有可能的是输出如下所示相似的内容:

清理这些看起来不太有趣! 幸运的是我们可以让这更容易。 清理数据集的最快、最简单的方法是将这些面孔按有意义的顺序分类,然后删除所有我们不需要的人脸。 最好的分类方法是 “按人脸分类”。

注意:按人脸分类是RAM密集型的,它要做很多计算。 我已经测试成功在 8GB RAM 上对 22k 张人脸进行了分类。 如果您要分类的人脸数量超出了 RAM,则该过程将自动切换到慢得多的方法,因此,如果您的内存有限,则可能需要将数据集拆分为较小的子集。 理论上,所需的 RAM 量为 (n2 * 24)/1.8,其中 n 是图像数。 您还需要考虑任何其他 RAM 开销(即其他程序正在运行,加载到 RAM 的映像),但理论上,这将占用 30,000 个图像 (300002 * 24)/ 1.8 = 12,000,000,000 字节或大约 11GB。

转到 “GUI” 中的 “Tools” 选项卡,然后转到 “Sort” 子选项卡:

程序将开始读取人脸,为每个人脸建立身份。 然后它将根据相似度将面孔聚集。 实际中聚集过程可能需要很长时间,因为它需要计算大量数据。 不幸的是,没有关于进度的视觉反馈,因此请耐心等待。

完成后,您应该发现99%的面孔已分类在一起:

所有无用的也一起分类了:

现在您要做的就是滚动 faces 文件夹,删除那些不想保留的人脸。

清理 “匹配文件”

现在我们已经删除了所有不需要的人脸,只留下我们要做的一组,我们需要清理 "匹配文件”。为什么? 因为我们不需要的已经删除的人脸还在 “匹配文件” 中,因此将来很可能会给我们造成问题。 使用集成的工具清理 “匹配文件” 还有一个额外好处,就是将我们的人脸重新命名为它们的原始文件名,因此是双赢的。

导航至 “Tools” 标签,然后选择 “Alignments” 子标签:

完成后,您的人脸将被重命名为其原默认名称,并且所有不需要的人脸将从您的 “匹配文件” 中删除。

该过程将备份您的 旧“匹配文件”,并将其放在新创建的 “匹配文件” 旁边。 它的名称与清理后的 “匹配文件” 名称相同,但文件名末尾会附加 "backup_<timestamp>"。 如果您新的 “匹配文件” 是正确无误的且感到满意,则可以安全地删除此备份文件。

此时,如果您正在提取以进行转换(或该集合将用于转换和训练),则可以完全删除您的 faces 文件夹,这些人脸都不再需要。 如果您需要重新生成 “人脸集”,则可以使用 “Alignments Tool” (提取作业)来完成。

手动修复 “匹配文件”

Ok,我们提取出了人脸,清理了所有没用的,现在确定完事了吗? 等等,伙计。 当然,您可以继续前进,但是您想要好的 “交换” 还是想要一次很好的 “交换”?

手动修复对于以下任务很有用:

根据我们要提取数据集的内容,这将决定我们要在此处执行的操作。 如果我们纯粹只提取一个训练集,则可以完全跳过此步骤,然而最好检查一下现有的 “匹配文件” 以确保正确构建任何遮罩。

如果为 “转换” 而提取,那么我们绝对要修复帧中的任何多个人脸,以及所有缺少匹配的帧。仅此一项就可以改善最终交换。 然后,根据您想要的程度,可以解决所有不良的匹配。

我将不详细介绍如何使用手动工具。 那本身就是一个指南,但是非常直观,在弹出窗口中编写了说明。

如果打算使用遮罩进行训练或使用 “Warp to Landmarks”,请将 “匹配文件” 从源帧位置复制到新创建的 faces 文件夹中。

从 “匹配文件” 中提取训练集

现在,您已经清理了 “匹配文件”,您可能希望拉出其中一些人脸以用于训练集,这是一个简单的任务:

导航到 “Tools” 选项卡,然后导航到 “Alignments” 子选项卡:

如果打算使用遮罩训练或使用 “Warp to Landmarks”,则将 “匹配文件” 从源帧位置复制到新创建的 faces 文件夹中。

合并 “人脸集” 进行训练

因此,您已经准备好要训练的大量人脸,并且有一堆来自所对应帧的 “匹配文件”。 这些可以合并为一个训练源吗?当然可以!

准备

在合并 “匹配文件” 之前,我们需要做一点准备:

现在,在 GUI 中,导航到 “Tools” 选项卡,然后导航至 “Alignments” 子选项卡:

完成

处理完成后:

您的训练准备好了


“训练” 流程

介绍

很多人在开始 "Faceswapping" 时不知所措,并且犯了许多错误。 错误是好的,这是我们的学习方式,但有时在深入学习之前对所涉及的过程有一点了解可能会有所帮助。

在本节中,我将详细介绍我们如何训练模型。有一些模型有很多选择,我不会全都说到,但希望这能足够让您来做出自己的明智决定。 如果您尚未生成用于训练的 “人脸集”,请立即停止并转到 “提取流程” 来生成它们。

本指南中有很多背景信息,我建议您把这些全都熟悉一下。机器学习是一个复杂的概念,但我尝试将其分解为尽可能简单易懂。对神经网络的工作原理以及从中获得的数据类型有基本的了解,将极大地提高您成功交换数据的机会。

我将在本指南中使用 “GUI”,在 “cli” 中也完全相同(“GUI”中存在的所有选项在“cli”中都是可用的)。

什么是训练?

概况

在较高的级别上,训练是在教我们的神经网络(NN)如何重塑人脸。大多数模型主要由两部分组成:

  1. 编码器 -这项工作是将大量人脸作为输入,并将其“编码”为“矢量”表现形式。值得注意的是,它并不是在学习您输入的每个人脸的精确表示,而是在尝试创建一种算法,可用于以后尽可能地重建与输入图像更接近的人脸。
  2. 解码器 -它的任务是获取编码器创建的矢量,并尝试将此转换变回人脸,并尽可能接近输入图像。

某些模型的构造略有不同,但基本前提保持不变。

神经网络需要知道它在编码和解码人脸方面做得如何,它使用 2种 主要工具来实现此功能:

  1. 损失 -对于每一批输入到模型中的人脸,神经网络都会读取人脸并尝试通过其当前的编码和解码算法重新创建,并将其与所输入的实际人脸进行比较。完成后,它将给自己一个分数(损失值)并相应地更新其权重。
  2. 权重 -一旦模型评估了重新创建人脸的效果,它将更新其权重。编码器/解码器算法根据输入的数据,如果它在一个方向上调整了权重,但感觉重建的人脸比以前差,那它就知道权重在朝错误的方向移动,因此它将以另外的方向调整权重。如果感觉有所改进,那么它知道要在前进的方向不断的调整权重。

然后,模型会重复这个动作很多次,并根据其损失值不断更新其权重,从理论上讲会随着时间的推移而不断改进,直到您认为已学到足以有效重现人脸的程度,或者损失值停止下降。

现在我们有了神经网络的基本知识,以及它如何学习创建人脸,这是如何应用于人脸交换的?在上面所述中,您可能已经注意到,神经网络学习如何对一个人脸进行加载,然后重建这些人脸。这不是我们想要的……我们想要很多的人脸并重建别人的脸。为了实现这一目标,我们的神经网络做了两件事:

术语

使用 Faceswap 时,您将看到一些常见的机器学习术语,为了生活简单些,在这里展示了一个术语表:

训练数据

数据的质量对模型来说是非常重要的。 良好的数据能够使一个较小的模型执行的很好,同样,没有模型可以对不良的数据执行得很好。 在模型的每一侧至少应有 500张 不同的图像,但是数据越多,越多样化,则越好。合理的图像数量介于 1,000 到 10,000 之间。 添加比这更多的图像实际上会损害训练。

太多 相似的图像 对您的模型没有帮助。 您需要尽可能多的不同角度,表情和照明条件。 常见的误解是以为模型是针对特定场景进行训练的。 这只是“记忆”,而不是您要实现的目标。 您的目标是尝试训练模型以在任何角度,在所有条件下使用所有表情来理解一个人脸,并将其与交换另一个人脸的所有角度,所有条件下的表情。 因此,您希望有尽可能多的不同来源为 A 和 B集 构建一个训练集。

两侧的不同角度非常重要。 神经网络只能学习所见的。 如果 95% 的人脸都是直视摄像头,而 5% 则是侧脸,那么模型需要很长时间才能学习如何创建侧面人脸,也可能根本无法创建,因为它看到的侧脸很少。 理想情况是,尽可能均匀的分布角度,表情和光照条件。

同样,在 A侧 和 B侧 之间具有尽可能多的匹配 角度/表情/照明条件 的人脸也很重要。 如果 A侧 有很多侧脸,而 B侧 没有侧脸,则该模型将永远无法交换侧脸,因为 解码器B 缺少创建侧脸镜头所需的信息。

训练数据一般不应被遮挡的,并且具有高质量(清晰和详细)。但是可以在训练集中包含一些 模糊/部分遮挡 的图像。 在最后交换中,会有一些 模糊/低分辨率/遮挡 的人脸,因此,对于神经网络来说,看到这些类型的图像也是很重要的,这样它才能忠实的进行再现。

可以在 “提取” 流程 指南中找到更详细的创建训练集内容。

选择模型

Faceswap 中有几种可用的模型,并且随着时间的推移会增加更多的模型。 模型质量对于每个人是高度主观的,所以这里将简要概述每种(当前)可用的模型。 最终最适合您的模型可以归结为许多因素,因此没有最佳答案。每种模型都有优点和缺点,但是如上所述,最重要的一个因素是数据的质量,没有模型可以解决数据问题。

您将看到下面提到的输入和输出大小(例如64px输入,64px输出)。 这是输入到模型的人脸图像大小(输入)和从模型生成的人脸大小(输出)。 输入模型的所有人脸部都是正方形的,因此 64px 的图像将为 64像素宽 64像素高。 一个普遍的误解是,高分辨率的输入将导致更好的交换。 虽然可以提供帮助,但并非总是如此。 神经网络正在学习如何将人脸编码为一种算法,然后再次对该算法进行解码。 它只需要足够的数据就可以创建可靠的算法。 输入分辨率和输出质量没有直接关联。

值得注意的是,模型越大,训练所需的时间就越长。 “Original” 在 Nvidia GTX 1080 上的训练可能需要12-48小时 的时间。 而 “Villain” 在相同的硬件上可能需要一周以上的时间。 通常认为,两倍大小的输入,模型将花费两倍的时间。 这是不正确的,至少需要四倍的时间,甚至可能更长。 这是因为 64px 图像具有 4,096像素。 但是,一个 128px 的图像具有 16,384像素。 这是原来的 4倍,此外,模型需要处理这些增加数据的缩放,训练时间会快速增加。

模型配置

Ok,您已经选择了模型,让我们开始训练吧!Well,等等。 我很欣赏您的渴望,但是您可能会想先设置一些模型的特定选项。 我将使用 GUI 来实现这一点,但是可以在 faceswap 文件夹中的找到配置文件 faceswap/config/train.ini(如果使用命令行)。

由于这些模型各不相同,因此我将不会介绍每个模型的选项,而且对新的模型持续更新介绍是很难的,但是我将概述一些较常见的选项。 我们将重点放在适用于所有模型的全局选项上。所有选项都有工具提示,因此将鼠标悬停在选项上可获得更多的信息。

要访问模型配置面板,请转到 “Settings” > “Configure Train Plugins...”:

一旦你有了想要的模型设置,请单击 “OK” 以保存配置并关闭窗口。

注意:点击确定将保存所有选项卡上的选项,因此请确保仔细检查它们。 您可以单击 “Cancel” 以取消所有更改,或单击 “Reset” 以将所有值恢复为其默认设置。

设置

现在您已经准备好了自己的人脸,已经配置了模型,是时候开始工作了!

转到 GUI 中的 “Train” 选项卡:

在这里,我们将告诉 Faceswap 所有东西都存储在哪里,我们想要什么,并开始实际训练。

训练监控

一旦开始训练,该过程将花费一两分钟来构建模型,预加载数据并开始训练。 一旦启动,GUI 将进入训练模式,在底部放置一个状态栏,并在右侧打开一些选项卡:

停止和重新开始

只需按一下 GUI 左下方的 “Terminate” 按钮,即可停止训练。 模型将保存其当前状态并退出。

通过选择相同的设置并将 “Model dir” 文件夹指向与保存的文件夹相同的位置,可以恢复模型。 通过 GUI "File" 菜单或选项面板下面的保存图标保存 Faceswap 配置,可以使其变得更加容易。

然后,您可以重新加载配置并继续训练。

可以在 “训练” 文件夹中添加和删除人脸,但是请确保在进行任何更改之前先停止训练,然后再次开始。 如果您正在使用 “Warp to Landmarks” 或使用遮罩进行训练,则需要确保使用 新的人脸 或 移除的人脸 更新 “匹配文件”。

恢复损坏的模型

有时模型会损坏。 可能有多种原因,但这可以通过预览中的所有人脸变为 纯色/乱码 来证明,并且损失值急剧上升且无法恢复。

Faceswap 提供了可轻松恢复模型的工具。 每次保存迭代(损失值总体下降)时都会保存备份,这些备份可以通过以下方式恢复:

点击 “Restore” 按钮。 一旦恢复,您应该可以从上次备份继续训练。



  1. 根据该文件在 Faceswap 中的作用,鄙人觉得翻译为 “匹配文件” 更加符合。

  2. 这个词不好翻译,故直接使用英文。

  3. 原文直译为排序,但根据实际操作,翻译为 “分类” 更加容易理解。

  4. VRAM指的是显卡内存。

上一篇下一篇

猜你喜欢

热点阅读