菜单

ControlNet 系统

相关源文件

ComfyUI 中的 ControlNet 系统通过引入边缘检测、深度图、姿势和其他视觉引导等附加条件输入,实现了对图像生成的精确控制。本页面描述了 ComfyUI 中 ControlNet 系统的架构和实现。

有关 T2I Adapters(一种替代的控制机制)的信息,请参阅下面的相关部分,因为它们与 ControlNets 具有相似的实现方式。

架构概述

ControlNet 系统由几个核心类组成,这些类处理条件过程的各个方面。该系统与注意力机制和 UNet 架构深度集成。

ControlNet 类层次结构

ControlNet 模型架构

来源: 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

Control 类型和实现

ControlNet 系统支持多种实现方式,以适应不同的模型架构。

Control 类型描述模型兼容性
标准 ControlNet经典实现SD 1.x, SD 2.x
ControlLora使用 LoRA 权重实现,内存效率高SD 1.x, SD 2.x
ControlNetSD35SD 3.5 模型的特殊实现SD 3.5
T2I Adapter替代控制机制,架构不同SD 1.x, SD 2.x, SDXL
MMDIT ControlNetMMDiT 架构的实现SD 3
Flux ControlNetFlux 模型的实现Flux, XLabs, Mistoline
HunYuan ControlNetHunYuan 模型的实现HunYuan DiT

来源: comfy/controlnet.py444-462 comfy/controlnet.py480-537 comfy/controlnet.py541-557 comfy/controlnet.py560-582 comfy/t2i_adapter/adapter.py103-162

Control 流和集成

ControlNet 通过明确定义的控制流与扩散采样过程集成。

来源: comfy/controlnet.py217-227 comfy/controlnet.py228-274 comfy/controlnet.py101-104 comfy/controlnet.py110-117

ControlBase 类

ControlBase 类提供了所有 ControlNet 实现的基础,其主要职责包括:

  1. 维护条件提示(原始和处理后的)
  2. 管理强度和应用参数
  3. 处理何时应用控制的时间步长范围
  4. 合并来自多个链式控件的输出
  5. 管理清理和 VRAM 资源

关键方法

来源: 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 类实现了标准的 ControlNet 行为。

来源: comfy/controlnet.py199-216 comfy/controlnet.py217-274 comfy/controlnet.py289-294

控制图像处理

ControlNet 的一个关键方面是处理条件图像

  1. 原始图像 (cond_hint_original) 在调用 set_cond_hint 时被保存
  2. 在执行期间,图像会根据 UNet 的潜在分辨率调整到所需的分辨率
  3. 如果需要 VAE 编码(用于潜在空间控制),则使用提供的 VAE 对图像进行编码
  4. 对于某些 ControlNet 类型,会应用额外的预处理(例如 Canny 边缘检测归一化)

来源: comfy/controlnet.py233-258 comfy/controlnet.py259-261

ControlLora 实现

ControlLora 使用 LoRA(Low-Rank Adaptation)提供了一种内存高效的实现

  1. 它不加载完整的 ControlNet 模型,而是使用更小的 LoRA 权重
  2. 名为 pre_run 的方法使用基础 UNet 架构构建了一个轻量级的控制模型
  3. 自定义的线性层和卷积操作负责应用 LoRA 权重

来源: comfy/controlnet.py356-362 comfy/controlnet.py364-396 comfy/controlnet.py296-354

T2I Adapter

T2I Adapters 是 ControlNets 的一种替代方案,具有不同的架构

  1. 它们使用更简单的架构,包含像素解扰和 ResNet 块
  2. 适配器处理图像,在多个分辨率下生成特征图
  3. 然后,这些特征图会在相应分辨率下应用于 UNet

来源: comfy/controlnet.py749-769 comfy/controlnet.py779-795 comfy/t2i_adapter/adapter.py103-162 comfy/t2i_adapter/adapter.py270-299

专用 ControlNet 加载器

ComfyUI 为不同的 ControlNet 架构实现了多个专用加载器

来源: comfy/controlnet.py588-746 comfy/controlnet.py444-462 comfy/controlnet.py480-537 comfy/controlnet.py541-557 comfy/controlnet.py560-582

控制强度与应用

ControlNet 提供不同的方法来应用控制强度

  1. StrengthType.CONSTANT:在所有层上应用均匀的强度
  2. StrengthType.LINEAR_UP:在后续层中逐渐施加更强的控制影响

控制强度在 control_merge 方法中应用,该方法处理强度应用和多个控制信号的合并

来源: comfy/controlnet.py62-65 comfy/controlnet.py154-193

与 ComfyUI 节点系统的集成

ControlNet 通过几个专用节点与节点系统集成

  1. ControlNetLoader:从检查点文件中加载 ControlNet 模型
  2. ControlNetApply:在采样过程中将加载的 ControlNet 应用到模型
  3. T2IAdapterLoader:加载 T2I Adapter 模型
  4. 各种预处理器:为特定控制类型(例如 Canny、Depth、Pose)准备图像

当采样节点执行时,它会在每个步骤调用 ControlNet 的 get_control 方法,该方法根据当前时间步和其他参数将控制应用于扩散过程。

VRAM 管理

ControlNet 实现包括 VRAM 优化策略

  1. ModelPatcher 包装器管理模型的加载/卸载
  2. ControlLora 使用内存高效的 LoRA 实现
  3. cleanup 方法确保使用后释放资源
  4. inference_memory_requirements 方法有助于预测内存需求

来源: comfy/controlnet.py110-117 comfy/controlnet.py149-152 comfy/controlnet.py410-411

高级特性

Union ControlNet

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

链接多个 ControlNet

可以使用 set_previous_controlnet 链接多个控件,从而创建按顺序应用的控件序列

当调用链中最后一个 ControlNet 的 get_control 方法时,它会递归调用之前的 ControlNet 并合并它们的输出。

来源:comfy/controlnet.py106-108 comfy/controlnet.py217-227

注意力机制集成

ControlNet 与 ComfyUI 的优化注意力系统集成

  • 使用注意力模块中的 optimized_attention 进行高效计算
  • 支持多种注意力后端:XFormers、Flash Attention、PyTorch SDPA、Sage 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

自定义 Control 操作

对于 Flux 或 SD3.5 等专用模型,实现了自定义操作

  1. ControlLoraOps 为 LoRA 提供了自定义的 Linear 和 Conv2d 操作
  2. 特殊的预处理器处理特定模型的模型要求
  3. 适用于 DiT 和 Flux 等架构的自定义 Control 块
  4. 模型特定的注意力模式和条件机制

来源:comfy/controlnet.py296-354 comfy/ldm/flux/controlnet.py14-41 comfy/ldm/flux/controlnet.py42-76

结论

ComfyUI 中的 ControlNet 系统为控制扩散模型提供了一个灵活且可扩展的框架。其模块化设计支持多种控制类型和模型架构,从而能够精确地指导图像生成过程。