ControlNet

GitHub
33.8k 3k 中等 30 次阅读 今天Apache-2.0图像
AI 解读 由 AI 自动生成,仅供参考

ControlNet 是一款专为扩散模型设计的开源神经网络结构,旨在让用户通过添加额外条件来精确控制图像生成过程。对于 Stable Diffusion 而言,这意味着不再仅仅依赖文本提示,而是可以结合边缘检测、人体姿态或深度图等输入,实现对构图和细节的精准把控。

ControlNet 巧妙解决了微调大模型容易破坏原有能力的痛点。它采用“零卷积”技术,将网络权重复制为“锁定”和“可训练”两部分。训练初期零卷积输出为零,确保原模型不受干扰,仅需少量图像对即可学习新条件,且无需从头训练,保护了生产级模型的完整性。此外,它还支持低显存模式,显著降低了硬件门槛。

无论是追求算法优化的开发者、进行实验的研究人员,还是需要精准素材的设计师,都能从 ControlNet 中受益。配合丰富的预训练模型和多种控制方式,它能帮助用户在个人设备上高效创作出符合预期的高质量图像,是提升 AI 绘图可控性的理想选择。

使用场景

独立游戏美术师小张负责主角的多套皮肤设计,要求在不同配色下严格保持同一动作帧。

没有 ControlNet 时

  • 仅靠文本提示词很难精确控制人物关节角度,生成的动作经常扭曲或比例失调。
  • 为了匹配特定姿势,需要反复重绘数十次,不仅浪费显卡资源还严重拖慢进度。
  • 每次生成的背景透视和角色位置随机飘移,导致多张素材无法拼合成连续动画。
  • 想要微调局部细节(如手部握剑姿势)几乎不可能,只能重新训练模型或手动修图。

使用 ControlNet 后

  • 通过 OpenPose 或 Canny 边缘检测,直接锁定参考图的骨架结构与轮廓线条。
  • 固定姿势约束后,仅需调整服装风格提示词,即可批量产出符合要求的皮肤变体。
  • 生成成功率大幅提升,原本需要半天调试的素材现在半小时即可完成。
  • 确保所有角色立绘在构图、透视和动态上一致,完美适配游戏引擎的动画绑定需求。

ControlNet 将不确定的扩散模型转化为可精准操控的生产力工具,彻底解决了创意落地中的构图失控难题。

运行环境要求

操作系统
  • 未说明
GPU

需要 GPU,建议 8GB 显存(支持 Low VRAM 模式)

内存

未说明

依赖
notes需使用 conda 创建环境并加载 environment.yaml;模型及检测器需从 Hugging Face 页面下载;若显存不足可使用 Low VRAM 模式;部分功能依赖 Gradio 交互界面。
python未说明
gradio
ControlNet hero image

快速开始

新闻:ControlNet (控制网络) 1.1 的夜间版本已发布!

ControlNet 1.1 已发布。在我们确认一切正常后,这些新模型将合并到此仓库中。

以下是 ControlNet 1.0

向文本到图像扩散模型 (Diffusion Models) 添加条件控制 的官方实现。

ControlNet 是一种神经网络 (Neural Network) 结构,通过添加额外条件来控制扩散模型。

img

它将神经网络块的权重复制到一个“锁定”副本和一个“可训练”副本中。

“可训练”的那个学习你的条件。“锁定”的那个保留你的模型。

得益于这一点,使用少量图像对数据集进行训练不会破坏生产就绪的扩散模型。

“零卷积 (Zero Convolution)”是权重和偏置均初始化为零的 1×1 卷积。

在训练之前,所有零卷积输出为零,ControlNet 不会引起任何失真。

没有任何层是从头开始训练的。你仍然是在微调 (Fine-tuning)。你的原始模型是安全的。

这使得在小型甚至个人设备上训练成为可能。

这也便于模型/权重/块/层的合并/替换/偏移操作。

常见问题解答 (FAQ)

问: 等等,如果卷积层的权重为零,梯度 (Gradient) 也会为零,网络将无法学习任何东西。为什么“零卷积”有效?

答: 并非如此。在此查看解释

稳定扩散 (Stable Diffusion) + ControlNet

通过重复上述简单结构 14 次,我们可以这样控制稳定扩散:

img

通过这种方式,ControlNet 可以重用SD 编码器 (Encoder) 作为深度、强大、鲁棒且功能强大的骨干 (Backbone) 来学习多样化的控制。许多证据(如 )验证了 SD 编码器是一个优秀的骨干。

请注意,我们连接层的方式计算效率高。原始 SD 编码器不需要存储梯度(锁定的原始 SD 编码器块 1234 和中层)。尽管添加了多层,但所需的 GPU 显存 (GPU Memory) 并不比原始 SD 大多少。太棒了!

功能与新闻

2023/0/14 - 我们发布了 ControlNet 1.1。在我们确认一切正常后,这些新模型将合并到此仓库中。

2023/03/03 - 我们发布了一个讨论主题 - 预计算 ControlNet:将 ControlNet 速度提升 45%,但这有必要吗?

2023/02/26 - 我们发布了一篇博客 - 消融研究 (Ablation Study):为什么 ControlNet 使用深度编码器?如果它更轻呢?或者甚至是多层感知机 (MLP)?

2023/02/20 - 非提示模式的实现已发布。另见 猜测模式/非提示模式

2023/02/12 - 现在您可以通过 转移 ControlNet 来尝试使用任何社区模型。

2023/02/11 - 添加了 低显存 (VRAM) 模式。如果您使用 8GB GPU 或想要更大的批次大小 (Batch Size),请使用此模式。

生产就绪的预训练模型

首先创建一个新的 Conda 环境

conda env create -f environment.yaml
conda activate control

所有模型和检测器 (Detectors) 均可从 我们的 Hugging Face 页面 下载。请确保 SD 模型放在 "ControlNet/models" 中,检测器放在 "ControlNet/annotator/ckpts" 中。请确保从该 Hugging Face 页面下载所有必要的预训练权重和检测器模型,包括 HED 边缘检测模型、Midas 深度估计模型、Openpose 等。

我们提供了 9 个带有这些模型的 Gradio 应用程序。

所有测试图片都可以在 "test_imgs" 文件夹中找到。

带有 Canny 边缘的 ControlNet

Stable Diffusion 1.5 + ControlNet(使用简单的 Canny 边缘检测)

python gradio_canny2image.py

Gradio 应用程序还允许您更改 Canny 边缘阈值。只需尝试一下以获取更多详细信息。

Prompt: "bird" p

Prompt: "cute dog" p

带有 M-LSD 线条的 ControlNet

Stable Diffusion 1.5 + ControlNet(使用简单的 M-LSD 直线检测)

python gradio_hough2image.py

Gradio 应用程序还允许您更改 M-LSD 阈值。只需尝试一下以获取更多详细信息。

Prompt: "room" p

Prompt: "building" p

带有 HED 边界的 ControlNet

Stable Diffusion 1.5 + ControlNet(使用软 HED 边界)

python gradio_hed2image.py

软 HED 边界将保留输入图像中的许多细节,使此应用程序适合重新着色和风格化。只需尝试一下以获取更多详细信息。

Prompt: "oil painting of handsome old man, masterpiece" p

Prompt: "Cyberpunk robot" p

带有用户涂鸦的 ControlNet

Stable Diffusion 1.5 + ControlNet(使用涂鸦)

python gradio_scribble2image.py

请注意,UI 基于 Gradio,而 Gradio 在某些方面难以自定义。目前,您需要在外部的 UI 之外绘制涂鸦(使用您喜欢的绘图软件,例如 MS Paint),然后将涂鸦图像导入 Gradio。

Prompt: "turtle" p

Prompt: "hot air balloon" p

交互式界面

我们实际上提供了一个交互式界面

python gradio_scribble2image_interactive.py

然而,由于 gradio 非常 有 bug 且难以自定义,目前,用户需要先设置画布宽度和高度,然后点击“打开绘图画布”以获得绘图区域。请勿将图像上传到该绘图画布。此外,绘图区域非常小;应该更大。但我无法找出如何使其更大。再次强调,gradio 确实有很多 bug。(现已修复,将尽快更新)

下面的狗草图是我画的。也许我们应该画一只更好的狗来展示。

Prompt: "dog in a room" p

带有假涂鸦的 ControlNet

Stable Diffusion 1.5 + ControlNet(使用假涂鸦)

python gradio_fake_scribble2image.py

有时我们很懒,不想画涂鸦。这个脚本使用完全相同的基于涂鸦的模型,但使用简单的算法从输入图像合成涂鸦。

Prompt: "bag" p

Prompt: "shose"(注意:"shose" 是个拼写错误;应该是"shoes"。但它似乎仍然有效。) p

ControlNet with Human Pose

Stable Diffusion 1.5 + ControlNet(使用人体姿态)

python gradio_pose2image.py

显然,这个模型值得拥有一个更好的用户界面来直接操作姿态骨架。然而,Gradio 在某种程度上难以定制。目前你需要输入一张图片,然后 Openpose 会为你检测姿态。

Prompt: "Chief in the kitchen" p

Prompt: "An astronaut on the moon" p

ControlNet with Semantic Segmentation

Stable Diffusion 1.5 + ControlNet(使用语义分割)

python gradio_seg2image.py

该模型使用 ADE20K 的分割协议。同样,这个模型值得拥有一个更好的用户界面来直接绘制分割区域。然而,Gradio 在某种程度上难以定制。目前你需要输入一张图片,然后一个名为 Uniformer 的模型会为你检测分割结果。尝试一下以了解更多详情。

Prompt: "House" p

Prompt: "River" p

ControlNet with Depth

Stable Diffusion 1.5 + ControlNet(使用深度图)

python gradio_depth2image.py

太好了!现在 SD 1.5 也支持深度控制。终于如此。可能性无穷无尽(考虑到 SD1.5 拥有比 SD2 多得多的社区模型)。

请注意,与 Stability 的模型不同,ControlNet 接收完整的 512×512 深度图,而不是 64×64 深度图。请注意,Stability 的 SD2 深度模型使用 64*64 深度图。这意味着 ControlNet 将在深度图中保留更多细节。

这始终是一个优势,因为如果用户不想保留更多细节,他们可以直接使用另一个 SD 对图像到图像 (i2i) 进行后处理。但如果他们想要保留更多细节,ControlNet 就成了唯一的选择。再次强调,SD2 使用 64×64 深度,而我们使用 512×512。

Prompt: "Stormtrooper's lecture" p

ControlNet with Normal Map

Stable Diffusion 1.5 + ControlNet(使用法线图)

python gradio_normal2image.py

该模型使用法线图。目前在 APP 中,法线是根据 midas 深度图和用户阈值计算得出的(用于判断哪些区域是背景且法线正对观察者,调整 gradio 应用中的“法线背景阈值”来感受效果)。

Prompt: "Cute toy" p

Prompt: "Plaster statue of Abraham Lincoln" p

与深度模型相比,该模型似乎在保留几何结构方面表现更好。这是直观的:细微细节在深度图中并不显著,但在法线图中却很显著。下面是相同输入的深度结果。你可以看到输入图像中男子的发型被深度模型修改了,但被法线模型保留了。

Prompt: "Plaster statue of Abraham Lincoln" p

ControlNet with Anime Line Drawing

我们还训练了一个相对简单的用于动漫线条画的 ControlNet。该工具可能对艺术创作有用。(尽管结果中的图像细节略有修改,因为它仍然扩散潜在图像。)

该模型目前不可用。我们需要在发布此模型之前评估潜在风险。尽管如此,你可能对 将 ControlNet 转移到任何社区模型 感兴趣。

p

Guess Mode / Non-Prompt Mode

“猜测模式”(或称为无提示词模式)将完全释放非常强大的 ControlNet 编码器的所有力量。

另请参阅博客 - 消融研究:为什么 ControlNets 使用深层编码器?如果更轻呢?甚至是 MLP?

你需要手动勾选“猜测模式”开关以启用此模式。

在此模式下,ControlNet 编码器将尽力识别输入控制图的内容,如深度图、边缘图、涂鸦等,即使你移除了所有提示词。

让我们在一些极具挑战性的实验设置中尽情玩耍!

无提示词。无“正向”提示词。无“负向”提示词。无额外的标题检测器。仅单次扩散循环。

对于此模式,我们建议使用 50 步,引导比例 (guidance scale) 在 3 到 5 之间。

p

无提示词:

p

请注意,以下示例为 768×768。无提示词。无“正向”提示词。无“负向”提示词。

p

通过调整参数,你可以获得一些非常有趣的结果,如下所示:

p

由于没有可用提示词,ControlNet 编码器将“猜测”控制图中有什么。有时猜测结果真的很有趣。因为扩散算法本质上可以给出多个结果,ControlNet 似乎能够给出多个猜测,就像这样:

p

在没有提示词的情况下,当控制强度相对较低时,HED 似乎擅长生成看起来像绘画的图像:

p

WebUI 插件 中也支持猜测模式:

p

无提示词。默认 WebUI 参数。纯随机结果,种子 (seed) 为 12345。标准 SD1.5。输入涂鸦位于 "test_imgs" 文件夹中以复现。

p

以下是另一个具有挑战性的示例:

p

无提示词。默认 WebUI 参数。纯随机结果,种子 (seed) 为 12345。标准 SD1.5。输入涂鸦位于 "test_imgs" 文件夹中以复现。

p

请注意,在猜测模式中,你仍然可以输入提示词。唯一的区别是,即使你不提供提示词,模型也会“更努力”地猜测控制图中有什么。亲自试一试吧!

此外,如果你编写一些脚本(如 BLIP)从“猜测模式”图像生成图像标题,然后将生成的标题作为提示词再次进行扩散,你将获得一个用于全自动条件图像生成的 SOTA (最先进) 流程。

Combining Multiple ControlNets

ControlNets 是可组合的:多个 ControlNet 可以轻松组合以实现多条件控制。

目前,此功能处于 Mikubill' A1111 Webui 插件 的实验阶段:

p

p

只要模型控制的是同一个 SD,不同研究项目之间的“界限”甚至都不存在。此插件还允许不同的方法协同工作!

Use ControlNet in Any Community Model (SD1.X)

这是一个实验性功能。

在此处查看步骤

或者你可能想使用 Mikubill' A1111 Webui 插件,它是即插即用的,不需要手动合并。

Annotate Your Own Data

我们提供简单的 Python 脚本来处理图像。

在此处查看 gradio 示例

使用你自己的数据进行训练

训练一个 ControlNet(一种用于控制扩散模型生成的条件网络)就像(甚至比)训练一个简单的 pix2pix(图像到图像转换模型)一样容易。

在此处查看步骤

相关资源

特别感谢伟大的项目 - Mikubill' A1111 Webui 插件

我们也感谢 Hysts 创建了 Hugging Face Space(托管机器学习应用的在线平台),以及那个令人惊叹的 Colab 列表(Google 云端 Jupyter Notebook 服务)中的 65 多个模型!

感谢 haofanwang 制作了 ControlNet-for-Diffusers(基于 Hugging Face Diffusers 库的实现)!

我们也感谢所有制作 ControlNet 演示的作者,包括但不限于 fffiloni, other-model, ThereforeGames, RamAnanth1 等!

此外,您可能还想阅读这些令人惊叹的相关作品:

Composer: 使用可组合条件进行创意且可控的图像合成: 一个更大的模型来控制扩散(扩散过程)!

T2I-Adapter: 学习适配器以挖掘文本到图像扩散模型的更多可控能力: 一个更小的模型来控制 Stable Diffusion(一种流行的文本生成图像扩散模型)!

ControlLoRA: 一个轻量级神经网络以控制 Stable Diffusion 的空间信息: 使用 LoRA(低秩适应)实现 ControlNet!

以及这些令人惊叹的最新项目:InstructPix2Pix 学习遵循图像编辑指令, Pix2pix-zero: 零样本图像到图像翻译, Plug-and-Play Diffusion Features 用于文本驱动图像到图像翻译的即插即用扩散特征, MaskSketch: 非配对结构引导的掩码图像生成, SEGA: 使用语义维度指导扩散, Universal Guidance for Diffusion Models 扩散模型的通用引导, Region-Aware Diffusion 用于零样本文本驱动图像编辑的区域感知扩散, Domain Expansion of Image Generators 图像生成器的领域扩展, Image Mixer 图像混合器, MultiDiffusion: 融合扩散路径以实现受控图像生成

引用

@misc{zhang2023adding,
  title={Adding Conditional Control to Text-to-Image Diffusion Models}, 
  author={Lvmin Zhang and Anyi Rao and Maneesh Agrawala},
  booktitle={IEEE International Conference on Computer Vision (ICCV)}
  year={2023},
}

Arxiv 链接

补充材料

常见问题

相似工具推荐

stable-diffusion-webui

stable-diffusion-webui 是一个基于 Gradio 构建的网页版操作界面,旨在让用户能够轻松地在本地运行和使用强大的 Stable Diffusion 图像生成模型。它解决了原始模型依赖命令行、操作门槛高且功能分散的痛点,将复杂的 AI 绘图流程整合进一个直观易用的图形化平台。 无论是希望快速上手的普通创作者、需要精细控制画面细节的设计师,还是想要深入探索模型潜力的开发者与研究人员,都能从中获益。其核心亮点在于极高的功能丰富度:不仅支持文生图、图生图、局部重绘(Inpainting)和外绘(Outpainting)等基础模式,还独创了注意力机制调整、提示词矩阵、负向提示词以及“高清修复”等高级功能。此外,它内置了 GFPGAN 和 CodeFormer 等人脸修复工具,支持多种神经网络放大算法,并允许用户通过插件系统无限扩展能力。即使是显存有限的设备,stable-diffusion-webui 也提供了相应的优化选项,让高质量的 AI 艺术创作变得触手可及。

162.1k|★★★☆☆|今天
开发框架图像Agent

ComfyUI

ComfyUI 是一款功能强大且高度模块化的视觉 AI 引擎,专为设计和执行复杂的 Stable Diffusion 图像生成流程而打造。它摒弃了传统的代码编写模式,采用直观的节点式流程图界面,让用户通过连接不同的功能模块即可构建个性化的生成管线。 这一设计巧妙解决了高级 AI 绘图工作流配置复杂、灵活性不足的痛点。用户无需具备编程背景,也能自由组合模型、调整参数并实时预览效果,轻松实现从基础文生图到多步骤高清修复等各类复杂任务。ComfyUI 拥有极佳的兼容性,不仅支持 Windows、macOS 和 Linux 全平台,还广泛适配 NVIDIA、AMD、Intel 及苹果 Silicon 等多种硬件架构,并率先支持 SDXL、Flux、SD3 等前沿模型。 无论是希望深入探索算法潜力的研究人员和开发者,还是追求极致创作自由度的设计师与资深 AI 绘画爱好者,ComfyUI 都能提供强大的支持。其独特的模块化架构允许社区不断扩展新功能,使其成为当前最灵活、生态最丰富的开源扩散模型工具之一,帮助用户将创意高效转化为现实。

107.7k|★★☆☆☆|2天前
开发框架图像Agent

ML-For-Beginners

ML-For-Beginners 是由微软推出的一套系统化机器学习入门课程,旨在帮助零基础用户轻松掌握经典机器学习知识。这套课程将学习路径规划为 12 周,包含 26 节精炼课程和 52 道配套测验,内容涵盖从基础概念到实际应用的完整流程,有效解决了初学者面对庞大知识体系时无从下手、缺乏结构化指导的痛点。 无论是希望转型的开发者、需要补充算法背景的研究人员,还是对人工智能充满好奇的普通爱好者,都能从中受益。课程不仅提供了清晰的理论讲解,还强调动手实践,让用户在循序渐进中建立扎实的技能基础。其独特的亮点在于强大的多语言支持,通过自动化机制提供了包括简体中文在内的 50 多种语言版本,极大地降低了全球不同背景用户的学习门槛。此外,项目采用开源协作模式,社区活跃且内容持续更新,确保学习者能获取前沿且准确的技术资讯。如果你正寻找一条清晰、友好且专业的机器学习入门之路,ML-For-Beginners 将是理想的起点。

85k|★★☆☆☆|今天
图像数据工具视频

ragflow

RAGFlow 是一款领先的开源检索增强生成(RAG)引擎,旨在为大语言模型构建更精准、可靠的上下文层。它巧妙地将前沿的 RAG 技术与智能体(Agent)能力相结合,不仅支持从各类文档中高效提取知识,还能让模型基于这些知识进行逻辑推理和任务执行。 在大模型应用中,幻觉问题和知识滞后是常见痛点。RAGFlow 通过深度解析复杂文档结构(如表格、图表及混合排版),显著提升了信息检索的准确度,从而有效减少模型“胡编乱造”的现象,确保回答既有据可依又具备时效性。其内置的智能体机制更进一步,使系统不仅能回答问题,还能自主规划步骤解决复杂问题。 这款工具特别适合开发者、企业技术团队以及 AI 研究人员使用。无论是希望快速搭建私有知识库问答系统,还是致力于探索大模型在垂直领域落地的创新者,都能从中受益。RAGFlow 提供了可视化的工作流编排界面和灵活的 API 接口,既降低了非算法背景用户的上手门槛,也满足了专业开发者对系统深度定制的需求。作为基于 Apache 2.0 协议开源的项目,它正成为连接通用大模型与行业专有知识之间的重要桥梁。

77.1k|★★★☆☆|昨天
Agent图像开发框架

PaddleOCR

PaddleOCR 是一款基于百度飞桨框架开发的高性能开源光学字符识别工具包。它的核心能力是将图片、PDF 等文档中的文字提取出来,转换成计算机可读取的结构化数据,让机器真正“看懂”图文内容。 面对海量纸质或电子文档,PaddleOCR 解决了人工录入效率低、数字化成本高的问题。尤其在人工智能领域,它扮演着连接图像与大型语言模型(LLM)的桥梁角色,能将视觉信息直接转化为文本输入,助力智能问答、文档分析等应用场景落地。 PaddleOCR 适合开发者、算法研究人员以及有文档自动化需求的普通用户。其技术优势十分明显:不仅支持全球 100 多种语言的识别,还能在 Windows、Linux、macOS 等多个系统上运行,并灵活适配 CPU、GPU、NPU 等各类硬件。作为一个轻量级且社区活跃的开源项目,PaddleOCR 既能满足快速集成的需求,也能支撑前沿的视觉语言研究,是处理文字识别任务的理想选择。

74.9k|★★★☆☆|今天
语言模型图像开发框架

tesseract

Tesseract 是一款历史悠久且备受推崇的开源光学字符识别(OCR)引擎,最初由惠普实验室开发,后由 Google 维护,目前由全球社区共同贡献。它的核心功能是将图片中的文字转化为可编辑、可搜索的文本数据,有效解决了从扫描件、照片或 PDF 文档中提取文字信息的难题,是数字化归档和信息自动化的重要基础工具。 在技术层面,Tesseract 展现了强大的适应能力。从版本 4 开始,它引入了基于长短期记忆网络(LSTM)的神经网络 OCR 引擎,显著提升了行识别的准确率;同时,为了兼顾旧有需求,它依然支持传统的字符模式识别引擎。Tesseract 原生支持 UTF-8 编码,开箱即用即可识别超过 100 种语言,并兼容 PNG、JPEG、TIFF 等多种常见图像格式。输出方面,它灵活支持纯文本、hOCR、PDF、TSV 等多种格式,方便后续数据处理。 Tesseract 主要面向开发者、研究人员以及需要构建文档处理流程的企业用户。由于它本身是一个命令行工具和库(libtesseract),不包含图形用户界面(GUI),因此最适合具备一定编程能力的技术人员集成到自动化脚本或应用程序中

73.3k|★★☆☆☆|3天前
开发框架图像