核心要点

  • 冻结原扩散 U-Net,复制其编码器部分作为可训练副本,专门学习空间条件

  • 条件图(Canny 边缘、OpenPose 姿态、深度、分割等)作为额外输入接入可训练分支

  • 两分支通过零卷积(zero-conv,初始权重为 0)连接,训练初期不扰动原模型

  • 零卷积让条件信号渐进式注入主干,既保留原模型能力又获得空间可控性

标准回答

要解决的问题

文生图只能用文字粗略描述构图,难以精确控制人物姿态、物体轮廓、深度布局。ControlNet 让扩散模型接受空间条件图(如边缘、姿态骨架、深度图、语义分割),实现像素级可控生成。

结构:可训练副本 + 冻结主干

ControlNet 冻结原始 U-Net(保住预训练能力),同时复制一份其编码器作为可训练分支。空间条件图先编码,喂入这个可训练副本;副本各层的输出再加回原 U-Net 解码器对应层,从而把条件信息注入去噪过程。

零卷积(zero-conv)是关键

可训练分支与主干之间用 1×1 卷积连接,且该卷积权重初始化为 0。训练刚开始时它输出 0,等于完全不改变原模型,避免一上来就破坏预训练知识;随着训练,零卷积权重逐渐学到非零值,把空间条件渐进式注入。这让小数据也能稳定微调出强可控能力。

使用

一个底模可挂多个 ControlNet(边缘 + 姿态叠加),在 ComfyUI 等工具中常与文本提示、CFGDDIM 采样组合,精确控制构图同时保留底模画风。

常见误区

⚠️ 常见踩坑

ControlNet 不是重训整个扩散模型,而是冻结底模、只训练复制出的编码器副本;零卷积初始为 0 是为了「训练起步不破坏原模型」,别误以为它永远输出 0 或没有作用。

追问

追问 1零卷积初始化为 0 有什么意义?

保证训练第一步 ControlNet 分支对主干的贡献为 0,输出与原模型完全一致,从而不破坏预训练权重、训练更稳定。随后零卷积逐步学到非零权重,条件信号被平滑、渐进地注入,避免梯度震荡和能力退化。

追问 2ControlNet 和 LoRA 在可控生成上有何分工?

ControlNet 注入的是空间结构条件(轮廓、姿态、深度),控制「画成什么样的构图」;LoRA 是低秩微调,改变风格、人物或概念,控制「画成什么风格」。二者可叠加:LoRA 定风格、ControlNet 定构图。

追问 3常见的 ControlNet 条件类型有哪些?

常见有 Canny/HED 边缘、OpenPose 人体姿态、深度图(MiDaS)、法线图、语义分割、涂鸉(scribble)、线稿(lineart)等。每类训练独立的 ControlNet 权重,对应不同的空间引导需求,可按场景单用或组合。

延伸学习

与本题相关的知识库文章、术语、工具与行业资讯。