跳转至

4.2 ControlNet

所属章节:第 4 章 条件控制与个性化
课时:90 分钟
前置:SD 架构、Cross-Attention
对应面试题:A13
一句话目标:学完能画出 ControlNet 的 frozen base + trainable copy + zero convolution,并解释它为什么能在不破坏 SD 先验的情况下做空间控制。


1. 学习目标

学完本节,你应该能够:

  1. 解释 为什么文本 prompt 不足以做精确空间控制;
  2. 画出 ControlNet 的结构;
  3. 说明 冻结副本、可训练副本、零卷积的作用;
  4. 复述 ControlNet 的训练/推理流程;
  5. 解释 control scale、多 ControlNet 组合;
  6. 区分 ControlNet 与 T2I-Adapter/ControlNet-XS;
  7. 用 90 秒回答 A13。

2. 为什么需要 ControlNet

文本能控制“生成什么”,但很难精确控制:

  • 人物姿态;
  • 物体边缘;
  • 深度/透视;
  • 房间布局;
  • 手部骨架;
  • 线稿上色。

ControlNet 的目标:

在不破坏预训练 SD 生成能力的前提下,注入一张“空间条件图”。


3. 结构:冻结 + 可训练副本

3.1 冻结的基础模型

  • 原 SD UNet 的编码器/中间块;
  • 参数冻结;
  • 保留预训练知识。

3.2 可训练副本

  • 复制同一部分编码器/中间块;
  • 参数可训练;
  • 接收条件图特征。

3.3 条件编码器

  • 把 Canny/Depth/OpenPose 等控制图编码成特征;
  • 通常是小卷积网络;
  • 输出与 latent 空间对齐。

3.4 零卷积

  • \(1\times1\) 卷积;
  • 权重和偏置初始化为 0;
  • 连接可训练副本与冻结解码器/基础特征。

3.5 简化数据流

\[ h_{\mathrm{base}} =\mathrm{LockedEncoder}(z_t), \]
\[ h_{\mathrm{cond}} =\mathrm{TrainableEncoder} \left(z_t+\mathrm{CondEncoder}(c)\right), \]
\[ h_{\mathrm{out}} =h_{\mathrm{base}} +\mathrm{ZeroConv}(h_{\mathrm{cond}}). \]

真实结构比这更细,但这个式子足够解释“条件怎么进去”。


4. 为什么零卷积有效

训练开始时:

  • 零卷积输出为 0;
  • ControlNet 对原模型没有影响;
  • 模型仍是一个正常的 SD。

训练过程中:

  • 零卷积逐渐学到非零权重;
  • 条件分支逐步注入控制信息;
  • 不会在初期破坏原模型。

一句话:

零初始化 = 稳定起步,渐进注入。


5. 训练流程

  1. 准备三元组:
  2. 控制图 \(c\)(Canny/Depth/Pose);
  3. 目标图 \(x_0\);
  4. 文本 caption。
  5. 冻结原 SD;
  6. 目标图经 VAE 编码成 latent;
  7. 加噪;
  8. 条件图经编码器 + 可训练副本注入;
  9. 预测噪声,算扩散损失;
  10. 只更新 ControlNet 分支/零卷积;
  11. 文本条件做 CFG dropout。

关键:

  • 控制图是“结构条件”;
  • 文本是“语义条件”;
  • 两者可以同时使用。

6. 推理流程

  • 输入控制图 + prompt;
  • 预处理控制图(Canny/Depth/OpenPose);
  • 通过 controlnet_conditioning_scale 调节控制强度;
  • 多个 ControlNet 可叠加;
  • 控制太强会僵硬/伪影,太弱不起作用;
  • 支持 guess mode(无 prompt 时也按控制图生成)。

7. 为什么 ControlNet 能保留先验

  1. 冻结 base:不破坏原模型;
  2. 可训练副本:容量足够学习空间对应;
  3. 零卷积:初始无扰动,训练稳定;
  4. 条件编码器:把控制图映射到 latent 空间;
  5. 扩散损失:仍然学去噪,不需要额外判别器。

8. 变体

方法 特点
ControlNet 1.1 更多条件类型,训练更稳
T2I-Adapter 更轻量,插入式适配器
ControlNet-XS 更小、更快
ControlNet++ 改进条件一致性与训练

面试时知道“有轻量替代”即可,不必展开每个变体。


9. 90 秒回答:ControlNet 的核心原理

面试官问:介绍一下 ControlNet 的核心原理。

参考回答:

“ControlNet 在冻结的 SD 旁边复制一份可训练的编码器/中间块,用条件编码器把 Canny/Depth/Pose 等控制图注入进去,再通过零初始化卷积把特征加回原模型。零卷积初始为 0,所以训练开始时不影响原模型,之后逐渐学会注入空间条件。训练只更新 ControlNet 分支,base 冻结,因此保留生成先验;推理时用 control scale 调节强度,也可以叠加多个 ControlNet。”


10. 追问与回答

追问 1:为什么复制编码器,而不是只加一个 adapter?

编码器容量更大,能学到更强的空间对应;adapter 更轻,但控制能力通常弱一些。

追问 2:为什么零卷积不是普通卷积?

零卷积的初始输出为 0,保证训练初期不破坏原模型;普通卷积初始有随机输出,会引入噪声。

追问 3:ControlNet 训练整个 SD 吗?

不。base 冻结,只训练 ControlNet 分支/零卷积。

追问 4:多个 ControlNet 怎么组合?

每个 ControlNet 输出特征相加/加权;条件冲突时需要调 scale 或减少条件。


11. 常见误区

  1. 说 ControlNet 训练整个 SD:只训分支。
  2. 把零卷积说成普通卷积:零初始化是关键。
  3. 忽略控制图预处理:Canny/Depth/Pose 需要对应算法。
  4. 认为 control scale 越大越好:会僵硬/伪影。
  5. 把 ControlNet 和 IP-Adapter 混为一谈:前者空间,后者语义/风格。

12. 课堂练习

答案见 06 章节练习与答案。

  1. 画 ControlNet 结构。
  2. 解释零卷积。
  3. 说明训练/推理流程。
  4. 比较 ControlNet 与 T2I-Adapter。
  5. 用 90 秒回答 A13。

13. 自测清单

  • [ ] 能画 frozen base + trainable copy;
  • [ ] 能解释零卷积;
  • [ ] 能复述训练流程;
  • [ ] 能调 control scale;
  • [ ] 能组合多个 ControlNet;
  • [ ] 能 90 秒回答 A13。

14. 本节材料为什么这样设计

  • 先讲“为什么需要”:文本控制的边界。
  • 结构图 + 公式:面试常要求画图。
  • 零卷积单列:最容易被追问。
  • 训练/推理分开:避免只会说“加条件”。
  • 不写代码:本节是架构和原理。

详细设计理由见 08 材料设计理由。


15. 下一节

4.3 IP-Adapter