模型概述
模型特點
模型能力
使用案例
🚀 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 許可證的文章,本許可證基於此。

