核心要点
冻结原扩散 U-Net,复制其编码器部分作为可训练副本,专门学习空间条件
条件图(Canny 边缘、OpenPose 姿态、深度、分割等)作为额外输入接入可训练分支
两分支通过零卷积(zero-conv,初始权重为 0)连接,训练初期不扰动原模型
零卷积让条件信号渐进式注入主干,既保留原模型能力又获得空间可控性
标准回答
要解决的问题
文生图只能用文字粗略描述构图,难以精确控制人物姿态、物体轮廓、深度布局。ControlNet 让扩散模型接受空间条件图(如边缘、姿态骨架、深度图、语义分割),实现像素级可控生成。
结构:可训练副本 + 冻结主干
ControlNet 冻结原始 U-Net(保住预训练能力),同时复制一份其编码器作为可训练分支。空间条件图先编码,喂入这个可训练副本;副本各层的输出再加回原 U-Net 解码器对应层,从而把条件信息注入去噪过程。
零卷积(zero-conv)是关键
可训练分支与主干之间用 1×1 卷积连接,且该卷积权重初始化为 0。训练刚开始时它输出 0,等于完全不改变原模型,避免一上来就破坏预训练知识;随着训练,零卷积权重逐渐学到非零值,把空间条件渐进式注入。这让小数据也能稳定微调出强可控能力。
使用
一个底模可挂多个 ControlNet(边缘 + 姿态叠加),在 ComfyUI 等工具中常与文本提示、CFG、DDIM 采样组合,精确控制构图同时保留底模画风。
常见误区
⚠️ 常见踩坑
ControlNet 不是重训整个扩散模型,而是冻结底模、只训练复制出的编码器副本;零卷积初始为 0 是为了「训练起步不破坏原模型」,别误以为它永远输出 0 或没有作用。
追问
追问 1:零卷积初始化为 0 有什么意义?
保证训练第一步 ControlNet 分支对主干的贡献为 0,输出与原模型完全一致,从而不破坏预训练权重、训练更稳定。随后零卷积逐步学到非零权重,条件信号被平滑、渐进地注入,避免梯度震荡和能力退化。
追问 2:ControlNet 和 LoRA 在可控生成上有何分工?
ControlNet 注入的是空间结构条件(轮廓、姿态、深度),控制「画成什么样的构图」;LoRA 是低秩微调,改变风格、人物或概念,控制「画成什么风格」。二者可叠加:LoRA 定风格、ControlNet 定构图。
追问 3:常见的 ControlNet 条件类型有哪些?
常见有 Canny/HED 边缘、OpenPose 人体姿态、深度图(MiDaS)、法线图、语义分割、涂鸉(scribble)、线稿(lineart)等。每类训练独立的 ControlNet 权重,对应不同的空间引导需求,可按场景单用或组合。
延伸学习
与本题相关的知识库文章、术语、工具与行业资讯。
📚 知识库
📖 术语表
🛠️ AI 工具
- ComfyUI
节点式 Diffusion 模型 GUI,109,363+ stars。基于节点的工作流编排,可视化连接各处理模块,是最强大的图像生成工作流工具,支持 SDXL、Flux、Stable Cascade 等最新模型