生成模型 / 条件生成 原理笔记进阶 2 分钟阅读 查看源文件 ↗

ControlNet#

本页内容4 个部分

1. 动机#

Cross-Attention 让模型理解"画什么"(语义),但无法精确控制"画在哪"(空间结构)。例如"一只猫坐在椅子上"——猫的姿态、椅子的角度完全由模型自由发挥。ControlNet(Zhang et al., 2023)解决的就是:在不破坏预训练 SD 的前提下,加入像素级空间控制。

2. 架构设计#

  1. 复制 U-Net 的 Encoder 半边作为 ControlNet 分支(包括模型权重)
  2. 每个 encoder block 的输出通过 zero-convolution(1×1 卷积,权重和偏置初始化为 0)连接回原 U-Net 的对应层
  3. 原 U-Net 参数完全冻结,只训练 ControlNet 分支 + zero-convolution

zero-convolution 为什么关键?

初始化为 0 意味着训练开始时,ControlNet 分支的输出对原 U-Net 没有任何影响——模型的初始状态等价于原始 SD。训练过程中,zero-conv 的参数从 0 逐渐学到有意义的值,ControlNet 的影响"渐进式"地注入。如果用随机初始化的卷积,训练初期会向 U-Net 注入噪声,破坏预训练权重。

3. 支持的条件类型#

条件 输入格式 典型用途
Canny 边缘 H×W×1H\times W\times1 二值图 保持物体轮廓
深度图 H×W×1H\times W\times1 灰度 保持空间纵深
人体姿态 OpenPose 骨架图 控制人物动作
语义分割图 H×W×CH\times W\times C 类别 mask 控制场景布局
法线图 / 光流 H×W×3H\times W\times3 控制表面光照 / 时序运动

4. 多 ControlNet 组合#

多个 ControlNet 可以同时使用(如 Canny + 深度图),各自的 zero-conv 输出直接相加到 U-Net 对应层。每个 ControlNet 有独立的 conditioning_scale 权重控制影响强度。

**面试要点:**ControlNet 的核心是 zero-convolution + 冻结原模型。zero-conv 保证训练初期不破坏预训练权重,冻结策略便于在兼容基座上复用 ControlNet,但同架构不保证与所有微调权重都兼容或保持效果。对于视频生成,ControlNet 思路被广泛借鉴——用深度序列、光流引导时序一致性。