Chapter 07

ControlNet · 精确控图

只有 prompt 是"描述",ControlNet 是"控制"——给模型一张"参考图"(边缘/深度/姿态),生成的图就能严格贴合这个结构。这是让 AI 从"随机抽奖"变成"按稿出图"的关键工具。

一、ControlNet 在干什么

Diffusion 生图靠文字引导,ControlNet 再加一路空间信号引导——给 U-Net 额外的"结构约束":

普通 SD: prompt ──▶ U-Net 去噪 ──▶ 图像 (只有语义控制) 加上 ControlNet: prompt ────┐ ├─▶ U-Net 去噪 ──▶ 图像 参考图 ──▶ 预处理 ──▶ ControlNet ──(空间特征注入)──┘ (Canny/Depth/Pose etc)

ControlNet 本质是一个冻结的 U-Net 副本 + 零初始化的"控制分支",训练时只更新控制分支。推理时把参考图的特征注入主 U-Net 的各层,让去噪"必须贴着这个结构走"。

二、ControlNet 家族速查

类型输入参考图适合
Canny边缘线条图保持物体轮廓,换画风
Lineart / Lineart Anime线稿漫画/插画上色
Depth深度图(白近黑远)保持 3D 结构,换材质
OpenPose骨骼姿态图精确控制人物姿势
DWPose改进版 OpenPose同上,手脚更准
Normal Map法线图3D 渲染风格
Tile / Ultimate Upscale低分辨率原图超分放大
Seg语义分割色块图"草地放这里,房子放那里"
MLSD直线检测建筑/室内设计
Scribble手绘草图快速构图
Softedge(hed/pidi)柔边缘比 Canny 更松的结构控制
Shuffle颜色块打乱配色迁移
Reference-Only原图保留"某张图的风格"
IP-Adapter原图风格迁移(详见下章)

三、ComfyUI 里的 ControlNet 节点三件套

参考图 ──▶ AIO Aux Preprocessor ──▶ 预处理后的图 (选 canny / depth / openpose ...) │ ▼ Load ControlNet Model ──▶ ControlNet (选对应的 .safetensors) │ ▼ 正向 CONDITIONING ──▶ Apply ControlNet ──▶ 新 CONDITIONING ──▶ KSampler ▲ │ strength = 0.6-1.0 start_percent = 0.0 end_percent = 1.0

三步:预处理 → 加载 CN 模型 → Apply 到 CONDITIONING 上

装 ControlNet 节点包

Manager 里装 ComfyUI_Controlnet_aux——所有预处理器集大成,一个节点(AIO Aux Preprocessor)里选择 canny/depth/pose 等。

四、ControlNet 模型放哪

放到 ComfyUI/models/controlnet/。主流下载来源:

Union ControlNet 是 2025 主流
——把所有 CN 类型训进一个模型。加载时在 Apply ControlNet 或专用 SetUnionControlNetType 节点选"canny/depth/pose",显存只吃一份。硬盘从 10×1GB 变成 1×2.5GB。

五、几个典型场景

场景 1:保留原图构图,换画风(Canny)

手上有一张实拍照片,想变成油画风:

1. 原图 ──▶ AIO Preprocessor(canny, low=100, high=200)
2. Load ControlNet canny 模型
3. Apply ControlNet:strength=0.7, end_percent=0.7
4. prompt: "oil painting, thick brush strokes, Vincent van Gogh style, ..."
5. KSampler 跑图

关键:end_percent=0.7 意味着前 70% 步强制贴结构,后 30% 让模型自由润色——太松(0.3)结构容易崩,太紧(1.0)风格不够"油画"。

场景 2:从线稿上色(Lineart)

漫画师画了黑白线稿,想批量上色:

1. 线稿图(黑白) ──▶ AIO Preprocessor(lineart_anime_denoise)
2. Load ControlNet lineart 模型(或 SDXL Union)
3. Apply ControlNet:strength=0.9, end_percent=0.85
4. prompt: "1girl, blue hair, red dress, anime, ..."
5. KSampler(建议用 Pony/Animagine base)

场景 3:换姿势/动作(OpenPose)

1. 参考姿态图 ──▶ AIO Preprocessor(openpose / dwpose)
   输出骨骼图(黑底 + 彩色关键点连线)
2. Load ControlNet openpose 模型
3. Apply ControlNet:strength=1.0, end_percent=1.0
   (姿态要精确,权重拉满)
4. prompt: 描述人物,不描述姿态
5. 出图:同姿态,不同人物/服装
DWPose 比 OpenPose 强
原版 OpenPose 对手部关键点经常漏,DWPose 是 2023 年改进版,手脚检测精度高得多——ComfyUI-Aux 里优先选 dwpose。需要下载 yolox 和 dwpose 两个模型(~400MB)。

场景 4:保结构换材质(Depth)

产品渲染神器——给一张 3D 建模的深度图,生成各种材质版本的成品图:

1. 3D 软件导出深度图(或 AIO Preprocessor 的 depth_zoe)
2. Load ControlNet depth 模型
3. Apply ControlNet:strength=0.8
4. prompt 改材质:
   v1: "wooden chair, oak wood, handcrafted, ..."
   v2: "gold chair, polished metal, reflective, ..."
   v3: "glass chair, transparent, art deco, ..."
5. 同一个深度图 + 不同 prompt = 多个材质版本

场景 5:Tile 超分放大

Tile ControlNet 的用法和其他不一样——它是给高分辨率 img2img 提供"每个 tile 的结构约束",避免放大后面部分和整体脱节。见第 8 章详述。

六、关键参数:strength / start / end

strength(控制强度)
0.0 完全不控,1.0 最强。Canny/Lineart 常用 0.7-0.9,OpenPose 常用 1.0(姿态要准),Depth 0.7-0.85,Tile 0.5-0.7(给模型空间润色)。
start_percent(何时开始控制)
0.0 从第一步就约束;> 0 让前面几步自由发挥。通常 0.0。
end_percent(何时结束控制)
1.0 全程控制;0.7-0.85 前期控构图,后期让模型自由润色。风格迁移类(canny 换画风)常设 0.7,结构铁律类(openpose)设 1.0。

七、多 ControlNet 叠加

Apply ControlNet 节点可以串联——上一个的 CONDITIONING 输出接下一个的输入:

正向 prompt ──▶ Apply CN #1 (canny, 0.6)
             ──▶ Apply CN #2 (openpose, 0.8)
                 ──▶ Apply CN #3 (depth, 0.4)
                     ──▶ KSampler

经典组合:

叠 3 个以上 CN 的风险
每个 CN 是一个额外的 U-Net 级别推理,显存吃得多——3 个叠加时 VRAM 要 16GB+。另外约束越多越容易互相矛盾,画面崩的可能性上升。2 个 CN 是甜点。

八、SDXL ControlNet 的坎坷与 Union 的救赎

SD1.5 时代 ControlNet 生态极成熟——官方 + 社区一堆。SDXL 出来后,社区训 SDXL ControlNet 进度慢,早期只有 Canny/Depth 两三个能用。

2024 年 xinsir 推出 Union SDXL 彻底改变局面——一个 2.5GB 模型内含 10+ CN 类型,推理时切换类型即可。ComfyUI 里用法:

1. 加载 xinsir_controlnet_union_sdxl
2. 插入节点 SetUnionControlNetType,选 "canny"(或 depth/pose/tile ...)
3. 接 Apply ControlNet
4. 参考图按对应预处理器处理后喂进去

Union 的好处:切换 CN 类型不需要重载模型,节省显存和时间。生产环境首选。

九、Flux ControlNet 生态

Flux 出来时间不长,ControlNet 还在补齐。当前主力:

Flux Control LoRA 是 2025 新范式
BFL 官方用 LoRA 实现 ControlNet 功能——强度/叠加方式和普通 LoRA 一样,不再是独立模型。文件只有几百 MB。这种模式可能成为未来 Diffusion 控制的主流。

十、Preprocessor 选型指南

预处理器把原图变成"CN 吃的输入"——同一类型有多个实现,选对提升质量:

CN 类型推荐预处理器理由
Cannycanny(低 100,高 200)默认可调,线条最"干脆"
Lineartlineart_anime_denoise / lineart_realistic动漫/真人分开用
Depthdepth_zoe / depth_anything_v2Zoe 通用,Depth Anything 更精细
Posedwpose比 openpose 手脚精度高
Normalnormal_bae / normal_dsineDSine 新,质量更好
Softedgesoftedge_hed / softedge_pidi_safePiDi Safe 是改进版
Segseg_ofade20k / seg_ofcocoADE20K 室外场景好
MLSDmlsd唯一选择,直线检测
Scribblescribble_xdog / scribble_pidiXDoG 更像手绘

十一、一个完整工作流示例:产品图生成

需求:有一张拖鞋 3D 渲染图,需要生成 5 个不同材质版本用于电商页面。

原 3D 渲染图 ──┬──▶ AIO Preprocessor(depth_zoe) ──▶ CN Depth └──▶ AIO Preprocessor(canny) ──▶ CN Canny Load Checkpoint(Juggernaut XL) │ ▼ CLIP Text Encode 正向 → Apply CN Depth(0.8, 0-1.0) → Apply CN Canny(0.5, 0-0.7) │ ▼ KSampler(dpmpp_2m + karras, 28 步, cfg=6) │ ▼ VAE Decode → Save Image Prompt 池(每次跑不同): v1: "leather slippers, tan brown, stitched edges, ..." v2: "fuzzy wool slippers, grey, cozy home aesthetic, ..." v3: "crystal transparent slippers, Cinderella style, ..." v4: "neon cyberpunk slippers, LED trim, ..." v5: "handwoven bamboo slippers, Japanese minimal, ..."

产出:5 张结构完全一致(深度 + 轮廓),材质完全不同的产品图。这就是 ControlNet 工业化的样子。

十二、反模式

  1. strength 和 end_percent 都拉满:画风完全被压,模型没空间发挥。除非是 OpenPose 姿态硬需求。
  2. 用 Canny 做 1024×1024 大图 + 低分辨率参考图:边缘图分辨率不匹配,模糊。参考图要≥ 生成分辨率。
  3. OpenPose 喂黑白骨骼图错误:必须是带彩色关键点的标准 OpenPose 格式。搞错会完全不 work。
  4. 忘了装 preprocessor 依赖模型:DWPose/Depth Anything 需要额外下载底层模型,Manager 里"Install Models" 装一下。
  5. SDXL 用 SD1.5 ControlNet:架构不兼容,不能混用。
  6. 叠 4 个 CN:画面崩 + 显存爆。
  7. Tile 没配合 upscale 用:Tile 的正确场景是超分,单独用效果奇怪。
  8. 所有 CN 都开全程:风格类 CN(Canny)用 end_percent=0.7 更自然。

十三、本章小结

记住:
① ControlNet = 空间信号引导——给模型看"结构参考图",让它按这个结构出图。
② 2025 主流:SDXL Union ControlNet(xinsir)一个模型覆盖所有类型,大幅省显存。
③ 参数三件套:strength 0.6-1.0,start=0,end 0.7-1.0(看硬度)。姿态类拉满,风格类稍松。
④ Canny/Depth/OpenPose 是"三件套",其他按场景补。Canny+Pose 叠加是换人像最稳组合。
⑤ Flux 生态正在用 Control LoRA 取代传统 CN——更轻量、更模块化。