FaceFusion 人脸融合完整指南:13 个换脸模型怎么选,3 个参数怎么调
【免费下载链接】facefusionIndustry leading face manipulation platform项目地址: https://gitcode.com/GitHub_Trending/fa/facefusion
facefusion 把目标视频拆帧、定位每张脸、用换脸模型推理出新面部,再贴回原帧后合成为视频。你不需要自己搭 ONNX 推理链路,也不需要手写关键点对齐——这些都被拆成了facefusion/processors/modules/下的一组处理器。这篇指南回答三个最实际问题:13 个 swapper 模型分别该什么时候选、face_swapper_weight和face_swapper_pixel_boost到底改了什么、以及在 CUDA 机器上怎么把一晚上的活压到几分钟。所有命令、参数名和默认值均出自本仓库源码,路径在文中逐项标注。
第一次跑通:一条命令加两个检查点
先装环境。项目自带 Conda 依赖文件,仓库克隆地址:
git clone https://gitcode.com/GitHub_Trending/fa/facefusion cd facefusion conda env create -f environment.yml conda activate facefusion python install.py python facefusion.py run -s source.jpg -t target.mp4 -o output.mp4-s/-t/-o分别是源人脸图片、目标视频、输出路径(facefusion/program.py 第 52~68 行)。改-o指向已有目录才有效,目录不存在会直接报错退出。模型文件不在代码库里,首次运行到pre_check()时按需下载到.assets/models/目录,下载源由--download-providers控制,默认同时尝试 github 与 huggingface(facefusion/choices.py 第 123~142 行)。
注意-t指向的目标是整段视频,facefusion 内部先解码成 PNG 帧序列(--temp-frame-format默认png),处理完再编码回 mp4。所以“处理 10 分钟视频”的真实成本 = 解码 + 逐帧推理 + 编码,后面提速三节的三个旋钮各自砍掉其中一段。
run只是入口之一。create_program()(facefusion/program.py 第 319~343 行)里一共注册了 19 个子命令,和你最相关的几个:
run:GUI 与处理一体,--ui-workflow默认instant_runner,网页里点一下即跑当前步骤headless-run:同参数但不带任何 UI 参数组,适合服务器batch-run:用--source-pattern/--target-pattern/--output-pattern三条 glob 批量跑benchmark:用内置 720p 样例视频跑测速,--benchmark-mode默认warm,--benchmark-cycle-count默认 5job-add-step / job-submit / job-run-all:作业系统,把多组素材排成队列
# 多素材排队:先建作业,逐步添加,再统一提交 python facefusion.py job-create my_job python facefusion.py job-add-step my_job -s a.jpg -t v1.mp4 -o o1.mp4 python facefusion.py job-submit-alljob-create的job_id会被sanitize_job_id校验,job-add-step接受与run完全相同的处理参数组——即一份作业可以混用不同模型、不同 mask 的多步任务,互不干扰。
13 个换脸模型对照:从 128 输入到 512 输入
换脸模型全部登记在 facefusion/processors/modules/face_swapper/core.py 的create_static_model_set(),每个模型声明了原生输入尺寸、对齐模板、归一化参数和许可证。模型名可直接传给--face-swapper-model,完整对照如下:
| 模型 | 原生输入 | 可选 pixel_boost | 对齐模板 | 精度 | 选型参考 |
|---|---|---|---|---|---|
| inswapper_128 | 128×128 | 128~1024 | arcface_128 | fp32 | 默认基线,单次推理开销最小 |
| inswapper_128_fp16 | 128×128 | 128~1024 | arcface_128 | fp16 | 显存减半的 inswapper |
| hyperswap_1a/1b/1c_256 | 256×256 | 256~1024 | arcface_128 | fp16 | 默认模型,FaceFusion 2025 自研 |
| blendswap_256 | 256×256 | 256~1024 | ffhq_512 | fp32 | 走整帧输入路径,换全脸含发型边缘 |
| ghost_1/2/3_256 | 256×256 | 256~1024 | arcface_112_v1 | fp32 | 研究导向,Apache-2.0 许可 |
| hififace_unofficial_256 | 256×256 | 256~1024 | mtcnn_512 | fp32 | 2021 模型,非官方权重 |
| simswap_256 | 256×256 | 256~1024 | arcface_112_v1 | fp32 | 2020 基线对照 |
| simswap_unofficial_512 | 512×512 | 512~1024 | arcface_112_v1 | fp32 | 唯一 512 原生输入,细节上限最高 |
| uniface_256 | 256×256 | 256~1024 | ffhq_512 | fp32 | 整帧输入路径,同 blendswap 机制 |
两个要点比模型数量更重要:
- 推理次数由 pixel_boost 决定,不由模型决定。
inswapper_128 + 512与simswap_unofficial_512 + 512都是 16 次模型调用/脸/帧,差别只在前者每次只算 128×128。想快:小模型 + 低 boost;想细:大原生输入或高 boost,代价按平方增长。 - 许可证不同。
ghost_*是 Apache-2.0,inswapper_128、blendswap_256、simswap_256标注 Non-Commercial(见__metadata__字段)。商业交付前逐项核对core.py里各模型的license值,这一列仓库替你记好了。
不同模型对源脸的输入方式也不同:forward_swap_face()(同文件第 640~659 行)显示,blendswap和uniface喂整帧像素,其余模型喂512 维嵌入向量;其中 ghost 系列还要先过embedding_converter把 InsightFace 嵌入转换到自家空间(第 662~671 行)。这就是换 ghost 模型时会多下载一个crossface_*.onnx的原因。
三个真正改变结果的参数:weight、pixel_boost、mask_blur
face_swapper_weight不是强度开关,它是嵌入向量的混合系数。balance_source_embedding()(face_swapper/core.py 第 715~726 行)做了两件事:
face_swapper_weight = numpy.interp(face_swapper_weight, [ 0, 1 ], [ 0.35, -0.35 ]) source_embedding = source_embedding * (1 - face_swapper_weight) \ + target_embedding * face_swapper_weight0.5 映射到 0,源嵌入和目标嵌入各占一半;往 0 走(最大 +0.35)混入更多目标脸的身份,往 1 走(最小 −0.35)则强化源脸。你改的是--face-swapper-weight,看到的变化是“像原视频的人”和“像源照片的人”之间的滑动,不是模糊度。取值范围 0.0~1.0、步长 0.05(facefusion/choices.py 第 164 行),默认 0.5。
face_swapper_pixel_boost控制“裁剪出的人脸先被 warp 到多大尺寸再送模型”。swap_face()的完整链路:
crop_vision_frame, affine_matrix = warp_face_by_face_landmark_5( temp_vision_frame, target_face.landmark_set.get('5/68'), model_template, pixel_boost_size) # ... 对每个子块做 forward_swap_face 推理 ... crop_vision_frame = explode_pixel_boost(temp_vision_frames, pixel_boost_total, model_size, pixel_boost_size) paste_vision_frame = paste_back(temp_vision_frame, crop_vision_frame, crop_mask, affine_matrix)pixel_boost_total = pixel_boost // 模型原生尺寸,推理次数 =pixel_boost_total²(face_swapper/core.py 第 601~637 行,分块逻辑在 facefusion/processors/pixel_boost.py)。inswapper_128从 128 提到 512 是 1 → 16 次调用;hyperswap_1a_256从 256 提到 1024 是 1 → 16 次。改这个值后你会直接看到帧耗时按平方跳变,同时小脸、侧脸处的发丝和五官细节提升明显——它是全参数表里“质量/速度”杠杆最大的一档。
face_mask_blur(默认 0.3,范围 0~1)决定贴回前 mask 边缘的羽化宽度,配合--face-mask-types生效,可选box(默认)、area、region、occlusion(facefusion/choices.py 第 26~44 行给出 area/region 的具体 68 点索引和部件编号)。边缘出现“贴片感”时先把它从 0.3 往 0.5 抬;要露出眼镜、胡子等遮挡物,加occlusion(默认模型xseg_1,见 facefusion/program.py 第 147 行)。
顺手记一张常用旋钮速查表:
| 参数 | 默认 | 范围 | 调高看到什么 |
|---|---|---|---|
--face-swapper-weight | 0.5 | 0.0~1.0(步长 0.05) | 更像源照片;调低更像原视频 |
--face-swapper-pixel-boost | 模型首个选项 | 128~1024 | 细节↑,耗时按平方↑ |
--face-mask-blur | 0.3 | 0.0~1.0(步长 0.05) | 边缘更柔,过高发虚 |
--face-detector-score | 0.5 | 0.0~1.0(步长 0.05) | 更多脸被检出,假阳性↑ |
--execution-thread-count | 8 | 1~32 | CPU 路径吞吐↑(facefusion/choices.py 第 161 行) |
--video-memory-strategy | strict | strict / moderate | strict 每作业后卸模型,防显存溢出 |
提速三处:推理后端、输出编码、内存策略
推理后端。--execution-providers按机器实际安装的 onnxruntime 提供器过滤(facefusion/execution.py 第 21~30 行),可选cuda tensorrt rocm migraphx coreml openvino qnn directml cpu。有 NVIDIA 卡时优先:
python facefusion.py run -s s.jpg -t t.mp4 -o o.mp4 \ --execution-providers tensorrt cuda --execution-device-ids 0列表顺序即回退顺序:TensorRT 失败落到 CUDA。create_inference_providers()(第 45~59 行)为 TensorRT 开了trt_engine_cache_enable和 timing cache,引擎缓存写进.caches/<onnxruntime 版本>/目录——第一次跑某个分辨率最慢(现场构建引擎),第二次起直接加载缓存。多卡时--execution-device-ids接受多个编号。macOS 上有个隐藏路径:ghost/uniface 和 fp16 模型会自动改走 CoreML 的 MLProgram 格式(face_swapper/core.py 第 505~519 行)。
输出编码。--output-video-preset默认veryfast,--output-video-quality默认 80(facefusion/program.py 第 195~196 行)。preset 只影响编码器速度档位,quality 是 0~100 的质量分——草稿轮veryfast不动,交付轮把 quality 抬到 90 左右、preset 换慢档位重跑一次即可。--output-video-scale支持 0.25~8.0 倍缩放(facefusion/choices.py 第 177 行),先按 0.5 出小样确认效果再全尺寸跑,是省时间的常规操作。
批量与内存。多组素材别写 shell 循环,用batch-run的三个 pattern,或作业系统排队。长视频显存吃紧时--video-memory-strategy默认就是strict:post_process()(face_swapper/core.py 第 587~598 行)在 strict 下连公共模块(检测器、关键点、遮挡)的推理池一起清空,代价是下一任务要重新加载模型。moderate只卸 swapper 本体,适合“同一批素材连续跑多步”的场景。
排错:五个报错文案对应的五个检查
pre_process()(face_swapper/core.py 第 559~584 行)在跑之前做四次校验,报错文案都能直接对号入座:
- “choose image source”:
-s没传图片,或路径解析不到文件。run要求-s至少一张图。 - “no source face detected”:源图里没检出正好一张脸。用
get_one_face强校验(第 568 行),图里 0 张或多张都失败——多张脸就裁出单张,或换--face-detector-score从 0.5 降到 0.4 再试。 - “choose image or video target”:
-t指向了音频或不存在的路径。 - “specify image or video output”:
-o所在目录不存在。 - “match target and output extension”:目标视频是 mp4,输出却写了 .jpg——两者扩展名必须一致。
多人群视频里替换错了人,问题出在选脸而非换脸:--face-selector-mode默认reference(facefusion/program.py 第 123 行),配合--reference-frame-number(默认第 0 帧)和--reference-face-position(默认第 0 号脸)锁定参考帧里的某张脸,后续帧按--reference-face-distance(默认 0.3)的距离跟随。换错人时先改--reference-frame-number指到一个目标人物正对镜头的帧。
检测不到的脸分两种:角度问题加--face-detector-angles(默认只处理 0° 正脸,可选 90/180/270,facefusion/choices.py 第 163 行);小脸问题则是--face-detector-size——注意yolo_face和yunet只支持640x640,想用160x160~512x512的更多尺寸档要换scrfd或retinaface(第 9~14 行)。--face-tracker-score(默认 0.0,范围 0~0.5)控制跨帧跟踪的相似度门槛,调高可减少换脸在帧间“跳脸”。
要点清单
- 默认组合
hyperswap_1a_256 + 256x256 + weight 0.5直接出结果;要细节把--face-swapper-pixel-boost提到 512 或 1024,耗时按(boost/原生)²增长。 face_swapper_weight是源/目标身份嵌入的混合比(0.35 ↔ −0.35),不是强度旋钮;结果偏源照片就往 0.4 以下调,反之往 0.6 以上调。- 速度三件套:
--execution-providers tensorrt cuda(引擎缓存在.caches/,二次运行起飞)、交付轮才动--output-video-quality、长视频保持--video-memory-strategy strict。 - 多人群先修
--reference-frame-number和--reference-face-position,再谈其他参数;检测不到脸先查--face-detector-angles和--face-detector-size。 - 模型许可证写在
face_swapper/core.py的__metadata__里:ghost_*为 Apache-2.0,inswapper_128/blendswap_256为 Non-Commercial,商用前逐一核对。
【免费下载链接】facefusionIndustry leading face manipulation platform项目地址: https://gitcode.com/GitHub_Trending/fa/facefusion
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考