site logo

Marico's space

Flux 2 Klein 9B 上的 Face Swap:Mask-Guided LanPaint、Rank-128 BFS LoRA 与 Megapixel Budget

AI技术与应用 2026-11-09 14:48:48 4

最近折腾了 Flux 2 Klein 9B 的换脸流程,踩了几个参数不一致的坑,这篇把整个工作流说清楚。作者把这套组合称为自己在图像编辑模型里见过最好的换脸结果,但真正值得关注的并不是模型本身,而是套在外面的三个约束:遮罩绘制的局部重绘区域、专门为 Klein 9B 训练的 Rank-128 LoRA(低秩适配器),以及决定人脸会不会变形的 Megapixel Budget(百万像素预算)。

证据说明:本期提供的是一份包含 57 个节点的工作流 JSON(JavaScript 对象表示法)。下面涉及的图表数值都读取自这份文件;百万像素建议值和 LoRA(低秩适配器)的来源则来自作者讲解。两边对不上时,我会明确标出来。

什么时候值得用

  • 你有一张待处理的人像,以及一张更干净、更清晰的人脸参考图,希望只替换脸部,不动画面其他部分。
  • 你使用的图像编辑模型原生不支持局部重绘,但仍然需要修改某个局部区域。
  • 你对已经完成的编辑结果进行二次放大,希望人脸经过第二遍处理后依然稳定。

工作流到底做了什么

  1. 输入两张图片。Image 1 是目标图。右键打开遮罩编辑器,涂出准备替换的人脸区域。Image 2 是参考人脸。
  2. 统一百万像素尺寸。ImageScaleToTotalPixels 节点放在最前面,并使用 lanczos 缩放算法;一个标记为 Set Megapixels 的 PrimitiveFloat 节点连接到它。
  3. 局部重绘,而不是空白 Latent(潜空间张量)。作者故意选择 LanPaint 局部重绘路线,而不是输入空白潜变量。画面里有两个人时,空白潜变量会让换脸结果落到错误位置。这里优先保证精度,而不是图省事。
  4. LanPaint_KSampler 负责核心生成。参数为:20 步、CFG(Classifier-Free Guidance,分类器自由引导)1、euler、simple、denoise 1,以及“Image First”。这个节点能让不支持原生局部重绘的模型完成指定区域的重新绘制,代价是速度变慢,作者接受了这一点。
  5. 解码后重新对齐尺寸。ImageResizeKJv2 设置为 512x512、nearest-exact、centre crop;LayerUtility: ImageScaleByAspectRatio V2 则使用 letterbox、lanczos,最长边设为 1920。作者的思路是:模型最终解码出的尺寸并不完全可控,因此需要把图片和遮罩重新约束到源图尺寸,保证后续处理一致。
  6. 第二次采样专门负责放大。这一段使用一个步骤很少的 KSampler:4 步、CFG 1、euler、simple。这是作者额外接上的“image edit model upscale”尾段,因为最初的换脸结果偏软。

工作流使用的模型

  • 骨干模型:flux-2-klein-9b.safetensors,加载两次,分别用于换脸和放大阶段
  • 文本编码器:qwen_3_8b_fp8mixed.safetensors,CLIPLoader 类型为 flux2
  • VAE(变分自编码器):flux2-vae.safetensors
  • 换脸 LoRA:bfs_head_v1_flux-klein_9b_step3500_rank128B.safetensors,strength 为 1.0
  • 空白潜变量尺寸:1008x1024 和 1024x1024

百万像素预算,以及一个值得注意的参数冲突

作者引用 Flux 2 官方上限时给出的数字是 4 百万像素,但他自己实际使用的是 1.5。按照他的说法,2 百万像素已经偏高,容易导致人脸变形。

问题在于,随工作流提供的 Set Megapixels 节点实际设置成了 2,并且有三个中间 ImageScaleToTotalPixels 节点处于 bypass(绕过)状态。也就是说,文件里的默认值高于作者口头推荐值:如果要跟着视频复现,运行前应该先把这个节点调成 1.5。

LoRA 的训练步数,以及第二处冲突

LoRA 文件名中写的是 step3500,但作者在讲解中称 Klein 9B 版本大约训练到了 3700-3750 步。两者指向的是同一个权重文件,只是引用训练步数时说法不同。

真正影响使用的结论是:只选 2511 或 Klein 9B 版本,这两个模型都已经开放。作者还提醒,更小的 Klein 4B 版本会丢失换脸稳定性,继续尝试其他尺寸基本是在浪费时间。

操作步骤

  1. 加载工作流,然后加载 Image 1,也就是目标图,以及 Image 2,也就是参考人脸。
  2. 右键 Image 1,打开遮罩编辑器,涂出需要替换的人脸区域,保存遮罩。
  3. 设置百万像素节点。作者使用的是 1.5,随文件提供的配置是 2。
  4. LoRA strength 保持 1.0;LanPaint 采样器保持 20 步、CFG 1、euler、simple。
  5. 先运行工作流,检查换脸结果,不要一上来就动放大分支。
  6. 如果结果偏软,再运行 4 步的放大尾段。作者指出,他自己使用的参考图质量较低,所以画面发软主要来自输入,而不是模型。
  7. 想得到更好的结果,应上传高分辨率的 Image 2,并选择与目标人脸角度接近的参考图。作者明确表示,他自己测试时这两点都没有做到。

参数依据

以下数据来自 Flux2 Klein9B 无痕换头放大大师版.json,工作流共 57 个节点:

节点 参数
LanPaint_KSampler 20 steps, CFG 1, euler, simple, denoise 1, "Image First"
Upscale KSampler 4 steps, CFG 1, euler, simple, denoise 1
LoraLoaderModelOnly bfs_head_v1_flux-klein-9b_step3500_rank128B, strength 1.0
PrimitiveFloat(百万像素) 2(作者推荐 1.5)
ImageScaleToTotalPixels lanczos, 0.5(x3 bypassed)
LayerUtility: ImageScaleByAspectRatio V2 letterbox, lanczos, longest 1920
ImageResizeKJv2 512x512, nearest-exact, centre crop
EmptyFlux2LatentImage 1008x1024 and 1024x1024
SaveImage prefix ComfyUI

限制和使用边界

  • 这不是原创工作流。作者表示,基础版本来自一位 Reddit 用户,他在上面增加了放大流程和细节调整。
  • 速度代价。LanPaint 换来的是对原生局部重绘模型的兼容,代价则是明显的运行速度下降。
  • 这里不需要讨论 Wan 级别的肢体处理能力,但人脸角度很重要。作者自己的测试使用了不匹配的角度和低质量参考图,两项都影响了结果。
  • 没有量化指标。“我见过最好的结果”只是作者在自己测试过的图像编辑模型之间做出的主观比较,不属于基准测试结论。
  • 工作流文件与讲解之间存在两处已记录的不一致:百万像素为 2 对 1.5,LoRA 训练步数为 3500 对约 3750。两者都不构成阻塞问题,但在信任其中任何一个数字之前,最好先知道它们的存在。
  • 伦理风险。作者提到换脸可能被用于恶意场景,但他仍将它当作一种生产能力来处理,尤其适用于那些对真实人脸限制非常严格的托管平台。

本期资源

  • RunningHub:https://www.runninghub.ai/post/2026299604819517442/?inviteCode=rh-v1111
  • 镜像:本期没有
  • YouTube:https://www.youtube.com/watch?v=KqnEfQ-UCOM
  • Bilibili:https://www.bilibili.com/video/BV1WHfSBtE4u