模型简介
模型特点
模型能力
使用案例
🚀 Controlnet - 法线贴图版本
ControlNet 是一种神经网络结构,通过添加额外条件来控制扩散模型。此检查点对应于基于法线贴图估计的 ControlNet。它可与 Stable Diffusion 结合使用。
🚀 快速开始
本模型建议与 Stable Diffusion v1 - 5 结合使用,因为该检查点是基于此模型训练的。实验表明,该检查点也可与其他扩散模型(如经过微调的 Stable Diffusion)一起使用。
安装依赖
$ pip install diffusers transformers accelerate
运行代码示例
from PIL import Image
from transformers import pipeline
import numpy as np
import cv2
from diffusers import StableDiffusionControlNetPipeline, ControlNetModel, UniPCMultistepScheduler
import torch
from diffusers.utils import load_image
image = load_image("https://huggingface.co/lllyasviel/sd-controlnet-normal/resolve/main/images/toy.png").convert("RGB")
depth_estimator = pipeline("depth-estimation", model ="Intel/dpt-hybrid-midas" )
image = depth_estimator(image)['predicted_depth'][0]
image = image.numpy()
image_depth = image.copy()
image_depth -= np.min(image_depth)
image_depth /= np.max(image_depth)
bg_threhold = 0.4
x = cv2.Sobel(image, cv2.CV_32F, 1, 0, ksize=3)
x[image_depth < bg_threhold] = 0
y = cv2.Sobel(image, cv2.CV_32F, 0, 1, ksize=3)
y[image_depth < bg_threhold] = 0
z = np.ones_like(x) * np.pi * 2.0
image = np.stack([x, y, z], axis=2)
image /= np.sum(image ** 2.0, axis=2, keepdims=True) ** 0.5
image = (image * 127.5 + 127.5).clip(0, 255).astype(np.uint8)
image = Image.fromarray(image)
controlnet = ControlNetModel.from_pretrained(
"fusing/stable-diffusion-v1-5-controlnet-normal", torch_dtype=torch.float16
)
pipe = StableDiffusionControlNetPipeline.from_pretrained(
"runwayml/stable-diffusion-v1-5", controlnet=controlnet, safety_checker=None, torch_dtype=torch.float16
)
pipe.scheduler = UniPCMultistepScheduler.from_config(pipe.scheduler.config)
# Remove if you do not have xformers installed
# see https://huggingface.co/docs/diffusers/v0.13.0/en/optimization/xformers#installing-xformers
# for installation instructions
pipe.enable_xformers_memory_efficient_attention()
pipe.enable_model_cpu_offload()
image = pipe("cute toy", image, num_inference_steps=20).images[0]
image.save('images/toy_normal_out.png')
✨ 主要特性
- 额外条件控制:ControlNet 作为一种神经网络结构,能够通过添加额外条件来控制扩散模型,为文本到图像的生成提供更多的控制维度。
- 端到端学习:可以端到端地学习特定任务的条件,即使在训练数据集较小(少于 50k)的情况下,学习效果依然稳健。
- 训练高效:训练速度与微调扩散模型相当,既可以在个人设备上进行训练,也可以利用强大的计算集群处理大量数据。
- 多类型条件支持:可以与 Stable Diffusion 等大型扩散模型结合,支持边缘图、分割图、关键点等多种条件输入,丰富了控制大型扩散模型的方法。
📦 安装指南
安装 diffusers
及相关依赖包:
$ pip install diffusers transformers accelerate
💻 使用示例
基础用法
from PIL import Image
from transformers import pipeline
import numpy as np
import cv2
from diffusers import StableDiffusionControlNetPipeline, ControlNetModel, UniPCMultistepScheduler
import torch
from diffusers.utils import load_image
image = load_image("https://huggingface.co/lllyasviel/sd-controlnet-normal/resolve/main/images/toy.png").convert("RGB")
depth_estimator = pipeline("depth-estimation", model ="Intel/dpt-hybrid-midas" )
image = depth_estimator(image)['predicted_depth'][0]
image = image.numpy()
image_depth = image.copy()
image_depth -= np.min(image_depth)
image_depth /= np.max(image_depth)
bg_threhold = 0.4
x = cv2.Sobel(image, cv2.CV_32F, 1, 0, ksize=3)
x[image_depth < bg_threhold] = 0
y = cv2.Sobel(image, cv2.CV_32F, 0, 1, ksize=3)
y[image_depth < bg_threhold] = 0
z = np.ones_like(x) * np.pi * 2.0
image = np.stack([x, y, z], axis=2)
image /= np.sum(image ** 2.0, axis=2, keepdims=True) ** 0.5
image = (image * 127.5 + 127.5).clip(0, 255).astype(np.uint8)
image = Image.fromarray(image)
controlnet = ControlNetModel.from_pretrained(
"fusing/stable-diffusion-v1-5-controlnet-normal", torch_dtype=torch.float16
)
pipe = StableDiffusionControlNetPipeline.from_pretrained(
"runwayml/stable-diffusion-v1-5", controlnet=controlnet, safety_checker=None, torch_dtype=torch.float16
)
pipe.scheduler = UniPCMultistepScheduler.from_config(pipe.scheduler.config)
# Remove if you do not have xformers installed
# see https://huggingface.co/docs/diffusers/v0.13.0/en/optimization/xformers#installing-xformers
# for installation instructions
pipe.enable_xformers_memory_efficient_attention()
pipe.enable_model_cpu_offload()
image = pipe("cute toy", image, num_inference_steps=20).images[0]
image.save('images/toy_normal_out.png')
📚 详细文档
模型详情
属性 | 详情 |
---|---|
开发者 | Lvmin Zhang, Maneesh Agrawala |
模型类型 | 基于扩散的文本到图像生成模型 |
语言 | 英文 |
许可证 | The CreativeML OpenRAIL M license 是一种 Open RAIL M license,改编自 BigScience 和 the RAIL Initiative 在负责任的人工智能许可领域的联合工作。有关我们许可证所基于的 BLOOM Open RAIL license 的文章,请参阅相关链接。 |
更多信息资源 | GitHub 仓库,论文 |
引用方式 | @misc{zhang2023adding, |
模型介绍
Controlnet 由 Lvmin Zhang 和 Maneesh Agrawala 在论文 Adding Conditional Control to Text-to-Image Diffusion Models 中提出。论文摘要如下:
我们提出了一种神经网络结构 ControlNet,用于控制预训练的大型扩散模型,以支持额外的输入条件。ControlNet 以端到端的方式学习特定任务的条件,即使训练数据集较小(少于 50k),学习过程也很稳健。此外,训练 ControlNet 的速度与微调扩散模型相当,并且可以在个人设备上进行训练。或者,如果有强大的计算集群,模型可以处理大量(数百万到数十亿)的数据。我们发现,像 Stable Diffusion 这样的大型扩散模型可以通过 ControlNets 进行增强,以支持边缘图、分割图、关键点等条件输入。这可能会丰富控制大型扩散模型的方法,并进一步促进相关应用的发展。
发布的检查点
作者发布了 8 种不同的检查点,每种检查点都基于 Stable Diffusion v1 - 5 在不同类型的条件下进行训练:
模型名称 | 控制图像概述 | 控制图像示例 | 生成图像示例 |
---|---|---|---|
lllyasviel/sd-controlnet-canny 基于 Canny 边缘检测训练 |
黑色背景上带有白色边缘的单色图像。 | ![]() |
![]() |
lllyasviel/sd-controlnet-depth 基于 Midas 深度估计训练 |
黑色代表深区域,白色代表浅区域的灰度图像。 | ![]() |
![]() |
lllyasviel/sd-controlnet-hed 基于 HED 边缘检测(软边缘)训练 |
黑色背景上带有白色软边缘的单色图像。 | ![]() |
![]() |
lllyasviel/sd-controlnet-mlsd 基于 M - LSD 线检测训练 |
黑色背景上仅由白色直线组成的单色图像。 | ![]() |
![]() |
lllyasviel/sd-controlnet-normal 基于法线贴图训练 |
法线贴图 图像。 | ![]() |
![]() |
lllyasviel/sd-controlnet_openpose 基于 OpenPose 骨骼图像训练 |
OpenPose 骨骼 图像。 | ![]() |
![]() |
lllyasviel/sd-controlnet_scribble 基于人工涂鸦训练 |
黑色背景上带有白色轮廓的手绘单色图像。 | ![]() |
![]() |
lllyasviel/sd-controlnet_seg 基于语义分割训练 |
ADE20K 的分割协议图像。 | ![]() |
![]() |
训练过程
法线模型的训练分为初始模型训练和扩展模型训练两个阶段:
- 初始法线模型训练:基于 DIODE 中的 25,452 对法线图像和标题对进行训练,图像标题由 BLIP 生成。以 Stable Diffusion 1.5 为基础模型,使用 Nvidia A100 80G 进行了 100 GPU 小时的训练。
- 扩展法线模型训练:在初始法线模型的基础上,进一步在“粗略”法线贴图上进行训练。这些粗略法线贴图是通过 Midas 计算深度图,然后从距离计算法线得到的。使用初始法线模型作为基础模型,使用 Nvidia A100 80G 进行了 200 GPU 小时的训练。
博客文章
更多信息请参考 ControlNet 官方博客文章。
🔧 技术细节
ControlNet 通过添加额外的条件输入,对预训练的扩散模型进行控制。在训练过程中,它能够端到端地学习特定任务的条件,使得即使在训练数据较少的情况下,也能实现稳健的学习。在本项目中,法线模型的训练分为两个阶段,初始模型基于特定的法线图像和标题对进行训练,扩展模型则在粗略法线贴图上进一步优化。在推理阶段,通过结合 Stable Diffusion 模型和 ControlNet 模型,根据输入的条件图像和文本提示生成相应的图像。
📄 许可证
本项目采用 The CreativeML OpenRAIL M license,这是一种 Open RAIL M license,改编自 BigScience 和 the RAIL Initiative 在负责任的人工智能许可领域的联合工作。有关我们许可证所基于的 BLOOM Open RAIL license 的文章,请参阅相关链接。

