本文档涵盖了 Faceswap 深度学习组件的高级方面、模型自定义选项和训练优化策略。它适用于希望超越基本用法并理解或修改底层神经网络架构和训练过程的用户。
有关提取、训练和转换等核心工作流程的信息,请参阅 核心工作流程。有关配置系统详细信息,请参阅 配置系统。
损失函数是深度学习的核心,因为它们定义了模型的性能。Faceswap 提供了广泛的损失函数选择,并能够组合多个函数以获得更好的结果。
Faceswap 支持许多损失函数,每个函数都有不同的特性
| 损失函数 | 描述 | 最适合 |
|---|---|---|
| MAE | 平均绝对误差 - 将像素引导至中值 | 通用,对异常值鲁棒 |
| MSE | 均方误差 - 将像素引导至平均值 | 通用,对较大的误差进行更多惩罚 |
| SSIM | 结构相似性 - 关注纹理、亮度和对比度 | 保留结构细节 |
| MS-SSIM | 多尺度结构相似性 - 分析多个尺度 | 更好的结构细节保留 |
| GMSD | 梯度幅度相似度偏差 | 匹配像素差异的全局标准偏差 |
| LogCosh | 双曲余弦的对数 - 结合了 MSE 和 MAE 的特性 | 稳定的训练,具有异常值保护 |
| L_inf_norm | 专注于减少最大的单个像素误差 | 修复最明显的瑕疵 |
| LPIPS | 学习感知图像块相似性 | 感知质量(需要更多 VRAM) |
| FFL | 焦点频率损失 | 分析频率频谱而非像素 |
| FLIP | 来自 Nvidia 的感知损失 | 互补损失函数 |
Faceswap 允许组合最多四个具有可调权重的损失函数。这对于解决图像质量的不同方面特别强大。
常见的组合包括
对于以人脸为中心的训练,惩罚掩码损失允许对不同面部区域应用不同的重要性权重
使用此功能
来源:plugins/train/_config.py400-581 plugins/train/model/_base/settings.py62-277
Faceswap 采用模块化方法构建神经网络,使用可重用的构建块作为所有模型架构的基础。
Faceswap 提供专门的权重初始化技术
来源:lib/model/nn_blocks.py25-667
Faceswap 的模块化架构使得创建自定义模型或修改现有模型成为可能。
Faceswap 中的所有模型都遵循带有共享编码器的编码器-解码器架构
Faceswap 包含几种具有不同特性的模型架构
| 模型 | 描述 | 内存使用 | 质量 | 训练速度 |
|---|---|---|---|---|
| 原文 | 基本架构,良好的起点 | 低 | 中等 | 快 |
| IAE | 改进的自编码器,带有中间层 | 中等 | 良好 | 中等 |
| DFL-SAE | DeepFaceLab SAE,支持 LIAE 和 DF 模式 | 中高 | 非常好 | 中等 |
| DFL-H128 | DFL 模型的高分辨率变体 | 中高 | 非常好 | 中等 |
| Realface | 具有多个残差块的先进模型 | 高 | 优秀 | 慢 |
| DFaker | 注重细节的模型,具有广泛的残差网络 | 中高 | 良好 | 中等 |
| 轻量 | 适用于低 VRAM GPU 的最小模型 | 非常低 | 基础 | 非常快 |
| Unbalanced | 不对称模型,B 面更强 | 中等 | 良好 | 中等 |
| DLight | DFaker 的轻量级变体 | 低-中 | 良好 | Medium-Fast |
| Villain | 具有广泛残差链的模型 | 高 | 非常好 | 慢 |
创建自定义模型
ModelBase 类__init__ 中设置 input_shapebuild_model(), encoder(), 和 decoder()lib.model.nn_blocks 的神经网络模块基本实现要求
来源:plugins/train/model/_base/model.py39-411 plugins/train/model/original.py1-160 plugins/train/model/realface.py1-193 plugins/train/model/dfl_sae.py1-164
找到最佳学习率是高效训练的关键
Faceswap 的学习率查找器会运行指定数量的迭代(默认为 1000 次)来自动发现最佳学习率。这可以通过“强度”参数(默认、激进、极端)进一步微调。
对于计算能力为 7.0 或更高(RTX 系列及更新型号)的 NVIDIA GPU
混合精度可显著降低兼容硬件上的 VRAM 需求和训练时间。模型会自动检测哪些层可以安全使用 FP16,哪些层必须保留为 FP32 以获得数值稳定性。
梯度爆炸是深度学习中的一个常见问题。Faceswap 的 AutoClip 功能会根据观察到的梯度动态调整梯度裁剪阈值。
AutoClip 可以通过防止导致 NaN 值的梯度爆炸来显著提高训练稳定性。
对于拥有多个 GPU 的系统,Faceswap 提供分布策略
Faceswap 提供了几种优化器,每种都有不同的特性
| 优化器 | 描述 | 最佳用途 |
|---|---|---|
| Adam | 自适应矩估计 | 通用,默认设置良好 |
| Nadam | Adam 结合 Nesterov 动量 | 在某些情况下收敛更快 |
| AdaBelief | 通过对观察到的梯度的信念来调整步长 | 收敛更快,泛化能力更好 |
| RMSprop | 均方根传播 | 具有不同动量特性的替代方案 |
来源:plugins/train/_config.py276-323 plugins/train/model/_base/settings.py280-340 plugins/train/_config.py190-275
Faceswap 实现了一个复杂的模型状态管理系统,该系统处理模型的保存、加载和备份。
备份系统通过以下方式防止模型损坏
| 选项 | 描述 | 优点 | 缺点 |
|---|---|---|---|
| 保存间隔 | 保存频率(迭代次数) | 定期检查点 | 存储空间使用情况 |
| 保存优化器 | 何时保存优化器状态 | 训练连续性 | 文件大小 3 倍,保存速度较慢 |
| 快照 | 模型的完整备份 | 可恢复的里程碑 | 存储空间使用情况 |
来源:plugins/train/model/_base/io.py58-282 plugins/train/model/_base/model.py428-634
训练期间的 NaN(非数字)值表示模型崩溃,通常是由于梯度爆炸。Faceswap 提供了多种保护措施:
对于 VRAM 有限的情况
| 问题 | 可能原因 | 解决方案 |
|---|---|---|
| OOM 错误 | 批次大小过大,模型过于复杂 | 减小批次大小,使用混合精度,更简单的模型 |
| NaN 损失 | 学习率过高,梯度爆炸 | 启用 AutoClip,降低学习率,增加 epsilon |
| 质量差 | 训练不足,损失函数错误 | 训练时间更长,尝试不同的损失组合 |
| 训练缓慢 | CPU 瓶颈,模型效率低下 | 检查 I/O 系统,选择更快的模型,优化设置 |
| 模型伪影 | 棋盘格图案,颜色偏移 | 启用 ICNR 初始化,使用合适的损失函数 |
来源:plugins/train/_config.py175-347 plugins/train/model/_base/settings.py343-573
本综合指南涵盖了 Faceswap 模型架构、训练过程和优化技术的最高级方面。通过理解这些组件,您可以获得更好的结果,并根据您的具体需求定制系统。