模型简介
模型特点
模型能力
使用案例
🚀 Controlnet - v1.1 - seg版本
ControlNet是一种神经网络结构,可通过添加额外条件来控制扩散模型。Controlnet v1.1 是 Controlnet v1.0 的后续模型,由 Lvmin Zhang 在 lllyasviel/ControlNet-v1-1 中发布。本检查点是将 原始检查点 转换为 diffusers
格式,可与 Stable Diffusion 结合使用,例如 runwayml/stable-diffusion-v1-5。
🚀 快速开始
本模型可结合 Stable Diffusion 使用,以下是使用前的准备步骤和示例代码:
- 安装
diffusers
及相关依赖包:
$ pip install diffusers transformers accelerate
- 运行示例代码:
import torch
import os
from huggingface_hub import HfApi
from pathlib import Path
from diffusers.utils import load_image
from PIL import Image
import numpy as np
from transformers import AutoImageProcessor, UperNetForSemanticSegmentation
from diffusers import (
ControlNetModel,
StableDiffusionControlNetPipeline,
UniPCMultistepScheduler,
)
image_processor = AutoImageProcessor.from_pretrained("openmmlab/upernet-convnext-small")
image_segmentor = UperNetForSemanticSegmentation.from_pretrained("openmmlab/upernet-convnext-small")
checkpoint = "lllyasviel/control_v11p_sd15_seg"
image = load_image(
"https://huggingface.co/lllyasviel/control_v11p_sd15_seg/resolve/main/images/input.png"
)
prompt = "old house in stormy weather with rain and wind"
pixel_values = image_processor(image, return_tensors="pt").pixel_values
with torch.no_grad():
outputs = image_segmentor(pixel_values)
seg = image_processor.post_process_semantic_segmentation(outputs, target_sizes=[image.size[::-1]])[0]
color_seg = np.zeros((seg.shape[0], seg.shape[1], 3), dtype=np.uint8) # height, width, 3
for label, color in enumerate(ada_palette):
color_seg[seg == label, :] = color
color_seg = color_seg.astype(np.uint8)
control_image = Image.fromarray(color_seg)
control_image.save("./images/control.png")
controlnet = ControlNetModel.from_pretrained(checkpoint, torch_dtype=torch.float16)
pipe = StableDiffusionControlNetPipeline.from_pretrained(
"runwayml/stable-diffusion-v1-5", controlnet=controlnet, torch_dtype=torch.float16
)
pipe.scheduler = UniPCMultistepScheduler.from_config(pipe.scheduler.config)
pipe.enable_model_cpu_offload()
generator = torch.manual_seed(0)
image = pipe(prompt, num_inference_steps=30, generator=generator, image=control_image).images[0]
image.save('images/image_out.png')
✨ 主要特性
- 支持额外条件控制:ControlNet 可控制预训练的大型扩散模型,支持额外的输入条件,如边缘图、分割图、关键点等。
- 训练高效:训练速度与微调扩散模型相当,即使在小数据集(< 50k)上也能稳健学习,也可在强大的计算集群上扩展到大量数据(数百万到数十亿)。
- 多版本支持:发布了 14 种不同的检查点,每种都在不同类型的条件下与 Stable Diffusion v1-5 一起训练。
📦 安装指南
使用本模型前,需要安装 diffusers
及相关依赖包:
$ pip install diffusers transformers accelerate
💻 使用示例
基础用法
以下是使用本模型的基础代码示例,首先需要安装必要的库,然后定义所需的颜色表,最后运行代码生成图像:
# 安装依赖包
$ pip install diffusers transformers accelerate
# 定义颜色表
import numpy as np
ada_palette = np.asarray([
[0, 0, 0],
[120, 120, 120],
[180, 120, 120],
[6, 230, 230],
[80, 50, 50],
[4, 200, 3],
[120, 120, 80],
[140, 140, 140],
[204, 5, 255],
[230, 230, 230],
[4, 250, 7],
[224, 5, 255],
[235, 255, 7],
[150, 5, 61],
[120, 120, 70],
[8, 255, 51],
[255, 6, 82],
[143, 255, 140],
[204, 255, 4],
[255, 51, 7],
[204, 70, 3],
[0, 102, 200],
[61, 230, 250],
[255, 6, 51],
[11, 102, 255],
[255, 7, 71],
[255, 9, 224],
[9, 7, 230],
[220, 220, 220],
[255, 9, 92],
[112, 9, 255],
[8, 255, 214],
[7, 255, 224],
[255, 184, 6],
[10, 255, 71],
[255, 41, 10],
[7, 255, 255],
[224, 255, 8],
[102, 8, 255],
[255, 61, 6],
[255, 194, 7],
[255, 122, 8],
[0, 255, 20],
[255, 8, 41],
[255, 5, 153],
[6, 51, 255],
[235, 12, 255],
[160, 150, 20],
[0, 163, 255],
[140, 140, 140],
[250, 10, 15],
[20, 255, 0],
[31, 255, 0],
[255, 31, 0],
[255, 224, 0],
[153, 255, 0],
[0, 0, 255],
[255, 71, 0],
[0, 235, 255],
[0, 173, 255],
[31, 0, 255],
[11, 200, 200],
[255, 82, 0],
[0, 255, 245],
[0, 61, 255],
[0, 255, 112],
[0, 255, 133],
[255, 0, 0],
[255, 163, 0],
[255, 102, 0],
[194, 255, 0],
[0, 143, 255],
[51, 255, 0],
[0, 82, 255],
[0, 255, 41],
[0, 255, 173],
[10, 0, 255],
[173, 255, 0],
[0, 255, 153],
[255, 92, 0],
[255, 0, 255],
[255, 0, 245],
[255, 0, 102],
[255, 173, 0],
[255, 0, 20],
[255, 184, 184],
[0, 31, 255],
[0, 255, 61],
[0, 71, 255],
[255, 0, 204],
[0, 255, 194],
[0, 255, 82],
[0, 10, 255],
[0, 112, 255],
[51, 0, 255],
[0, 194, 255],
[0, 122, 255],
[0, 255, 163],
[255, 153, 0],
[0, 255, 10],
[255, 112, 0],
[143, 255, 0],
[82, 0, 255],
[163, 255, 0],
[255, 235, 0],
[8, 184, 170],
[133, 0, 255],
[0, 255, 92],
[184, 0, 255],
[255, 0, 31],
[0, 184, 255],
[0, 214, 255],
[255, 0, 112],
[92, 255, 0],
[0, 224, 255],
[112, 224, 255],
[70, 184, 160],
[163, 0, 255],
[153, 0, 255],
[71, 255, 0],
[255, 0, 163],
[255, 204, 0],
[255, 0, 143],
[0, 255, 235],
[133, 255, 0],
[255, 0, 235],
[245, 0, 255],
[255, 0, 122],
[255, 245, 0],
[10, 190, 212],
[214, 255, 0],
[0, 204, 255],
[20, 0, 255],
[255, 255, 0],
[0, 153, 255],
[0, 41, 255],
[0, 255, 204],
[41, 0, 255],
[41, 255, 0],
[173, 0, 255],
[0, 245, 255],
[71, 0, 255],
[122, 0, 255],
[0, 255, 184],
[0, 92, 255],
[184, 255, 0],
[0, 133, 255],
[255, 214, 0],
[25, 194, 194],
[102, 255, 0],
[92, 0, 255],
])
# 运行代码
import torch
import os
from huggingface_hub import HfApi
from pathlib import Path
from diffusers.utils import load_image
from PIL import Image
import numpy as np
from transformers import AutoImageProcessor, UperNetForSemanticSegmentation
from diffusers import (
ControlNetModel,
StableDiffusionControlNetPipeline,
UniPCMultistepScheduler,
)
image_processor = AutoImageProcessor.from_pretrained("openmmlab/upernet-convnext-small")
image_segmentor = UperNetForSemanticSegmentation.from_pretrained("openmmlab/upernet-convnext-small")
checkpoint = "lllyasviel/control_v11p_sd15_seg"
image = load_image(
"https://huggingface.co/lllyasviel/control_v11p_sd15_seg/resolve/main/images/input.png"
)
prompt = "old house in stormy weather with rain and wind"
pixel_values = image_processor(image, return_tensors="pt").pixel_values
with torch.no_grad():
outputs = image_segmentor(pixel_values)
seg = image_processor.post_process_semantic_segmentation(outputs, target_sizes=[image.size[::-1]])[0]
color_seg = np.zeros((seg.shape[0], seg.shape[1], 3), dtype=np.uint8) # height, width, 3
for label, color in enumerate(ada_palette):
color_seg[seg == label, :] = color
color_seg = color_seg.astype(np.uint8)
control_image = Image.fromarray(color_seg)
control_image.save("./images/control.png")
controlnet = ControlNetModel.from_pretrained(checkpoint, torch_dtype=torch.float16)
pipe = StableDiffusionControlNetPipeline.from_pretrained(
"runwayml/stable-diffusion-v1-5", controlnet=controlnet, torch_dtype=torch.float16
)
pipe.scheduler = UniPCMultistepScheduler.from_config(pipe.scheduler.config)
pipe.enable_model_cpu_offload()
generator = torch.manual_seed(0)
image = pipe(prompt, num_inference_steps=30, generator=generator, image=control_image).images[0]
image.save('images/image_out.png')
高级用法
暂未提供高级用法示例,你可以根据实际需求对基础代码进行扩展和修改。
📚 详细文档
模型详情
属性 | 详情 |
---|---|
开发者 | Lvmin Zhang, Maneesh Agrawala |
模型类型 | 基于扩散的文本到图像生成模型 |
语言 | 英语 |
许可证 | The CreativeML OpenRAIL M license 是一种 Open RAIL M license,改编自 BigScience 和 the RAIL Initiative 在负责任的人工智能许可领域的联合工作。另见 关于 BLOOM Open RAIL 许可证的文章,本许可证基于此。 |
更多信息资源 | GitHub 仓库,论文 |
引用方式 | @misc{zhang2023adding, title={Adding Conditional Control to Text-to-Image Diffusion Models}, author={Lvmin Zhang and Maneesh Agrawala}, year={2023}, eprint={2302.05543}, archivePrefix={arXiv}, primaryClass={cs.CV} } |
其他发布的检查点 v1-1
作者发布了 14 种不同的检查点,每种都在不同类型的条件下与 Stable Diffusion v1-5 一起训练:
模型名称 | 控制图像概述 | 条件图像 | 控制图像示例 | 生成图像示例 |
---|---|---|---|---|
lllyasviel/control_v11p_sd15_canny |
使用 Canny 边缘检测训练 | 黑色背景上带有白色边缘的单色图像。 | ![]() |
![]() |
lllyasviel/control_v11e_sd15_ip2p |
使用像素到像素指令训练 | 无条件。 | ![]() |
![]() |
lllyasviel/control_v11p_sd15_inpaint |
使用图像修复训练 | 无条件。 | ![]() |
![]() |
lllyasviel/control_v11p_sd15_mlsd |
使用多级线段检测训练 | 带有注释线段的图像。 | ![]() |
![]() |
lllyasviel/control_v11f1p_sd15_depth |
使用深度估计训练 | 带有深度信息的图像,通常表示为灰度图像。 | ![]() |
![]() |
lllyasviel/control_v11p_sd15_normalbae |
使用表面法线估计训练 | 带有表面法线信息的图像,通常表示为彩色编码图像。 | ![]() |
![]() |
lllyasviel/control_v11p_sd15_seg |
使用图像分割训练 | 带有分割区域的图像,通常表示为彩色编码图像。 | ![]() |
![]() |
lllyasviel/control_v11p_sd15_lineart |
使用线稿生成训练 | 带有线稿的图像,通常是白色背景上的黑色线条。 | ![]() |
![]() |
lllyasviel/control_v11p_sd15s2_lineart_anime |
使用动漫线稿生成训练 | 带有动漫风格线稿的图像。 | ![]() |
![]() |
lllyasviel/control_v11p_sd15_openpose |
使用人体姿态估计训练 | 带有人体姿态的图像,通常表示为一组关键点或骨架。 | ![]() |
![]() |
lllyasviel/control_v11p_sd15_scribble |
使用基于涂鸦的图像生成训练 | 带有涂鸦的图像,通常是随机或用户绘制的笔触。 | ![]() |
![]() |
lllyasviel/control_v11p_sd15_softedge |
使用软边缘图像生成训练 | 带有软边缘的图像,通常用于创建更具绘画感或艺术效果的图像。 | ![]() |
![]() |
lllyasviel/control_v11e_sd15_shuffle |
使用图像打乱训练 | 带有打乱的补丁或区域的图像。 | ![]() |
![]() |
lllyasviel/control_v11f1e_sd15_tile |
使用图像平铺训练 | 模糊的图像或图像的一部分。 | ![]() |
![]() |
分割 1.1 版本的改进
- 支持 COCO 协议:之前的分割 1.0 版本支持约 150 种颜色,而分割 1.1 版本支持来自 COCO 的另外 182 种颜色。
- 继承分割 1.0:所有之前的输入仍然应该可以正常工作。
更多信息
如需更多信息,请查看 Diffusers ControlNet 博客文章 和 官方文档。
🔧 技术细节
ControlNet 在 Adding Conditional Control to Text-to-Image Diffusion Models 中被提出,其摘要如下: 我们提出了一种神经网络结构 ControlNet,用于控制预训练的大型扩散模型以支持额外的输入条件。ControlNet 以端到端的方式学习特定任务的条件,即使在训练数据集较小(< 50k)的情况下,学习也很稳健。此外,训练一个 ControlNet 的速度与微调一个扩散模型相当,并且该模型可以在个人设备上进行训练。或者,如果有强大的计算集群可用,该模型可以扩展到大量数据(数百万到数十亿)。我们报告称,像 Stable Diffusion 这样的大型扩散模型可以通过 ControlNets 进行增强,以支持边缘图、分割图、关键点等条件输入。这可能会丰富控制大型扩散模型的方法,并进一步促进相关应用的发展。
📄 许可证
本模型使用 The CreativeML OpenRAIL M license,这是一种 Open RAIL M license,改编自 BigScience 和 the RAIL Initiative 在负责任的人工智能许可领域的联合工作。另见 关于 BLOOM Open RAIL 许可证的文章,本许可证基于此。

