一、ControlNet 在干什么
Diffusion 生图靠文字引导,ControlNet 再加一路空间信号引导——给 U-Net 额外的"结构约束":
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 节点三件套
三步:预处理 → 加载 CN 模型 → Apply 到 CONDITIONING 上。
装 ControlNet 节点包
Manager 里装 ComfyUI_Controlnet_aux——所有预处理器集大成,一个节点(AIO Aux Preprocessor)里选择 canny/depth/pose 等。
四、ControlNet 模型放哪
放到 ComfyUI/models/controlnet/。主流下载来源:
- SD 1.5 ControlNet:lllyasviel 官方——文件前缀
control_v11p_sd15_xxx.pth - SDXL ControlNet:xinsir Union——一个 2.5GB 模型支持所有 CN 类型,2024 年的大跃进
- Flux ControlNet:XLabs-AI / InstantX Union——Flux 生态新秀
——把所有 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. 出图:同姿态,不同人物/服装
原版 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
七、多 ControlNet 叠加
Apply ControlNet 节点可以串联——上一个的 CONDITIONING 输出接下一个的输入:
正向 prompt ──▶ Apply CN #1 (canny, 0.6)
──▶ Apply CN #2 (openpose, 0.8)
──▶ Apply CN #3 (depth, 0.4)
──▶ KSampler
经典组合:
- Canny + OpenPose——既保整体构图又保姿态,换人像 + 换画风最稳
- Depth + Canny——3D 结构 + 边缘双约束,产品图超稳
- Lineart + Reference——线稿上色 + 风格迁移
每个 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 还在补齐。当前主力:
- XLabs-AI flux-controlnet-canny-v3——Flux Canny,最早的 Flux CN
- InstantX FLUX.1-dev-Controlnet-Union——Union 风格,支持 canny/tile/depth
- Flux Redux(BFL 官方)——类 IP-Adapter 的参考图
- Flux Fill——inpaint 专用
- Flux Depth / Canny LoRA(BFL 官方发布的 Control LoRA)——原生 LoRA 实现 CN,比传统 CN 轻
BFL 官方用 LoRA 实现 ControlNet 功能——强度/叠加方式和普通 LoRA 一样,不再是独立模型。文件只有几百 MB。这种模式可能成为未来 Diffusion 控制的主流。
十、Preprocessor 选型指南
预处理器把原图变成"CN 吃的输入"——同一类型有多个实现,选对提升质量:
| CN 类型 | 推荐预处理器 | 理由 |
|---|---|---|
| Canny | canny(低 100,高 200) | 默认可调,线条最"干脆" |
| Lineart | lineart_anime_denoise / lineart_realistic | 动漫/真人分开用 |
| Depth | depth_zoe / depth_anything_v2 | Zoe 通用,Depth Anything 更精细 |
| Pose | dwpose | 比 openpose 手脚精度高 |
| Normal | normal_bae / normal_dsine | DSine 新,质量更好 |
| Softedge | softedge_hed / softedge_pidi_safe | PiDi Safe 是改进版 |
| Seg | seg_ofade20k / seg_ofcoco | ADE20K 室外场景好 |
| MLSD | mlsd | 唯一选择,直线检测 |
| Scribble | scribble_xdog / scribble_pidi | XDoG 更像手绘 |
十一、一个完整工作流示例:产品图生成
需求:有一张拖鞋 3D 渲染图,需要生成 5 个不同材质版本用于电商页面。
产出:5 张结构完全一致(深度 + 轮廓),材质完全不同的产品图。这就是 ControlNet 工业化的样子。
十二、反模式
- strength 和 end_percent 都拉满:画风完全被压,模型没空间发挥。除非是 OpenPose 姿态硬需求。
- 用 Canny 做 1024×1024 大图 + 低分辨率参考图:边缘图分辨率不匹配,模糊。参考图要≥ 生成分辨率。
- OpenPose 喂黑白骨骼图错误:必须是带彩色关键点的标准 OpenPose 格式。搞错会完全不 work。
- 忘了装 preprocessor 依赖模型:DWPose/Depth Anything 需要额外下载底层模型,Manager 里"Install Models" 装一下。
- SDXL 用 SD1.5 ControlNet:架构不兼容,不能混用。
- 叠 4 个 CN:画面崩 + 显存爆。
- Tile 没配合 upscale 用:Tile 的正确场景是超分,单独用效果奇怪。
- 所有 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——更轻量、更模块化。