模型:
lllyasviel/control_v11p_sd15_seg
Controlnet v1.1 是 Controlnet v1.0 的后续模型,于 lllyasviel/ControlNet-v1-1 由 Lvmin Zhang 发布。
该检查点是将 the original checkpoint 转换为扩散器格式。它可以与稳定扩散(如 runwayml/stable-diffusion-v1-5 )等稳定扩散一起使用。
更多详细信息,请参阅 🧨 Diffusers docs 。
ControlNet 是一种神经网络结构,用于通过添加额外条件来控制扩散模型。
此检查点对应于基于 seg 图像的 ControlNet。
开发者:Lvmin Zhang,Maneesh Agrawala
模型类型:基于扩散的文本到图像生成模型
语言:英文
许可证: The CreativeML OpenRAIL M license 是 Open RAIL M license 的衍生产品,由 BigScience 和 the RAIL Initiative 共同在负责任的 AI 许可证方面进行合作。还请参阅我们许可证所依据的 the article about the BLOOM Open RAIL license 。
更多信息的资源: GitHub Repository , Paper 。
引用方式:
@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}}
Controlnet 是由 Lvmin Zhang,Maneesh Agrawala 在 Adding Conditional Control to Text-to-Image Diffusion Models 提出的。
摘要如下:
我们提出了一种神经网络结构 ControlNet,用于控制预训练的大型扩散模型,以支持额外的输入条件。ControlNet 以端到端的方式学习任务特定的条件,并且即使训练数据集很小(< 50k),学习也很稳健。此外,训练 ControlNet 的速度与微调扩散模型的速度相当,并且可以在个人设备上进行训练。或者,如果有强大的计算集群可用,该模型可以扩展到大量(百万到十亿)的数据。我们报告了像 Stable Diffusion 这样的大型扩散模型可以通过与 ControlNet 的组合来实现条件输入,如边缘图,分割图,关键点等。这可能丰富了控制大型扩散模型的方法,并进一步促进相关应用。
建议使用 Stable Diffusion v1-5 作为检查点,因为该检查点已经在其上训练过。实验上,该检查点可以与其他扩散模型(如 dreamboothed 稳定扩散)一起使用。
注意:如果要处理图像以创建辅助条件,则需要以下外部依赖项:
$ 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')
作者发布了14个不同的检查站点,每个站点都使用 Stable Diffusion v1-5 在不同类型的条件下进行了训练:
| Model Name | Control Image Overview | Condition Image | Control Image Example | Generated Image Example |
|---|---|---|---|---|
| 12319321 | Trained with canny edge detection | A monochrome image with white edges on a black background. | 12320321 12321321||
| 12322321 | Trained with pixel to pixel instruction | No condition . | 12323321 12324321||
| 12325321 | Trained with image inpainting | No condition. | 12326321 12327321||
| 12328321 | Trained with multi-level line segment detection | An image with annotated line segments. | 12329321 12330321||
| 12331321 | Trained with depth estimation | An image with depth information, usually represented as a grayscale image. | 12332321 12333321||
| 12334321 | Trained with surface normal estimation | An image with surface normal information, usually represented as a color-coded image. | 12335321 12336321||
| 12337321 | Trained with image segmentation | An image with segmented regions, usually represented as a color-coded image. | 12338321 12339321||
| 12340321 | Trained with line art generation | An image with line art, usually black lines on a white background. | 12341321 12342321||
| 12343321 | Trained with anime line art generation | An image with anime-style line art. | 12344321 12345321||
| 12346321 | Trained with human pose estimation | An image with human poses, usually represented as a set of keypoints or skeletons. | 12347321 12348321||
| 12349321 | Trained with scribble-based image generation | An image with scribbles, usually random or user-drawn strokes. | 12350321 12351321||
| 12352321 | Trained with soft edge image generation | An image with soft edges, usually to create a more painterly or artistic effect. | 12353321 12354321||
| 12355321 | Trained with image shuffling | An image with shuffled patches or regions. | 12356321 12357321||
| 12358321 | Trained with image tiling | A blurry image or part of an image . | 12359321 12360321
更多信息,请参阅 Diffusers ControlNet Blog Post ,并查看 official docs 。