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

