Qwen-Image 2.1 Fun ControlNet Union:一个文件集成 8 种控制
阿里巴巴 PAI 为 Qwen-Image 2.1 打造的 ControlNet Union 将八种结构控制与图像修复打包进一个 7.5 GB 分支,ComfyUI 支持即将落地。
Qwen-Image 2.1 于 2026 年 9 月 20 日发布,是一个 7B 单流 DiT,用同一套权重完成生成与编辑,并输出真正的 RGBA 透明度。这个 ControlNet-Union 分支沿用了阿里巴巴 PAI 为 MiniMax H3 采取的思路:用一个控制 checkpoint 覆盖所有条件,无需按条件切换权重。
一个分支,八种条件
发布的文件只包含控制分支(control_img_in 加 16 个 control_blocks,模型卡标注约 7.0 GB,磁盘占用 7.55 GB)。它以 strict=False 加载到基础 Qwen-Image 2.1 transformer 之上,基础部分保持冻结,因此基础权重被原样复用。
| 控制条件 | Canny、Depth、Grayscale、HED、Lineart、MLSD、Pose、Scribble |
| 控制分支深度 | 16 个 block,在 32 个 transformer block 的每第 2 个上做一次 skip(control_layers = [0, 2, 4, ..., 30]) |
| 控制输入宽度 | control_in_dim = 129:控制 latent(64)+ mask(1)+ 掩蔽图像 latent(64) |
| 注入方式 | 每个控制 block 上零门控的 before_proj / after_proj,加回主分支 |
| 采样 | CFG 蒸馏,示例脚本以 guidance_scale = 1.0 运行(每步一次前向传播) |
| 文本编码器 / VAE | 用于 prompt 与条件图像的 Qwen3-VL 处理器,VAE 解码 RGBA,预览可直接保存为 PNG |
control_context_scale 会在每个控制 skip 加回主分支之前对其缩放:1.0 是所有公开结果使用的最强设置,数值越低引导越弱,0.0 则关闭控制分支。
控制条件
| 条件 | 控制信号 |
|---|---|
| Canny | Canny 边缘图 |
| Depth | 单目深度图 |
| Grayscale | 灰度(亮度)图像 |
| HED | HED 边缘检测图 |
| Lineart | 线稿提取 |
| MLSD | 线段检测图 |
| Pose | DWPose 骨骼 |
| Scribble | 手绘或草图线条 |
任何目标画布尺寸下的普通 RGB 控制图像都可以使用:模型卡指出它能容忍不同的线条粗细、阈值和裁剪。以下所有样例均来自模型卡,采用 40 步推理、control_context_scale = 1.0 和种子 43,左侧为控制信号,右侧为生成结果。
![]() | ![]() |
|---|---|
| Canny 边缘图 | 已生成输出 |
![]() | ![]() |
|---|---|
| 深度图 | 已生成输出 |
![]() | ![]() |
|---|---|
| 灰度图像 | 已生成输出 |
![]() | ![]() |
|---|---|
| 涂鸦草图 | 已生成输出 |
其余条件(HED、Lineart、MLSD、Pose)遵循同样的模式,可在模型页面查看。
图像修复共用同一分支
控制输入之所以被拓宽到 129 个通道,正是为了让一个分支同时完成两项任务:控制 latent、保留 mask 和掩蔽图像 latent 在进入分支前被拼接在一起。纯控制时,mask 与掩蔽图像通道会被零填充,因此同一个 checkpoint 依然可以运行普通的 Canny 或 Depth。图像修复时,掩蔽区域会根据 prompt 重新绘制,而画面其余部分保持不变,两者也能结合使用:同时提供控制图像和 mask,重绘区域就会同时遵循 prompt 和给定结构。
mask 中白色表示应重新生成内容的区域,黑色表示应保留的区域。重新生成的像素会以中灰色编码,即 VAE [-1, 1] 输入范围的零点,因此未改动的区域能够完整无损地通过本轮往返。
![]() | ![]() | ![]() | ![]() |
|---|---|---|---|
| 来源图像 | Mask | Pose 控制 | 图像修复输出 |
ComfyUI 支持
ComfyUI 支持目前仍在审核中,尚未发布。Kijai 于 2026 年 9 月 24 日提交了 PR #16519(“Support Qwen-Image 2.1 union fun controlnet”),它改动了四个文件:
comfy/ldm/qwen_image21/model.py新增QwenImage21FunControl和QwenImage21FunControlBlock,这是一个 VACE 风格的分支,将控制 latent 注入目标行,并在一个基础 block 之后把每个 block 的after_projskip 加回去。comfy_extras/nodes_model_patch.py让 ModelPatchLoader 认识这种布局:它通过control_img_in加control_blocks.0.img_mlp.out.weight识别该 checkpoint,并从 state dict 推导 block 数量、control_in_dim、head dim 和 MLP 比例,因此一个 loader 就能适配这一 checkpoint 家族。量化文件以混合精度算子加载,使各层保持量化并使用 bf16 计算。comfy_extras/nodes_qwen.py新增 QwenImage21FunControlNetApply(“Apply Qwen Image 2.1 Fun ControlNet”):输入为model加model_patch、strength(默认 1.0)、start_percent/end_percent,以及可选的control_image、inpaint_image和mask(“1 表示需要重新生成的区域”)。comfy/controlnet.py收紧 Qwen Fun loader 的检测逻辑,避免新 checkpoint 被误判为旧版 ControlNet 布局。
在 PR 审核期间,Kijai 已经发布了转换好的 ComfyUI 模型补丁:
- qwen_image_2.1_fun_controlnet_union_bf16.safetensors
- qwen_image_2.1_fun_controlnet_union_int8_convrot.safetensors
Comfy-Org/workflow_templates 中目前还没有它的官方工作流模板,因此上一个 Qwen-Image 模板(image_qwen_image_controlnet_patch、image_qwen_image_instantx_inpainting_controlnet)都是面向更早模型的,在这里并不适用。
可用性
在 ComfyUI 之外,该 checkpoint 可通过 VideoX-Fun 运行:克隆 VideoX-Fun,将基础 Qwen-Image 2.1 模型和控制 checkpoint 放到 models/Diffusion_Transformer/ 下,然后运行 examples/qwenimage21_fun/predict_t2i_control.py(图像修复则运行 predict_i2i_inpaint.py)。该分支是在提交 “Update Qwen Image 2.1 Control and Flex Forcing” 中加入的。
模型卡中有四点值得留意:
config_path必须为config/qwenimage21/qwenimage21_control.yaml。它会完全按照 checkpoint 的预期构建控制分支(control_layers: [0, 2, 4, ..., 30]、control_in_dim: 129),使用任何其他配置都会静默丢弃或错置控制权重,导致输出错误。sample_size决定输出画布。请让两边都保持为 16 的倍数,以免控制图被扭曲。use_kv_cache = True会在第一个去噪步之后缓存文本与条件图像的 key,从而在固定分辨率下加速生成。- 内存:transformer 加上 Qwen3-VL 文本编码器无法在单张消费级 GPU 上完整加载。模型卡推荐
model_group_offload作为最快方案,或在单张高显存 GPU 上使用model_cpu_offload_and_qfloat8。












评论
使用 GitHub 登录后即可参与讨论。