モデル概要
モデル特徴
モデル能力
使用事例
🚀 Controlnet - 画像セグメンテーション版
ControlNetは、追加の条件を加えることで拡散モデルを制御するニューラルネットワーク構造です。このチェックポイントは、画像セグメンテーションを条件としたControlNetに対応しています。Stable Diffusionと組み合わせて使用することができます。
🚀 クイックスタート
ControlNetは、追加の条件を加えることで拡散モデルを制御するニューラルネットワーク構造です。このチェックポイントは、画像セグメンテーションを条件としたControlNetに対応しています。
✨ 主な機能
- 拡散モデルに追加の条件を加えることができます。
- 画像セグメンテーションを条件として使用することができます。
- Stable Diffusionと組み合わせて使用することができます。
📚 ドキュメント
モデルの詳細
属性 | 詳情 |
---|---|
開発者 | 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のような大規模拡散モデルにControlNetsを追加することで、エッジマップ、セグメンテーションマップ、キーポイントなどの条件付き入力を可能にできることを報告しています。これにより、大規模拡散モデルを制御する方法が豊富になり、関連するアプリケーションがさらに促進される可能性があります。
公開されたチェックポイント
著者らは、Stable Diffusion v1 - 5 を使用して、異なるタイプの条件付きで学習された8つの異なるチェックポイントを公開しました。
モデル名 | 制御画像の概要 | 制御画像の例 | 生成画像の例 |
---|---|---|---|
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のセグメンテーションプロトコル画像。 | ![]() |
![]() |
💻 使用例
基本的な使用法
このチェックポイントは Stable Diffusion v1 - 5 で学習されているため、それと組み合わせて使用することをお勧めします。実験的には、このチェックポイントはdreamboothed stable diffusionなどの他の拡散モデルとも使用できます。
diffusers
と関連パッケージをインストールしましょう。
$ pip install diffusers transformers accelerate
- semantic_segmentation で説明されているように、ここではカラーパレットを使用する必要があります。
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)
# xformersがインストールされていない場合は削除してください
# インストール手順については、https://huggingface.co/docs/diffusers/v0.13.0/en/optimization/xformers#installing-xformers を参照してください
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')
学習
セマンティックセグメンテーションモデルは、ADE20Kの164Kのセグメンテーション画像とキャプションのペアで学習されました。このモデルは、Stable Diffusion 1.5をベースモデルとして、Nvidia A100 80Gを使用して200GPU時間学習されました。
ブログ記事
詳細情報については、[公式ControlNetブログ記事](https://huggi を参照してください。
📄 ライセンス
このモデルは The CreativeML OpenRAIL M license の下で提供されています。

