☰
FaceFusion 人脸融合完整指南:13 个换脸模型怎么选,3 个参数怎么调
2026/10/7 5:21:17 网站建设 项目流程

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默认 5
  • job-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-all

job-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_128128×128128~1024arcface_128fp32默认基线,单次推理开销最小
inswapper_128_fp16128×128128~1024arcface_128fp16显存减半的 inswapper
hyperswap_1a/1b/1c_256256×256256~1024arcface_128fp16默认模型,FaceFusion 2025 自研
blendswap_256256×256256~1024ffhq_512fp32走整帧输入路径,换全脸含发型边缘
ghost_1/2/3_256256×256256~1024arcface_112_v1fp32研究导向,Apache-2.0 许可
hififace_unofficial_256256×256256~1024mtcnn_512fp322021 模型,非官方权重
simswap_256256×256256~1024arcface_112_v1fp322020 基线对照
simswap_unofficial_512512×512512~1024arcface_112_v1fp32唯一 512 原生输入,细节上限最高
uniface_256256×256256~1024ffhq_512fp32整帧输入路径,同 blendswap 机制

两个要点比模型数量更重要:

  1. 推理次数由 pixel_boost 决定,不由模型决定。inswapper_128 + 512与simswap_unofficial_512 + 512都是 16 次模型调用/脸/帧,差别只在前者每次只算 128×128。想快:小模型 + 低 boost;想细:大原生输入或高 boost,代价按平方增长。
  2. 许可证不同。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_weight

0.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-weight0.50.0~1.0(步长 0.05)更像源照片;调低更像原视频
--face-swapper-pixel-boost模型首个选项128~1024细节↑,耗时按平方↑
--face-mask-blur0.30.0~1.0(步长 0.05)边缘更柔,过高发虚
--face-detector-score0.50.0~1.0(步长 0.05)更多脸被检出,假阳性↑
--execution-thread-count81~32CPU 路径吞吐↑(facefusion/choices.py 第 161 行)
--video-memory-strategystrictstrict / moderatestrict 每作业后卸模型,防显存溢出

提速三处:推理后端、输出编码、内存策略

推理后端。--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 行)在跑之前做四次校验,报错文案都能直接对号入座:

  1. “choose image source”:-s没传图片,或路径解析不到文件。run要求-s至少一张图。
  2. “no source face detected”:源图里没检出正好一张脸。用get_one_face强校验(第 568 行),图里 0 张或多张都失败——多张脸就裁出单张,或换--face-detector-score从 0.5 降到 0.4 再试。
  3. “choose image or video target”:-t指向了音频或不存在的路径。
  4. “specify image or video output”:-o所在目录不存在。
  5. “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)控制跨帧跟踪的相似度门槛,调高可减少换脸在帧间“跳脸”。

要点清单

  1. 默认组合hyperswap_1a_256 + 256x256 + weight 0.5直接出结果;要细节把--face-swapper-pixel-boost提到 512 或 1024,耗时按(boost/原生)²增长。
  2. face_swapper_weight是源/目标身份嵌入的混合比(0.35 ↔ −0.35),不是强度旋钮;结果偏源照片就往 0.4 以下调,反之往 0.6 以上调。
  3. 速度三件套:--execution-providers tensorrt cuda(引擎缓存在.caches/,二次运行起飞)、交付轮才动--output-video-quality、长视频保持--video-memory-strategy strict。
  4. 多人群先修--reference-frame-number和--reference-face-position,再谈其他参数;检测不到脸先查--face-detector-angles和--face-detector-size。
  5. 模型许可证写在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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询