菜单

核心工作流程

相关源文件

目的与范围

本文档概述了 Faceswap 的三个主要流程:提取(Extract)、训练(Train)和转换(Convert)。这些流程构成了面部交换的核心工作流程管道。本页面将解释每个流程如何工作以及它们如何连接,为理解 Faceswap 系统奠定基础。有关每个特定流程的更详细信息,请参阅 提取管道训练管道转换管道

核心工作流程概述

Faceswap 通过三个顺序流程运作,形成一个完整的管道。

来源:faceswap.py34-54 scripts/extract.py30-182 scripts/convert.py65-182

三个流程分别是:

  1. 提取(Extract):检测源媒体(图像或视频)中的人脸,使用面部地标进行对齐,并将它们提取为图像文件以及对齐数据。

  2. 训练(Train):使用提取的人脸来训练深度学习模型,将一张身份的面部转换为另一张身份的面部。

  3. 转换(Convert):使用训练好的模型来交换目标媒体(图像或视频)中的面部,并生成带有交换面部的最终输出。

命令行界面

这三个工作流程在 Faceswap 的命令行界面中被实现为命令。

来源:faceswap.py34-54

提取流程

提取流程在源媒体中识别面部,将它们对齐到一个标准化的位置,并将它们保存为单独的图像文件。

来源:scripts/extract.py30-182 scripts/extract.py619-717 scripts/fsmedia.py59-163

关键组件

  1. ImagesLoader:从目录加载图像或从视频文件中加载帧。

    • 处理图像序列和视频文件。
    • 提供输入源的元数据。
  2. Extractor Pipeline:用于面部处理的插件链。

    • Detector:定位图像中的面部(MTCNN、S3FD、CV2-DNN 等)。
    • Aligner:识别面部地标并标准化面部位置。
    • Masker:为面部生成掩码(Components、Extended)。
  3. Alignments:存储有关检测到的面部的元数据。

    • 将面部位置、地标和掩码保存到 .fsa 文件。
    • 稍后在转换过程中使用。
  4. 输出:

    • 输出目录中的单独面部图像。
    • 包含元数据的对齐文件。

来源:scripts/extract.py30-48 scripts/extract.py181-244 scripts/fsmedia.py59-120

训练流程

训练流程使用提取的面部来创建模型,该模型能够实现面部身份之间的转换。

关键组件

  1. Data Loader:加载和预处理提取的面部图像。

    • 应用增强(随机翻转、颜色调整)。
    • 对图像进行批处理以进行训练。
  2. Model:用于面部转换的神经网络架构。

    • 提供多种架构(Original、DFL-SAE、Phaze-A)。
    • 采用带共享和身份特定组件的编码器-解码器结构。
  3. Trainer:管理训练过程。

    • 实现具有前向/后向传播的训练循环。
    • 计算损失并更新模型权重。
    • 保存模型检查点并生成预览。
  4. 输出:

    • 训练好的模型文件。
    • 显示当前交换质量的预览图像。

转换流程

转换流程将训练好的模型应用于目标媒体中的面部交换。

来源:scripts/convert.py65-182 scripts/convert.py283-722 scripts/convert.py725-907

关键组件

  1. DiskIO:处理输入读取和输出写入。

    • 从视频或图像加载帧。
    • 从对齐文件中获取检测到的面部。
    • 保存转换后的输出。
  2. Predict:使用训练好的模型生成交换面部。

    • 加载训练好的模型。
    • 通过模型处理检测到的面部。
    • 返回交换后的面部图像。
  3. Converter:对交换后的面部应用后处理。

    • 颜色校正以匹配原始图像。
    • 掩码应用以实现无缝混合。
    • 面部缩放和定位。
  4. 输出:

    • 包含交换面部的媒体(视频或图像)。

来源:scripts/convert.py283-323 scripts/convert.py725-797

流程间数据流

三个核心流程设计为顺序运行,但也可以使用现有数据独立运行。

关键数据交换

  1. 提取 → 训练:

    • 提取的面部图像用作训练数据。
    • 面部必须组织在单独的 A/B 文件夹中。
  2. 提取 → 转换:

    • .fsa 对齐文件提供面部位置数据。
    • 支持交换后准确放置面部。
  3. 训练 → 转换:

    • 训练好的模型提供面部转换功能。
    • 模型包含学习到的面部身份之间的映射。

这种模块化设计提供了灵活性:

  • 提取一次,使用不同的架构训练多个模型。
  • 使用一组提取的面部与多个目标视频。
  • 无需重新训练即可试验不同的转换设置。

来源:scripts/extract.py30-48 scripts/convert.py65-107

实现架构

每个核心工作流程的实现遵循相似的模式。

通用实现功能

  1. 命令行参数:每个进程通过 argparse 接受特定的参数。

    • 输入/输出目录。
    • 插件选择。
    • 特定于进程的选项。
  2. 插件系统:动态加载的模块化组件。

    • 为每种插件类型提供一致的接口。
    • 允许在不更改核心代码的情况下进行自定义。
  3. 基于队列的管道:多线程处理管道。

    • 项目通过队列系统流动。
    • 在适当的情况下实现并行处理。
  4. I/O 处理:用于输入/输出操作的专用类。

    • 媒体加载(图像/视频)。
    • 数据序列化/反序列化。
    • 结果保存。

来源:scripts/extract.py30-48 scripts/extract.py619-717 scripts/convert.py65-107 scripts/convert.py283-323 scripts/convert.py725-797

命令行示例

以下是使用每个核心工作流程的示例。

提取

训练

转换

来源:faceswap.py34-54

总结

Faceswap 的三个核心工作流程——提取(Extract)、训练(Train)和转换(Convert)——构成了完整的面部交换管道。

  1. 提取(Extract)识别并提取源媒体中的面部。
  2. 训练(Train)学习身份之间的转换。
  3. 转换(Convert)将学习到的转换应用于新媒体。

每个进程都是模块化的,可以通过命令行选项和插件进行自定义,从而灵活地执行面部交换。这些工作流程可以按顺序运行以完成整个面部交换管道,也可以根据需要单独运行。

来源: scripts/extract.py30-48 scripts/convert.py65-107 faceswap.py34-54