ControlNet#
本页内容4 个部分
1. 动机#
Cross-Attention 让模型理解"画什么"(语义),但无法精确控制"画在哪"(空间结构)。例如"一只猫坐在椅子上"——猫的姿态、椅子的角度完全由模型自由发挥。ControlNet(Zhang et al., 2023)解决的就是:在不破坏预训练 SD 的前提下,加入像素级空间控制。
2. 架构设计#
- 复制 U-Net 的 Encoder 半边作为 ControlNet 分支(包括模型权重)
- 每个 encoder block 的输出通过 zero-convolution(1×1 卷积,权重和偏置初始化为 0)连接回原 U-Net 的对应层
- 原 U-Net 参数完全冻结,只训练 ControlNet 分支 + zero-convolution
zero-convolution 为什么关键?
初始化为 0 意味着训练开始时,ControlNet 分支的输出对原 U-Net 没有任何影响——模型的初始状态等价于原始 SD。训练过程中,zero-conv 的参数从 0 逐渐学到有意义的值,ControlNet 的影响"渐进式"地注入。如果用随机初始化的卷积,训练初期会向 U-Net 注入噪声,破坏预训练权重。
3. 支持的条件类型#
| 条件 | 输入格式 | 典型用途 |
|---|---|---|
| Canny 边缘 | 二值图 | 保持物体轮廓 |
| 深度图 | 灰度 | 保持空间纵深 |
| 人体姿态 | OpenPose 骨架图 | 控制人物动作 |
| 语义分割图 | 类别 mask | 控制场景布局 |
| 法线图 / 光流 | 控制表面光照 / 时序运动 |
4. 多 ControlNet 组合#
多个 ControlNet 可以同时使用(如 Canny + 深度图),各自的 zero-conv 输出直接相加到 U-Net 对应层。每个 ControlNet 有独立的 conditioning_scale 权重控制影响强度。
**面试要点:**ControlNet 的核心是 zero-convolution + 冻结原模型。zero-conv 保证训练初期不破坏预训练权重,冻结策略便于在兼容基座上复用 ControlNet,但同架构不保证与所有微调权重都兼容或保持效果。对于视频生成,ControlNet 思路被广泛借鉴——用深度序列、光流引导时序一致性。