
最近折腾了 Flux 2 Klein 9B 的换脸流程,踩了几个参数不一致的坑,这篇把整个工作流说清楚。作者把这套组合称为自己在图像编辑模型里见过最好的换脸结果,但真正值得关注的并不是模型本身,而是套在外面的三个约束:遮罩绘制的局部重绘区域、专门为 Klein 9B 训练的 Rank-128 LoRA(低秩适配器),以及决定人脸会不会变形的 Megapixel Budget(百万像素预算)。
证据说明:本期提供的是一份包含 57 个节点的工作流 JSON(JavaScript 对象表示法)。下面涉及的图表数值都读取自这份文件;百万像素建议值和 LoRA(低秩适配器)的来源则来自作者讲解。两边对不上时,我会明确标出来。
ImageScaleToTotalPixels 节点放在最前面,并使用 lanczos 缩放算法;一个标记为 Set Megapixels 的 PrimitiveFloat 节点连接到它。LanPaint_KSampler 负责核心生成。参数为:20 步、CFG(Classifier-Free Guidance,分类器自由引导)1、euler、simple、denoise 1,以及“Image First”。这个节点能让不支持原生局部重绘的模型完成指定区域的重新绘制,代价是速度变慢,作者接受了这一点。ImageResizeKJv2 设置为 512x512、nearest-exact、centre crop;LayerUtility: ImageScaleByAspectRatio V2 则使用 letterbox、lanczos,最长边设为 1920。作者的思路是:模型最终解码出的尺寸并不完全可控,因此需要把图片和遮罩重新约束到源图尺寸,保证后续处理一致。euler、simple。这是作者额外接上的“image edit model upscale”尾段,因为最初的换脸结果偏软。flux-2-klein-9b.safetensors,加载两次,分别用于换脸和放大阶段qwen_3_8b_fp8mixed.safetensors,CLIPLoader 类型为 flux2flux2-vae.safetensorsbfs_head_v1_flux-klein_9b_step3500_rank128B.safetensors,strength 为 1.01008x1024 和 1024x1024作者引用 Flux 2 官方上限时给出的数字是 4 百万像素,但他自己实际使用的是 1.5。按照他的说法,2 百万像素已经偏高,容易导致人脸变形。
问题在于,随工作流提供的 Set Megapixels 节点实际设置成了 2,并且有三个中间 ImageScaleToTotalPixels 节点处于 bypass(绕过)状态。也就是说,文件里的默认值高于作者口头推荐值:如果要跟着视频复现,运行前应该先把这个节点调成 1.5。
LoRA 文件名中写的是 step3500,但作者在讲解中称 Klein 9B 版本大约训练到了 3700-3750 步。两者指向的是同一个权重文件,只是引用训练步数时说法不同。
真正影响使用的结论是:只选 2511 或 Klein 9B 版本,这两个模型都已经开放。作者还提醒,更小的 Klein 4B 版本会丢失换脸稳定性,继续尝试其他尺寸基本是在浪费时间。
euler、simple。以下数据来自 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 |