模型简介
模型特点
模型能力
使用案例
🚀 Controlnet - 图像分割版本
ControlNet 是一种神经网络结构,可通过添加额外条件来控制扩散模型。此检查点对应于基于图像分割的 ControlNet,可与 Stable Diffusion 结合使用。
🚀 快速开始
ControlNet 能够为预训练的大型扩散模型添加额外输入条件的控制能力。它可以学习特定任务的条件,即使在训练数据集较小的情况下也能保持鲁棒性。下面将介绍如何使用此模型进行图像分割生成。
✨ 主要特性
- 可控制扩散模型:通过添加额外条件,对扩散模型进行有效控制。
- 支持多种条件输入:如边缘图、分割图、关键点等。
- 训练灵活:可在个人设备上进行训练,也能利用强大的计算集群处理大量数据。
📦 安装指南
我们需要安装 diffusers
及相关依赖包:
$ pip install diffusers transformers accelerate
💻 使用示例
基础用法
首先,我们需要定义一个调色板,用于语义分割:
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],
])
高级用法
在定义好调色板后,我们可以运行完整的分割 + ControlNet 生成代码:
from transformers import AutoImageProcessor, UperNetForSemanticSegmentation
from PIL import Image
import numpy as np
import torch
from diffusers import StableDiffusionControlNetPipeline, ControlNetModel, UniPCMultistepScheduler
from diffusers.utils import load_image
image_processor = AutoImageProcessor.from_pretrained("openmmlab/upernet-convnext-small")
image_segmentor = UperNetForSemanticSegmentation.from_pretrained("openmmlab/upernet-convnext-small")
image = load_image("https://huggingface.co/lllyasviel/sd-controlnet-seg/resolve/main/images/house.png").convert('RGB')
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(palette):
color_seg[seg == label, :] = color
color_seg = color_seg.astype(np.uint8)
image = Image.fromarray(color_seg)
controlnet = ControlNetModel.from_pretrained(
"lllyasviel/sd-controlnet-seg", 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("house", image, num_inference_steps=20).images[0]
image.save('./images/house_seg_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, |
发布的检查点
作者发布了 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 的分割协议图像。 | ![]() |
![]() |
训练信息
语义分割模型在来自 ADE20K 的 164K 个分割图像 - 标题对数据集上进行训练。使用 Stable Diffusion 1.5 作为基础模型,在 Nvidia A100 80G GPU 上训练了 200 小时。
博客文章
欲了解更多信息,请查看 ControlNet 官方博客文章。
🔧 技术细节
ControlNet 是在论文 Adding Conditional Control to Text-to-Image Diffusion Models 中提出的神经网络结构。该结构旨在为预训练的大型扩散模型添加额外输入条件的控制能力。它能够以端到端的方式学习特定任务的条件,即使在训练数据集较小(< 50k)的情况下,学习过程也具有鲁棒性。训练 ControlNet 的速度与微调扩散模型相当,并且可以在个人设备上进行训练。如果有强大的计算集群,模型也可以处理大量(数百万到数十亿)的数据。通过使用 ControlNet,可以为像 Stable Diffusion 这样的大型扩散模型添加条件输入,如边缘图、分割图、关键点等,从而丰富控制大型扩散模型的方法,并促进相关应用的发展。
📄 许可证
本项目采用 The CreativeML OpenRAIL M license。这是一种 Open RAIL M license,改编自 BigScience 和 the RAIL Initiative 在负责任的人工智能许可领域的联合工作。另见 关于 BLOOM Open RAIL 许可证的文章,本许可证基于此文章。

