ControlNet 实战:让 AI 严格按你画的来——按姿势出图、线稿上色、深度控图
上一篇我们讲完了图生图、局部重绘和放大。这三种手段已经能应付大部分改图需求,但它们有一个共同的局限:控制都是间接的。你靠提示词描述想要的姿势,AI「理解」得靠碰运气;你重绘一个区域,边缘画到哪里、手部摆成什么样,最终仍由模型随机决定。
商业稿件不是这样交付的。客户给的参考图上有明确的姿势、明确的构图、明确的轮廓线,「差不多」就是不合格。ControlNet 正是解决这个问题的技术:让 AI 严格按你指定的构图、姿势、结构出图,而不是「参考着大概画一个」。它是从「能用 AI 出图」到「能接商稿」的分水岭。
一、ControlNet 是什么
一句话定义:ControlNet 是一种给扩散模型附加「图像条件约束」的技术——你提供一张约束图(骨架、线稿、深度图等),模型在去噪的每一步都被强制服从这张图的结构信息。
它为什么重要?原生 SDXL 只理解文字,文字是模糊的("一个抬手的女孩"可以有一百种抬法)。ControlNet 让模型从「理解文字」跨越到「服从图像约束」:你画什么骨架,人就摆什么姿势;你给什么线稿,成品就保留什么轮廓。生成结果从「抽卡」变成「定向交付」。
安装与环境
实测环境:Mac mini M4(32G 统一内存)+ ComfyUI Desktop + SDXL 基础模型。
| 项目 | 说明 |
|---|---|
| 节点安装 | ComfyUI Manager → 搜索 ComfyUI ControlNet Auxiliary Preprocessors(预处理器,从普通图片提取骨架/线稿/深度图)→ Install |
| 核心加载节点 | ComfyUI 原生自带 Load Diffusion Model(或旧版 ControlNet Loader),无需额外安装 |
| 模型存放目录 | ComfyUI/models/controlnet/ |
| 模型来源 | Hugging Face lllyasviel/ControlNet-v1-1(SD1.5)或 diffusers/controlnet-*sdxl*、xinsir 系列(SDXL) |
注意:ControlNet 模型与基础模型版本强绑定。 用 SDXL 出图,必须下载 SDXL 版本的 ControlNet;SD1.5 的模型文件放进去也加载不出来或效果全错。这是新手最常见的坑,文末避坑指南会展开。
二、三种核心控制方式对比
ControlNet 家族成员众多,但覆盖 90% 商稿场景的是这三种:
| 控制方式 | 控制什么 | 输入约束图 | 典型场景 | SDXL 对应模型 |
|---|---|---|---|---|
| 姿态控制(OpenPose) | 人体骨架:动作、手势、体态 | OpenPose 骨架图(火柴人) | 按指定姿势出图、舞蹈动作定制、多人构图 | controlnet-openpose-sdxl-1.0.safetensors(thibaud 系列)或 xinsir-controlnet-openpose-sdxl |
| 线稿控制(Canny / Lineart) | 边缘与轮廓:物体形状、构图框架 | Canny 边缘图 / Lineart 线稿 | 按线稿上色、草图转成图、保持产品轮廓 | controlnet-canny-sdxl-1.0.safetensors、xinsir-controlnet-lineart-sdxl |
| 深度控制(Depth) | 空间层次:远近、遮挡、透视 | 深度图(灰度,近亮远暗) | 按构图层次替换场景、3D 渲染图转 2D 插画、改风格保结构 | controlnet-depth-sdxl-1.0.safetensors 或 xinsir-controlnet-depth-sdxl |
三者的取舍逻辑:
- 只要姿势对,不管长相细节 → OpenPose(约束最松,生成自由度最大)
- 轮廓必须一模一样 → Canny / Lineart(约束最紧,适合设计线稿落地)
- 保持画面空间结构,但内容可换 → Depth(介于两者之间)
三、姿态控制(OpenPose)详解
工作原理
OpenPose 预处理器从一张真人照片提取「火柴人骨架」——头顶、肩、肘、腕、髋、膝、踝的关键点连线。ControlNet 只拿骨架当条件,不参考原图的长相、服装、光影,所以同一个骨架可以生成完全不同的人物。约束精准且干净,这是它成为最常用方式的原因。
操作步骤
Load Image加载一张姿态参考图(真人照片,或直接用骨架图)- 若加载的是真人照片:接
OpenPose Preprocessor(来自 Auxiliary Preprocessors 包),输出骨架图;若已有骨架图可跳过 Load Diffusion Model节点加载 SDXL 版 OpenPose ControlNet 模型,目录选controlnet- 节点连接:ControlNet 模型 →
Apply ControlNet的 control_net 输入;Load Checkpoint(SDXL 底模)→ model;骨架图 → image;正向/负向提示词 → positive / negative Apply ControlNet输出的 positive / negative 接到 KSampler- 采样器照常设置(DPM++ 2M Karras、steps 25-30),出图
典型应用
- 按指定姿势出图:客户提供一张姿势参考,提取骨架后换人物、换服装、换场景
- 舞蹈/动作定制:连续动作截图逐帧提骨架,批量生成风格统一的序列
- 多人构图:一张多人骨架图固定每个人的位置和动作,避免人物粘连、肢体混乱
- 表情与手部:OpenPose 的 face/hand 模式可额外约束表情和手指姿态(对治「AI 手崩坏」有效,但需要参考图本身手部清晰)
参数建议
| 参数 | 建议值 | 说明 |
|---|---|---|
| strength | 0.7–1.0 | 姿态约束较松,通常给足 |
| start_percent / end_percent | 0.0 / 0.8 | 末段放开,让细节自由发挥 |
| 预处理器 | DWPose 或 OpenPose (body+hands) | DWPose 对复杂动作识别更准 |
四、线稿控制(Canny / Lineart)详解
Canny 与 Lineart 的区别
两者都以「边缘线」为约束,但提取方式不同:
| 项目 | Canny | Lineart |
|---|---|---|
| 来源 | 算法边缘检测,双阈值提取 | 神经网络生成的「画师风格线稿」 |
| 线条特征 | 均匀、机械、含大量纹理边缘 | 粗细有致、接近手绘、自动忽略杂纹 |
| 适用输入 | 照片、渲染图 | 真正的草图、白描线稿 |
| 约束强度 | 极紧(连背景纹理都锁) | 紧但更「聪明」,留有风格余地 |
实操建议:照片转边缘图用 Canny,画师线稿直接喂 Lineart。不要把照片直接当 Lineart 输入。
操作步骤
Load Image加载线稿/草图- 草图类输入接
Lineart Preprocessor;照片类输入接Canny Edge Preprocessor(低阈值 50-100、高阈值 150-250) Load Diffusion Model加载 Canny 或 Lineart 的 SDXL 版 ControlNet- 连接方式与 OpenPose 完全一致:预处理输出 → Apply ControlNet 的 image,模型 → control_net
- 提示词描述线稿之外的信息:配色、材质、光影、风格
- KSampler 出图,先低分辨率试结构,确认后接放大
典型应用
- 按线稿上色:线稿完整,ControlNet 锁轮廓,提示词控制配色与材质
- 按草图出成图:粗糙速写 + Lineart 预处理,草图直接变成品插画
- 保持物体轮廓:产品图换背景换材质,轮廓一像素不跑(商稿刚需)
参数建议
| 参数 | 建议值 | 说明 |
|---|---|---|
| strength | 0.6–0.9 | 过高会让成品保留「线条感」不上色干净 |
| start / end percent | 0.0 / 1.0 | 轮廓约束通常贯穿全程 |
| Canny 阈值 | 100 / 200 起步 | 线条缺失调低阈值;噪点太多调高 |
| 预处理分辨率 | 匹配目标出图尺寸 | 开启 pixel perfect |
五、深度控制(Depth)详解
工作原理
Depth 预处理器生成灰度深度图:离镜头越近越亮,越远越暗。ControlNet 把它当作空间结构约束,让模型在保持画面透视、遮挡、前后层次的同时,自由更换具体内容。
操作步骤
Load Image加载场景图(或 3D 渲染图)- 接
Depth Preprocessor(如 Midas / Depth Anything),输出灰度深度图 Load Diffusion Model加载 SDXL 版 Depth ControlNet- 连接方式与前两种一致:深度图 → Apply ControlNet 的 image,模型 → control_net
- 提示词描述要保留的结构之外的新内容(新场景、新风格)
- KSampler 出图
典型应用
- 按构图层次替换场景:保留原图的前后景关系,换成不同内容
- 3D 渲染图转 2D 插画:锁住三维空间结构,换成插画风格
- 改风格保结构:同一场景换成不同画风,空间关系不变
参数建议
| 参数 | 建议值 | 说明 |
|---|---|---|
| strength | 0.6–0.9 | 深度约束较强,太高会限制内容自由发挥 |
| start / end percent | 0.0 / 1.0 | 结构约束通常贯穿全程 |
| 预处理器 | Depth Anything | 对复杂场景的边缘细节识别更准 |
六、关键参数详解
无论哪种控制方式,ControlNet 节点上这几个参数都通用,直接影响生成效果:
| 参数 | 作用 | 建议值 | 调低 | 调高 |
|---|---|---|---|---|
| strength | 控制强度,约束图对结果的影响力 | 0.6–1.0 | 约束减弱,AI 自由发挥 | 过头会生硬、抑制细节 |
| start_percent | 控制生效的起始采样位置 | 0.0 | 提前生效 | 延后生效 |
| end_percent | 控制结束的采样位置 | 0.8–1.0 | 提前放开,尾部自由 | 全程锁死 |
| pixel perfect | 自动匹配预处理与出图分辨率 | 开启 | 关闭易产生错位 | 开启更准 |
| control_mode | 约束与提示词的优先级 | balance | control 优先时更贴约束图 | balance 时两者均衡 |
start/end percent 是精细控制的利器:比如只想用 ControlNet 固定前 80% 的构图,末尾 20% 放开让皮肤、发丝更自然,就把 end 设 0.8。这是很多「控制得很死又很自然」作品的来源。
七、ControlNet 与局部重绘配合
第 4 篇讲了局部重绘,但它有个隐患:蒙版重绘区域内的内容,模型仍可能偏离原图结构(比如改了背景,人物姿势却跟着变了)。用 ControlNet 可以锁住结构,只改蒙版区域的内容。
配合要点:
- 在重绘工作流里,把 ControlNet(通常用 OpenPose 或 Depth)接入,约束蒙版区域的整体结构
- strength 要适当降低到 0.5–0.7,因为重绘本来就在小范围改动,控制过强会抑制新内容的生成,导致「改不动」
- 蒙版范围 + ControlNet 约束两者结合,实现「结构不动、内容按需换」的精准修改
八、避坑指南
- 模型版本不匹配:SD1.5 的 ControlNet 文件不能用于 SDXL 出图,加载会出错或效果全错。下载时确认文件名带
sdxl,或来自diffusers/controlnet-*sdxl*、xinsir系列。 - strength 过高抑制生成:控制强度拉满,成品会生硬、细节缺失,甚至复制约束图的瑕疵。先低后高,够用即可。
- 输入图尺寸不对:约束图和出图尺寸差异过大,会导致错位、构图扭曲。开启 pixel perfect,或手动把约束图调整到接近出图尺寸。
- ControlNet 节点找不到模型:模型没放进
models/controlnet/,或放进了checkpoints/。移动到正确目录后刷新。 - 预处理器没装:OpenPose/Canny/Depth 预处理器来自
ControlNet Auxiliary Preprocessors包,没装的话节点会报缺依赖。
相关资源
- ControlNet SDXL 模型:Hugging Face 搜
xinsir-controlnet-sdxl系列、diffusers/controlnet-*-sdxl - 预处理器插件:ComfyUI Manager 搜
ControlNet Auxiliary Preprocessors - ComfyUI 官方:https://github.com/comfyanonymous/ComfyUI
下一篇进入批量出图与工作流自动化——从一张到一千张。批量处理、参数组合、CSV 输入,这是从「单张交付」走向「规模化接单」的关键,也是把前面几篇学的技能真正变成产出效率的临门一脚。