1. 简介
很多人刚开始换脸的时候会不知所措,而且会犯很多错误。错误是好的,这是我们学习的方式,但有时在深入学习之前对相关过程有一点了解会有所帮助。
在这篇文章中,我将详细介绍提取的工作流程。我并不是说这是最好的工作流程,或者你应该做什么,但它对我来说是有效的,并且有望给你一个创建自己的工作流程的良好出发点。
在本指南中,我将使用GUI(图形化界面),但前提对于cli(命令行)是完全相同的(GUI中出现的所有选项都可以在cli中使用)。
2. 为什么Extract?
在最高层次上,提取包括三个阶段:检测(detection)、对齐(alignment)和掩码生成(mask generation)。
- Detection – 在画面中寻找人脸的过程。探测器扫描图像,并从图像中选择它认为是人脸的区域。
- Alignment – 在一张脸中找到
landmarks
(地标,稍后解释),并一致地确定这些脸的方向。这将从检测器中提取候选人脸,并试图找出潜在人脸的关键特征(眼睛、鼻子等)。然后,它会试图利用这些信息来对齐脸部。 - Mask Generation – 识别对齐面中包含人脸的部分,并屏蔽包含背景/障碍物的区域。
每一个阶段都有几个插件,它们的优缺点在工具提示(用于GUI)或帮助文本(用于cli)中有详细说明,所以我不会详细介绍。
提取主要有两个目的:
- Training: 生成一组人脸来进行训练。这些人脸也包含对齐信息和
masks
,这是训练模型所需的,这些信息保存在提取的人脸的.png
元数据中。 - Converting: 生成一个对齐文件和
masks
用于转换最终帧。对齐文件包含关于每个人脸在每帧中的位置的信息,以便转换过程知道在任何给定帧的位置交换的人脸。当生成用于转换的对齐文件时,提取的人脸实际上不是必需的,但它们对于清理对齐文件很有用(稍后会详细介绍)。
从技术上讲,还有第三个目的就是当你提取图像进行转换并想要一些人脸进行训练时,我也将掩盖这一点。
虽然提取的人脸不是转换所必需的(只有对齐文件是),但有它们是有用的,以便我们可以为转换过程清理我们的数据集。类似地,如果提取一个训练集的人脸,那么原始对齐文件实际上是不需要的。但是,保留对齐文件和原始的源文件是有用的,因为它是“主”文档,并允许您直接从对齐文件和源文件包含的信息中重新提取人脸。
2.1 对齐(Alignments)文件
对齐文件保存了它在每一帧中找到的所有人脸的信息,特别是人脸在哪里,以及68个点的landmarks
在哪里,它还存储了为每个人脸提取的所有masks
。
不要低估对齐文件的重要性,它是主文档,包含关于给定源人脸的位置信息以及每个人脸的任何相关信息。拥有一个干净和最新的对齐文件可以节省您将来的时间,因为您可以轻松地直接从文件重新生成人脸数据集。
对齐文件专门保存以下信息:
- 每个人脸在每一帧中的位置信息
- 每一帧中每一张人脸的68个点
landmarks
信息 - 每一帧的“components”和“extended”的
masks
- 任何其他用户生成的
masks
- 对齐后的小
jpg
缩略图(用于手动工具)
现在我们知道为什么我们需要提取人脸,我们如何确定一个好的工作流程?
3. Extracting(提取)
无论您创建人脸数据集的原因是什么,第一步是从框架中实际提取人脸。接下来让我们看一下Extract
部分的不同组件的含义,包括Data/Plugins/Face Processing/Output
等。
3.1 Data(数据集)
这是我们选择输入视频或图像以及输出位置的地方:
- Input Dir: 首先我们需要一个数据来源,可以设置为视频文件(视频图标)或包含一系列图像的文件夹(图片图标)。
- Output Dir: 接下来,我们需要告诉流程将提取的人脸保存到哪里。单击下面的文件夹图标以选择输出位置。
- 我忽略了接下来的几个选项,所以你可能也应该忽略它们。下面是它们的解释:
- Alignments: 如果您想为对齐文件指定不同的名称/位置,可以使用此选项。让它保持空白更容易,并让进程将其保存到默认位置(将在与源帧/视频相同的位置)。
3.2 Plugins(插件)
该插件(Plugins)用于首次检测图像中的人脸,读取人脸的landmarks
对齐图像,并使用各种masks
方法创建一个mask
。
- Detector, Aligner: 选择您想要使用的。在撰写本文时,最好的
Detector
(检测器)是S3FD
,最好的Aligner
(对准器)是FAN
。 - Masker: 选择您想要使用的
masker
。在这里选择的任何masker
将生成一个基于landmark
的masks
之外的mask
。可以生成多个masks
(通过选择一个以上的masker
),但是要知道所有这些maskers
都使用GPU
,所以你添加的maskers
越多,提取速度就越慢。基于landmark
的masks
(Components
和Extended
)在提取过程中自动生成,并在下面详细介绍,以便您了解它们的执行情况。- 每个
masker
都有不同的优点和缺点,如果你想使用基于神经网络的mask
来训练或转换你的帧,那么你可以在这里选择一个mask
。 - 如果我要生成一个转换集,我倾向于把所有的
maskers
都去掉,因为我想先修改很多landmarks
,然后在人脸被固定后生成masks
(使用masks
工具)。对于训练集,我将选择我打算用于训练的mask
。注意,你总是可以用Mask
工具添加更多的masks
到对齐文件中。- BiSeNet-FP – 在CelebHQ-Masked数据集上训练的一个相对轻量级的
NN mask
。来自:zllrunning/face-parsing.PyTorch 。 在我看来,这在基于神经网络的masks
方面表现最好,尽管它仍然与一些(特别是skin)障碍进行斗争。这个mask
在它的配置设置中有额外的选项,允许在mask
区域内包含/排除头发,耳朵,眼睛和眼镜。这是唯一兼容“全头”训练的mask
,因为头发需要包含在mask
区域内,才能以这种方式训练。BiSeNet-FP
将头发和耳朵从mask
中排除(默认设置)
- BiSeNet-FP – 在CelebHQ-Masked数据集上训练的一个相对轻量级的
- 每个
BiSeNet-FP带头发和耳朵的mask
(全头训练所需的头发):
Unet-DFL – 一种基于神经网络的mask
设计提供智能分割大部分正面的脸。该mask
模型已由社区成员进行训练。
VGG-Clear – 一种基于神经网络的mask
,旨在提供智能分割大部分正面人脸,清除障碍。
- VGG-Obstructed – 旨在提供智能分割大部分正面人脸。
mask
模型经过专门训练,可以识别一些面部障碍(手和眼镜)。
- 以下基于
Landmarks
的masks
会自动创建:- Components – 从对齐阶段发现的68个点
landmarks
生成的mask
。这是一个围绕脸部外部点建立的多部分mask
。
- Components – 从对齐阶段发现的68个点
- Extended – 这种组件的一个主要问题是,它只延伸到眉毛的顶部。
Extended Mask
是基于组件的mask
,但试图进一步向上的额头,以避免“双眉”问题,(即当源眉毛和目标眉毛都出现在最后的交换。)
- Normalization: 这将对输入提取器的图像进行处理,以便在光线不好的情况下更好地找到人脸。不同的规范化方法适用于不同的数据集,但我认为
hist
是最好的全能型方法,这将会稍微减慢提取的速度,但可以得到更好的排列。 - Re Feed: 此选项会将稍微调整的检测到的人脸重新送回对准器,然后对最终结果求平均值。 这有助于减少“微抖动”。 对于训练集,我将其保留为零。 为了生成转换对齐,我将把它放在上面,重新送回检测的次数越多越好,但每次增加都会减慢提取速度。 将此设置为高,因为您觉得您有耐心,但任何高于9的值可能都不值得。下图显示
re-feed
设置为8(左)vsre-feed
设置为0:
- 接下来的几个选项也可以忽略。再说一次,我会详细说明他们做了什么,这样你就可以自己测试结果了:
- Rotate Images: 这对于除了
CV2-DNN
之外的所有当前detectors
来说都是完全不必要的。目前的detectors
完全能够找到任何方向的人脸,所以这只会减慢你的过程,很少或没有收获。
- Rotate Images: 这对于除了
3.3 Face Processing(人脸处理)
人脸过滤和选择的选项在这里定义:
- Min-size: 我通常将其设置为一个相当低的值,但高于零,以过滤掉任何明显太小而不是人脸的东西。然而,它将取决于输入帧的大小,然后是帧内人脸的大小。
- 出于以下原因,我将忽略接下来的几个选项,但您可以自行决定。下面是对每一个的解释:
- Filter/nFilter, Ref Threshold: 这些选项用于过滤不需要的人脸。我不用它,我更喜欢在下一阶段自己做这个,因为我总是比机器更有效地过滤人脸,而且不会花很长时间。过滤人脸也严重减慢了提取过程。
3.4 Output(输出)
人脸输出处理的选项:
- Extract Every N: 这是根据提取目的而变化的第一个选项。
- 如果你提取的是转换,或者提取的是转换,并且会使用一些人脸进行训练,那么把这个放在1(即从每一帧提取)。
- 如果您只是为了训练而提取,那么设置一个看起来合理的值,这取决于你输入的每秒帧数。然而,对于一个
25fps
的视频,正常的值大约在12 - 25
之间(即每半秒到每秒)。任何低于这个标准的情况下,你可能会有太多相似的人脸。记住你从你的训练集中提取了多少个资源,你想在你的最终训练集中有多少个人脸,以及你的资源有多长是值得记住的,这些都将根据具体情况而有所不同。
- 下面的几个选项在默认设置下是可以的,但是解释如下:
- Size: 这是包含被提取人脸的图像的大小。一般来说,
512px
对于大多数模型来说是合适的,这是整个头部提取图像的大小。训练时,这张图像的sub-crop
将根据你选择的居中使用。对于face
居中,模型可用的图像尺寸将是384px
。当训练以legacy
居中,可用的图像大小将是308px
。 - Save interval: 我不介意,但这取决于你。
- Debug Landmarks: 在提取的人脸上绘制Landmarks,仅用于调试目的。
- Size: 这是包含被提取人脸的图像的大小。一般来说,
3.5 Run(运行)
我们已经准备好进行运行Extraction
,你最终应该看到如下画面:
点击Extract
,等待人脸输出和对齐文件生成。
4. Sorting(排序)
现在我们已经提取了我们的人脸,我们需要清理数据集和对齐文件。Extractor
在提取人脸方面做得很好,但并不完美。它会得到一些误报,它会无法对齐一些人脸,它也会提取出我们不想交换的人脸。如果你转到faces
文件夹(提取人脸之后的文件夹,后续faces
文件夹都是相同的意思)你很可能会看到像这样的大部分输出:
把它清理干净看起来可不好玩!幸运的是,我们可以让它变得更简单。清理数据集的最快和最简单的方法是将这些人脸按有意义的顺序排序,然后删除所有我们不想要的人脸。按距离排序的最佳方法是“按人脸排序”。
注意: 按人脸排序是RAM(内存)密集型的,它需要做很多计算。我已经测试了在8GB内存上成功排序22k张脸。如果你不得不对比RAM中容纳的更多的人脸进行排序,那么这个过程将自动切换到一个更慢的方法,所以如果你的RAM有限,那么你可能想要把你的数据集分割成更小的子集。
理论上,需要的内存容量是 (�2×24)/1.8 ,其中 � 是图像的数量。你还需要考虑其他内存开销(例如,其他程序运行,加载到RAM(内存)中的图像),但理论上这意味着30000张图像将占用 (300002×24)/1.8=12,000,000,000 bytes或大约11GB。
转到GUI中的“Tools”标签,然后到“Sort”子标签:
其他参数(Data/ Sort Settings/Output
等)解释如下:
1. Data
在这里,我们选择上一步中提取的人脸数据集进行排序。
- Input: 输入包含从上一步中提取的人脸文件夹。
- Output: 这个应该是空的,我们想让这些人脸按顺序排列。
- Alignments: 这是在提取步骤中创建的对齐文件的路径。它将在相同的文件夹作为输入视频(
vid_name_alignments.fsa
)或在任何输入图像的文件夹(alignments.fsa
)。我们需要这个文件,因为我们需要放大人脸以获得良好的效果。您仍然可以在没有对齐文件的情况下对人脸进行排序,但结果将大大降低。
2. Sort Settings
我们想要如何排序的人脸和任何其他特定设置:
- Sort By: 设置为
Face
- 您可以忽略本节中的其他选项
3. Output
如何输出排序后的人脸:
- Final Process: 确保设置为
Rename
- Keep: 确保这是未选中的
- 你可以保持所有其他选项不变,因为它们对
rename
任务没有任何影响。
4. Run
保留所有其他选项为默认值,现在我们已经准备好检查我们的选项并运行Sort
,你最终应该看到如下画面:
点击Sort
开始排序过程。
这个过程将开始通过面部识别为每个人建立身份。然后,它会根据相似度将这些人脸聚在一起。实际的集群过程可能会花费很长时间,因为它必须计算大量的数据。不幸的是,它的进展没有视觉反馈,所以请耐心。
一旦完成,你应该找到99%的人脸排序在一起:
所有的垃圾也被分类在一起:
现在你要做的就是滚动faces
文件夹,删除那些你不想保留的faces
。
5. Clean the Alignments File(清理对齐文件)
现在我们已经删除了所有我们不想要的人脸,我们有一个设置,我们需要清理对齐文件。为什么? 因为所有不需要的人脸的信息还在文件中,这很可能给我们以后带来问题。清理对齐文件与集成的工具还有一个额外的优势,重命名我们的人脸回原来的文件名,所以这是一个双赢。
导航到 “Tools” 标签,然后是“Alignments”子标签:
5.1 Processing
本节允许我们选择希望执行的操作,以及设置任何输出处理,我们只对Job
部分感兴趣。
- Job: 这是工具中可用的所有不同对齐
jobs
的列表。- 选择 “Remove-Faces”
- Output: 忽略此部分,因为 “Remove-Faces” 部分不会生成任何输出
5.2 Data
我们想要处理数据的位置:
- Alignments File: 选择对齐文件。在提取过程中生成的它,将位于与提取的视频文件夹相同的位置,或在提取图像的文件夹内,它在源文件夹中。
- Faces Folder: 选择您在提取过程中将人脸输出到其中的
faces
文件夹(与您用于排序的文件夹相同,即提取输出的文件夹的位置)。 - 在本节中保留其他选项为空,因为它们不是必需的。
5.3 Run
保留所有其他选项为默认值,现在我们准备检查我们的选项并清理对齐文件。你最终应该看到如下画面:
点击Alignments
,让过程完成。
一旦做了你的人脸将被重命名回他们的默认名称,所有不想要的人脸将从你的对齐(alignments)文件中删除。
该过程将备份旧的对齐文件,并将其放在新创建的文件的原始位置旁边。它将具有与您清理后的对齐文件相同的名称,但是在其末尾附加 “backup_<timestamp>”。如果您满意您的新对齐文件是正确的,那么您可以安全地删除这个备份文件。
在这一点上,如果你提取转换(或数据集将被用于转换和训练),那么你可以完全删除你的人脸文件夹,这些人脸都不再需要了。如果你需要重新生成你的人脸数据集,那么可以使用对齐工具(提取工作)来完成。
6. Manually Fix Alignments(手动修复对齐)
好了,我们把脸都取出来了,把垃圾都清理干净了,应该没事了吧?坚持住,伙计。当然,你现在可以继续,但是你是想要一个好的交换还是一个很好的交换?
手动对齐适用于以下任务:
- 删除
frames
中剩余的multiple faces
- 添加对齐到那些缺少它们的
frames
中 - 修复未对齐的
frames
- 手动编辑您想要使用的
masks
根据我们提取数据集的目的来决定我们想在这里做什么。如果我们只是单纯地提取一个训练集,我们可以完全跳过这一步。检查现有的对齐以确保任何masks
都被正确构建是一个好主意。
如果提取的人脸用于转换,那么在绝对最小的情况下,我们想修复任何frame
中的多个人脸,以及任何缺失对齐的frame
,这将改善最终的交换结果。这取决于你想要多彻底,然后你可以修复任何糟糕的对齐。
我不会详细介绍如何使用手动工具,这本身就是一个指南,但是应该是非常直观的,包括所有可用选项的工具提示。
6.1 Launch the Manual Tool(启动手动工具)
要启动手动工具,首先导航到“Tools”标签,然后是“Manual”子标签:
6.1.1 Data
这就是我们指定对齐文件和视频文件/帧文件夹的地方:
- Alignments: 选择对齐文件。在提取过程中生成的它,将位于与提取的视频文件夹相同的位置,或在提取图像的文件夹内,它在源文件夹中。
- Frames: 选择用于提取过程的输入视频或帧的文件夹,指的是源人脸文件(图片/视频)。
6.1.2 Options
这是可以运行的可选操作,您通常不需要更改这些,但我将列出它们的作用,以防您确实需要使用它们:
- Thumbs Regen: 手动工具存储用于填充工具的
Faces Viewer
部分的缩略图缓存。如果您在对齐文件中使用了旧的手动工具,那么thumbs
可能已经与实际提取的人脸不同步了。此选项会重新生成缩略图,以便它们与对齐文件中存在的数据正确匹配。 - Single Process: 为了加速缩略图缓存的生成,进程启动几个线程从视频文件中读取图像。在一些视频中,这导致进程挂起,如果发生这种情况,则选择此选项以在单个线程中提取缩略图。
6.1.3 Run
保留所有其他选项为默认值,现在,我们准备检查我们的选项并启动手动工具(Manual Tool),你最终应该看到如下画面:
点击Manual
按钮启动手动工具。
注意: 手动工具启动可能需要一到两分钟,因为它依赖于你的GPU,所以需要初始化它将使用的aligners/maskers
。
输出的结果:
6.2 Manually Fixing for Converting(手动修复转换)
为了修复转换,我们需要做以下操作:
- Multi-Faces(多个人脸)
- 在
Frames
和Faces Viewer
之间的下拉filter
中将filter
模式更改为“Multiple Faces”,上图中的红色部分。
- 您可以在
Faces Viewer
中右键单击人脸,以删除要删除的人脸
- 或者,您可以将编辑器更改为左侧按钮栏上的“Bounding Box”或“Extract Box”,然后右键单击要从
Frame Viewer
中删除的人脸。 - 使用
transport
按钮或“Z”和“X”导航到前一帧或下一帧的多个人脸。
- 按“Ctrl+S”保存你修改后的对齐文件,或者按下
Frames
和Faces
之间的保存图标。
- Frames without faces(没有人脸的帧)
- 在
Frames
和Faces Viewer
之间的下拉filter
中将filter
模式更改为“No Faces”
- 在
- 使用
left=hand button bar
将编辑模式更改为“Bounding Box”编辑器
- 使用
transport
按钮或“Z”和“X”导航到前一帧或下一帧没有人脸。
- 如果你遇到一个帧,没有人脸检测,但应该是可以点击的人脸,用鼠标调整边界框,或者你可以复制前一个/下一个帧的校准使用复制按钮左边或使用“c”或“v”键编辑它们。
- 重复直到最后一帧
- 按“Ctrl+S”保存你修改后的对齐文件,或者按下
Frames
和Faces
之间的保存图标。
- Fixing alignments(修复对齐)
- 在
Frames
和Faces Viewer
之间的下拉filter
中将filter
模式更改为“Has Faces”
- 在
- 您可以使用
transport
控件在帧中导航,或者在Faces Viewer
中单击人脸,直接跳转到需要注意的任何帧。
- 如果对齐看起来不正确,使用左边按钮栏中的适当编辑器来修复它们
- 重复直到最后一帧
- 按“Ctrl+S”保存你修改后的对齐文件,或者按下
Frames
和Faces
之间的保存图标。
在手动调整期间,每次保存对齐文件都会创建一个备份。如果您满意您的新对齐文件是正确的,那么您可以删除这些备份,它们将位于与原始对齐文件相同的文件夹中。
6.3 Manually Fixing for a Training Set(手动修复训练集)
为了修复训练,我们想做以下内容(与修复转换的结果类似):
- Fixing alignments(修复对齐)
- 在
Frames
和Faces Viewer
之间的下拉filter
中将filter
模式更改为“Has Faces”
- 在
- 您可以使用
transport
控件在帧中导航,或者在Faces Viewer
中单击人脸,直接跳转到需要注意的任何帧。
- 如果对齐看起来不正确,使用左边按钮栏中的适当编辑器来修复它们
- 重复直到最后一帧
- 按“Ctrl+S”保存你修改后的对齐文件,或者按下
Frames
和Faces
之间的保存图标。
在手动调整期间,每次保存对齐文件都会创建一个备份,如果您满意您的新对齐文件是正确的,那么您可以删除这些备份,它们将位于与原始对齐文件相同的文件夹中。
6.4 重新生成提取的人脸(与第七节相同)
一旦对齐信息被修复了,您将需要重新生成您的人脸数据集。这是因为由于移动landmarks
,人脸图像会发生变化,所以训练过程将无法找到修改后的人脸。
首先删除你的输出的faces
文件夹,你不会想让这事发生的。
然后,您可以点击位于保存图标旁边的文件夹按钮,直接从对齐文件中提取人脸。
下面列出了一种替代方法,但是如果您已经成功地从Manual Tool
中提取,您可以直接跳转到Extracting a training set from an alignments file(第七节,下一章节)。
下一步导航到“Tools”标签,然后是“Alignments”子标签:
- Processing:本节允许我们选择希望执行的操作,以及设置任何输出处理。我们只对Job版块感兴趣。
- Job: 这是工具中可用的所有不同对齐
jobs
的列表。- 选择“Extract”job
- Output: 忽略此部分,因为“Extract”job不会生成任何输出。
- Data: 我们要处理数据集的位置。
- Alignments File: 选择在最后一步清理后生成的对齐文件。它位于与提取的视频文件夹相同的位置,或在提取图像的文件夹内,它在源文件夹中。
- Faces Folder: 选择一个您想要输出的人脸所在的空文件夹。
- Frames Folder: 选择用于提取过程的输入的视频或帧文件夹,指的是源文件夹。
- 将此部分中的任何其他选项留空,因为这一步不需要它们。
- Run:保留所有其他选项为默认值。现在,我们准备检查我们的选项并启动手动工具。
- 你最终应该看到如下画面:
- 点击
Alignments
按钮重新提取你的脸。
7. Extracting a training set from an alignments file(从对齐文件中提取训练集)
现在您已经清理了对齐文件,您可能想将其中一些人脸拉出来用于训练集,这是一个简单的任务,与上一节中的6.4 重新生成提取的人脸
的最后一部分相同。
导航到“Tools”标签,然后是“Alignments”子标签:
7.1 Processing
本节允许我们选择希望执行的操作,以及设置任何输出处理,我们只对Job
版块感兴趣。
- Job: 这是工具中可用的所有不同对齐
jobs
的列表。- 选择”Extract” job。
- Output: 忽略此部分,因为”Extract” job不会生成任何输出。
7.2 Data
我们要处理的资源的位置:
- Alignments File: 选择在最后一步清理后生成的对齐文件。它位于与提取的视频文件夹相同的位置,或在提取图像的文件夹内,它在源文件夹中。
- Faces Folder: 选择一个您想要输出的人脸所在的空文件夹。
- Frames Folder: 选择用于提取过程的输入的视频或帧文件夹,指的是源文件夹。
- 将此部分中的任何其他选项留空,因为这一步不需要它们。
7.3 Extract
这些选项用于从对齐文件中提取人脸:
- Extract Every N: 这取决于你输入的每秒帧数。然而,对于一个
25fps
的视频,正常的值大约在12 - 25
之间(即每半秒到每秒)。任何低于这个标准的情况下,你可能会有太多相似的人脸。记住你从你的训练集中提取了多少个资源,你想在你的最终训练集中有多少个人脸,以及你的资源有多长是值得记住的,这些都将根据具体情况而有所不同。 - Size: 这是包含被提取人脸的图像的大小。目前没有模型支持
512px
以上,所以这是默认值。 - Large: 启用此选项将只提取未按输出大小缩放的人脸。例如,如果提取的大小被设置为
512px
,而一个人脸在一个帧中被发现是480px
,它将不会被提取。如果它是520px
,它就会。
7.4 Run
保留所有其他选项为默认值。现在我们已经准备好检查我们的选项,并将我们的训练集从清理后的对齐文件提取到我们选择的文件夹中。你最终应该看到如下画面:
点击Alignments
按钮提取人脸。
对您希望为其生成训练集的所有资源重复此过程。
完成后,您可以将所有的人脸数据集放入同一个文件夹中,你的训练数据集准备好了。