4.2 ControlNet¶
所属章节:第 4 章 条件控制与个性化
课时:90 分钟
前置:SD 架构、Cross-Attention
对应面试题:A13
一句话目标:学完能画出 ControlNet 的 frozen base + trainable copy + zero convolution,并解释它为什么能在不破坏 SD 先验的情况下做空间控制。
1. 学习目标¶
学完本节,你应该能够:
- 解释 为什么文本 prompt 不足以做精确空间控制;
- 画出 ControlNet 的结构;
- 说明 冻结副本、可训练副本、零卷积的作用;
- 复述 ControlNet 的训练/推理流程;
- 解释 control scale、多 ControlNet 组合;
- 区分 ControlNet 与 T2I-Adapter/ControlNet-XS;
- 用 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 简化数据流¶
真实结构比这更细,但这个式子足够解释“条件怎么进去”。
4. 为什么零卷积有效¶
训练开始时:
- 零卷积输出为 0;
- ControlNet 对原模型没有影响;
- 模型仍是一个正常的 SD。
训练过程中:
- 零卷积逐渐学到非零权重;
- 条件分支逐步注入控制信息;
- 不会在初期破坏原模型。
一句话:
零初始化 = 稳定起步,渐进注入。
5. 训练流程¶
- 准备三元组:
- 控制图 \(c\)(Canny/Depth/Pose);
- 目标图 \(x_0\);
- 文本 caption。
- 冻结原 SD;
- 目标图经 VAE 编码成 latent;
- 加噪;
- 条件图经编码器 + 可训练副本注入;
- 预测噪声,算扩散损失;
- 只更新 ControlNet 分支/零卷积;
- 文本条件做 CFG dropout。
关键:
- 控制图是“结构条件”;
- 文本是“语义条件”;
- 两者可以同时使用。
6. 推理流程¶
- 输入控制图 + prompt;
- 预处理控制图(Canny/Depth/OpenPose);
- 通过
controlnet_conditioning_scale调节控制强度; - 多个 ControlNet 可叠加;
- 控制太强会僵硬/伪影,太弱不起作用;
- 支持 guess mode(无 prompt 时也按控制图生成)。
7. 为什么 ControlNet 能保留先验¶
- 冻结 base:不破坏原模型;
- 可训练副本:容量足够学习空间对应;
- 零卷积:初始无扰动,训练稳定;
- 条件编码器:把控制图映射到 latent 空间;
- 扩散损失:仍然学去噪,不需要额外判别器。
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. 常见误区¶
- 说 ControlNet 训练整个 SD:只训分支。
- 把零卷积说成普通卷积:零初始化是关键。
- 忽略控制图预处理:Canny/Depth/Pose 需要对应算法。
- 认为 control scale 越大越好:会僵硬/伪影。
- 把 ControlNet 和 IP-Adapter 混为一谈:前者空间,后者语义/风格。
12. 课堂练习¶
答案见 06 章节练习与答案。
- 画 ControlNet 结构。
- 解释零卷积。
- 说明训练/推理流程。
- 比较 ControlNet 与 T2I-Adapter。
- 用 90 秒回答 A13。
13. 自测清单¶
- [ ] 能画 frozen base + trainable copy;
- [ ] 能解释零卷积;
- [ ] 能复述训练流程;
- [ ] 能调 control scale;
- [ ] 能组合多个 ControlNet;
- [ ] 能 90 秒回答 A13。
14. 本节材料为什么这样设计¶
- 先讲“为什么需要”:文本控制的边界。
- 结构图 + 公式:面试常要求画图。
- 零卷积单列:最容易被追问。
- 训练/推理分开:避免只会说“加条件”。
- 不写代码:本节是架构和原理。
详细设计理由见 08 材料设计理由。