ComfyUI 中的 ControlNet 系统通过引入边缘检测、深度图、姿势和其他视觉引导等附加条件输入,实现了对图像生成的精确控制。本页面描述了 ComfyUI 中 ControlNet 系统的架构和实现。
有关 T2I Adapters(一种替代的控制机制)的信息,请参阅下面的相关部分,因为它们与 ControlNets 具有相似的实现方式。
ControlNet 系统由几个核心类组成,这些类处理条件过程的各个方面。该系统与注意力机制和 UNet 架构深度集成。
来源: comfy/controlnet.py66-197 comfy/controlnet.py199-294 comfy/controlnet.py356-411 comfy/controlnet.py465-478 comfy/controlnet.py749-806 comfy/cldm/cldm.py60-351 comfy/ldm/modules/attention.py616-647
ControlNet 系统支持多种实现方式,以适应不同的模型架构。
| Control 类型 | 描述 | 模型兼容性 |
|---|---|---|
| 标准 ControlNet | 经典实现 | SD 1.x, SD 2.x |
| ControlLora | 使用 LoRA 权重实现,内存效率高 | SD 1.x, SD 2.x |
| ControlNetSD35 | SD 3.5 模型的特殊实现 | SD 3.5 |
| T2I Adapter | 替代控制机制,架构不同 | SD 1.x, SD 2.x, SDXL |
| MMDIT ControlNet | MMDiT 架构的实现 | SD 3 |
| Flux ControlNet | Flux 模型的实现 | Flux, XLabs, Mistoline |
| HunYuan ControlNet | HunYuan 模型的实现 | HunYuan DiT |
来源: comfy/controlnet.py444-462 comfy/controlnet.py480-537 comfy/controlnet.py541-557 comfy/controlnet.py560-582 comfy/t2i_adapter/adapter.py103-162
ControlNet 通过明确定义的控制流与扩散采样过程集成。
来源: comfy/controlnet.py217-227 comfy/controlnet.py228-274 comfy/controlnet.py101-104 comfy/controlnet.py110-117
ControlBase 类提供了所有 ControlNet 实现的基础,其主要职责包括:
来源: comfy/controlnet.py66-87 comfy/controlnet.py88-95 comfy/controlnet.py101-104 comfy/controlnet.py106-108 comfy/controlnet.py110-117 comfy/controlnet.py154-193
主要的 ControlNet 类实现了标准的 ControlNet 行为。
来源: comfy/controlnet.py199-216 comfy/controlnet.py217-274 comfy/controlnet.py289-294
ControlNet 的一个关键方面是处理条件图像
cond_hint_original) 在调用 set_cond_hint 时被保存来源: comfy/controlnet.py233-258 comfy/controlnet.py259-261
ControlLora 使用 LoRA(Low-Rank Adaptation)提供了一种内存高效的实现
pre_run 的方法使用基础 UNet 架构构建了一个轻量级的控制模型来源: comfy/controlnet.py356-362 comfy/controlnet.py364-396 comfy/controlnet.py296-354
T2I Adapters 是 ControlNets 的一种替代方案,具有不同的架构
来源: comfy/controlnet.py749-769 comfy/controlnet.py779-795 comfy/t2i_adapter/adapter.py103-162 comfy/t2i_adapter/adapter.py270-299
ComfyUI 为不同的 ControlNet 架构实现了多个专用加载器
来源: comfy/controlnet.py588-746 comfy/controlnet.py444-462 comfy/controlnet.py480-537 comfy/controlnet.py541-557 comfy/controlnet.py560-582
ControlNet 提供不同的方法来应用控制强度
StrengthType.CONSTANT:在所有层上应用均匀的强度StrengthType.LINEAR_UP:在后续层中逐渐施加更强的控制影响控制强度在 control_merge 方法中应用,该方法处理强度应用和多个控制信号的合并
来源: comfy/controlnet.py62-65 comfy/controlnet.py154-193
ControlNet 通过几个专用节点与节点系统集成
当采样节点执行时,它会在每个步骤调用 ControlNet 的 get_control 方法,该方法根据当前时间步和其他参数将控制应用于扩散过程。
ControlNet 实现包括 VRAM 优化策略
ModelPatcher 包装器管理模型的加载/卸载cleanup 方法确保使用后释放资源inference_memory_requirements 方法有助于预测内存需求来源: comfy/controlnet.py110-117 comfy/controlnet.py149-152 comfy/controlnet.py410-411
Union ControlNet 使单个模型能够同时处理多种控制类型。它使用任务嵌入和 Transformer 层来处理不同的控制模式
Union ControlNet 的实现包括:
task_embedding:每个控制类型的可学习嵌入control_add_embedding:基于控制类型的额外条件union_controlnet_merge:通过基于注意力机制的融合处理多个控制输入来源: comfy/cldm/cldm.py321-378 comfy/cldm/cldm.py353-378 comfy/cldm/cldm.py388-430
可以使用 set_previous_controlnet 链接多个控件,从而创建按顺序应用的控件序列
当调用链中最后一个 ControlNet 的 get_control 方法时,它会递归调用之前的 ControlNet 并合并它们的输出。
来源:comfy/controlnet.py106-108 comfy/controlnet.py217-227
ControlNet 与 ComfyUI 的优化注意力系统集成
optimized_attention 进行高效计算CrossAttention 处理文本条件与视觉控制信号SpatialTransformer 处理 ControlNet 块中的空间注意力来源:comfy/controlnet.py296-354 comfy/ldm/modules/attention.py576-614 comfy/cldm/cldm.py19-32 comfy/ldm/modules/attention.py616-647
对于 Flux 或 SD3.5 等专用模型,实现了自定义操作
ControlLoraOps 为 LoRA 提供了自定义的 Linear 和 Conv2d 操作来源:comfy/controlnet.py296-354 comfy/ldm/flux/controlnet.py14-41 comfy/ldm/flux/controlnet.py42-76
ComfyUI 中的 ControlNet 系统为控制扩散模型提供了一个灵活且可扩展的框架。其模块化设计支持多种控制类型和模型架构,从而能够精确地指导图像生成过程。