切换主题

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

Easton editorial illustration: central orange ControlNet node with visible input and output sockets, three compact reference tiles showing a pose skeleton, Canny edges, and depth contours, one framed output portrait whose pose and composition match the reference tiles

"ComfyUI 官方 Apply ControlNet 文档说明了节点输入、strength 范围以及 start_percent 和 end_percent 的含义。"

你有一张参考图,想让 AI 照着画:姿势要接近参考、线稿要准确、构图不能偏。生成结果却完全变了样,姿势歪了、线稿模糊、构图也不受控。

这时候可以用 ControlNet:用 OpenPose 控制姿势,用 Canny 提取边缘,用 Depth 保留空间关系。但装上后,strength 调多少?start_percentend_percent 是什么意思?多个 ControlNet 怎么叠加才不冲突?

先按控制目标选对预处理器和模型,再调整强度与生效区间;如果结果仍然偏离参考图,就沿着工作流连接、底模匹配和参数冲突逐项排查。

“想控什么用哪种”速查表

遇到参考图,第一个问题通常是:该选哪个 ControlNet?下面的速查表按控制目标来选。

场景控制类型预处理器常见 SD1.5 模型
想让人物按指定姿势生成姿势控制OpenPose / DWPosecontrol_v11p_sd15_openpose
想按参考图的线稿生成线稿控制Cannycontrol_v11p_sd15_canny
想固定场景的构图层次深度构图Depth(MiDaS / LeReS)control_v11f1p_sd15_depth
想用手绘草稿当参考手绘草稿Scribblecontrol_v11p_sd15_scribble
想保留柔和轮廓软边缘控制SoftEdge(HED / PiDiNet)control_v11p_sd15_softedge

选预处理器时有两个细节:

  1. OpenPose 与 DWPose 都能输出姿势关键点。DWPose 通常能提供更完整的身体、手部和面部关键点;参考图需要控制手势或面部时,可以优先试 DWPose。

  2. 预处理器与 ControlNet 模型必须对应。用了 OpenPose 预处理器,就应加载接受姿势关键点输入的模型;如果控制图类型、模型和底模架构不匹配,结果可能几乎没有变化,也可能直接报错。

模型文件通常放在 ComfyUI 的 models/controlnet 目录。重启 ComfyUI 或刷新模型列表后,在 Load ControlNet Model 节点的下拉列表中选择它。

ControlNet 参数速查表

装好 ControlNet 后,最容易卡住的是 strengthstart_percentend_percent。下面这张表给出官方节点范围、起步值和调参直觉。

参数取值范围起步值效果说明典型测试方法
strength0–101.0控制强度,值越大通常越贴近控制图用相同 seed 从 1.0 小幅上调或下调;官方文档建议常在 0.5–1.5 间测试
start_percent0–10控制开始介入扩散过程的位置固定姿势或构图通常先从 0 开始,再按结果尝试延后
end_percent0–11控制停止介入扩散过程的位置约束太死时可尝试提前到 0.8 或更低,让后期细节恢复自由

start_percent / end_percent 的直觉理解

这两个参数不是等待时长,而是 ControlNet 的生效区间。比如 start_percent=0.2end_percent=0.8,表示 ControlNet 只在扩散过程的 20%–80% 区间介入,前后部分不施加这条控制。

构图、姿势这类大结构往往在较早阶段形成,所以需要稳定姿势时,通常先让控制从 0 开始。如果结果过于僵硬,可以先保持 start_percent=0,把 end_percent 从 1 降到 0.8,让后期采样不再被控制图持续拉住。

全程生效(start_percent=0end_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。
  • 使用节点输出的 MODELCLIPVAE 继续搭建基础文生图工作流。

步骤 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 开关与参数差异,避免随机种子掩盖控制效果。

节点连接时再检查三件事:

  1. Apply ControlNet 的 positive 和 negative 都已接入并输出到后续节点。
  2. image 端口接的是预处理后的控制图。
  3. 早期工作流里的 Apply ControlNet(Old) 已弃用,当前工作流应使用标准 Apply ControlNet 节点。

底模匹配对照

SD1.5、SDXL、FLUX 使用的 ControlNet 实现和权重并不通用。先确认底模,再按模型卡或官方工作流选择明确兼容的 ControlNet。

预处理器与模型对应表

预处理器SD1.5 常见模型SDXL 选择原则FLUX 选择原则
Cannycontrol_v11p_sd15_canny选择明确标注 SDXL 且接受 Canny 控制图的模型选择明确标注目标 FLUX 底模并支持 Canny 的模型
OpenPose / DWPosecontrol_v11p_sd15_openpose选择明确标注 SDXL 且接受姿势关键点的模型选择明确标注目标 FLUX 底模并支持 Pose 的模型
Depth(MiDaS / LeReS)control_v11f1p_sd15_depth选择明确标注 SDXL 且接受 Depth 控制图的模型选择明确标注目标 FLUX 底模并支持 Depth 的模型
Scribblecontrol_v11p_sd15_scribble选择明确标注 SDXL 且接受 Scribble 控制图的模型先查具体模型是否支持 Scribble,而不是假定 Union 必然包含该模式
SoftEdge(HED / PiDiNet)control_v11p_sd15_softedge选择明确标注 SDXL 且接受 SoftEdge 控制图的模型先查具体模型卡和工作流是否支持对应软边缘输入

Union 类模型把多种控制模式放进同一套权重,是 FLUX 工作流中的常见方案之一,但“支持哪些模式、用哪个节点、强度从多少开始”取决于具体模型与工作流版本。不要把某个社区模型的文件名和参数写成所有 FLUX ControlNet 的通用规则。

底模匹配对照表

底模类型ControlNet 选择放置目录注意事项
SD1.5control_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 接到后一个同名输入。

  1. 第一个 ControlNet:

    • 加载 OpenPose 模型与姿势控制图。
    • 先测试 strength=1.0start_percent=0end_percent=0.7
  2. 第二个 ControlNet:

    • 加载 Depth 模型与深度控制图。
    • 先测试较低的 strength=0.6start_percent=0end_percent=0.6
  3. 连接顺序:

    • 提示词 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。
  • 需要后期细节更自由时,优先提前结束约束,而不是随意把控制推迟到扩散后半段。

再检查以下事项:

  1. 同类型叠加不是绝对禁止,但如果两张控制图表达相同结构,通常只会增加冲突和调参成本。
  2. 优先组合互补信号,例如 OpenPose + Depth 或 OpenPose + Canny。
  3. 先固定 seed,比对单控制和双控制结果。
  4. 两个 strength 不要一开始都设得很高。
  5. 每次只调整一个参数,并保存能复现的工作流。
  6. 单个 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 搭建基础 ControlNet 工作流

从底模、参考图和预处理器开始,把控制条件接入采样链路并验证效果。

  1. 1

    步骤 1: 确认底模架构

    先判断当前 checkpoint 属于 SD1.5、SDXL 还是 FLUX,再选择明确兼容该架构的 ControlNet。
  2. 2

    步骤 2: 加载并预处理参考图

    用 OpenPose、Canny 或 Depth 预处理器生成对应的姿势、边缘或深度控制图。
  3. 3

    步骤 3: 加载 ControlNet 模型

    把模型放入 ComfyUI/models/controlnet,并用 Load ControlNet Model 选择与预处理器匹配的模型。
  4. 4

    步骤 4: 连接 Apply ControlNet

    接入 positive、negative、control_net 和预处理后的 image,再把输出 conditioning 送入 KSampler。
  5. 5

    步骤 5: 用固定 seed 调参

    先测试 strength 1.0、start_percent 0、end_percent 1,再根据约束强弱逐项调整。
  6. 6

    步骤 6: 叠加前逐个验证

    每个 ControlNet 单独生效后再串联,明确主次并降低辅助控制的强度或生效范围。

常见问题

OpenPose 和 DWPose 有什么区别?
两者都把人物姿势转换为关键点控制图。DWPose 通常能提供更完整的身体、手部和面部关键点;如果只需要大体姿势,OpenPose 也可以。两者常与同一类 OpenPose ControlNet 模型配合,但仍要按模型说明核对输入格式。
ControlNet 的 strength 调多少合适?
先从 1.0 附近开始,用相同 seed 比较结果。约束不明显时小幅上调,画面僵硬或变形时下调;0.5–1.5 是官方节点文档给出的常用测试区间,不是所有模型的固定安全值。
start_percent 和 end_percent 怎么理解?
它们定义 ControlNet 在扩散过程中的生效区间。例如 0.0–0.8 表示从开始介入,到 80% 时停止;固定整体姿势或构图通常从 0 开始,再通过提前结束给后期细节更多自由。
多个 ControlNet 能一起用吗?
可以。把前一个 Apply ControlNet 的 positive 和 negative 输出接到后一个同名输入,再把最后输出接入采样器。先分别验证每个控制,再降低辅助控制强度、缩短生效区间,避免信号互相拉扯。
FLUX 应该用哪个 ControlNet?
使用明确标注兼容目标 FLUX 底模和当前 ComfyUI 工作流的 ControlNet。Union 类模型是常见方案之一,但支持的控制类型、节点和强度范围取决于具体模型卡,不能直接照搬 SD1.5 的文件名或参数。

12 分钟阅读 · 发布于: 2026年7月19日 · 修改于: 2026年7月19日

当前属于系列阅读第 5 / 5 篇

ComfyUI 与 Stable Diffusion 专题:入门、工作流、模型选择与提示词

如果你是从搜索进入这篇文章,建议顺手补上上一篇或继续下一篇,这样更容易把同一主题读完整。

查看系列总览

相关文章

BetterLink

想持续收到这个主题的更新?

你可以直接关注作者更新、订阅 RSS,或者继续沿着系列入口往下读,避免下次又回到搜索结果重新找。

关注公众号

评论

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

Easton BlogEaston Blog