ComfyUI ControlNet 实战:用 OpenPose / Canny / Depth 精确控制构图与姿势

"ComfyUI 官方 Apply ControlNet 文档说明了节点输入、strength 范围以及 start_percent 和 end_percent 的含义。"
你有一张参考图,想让 AI 照着画:姿势要接近参考、线稿要准确、构图不能偏。生成结果却完全变了样,姿势歪了、线稿模糊、构图也不受控。
这时候可以用 ControlNet:用 OpenPose 控制姿势,用 Canny 提取边缘,用 Depth 保留空间关系。但装上后,strength 调多少?start_percent 和 end_percent 是什么意思?多个 ControlNet 怎么叠加才不冲突?
先按控制目标选对预处理器和模型,再调整强度与生效区间;如果结果仍然偏离参考图,就沿着工作流连接、底模匹配和参数冲突逐项排查。
“想控什么用哪种”速查表
遇到参考图,第一个问题通常是:该选哪个 ControlNet?下面的速查表按控制目标来选。
| 场景 | 控制类型 | 预处理器 | 常见 SD1.5 模型 |
|---|---|---|---|
| 想让人物按指定姿势生成 | 姿势控制 | OpenPose / DWPose | control_v11p_sd15_openpose |
| 想按参考图的线稿生成 | 线稿控制 | Canny | control_v11p_sd15_canny |
| 想固定场景的构图层次 | 深度构图 | Depth(MiDaS / LeReS) | control_v11f1p_sd15_depth |
| 想用手绘草稿当参考 | 手绘草稿 | Scribble | control_v11p_sd15_scribble |
| 想保留柔和轮廓 | 软边缘控制 | SoftEdge(HED / PiDiNet) | control_v11p_sd15_softedge |
选预处理器时有两个细节:
-
OpenPose 与 DWPose 都能输出姿势关键点。DWPose 通常能提供更完整的身体、手部和面部关键点;参考图需要控制手势或面部时,可以优先试 DWPose。
-
预处理器与 ControlNet 模型必须对应。用了 OpenPose 预处理器,就应加载接受姿势关键点输入的模型;如果控制图类型、模型和底模架构不匹配,结果可能几乎没有变化,也可能直接报错。
模型文件通常放在 ComfyUI 的 models/controlnet 目录。重启 ComfyUI 或刷新模型列表后,在 Load ControlNet Model 节点的下拉列表中选择它。
ControlNet 参数速查表
装好 ControlNet 后,最容易卡住的是 strength、start_percent、end_percent。下面这张表给出官方节点范围、起步值和调参直觉。
| 参数 | 取值范围 | 起步值 | 效果说明 | 典型测试方法 |
|---|---|---|---|---|
strength | 0–10 | 1.0 | 控制强度,值越大通常越贴近控制图 | 用相同 seed 从 1.0 小幅上调或下调;官方文档建议常在 0.5–1.5 间测试 |
start_percent | 0–1 | 0 | 控制开始介入扩散过程的位置 | 固定姿势或构图通常先从 0 开始,再按结果尝试延后 |
end_percent | 0–1 | 1 | 控制停止介入扩散过程的位置 | 约束太死时可尝试提前到 0.8 或更低,让后期细节恢复自由 |
start_percent / end_percent 的直觉理解
这两个参数不是等待时长,而是 ControlNet 的生效区间。比如 start_percent=0.2、end_percent=0.8,表示 ControlNet 只在扩散过程的 20%–80% 区间介入,前后部分不施加这条控制。
构图、姿势这类大结构往往在较早阶段形成,所以需要稳定姿势时,通常先让控制从 0 开始。如果结果过于僵硬,可以先保持 start_percent=0,把 end_percent 从 1 降到 0.8,让后期采样不再被控制图持续拉住。
全程生效(start_percent=0、end_percent=1)是清晰的基准。先用基准确认工作流确实生效,再只改一个参数,避免同时变更多个值后不知道是哪项产生了影响。
strength 调多少合适?
strength 决定 ControlNet 对生成结果的影响力度。0 表示不施加这条控制;数值越高,约束通常越强,但不同底模与 ControlNet 的反应并不相同。
先从 1.0 附近开始试。效果不明显就小幅上调,人物扭曲、线条变形或细节僵硬时就下调。ComfyUI 官方节点文档把 0.5–1.5 列为常用测试区间,但这不是所有 ControlNet 模型的固定“安全区间”,尤其不能直接套用到不同架构的模型。
工作流搭建步骤
ControlNet 工作流的核心链路是:加载底模与 ControlNet 模型,预处理参考图,把控制条件应用到 positive / negative conditioning,最后再交给 KSampler。
步骤 1:加载底模
节点:Load Checkpoint
- 选择你的 Stable Diffusion checkpoint。
- 记录它属于 SD1.5、SDXL 还是其他架构,后面必须选择兼容的 ControlNet。
- 使用节点输出的
MODEL、CLIP、VAE继续搭建基础文生图工作流。
步骤 2:加载 ControlNet 模型
节点:Load ControlNet Model
- 选择与底模架构和控制图类型相匹配的 ControlNet 模型。
- 节点输出
CONTROL_NET,后面接入 Apply ControlNet。
步骤 3:加载参考图并预处理
节点:Load Image + 预处理器节点,例如 OpenPose Preprocessor。
Load Image:上传参考图。- 预处理器:把参考图转换成姿势骨架、边缘图或深度图。
- Comfy Core 并不内置全部预处理器;需要时可通过 ComfyUI Manager 安装
comfyui_controlnet_aux。
预处理器提取出的控制图才是 ControlNet 真正读取的结构信号。为了排障,最好先预览控制图,确认骨架、边缘或深度信息本身没有缺失。
步骤 4:连接 ControlNet
节点:Apply ControlNet
control_net:来自 Load ControlNet Model。image:来自预处理器的输出,而不是未经处理的原图。positive:来自正向提示词 conditioning。negative:来自负向提示词 conditioning。strength:先设为 1.0。start_percent:先设为 0。end_percent:先设为 1。
Apply ControlNet 会输出新的 positive 和 negative conditioning。把这两个输出接到 KSampler;如果 KSampler 仍然接的是原始提示词 conditioning,这条 ControlNet 就没有进入采样链路。
步骤 5:生成并对比
节点:KSampler
model:来自 Load Checkpoint。positive/negative:来自 Apply ControlNet 的输出。latent_image:来自 Empty Latent Image 或其他 latent 输入。- 固定 seed 后再比较 ControlNet 开关与参数差异,避免随机种子掩盖控制效果。
节点连接时再检查三件事:
- Apply ControlNet 的 positive 和 negative 都已接入并输出到后续节点。
image端口接的是预处理后的控制图。- 早期工作流里的
Apply ControlNet(Old)已弃用,当前工作流应使用标准 Apply ControlNet 节点。
底模匹配对照
SD1.5、SDXL、FLUX 使用的 ControlNet 实现和权重并不通用。先确认底模,再按模型卡或官方工作流选择明确兼容的 ControlNet。
预处理器与模型对应表
| 预处理器 | SD1.5 常见模型 | SDXL 选择原则 | FLUX 选择原则 |
|---|---|---|---|
| Canny | control_v11p_sd15_canny | 选择明确标注 SDXL 且接受 Canny 控制图的模型 | 选择明确标注目标 FLUX 底模并支持 Canny 的模型 |
| OpenPose / DWPose | control_v11p_sd15_openpose | 选择明确标注 SDXL 且接受姿势关键点的模型 | 选择明确标注目标 FLUX 底模并支持 Pose 的模型 |
| Depth(MiDaS / LeReS) | control_v11f1p_sd15_depth | 选择明确标注 SDXL 且接受 Depth 控制图的模型 | 选择明确标注目标 FLUX 底模并支持 Depth 的模型 |
| Scribble | control_v11p_sd15_scribble | 选择明确标注 SDXL 且接受 Scribble 控制图的模型 | 先查具体模型是否支持 Scribble,而不是假定 Union 必然包含该模式 |
| SoftEdge(HED / PiDiNet) | control_v11p_sd15_softedge | 选择明确标注 SDXL 且接受 SoftEdge 控制图的模型 | 先查具体模型卡和工作流是否支持对应软边缘输入 |
Union 类模型把多种控制模式放进同一套权重,是 FLUX 工作流中的常见方案之一,但“支持哪些模式、用哪个节点、强度从多少开始”取决于具体模型与工作流版本。不要把某个社区模型的文件名和参数写成所有 FLUX ControlNet 的通用规则。
底模匹配对照表
| 底模类型 | ControlNet 选择 | 放置目录 | 注意事项 |
|---|---|---|---|
| SD1.5 | control_v11*_sd15_* 系列是常见选择 | ComfyUI/models/controlnet | 模型名中的 sd15 表示它面向 SD1.5,不兼容 SDXL |
| SDXL | 使用明确标注 SDXL 的 ControlNet 权重 | ComfyUI/models/controlnet | 同一控制类型可能有多个作者与实现,应按模型卡选择工作流 |
| FLUX | 使用明确标注兼容目标 FLUX 底模的 ControlNet 或 Union 模型 | ComfyUI/models/controlnet | 节点、控制模式和强度范围由具体模型决定,不能照搬 SD1.5 参数 |
底模选型建议
如果还没选定底模,可以先看 Stable Diffusion 模型选型指南。那篇文章负责比较底模特点和资源占用,这里只关注 ControlNet 兼容性。
模型文件放哪里?
ControlNet 模型通常放在 ComfyUI 的 models/controlnet 目录。下载后重启 ComfyUI 或刷新模型列表,在 Load ControlNet Model 节点中选择。
文件很多时,可以在不破坏管理工具识别的前提下用子目录分类;更重要的是保留来源和模型卡信息,不要只靠自己添加的文件名前缀判断架构。
多 ControlNet 叠加调参
想同时控制姿势和构图,可以串联多个 Apply ControlNet。叠加前先保证每个控制单独有效,否则多个问题混在一起会更难排查。
串联多个 Apply ControlNet 的步骤
叠加的核心是把前一个 Apply ControlNet 输出的 positive / negative conditioning 接到后一个同名输入。
-
第一个 ControlNet:
- 加载 OpenPose 模型与姿势控制图。
- 先测试
strength=1.0、start_percent=0、end_percent=0.7。
-
第二个 ControlNet:
- 加载 Depth 模型与深度控制图。
- 先测试较低的
strength=0.6、start_percent=0、end_percent=0.6。
-
连接顺序:
- 提示词 conditioning → 第一个 Apply ControlNet → 第二个 Apply ControlNet → KSampler。
- positive 和 negative 两条 conditioning 链都保持相同顺序。
这些数值只是排障用起点,不是最佳参数。姿势与构图都属于较早形成的大结构,所以通常先从扩散开始阶段介入,再通过不同强度和结束位置区分主次。
调参要点
叠加时先处理两个变量:主次和生效区间。
主次分明:
- 主控制先从 1.0 附近测试。
- 辅助控制先用更低的 strength,例如 0.5–0.7。
- 如果画面被两张控制图拉向不同方向,先降低辅助控制,而不是同时上调两者。
生效区间:
- 构图和姿势通常都需要在早期介入,可以把
start_percent保持在 0。 - 用不同的
end_percent控制约束持续多久,例如主控制到 0.7、辅助控制到 0.6。 - 需要后期细节更自由时,优先提前结束约束,而不是随意把控制推迟到扩散后半段。
再检查以下事项:
- 同类型叠加不是绝对禁止,但如果两张控制图表达相同结构,通常只会增加冲突和调参成本。
- 优先组合互补信号,例如 OpenPose + Depth 或 OpenPose + Canny。
- 先固定 seed,比对单控制和双控制结果。
- 两个 strength 不要一开始都设得很高。
- 每次只调整一个参数,并保存能复现的工作流。
- 单个 ControlNet 还没生效时,不要急着加入第二个。
排障清单
| 问题 | 可能原因 | 排查步骤 |
|---|---|---|
| 生成图和没加 ControlNet 一样 | 控制图没接入、strength 接近 0、KSampler 仍接原始 conditioning、模型与底模不匹配 | 预览控制图;检查 Apply ControlNet 的 image 与 conditioning 链;固定 seed 后对比开关;核对底模架构 |
| 姿势或线稿对不上参考图 | 预处理器类型不合适、控制图缺失关键结构、强度不足 | 检查骨架或边缘预览;换 DWPose / Canny 参数;小幅上调 strength 并逐次比较 |
| 画面僵硬或变形 | strength 过高、控制图噪声太多、约束持续到最后 | 降低 strength;清理控制图;把 end_percent 从 1 提前到 0.8 或更低 |
| 预处理器节点找不到 | 未安装对应自定义节点、依赖加载失败 | 在 ComfyUI Manager 中查找 comfyui_controlnet_aux;安装后重启;查看启动日志中的导入错误 |
| SDXL 或 FLUX 模型无法加载或不生效 | ControlNet 权重与底模架构或节点不兼容 | 回到模型卡核对底模、节点与示例工作流;不要仅凭文件名猜测兼容性 |
| 找不到 Apply ControlNet(Old) | 旧节点已弃用并默认隐藏 | 改用标准 Apply ControlNet;只有维护旧工作流时才考虑显示 deprecated nodes |
| 多个 ControlNet 互相冲突 | 控制图表达冲突、辅助强度过高、多个参数同时变化 | 单独验证每个控制;固定 seed;降低辅助强度;缩短生效区间;每次只改一项 |
| 参数改了仍看不出区别 | seed 未固定、参考图或控制图信息不足、控制链未进入采样器 | 固定 seed 和其他采样参数;预览控制图;核对 KSampler 的 positive / negative 来源 |
下一步
ControlNet 解决的是 prompt 之外的结构控制。完成基础工作流后,可以继续看这些内容:
- ComfyUI 入门安装与界面导航:如果还没装过 ComfyUI,或者对界面不熟悉,从这里开始。
- ComfyUI 工作流复用指南:保存、加载和排查缺失节点,避免每次重新搭工作流。
- Stable Diffusion Prompt 模板实战:ControlNet 负责结构,Prompt 负责主题、风格和细节。
在 ComfyUI 搭建基础 ControlNet 工作流
从底模、参考图和预处理器开始,把控制条件接入采样链路并验证效果。
- 1
步骤 1: 确认底模架构
先判断当前 checkpoint 属于 SD1.5、SDXL 还是 FLUX,再选择明确兼容该架构的 ControlNet。 - 2
步骤 2: 加载并预处理参考图
用 OpenPose、Canny 或 Depth 预处理器生成对应的姿势、边缘或深度控制图。 - 3
步骤 3: 加载 ControlNet 模型
把模型放入 ComfyUI/models/controlnet,并用 Load ControlNet Model 选择与预处理器匹配的模型。 - 4
步骤 4: 连接 Apply ControlNet
接入 positive、negative、control_net 和预处理后的 image,再把输出 conditioning 送入 KSampler。 - 5
步骤 5: 用固定 seed 调参
先测试 strength 1.0、start_percent 0、end_percent 1,再根据约束强弱逐项调整。 - 6
步骤 6: 叠加前逐个验证
每个 ControlNet 单独生效后再串联,明确主次并降低辅助控制的强度或生效范围。
常见问题
OpenPose 和 DWPose 有什么区别?
ControlNet 的 strength 调多少合适?
start_percent 和 end_percent 怎么理解?
多个 ControlNet 能一起用吗?
FLUX 应该用哪个 ControlNet?
12 分钟阅读 · 发布于: 2026年7月19日 · 修改于: 2026年7月19日
ComfyUI 与 Stable Diffusion 专题:入门、工作流、模型选择与提示词
如果你是从搜索进入这篇文章,建议顺手补上上一篇或继续下一篇,这样更容易把同一主题读完整。



评论
使用 GitHub 账号登录后即可评论