ControlNet
通过边缘/深度/姿态等条件信号精确控制 Stable Diffusion 生成结构的扩散模型控制器
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
通过边缘/深度/姿态等条件信号精确控制 Stable Diffusion 生成结构的扩散模型控制器
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
ControlNet 是一款通过添加额外条件信号,实现对 Stable Diffusion 等扩散模型生成结果进行精细结构控制的开源神经网络架构。
想象你是一名建筑设计师,用 AI 生成建筑草图时,你告诉 AI「画一栋现代风格的大楼」,AI 可能给你一栋欧式古典风格——提示词(Prompt)对生成结果的控制力有限,尤其是对空间结构、边缘线条、人体姿态这类几何信息的把控力几乎为零。
2023 年初,一篇由腾讯 ARC 实验室(张吕亿等研究者)发布的论文带来了转折。ControlNet 的核心思想是:不给扩散模型「下命令」,而是给扩散模型装上「眼睛」——让它在看懂输入图像的结构信息(边缘图、深度图、姿态骨架)后,再去生成对应的画面。这就像教 AI 先「读图」再「作画」,而不是靠模糊的文本描述去「猜」。
图1:ControlNet 支持同时应用多种条件信号进行联合控制
ControlNet 的出现直接引爆了 AI 绘画社区。在 GitHub 上,它获得了超过 33,000 颗星,成为有史以来最受欢迎的 AI 生成(AIGC)相关开源项目之一。如今,几乎所有主流 AI 绘画工具(Stable Diffusion WebUI、ComfyUI 等)都将 ControlNet 作为核心扩展模块。
ControlNet 的架构设计极其巧妙。它并非从头训练一个全新的扩散模型,而是采用「双分支 + 零卷积」策略,将额外的条件信息注入到预训练的扩散模型中:
1. 锁分支(Locked Branch) 原始的 Stable Diffusion(SD)模型权重被完整冻结,保证模型原有的生成能力不被破坏。
2. 可训练分支(Trainable Branch) 在扩散模型 Encoder 的每个层级旁边,新增一个结构完全相同的可训练副本。这个分支负责学习如何理解新的条件信号(边缘、深度、姿态等)。
3. 零卷积(Zero Convolution) 两个分支通过零初始化的 1×1 卷积层相连。在训练初期,这些卷积层的输出为零,因此新增分支不会对原始模型产生任何干扰——模型相当于「无痛」地接入了新能力。随着训练推进,零卷积逐渐学习到合适的权重,实现平滑过渡。
这种设计让 ControlNet 可以高效训练(仅需约 1 块 RTX 3090 显卡,约 300 小时),同时兼容 SD 1.5、SD 2.x 等多个版本。
图2:输入 Canny 边缘检测图,ControlNet 生成精确匹配的图像
ControlNet 生态最强大的地方在于其丰富的条件检测器(Annotator),每个检测器负责从输入图像中提取特定类型的结构信息:
| 检测器 | 功能 | 典型场景 |
|---|---|---|
| Canny | 边缘检测 | 保持建筑轮廓、产品设计 |
| HED | 软边缘( Holistically-Nested Edge) | 艺术线条、人物轮廓 |
| Depth | 深度图估计 | 三维结构保持、场景重建 |
| Normal | 法线图(物体表面朝向) | 立体感保持 |
| Semantic Segmentation | 语义分割 | 区域内容控制 |
| OpenPose | 人体姿态骨架 | 精确动作生成 |
| MLSD | 直线检测(无曲率线条) | 建筑、室内设计 |
| Scribble | 手绘涂鸦 | 草图生图 |
| SoftEdge | 柔和边缘 | 艺术风格保持 |
这些检测器位于仓库的 annotator/ 目录下,部分提供了 Gradio WebUI 接口(gradio_annotator.py),可以直接在浏览器中测试效果。
图3:OpenPose 姿态控制——输入骨架图,生成对应动作的人物图像
训练方面,仓库提供了完整的训练脚本:
tutorial_train.py — SD 1.x 版本训练tutorial_train_sd21.py — SD 2.x 版本训练tutorial_dataset.py / tutorial_dataset_test.py — 数据集处理训练数据通过 ldm/data/ 目录的 Dataset 类管理。训练框架选用 PyTorch Lightning,配置通过 environment.yaml 统一管理依赖(Python 3.8.5 + PyTorch 1.12.1 + CUDA 11.3)。
推理方面,仓库提供了 8 个 Gradio WebUI 脚本,分别对应不同的控制模式:
gradio_canny2image.py — Canny 边缘 → 图像生成gradio_depth2image.py — 深度图 → 图像生成gradio_pose2image.py — 姿态 → 图像生成gradio_seg2image.py — 语义分割 → 图像生成gradio_hed2image.py — 软边缘 → 图像生成gradio_normal2image.py — 法线图 → 图像生成gradio_scribble2image.py — 涂鸦 → 图像生成gradio_hough2image.py — 霍夫变换 → 图像生成gradio_fake_scribble2image.py — 伪涂鸦 → 图像生成gradio_scribble2image_interactive.py — 交互式涂鸦生成开发者还可以使用 tool_add_control.py(SD 1.x)或 tool_add_control_sd21.py(SD 2.x)将 ControlNet 作为工具集成到自有管线中。
ControlNet 必须使用 NVIDIA GPU 运行,推荐配置:
仓库提供了 environment.yaml(Conda 环境文件),可以一键还原依赖环境,但不支持 Docker 部署。部署流程需要手动下载 Stable Diffusion 模型权重和对应的 ControlNet 权重文件(存放在 models/ 目录),这增加了上手门槛。
ControlNet 并非完美无缺:
docs/low_vram.md 提供了低显存优化方案,但会影响生成速度。ControlNet 的发布是 2023 年 AIGC 领域最重要的事件之一。它证明了「文本生成」和「结构控制」可以解耦——这为后续大量多模态控制工具(如 T2I-Adapter、ControlNet-XS 等)奠定了范式基础。
目前,ControlNet 的生态已渗透到几乎所有主流 AI 图像生成平台:Stable Diffusion WebUI 的 ControlNet 扩展、ComfyUI 的 ControlNet 节点、Diffusers 库的 ControlNet 实现、HuggingFace Spaces 演示页面等。
| 指标 | 数据 |
|---|---|
| GitHub Stars | 33,893+ |
| Forks | 3,016 |
| 主要语言 | Python |
| 许可证 | Apache-2.0 |
| 核心框架 | PyTorch + PyTorch Lightning |
对于想要深入 AIGC 领域的开发者来说,ControlNet 是一个不可绕过的里程碑级项目——无论你是想使用它提升 AI 绘画的精确度,还是想学习其条件注入架构设计,都能从中获得巨大价值。