Faceswap 是目前最成熟的开源换脸项目之一,它把换脸流程拆成了提取、训练、转换三个阶段,每个阶段都有对应的脚本和图形界面。很多人第一次接触时会把注意力全放在训练模型上,结果数据集没整理好,或者环境里 CUDA 版本和 TensorFlow 不匹配,训练半天显存报错。所以这篇内容先从环境配置入手,再讲清楚数据准备和训练参数,最后给出转换时的常见问题。

环境配置:CUDA 与 cuDNN 的版本匹配是关键
官方推荐的安装方式是从 GitHub 拉取源码后使用安装脚本,但国内网络环境下直接运行 setup.py 很容易超时。更稳妥的做法是手动创建 Python 3.9 或 3.10 的虚拟环境,然后按照 requirements.txt 里的版本安装 TensorFlow。这里有一个常见的坑:如果你用的是 NVIDIA 30 系或 40 系显卡,TensorFlow 2.10 以下版本无法识别 Ampere 架构的算力,必须安装带 CUDA 11.2 支持的 TensorFlow 2.10 或更高版本。同时要保证系统里安装的 NVIDIA 驱动版本不低于 450.80.02,否则 CUDA 运行时初始化会直接失败。
验证环境是否正常,可以在 Python 里执行下面这段代码,确认 TensorFlow 能调用 GPU。如果打印出来的设备列表是空的,多半是 CUDA 路径没写进环境变量,或者 cuDNN 的 DLL 文件没有放到正确目录。Windows 用户要特别注意,cuDNN 的 bin、include、lib 三个文件夹需要分别合并到 CUDA 安装目录的对应文件夹里,而不是整个复制过去。
import tensorflow as tf
print("GPU available:", tf.config.list_physical_devices('GPU'))
# 如果输出为空列表,检查 CUDA_VISIBLE_DEVICES 或驱动版本
此外,Faceswap 的 GUI 依赖 tkinter,在 Linux 服务器上如果没有安装 python3-tk 包,启动 faceswap.py gui 时会直接报错。无头服务器建议直接用命令行模式处理,省去图形界面的依赖负担。
数据预处理:提取、对齐与掩码决定最终效果
训练之前必须先把视频转换成模型能识别的对齐人脸图片。Faceswap 的提取阶段会先检测人脸位置,再根据 68 个特征点做对齐,最后裁剪成统一尺寸。默认的 512x512 输出对大部分模型够用,但如果源视频分辨率很低,提高输出尺寸并不能增加细节,反而会引入更多噪声。提取完成后一定要人工筛选一遍,把侧脸角度过大、遮挡严重、模糊的图片删掉,否则训练时模型会学到错误的映射。
掩码是很多人忽略但极其重要的部分。它决定了换脸区域哪些像素参与训练、哪些像素保持原样。Faceswap 支持多种掩码类型,比如 components 掩码会覆盖眼睛、鼻子、嘴巴等主要部件,extended 掩码则扩大到整个面部轮廓。对于头发遮挡或者戴眼镜的场景,推荐使用 vgg-clear 或 bisenet-fp 掩码,它们对边缘的处理更精细。生成掩码的命令如下,注意 batch-size 要根据显存调整,默认值在消费级显卡上可能会爆内存。
python faceswap.py mask -i /path/to/aligned_faces -m bisenet-fp -b 8 # -i 输入对齐人脸目录,-m 指定掩码类型,-b 批次大小
数据集的平衡也很关键。如果 A 人脸有 5000 张图片,B 人脸只有 800 张,训练时模型会偏向数据量大的那一侧,换脸后表情和角度容易出现偏差。遇到这种情况,要么对 B 做数据增强,比如随机翻转、轻微旋转、亮度抖动,要么把 A 的数据量降到和 B 相近的水平。Faceswap 的训练脚本自带 augmentation 参数,开启后会自动做旋转和色彩变换,但强烈建议先保证原始数据的多样性,再依赖增强。
模型选择与训练参数调优
Faceswap 内置了多种模型架构,最常用的是 Original、DFL-SAE 和 Villain。Original 训练速度快,适合快速验证流程,但细节保留一般;DFL-SAE 的编码器-解码器结构更复杂,对表情和角度变化的泛化能力更强,代价是显存占用高、训练时间长。Villain 是轻量化版本,适合显存 6GB 以下的显卡。下表对比了三种模型在 256x256 输入下的典型显存占用和推荐迭代次数。
| 模型 | 显存占用(batch=8) | 推荐迭代 | 适用场景 |
|---|---|---|---|
| Original | 约 4GB | 50k-80k | 快速验证、低配置设备 |
| DFL-SAE | 约 8GB | 120k-200k | 高细节、复杂表情 |
| Villain | 约 3GB | 80k-120k | 显存受限、中等质量需求 |
批次大小(batch size)直接影响训练稳定性和显存占用。过大的批次容易导致梯度更新过于平滑,模型收敛慢;过小则噪声大,损失曲线震荡。一般建议从 8 开始尝试,如果显存报 OOM 错误,就减小到 4 或者 2。学习率默认值 1e-4 基本不用动,只有在损失长时间不下降时,才考虑降低到 5e-5。训练过程中要重点关注预览图,而不是只盯着 loss 数值。预览图里脸部轮廓清晰、五官对位准确,即使 loss 没有降到很低,实际效果也可能不错。
还有一个容易忽视的参数是 coverage,它表示模型训练时使用的面部区域比例。默认 87.5% 会裁剪掉额头和下巴的一部分,如果源人物有刘海或者需要保留完整额头,可以调到 100%。但 coverage 越大,训练时需要的显存和计算量也会增加,需要在效果和资源之间做取舍。
python faceswap.py train -A /path/to/faceA -B /path/to/faceB -m dfl-sae -bs 8 -it 150000 -co 87.5 # -A 和 -B 分别是两个身份的对齐人脸目录,-m 指定模型,-bs 批次大小,-it 迭代次数
训练完成后进入转换阶段,需要提供原始视频和对齐文件。转换脚本会把训练好的模型应用到每一帧上,然后合成输出。这里要注意 mask type 必须和训练时使用的一致,否则生成的视频边缘会出现生硬的边界。如果转换后的视频出现闪烁,可以尝试开启 temporal smoothing 或者调整 blend 参数,让相邻帧之间的换脸区域过渡更自然。