HuggingFace Diffusers 0.12 : API : パイプライン [Stable Diffusion] ControlNet 条件付けによるテキスト-to-画像生成 (翻訳/解説)
翻訳 : (株)クラスキャット セールスインフォメーション
更新日時 : 04/19/2023
作成日時 : 03/28/2023 (v0.14.0)
* 本ページは、HuggingFace Diffusers の以下のドキュメントを翻訳した上で適宜、補足説明したものです:
* サンプルコードの動作確認はしておりますが、必要な場合には適宜、追加改変しています。
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。
- 人工知能研究開発支援
- 人工知能研修サービス(経営者層向けオンサイト研修)
- テクニカルコンサルティングサービス
- 実証実験(プロトタイプ構築)
- アプリケーションへの実装
- 人工知能研修サービス
- PoC(概念実証)を失敗させないための支援
- お住まいの地域に関係なく Web ブラウザからご参加頂けます。事前登録 が必要ですのでご注意ください。
◆ お問合せ : 本件に関するお問い合わせ先は下記までお願いいたします。
- 株式会社クラスキャット セールス・マーケティング本部 セールス・インフォメーション
- sales-info@classcat.com ; Web: www.classcat.com ; ClassCatJP
HuggingFace Diffusers 0.12 : API : パイプライン [Stable Diffusion] ControlNet 条件付けによるテキスト-to-画像生成
概要
Adding Conditional Control to Text-to-Image Diffusion Models (テキスト-to-画像変換拡散モデルへの条件付き制御の追加) by Lvmin Zhang and Maneesh Agrawala.
事前訓練済みモデルを使用して、Stable Diffusion テキスト-to-画像生成を制御するために制御画像 (control images) (例えば、深度マップ) を提供することができて、その結果それは深度画像の構造に従い細部を埋めます。
論文の要約は以下のようなものです :
追加の入力条件をサポートするために事前訓練済み大規模拡散モデルを制御する、ニューラルネットワーク構造, ControlNet を提案します。ControlNet は end-to-end な手法でタスク固有の条件を学習し、そして学習は訓練データセットが小さい (< 50k) ときでさえ堅牢です。更に、ControlNet の訓練は拡散モデルの再調整ほどに高速で、モデルは個人向けデバイス上で訓練可能です。また、強力な計算クラスタが利用可能であれば、モデルは大規模なデータ総量 (数百万から数十億) にスケールできます。Stable Diffusion のような大規模な拡散モデルは、エッジマップ, セグメンテーションマップ, キーポイント等のような条件付き入力を可能にするために ControlNet で増強できることを報告します。これは大規模な拡散モデルを制御する手法を強化し、更に関連する応用を促進する可能性があります。
This model was contributed by the amazing community contributor takuma104 ❤️ .
リソース
利用可能なパイプライン
- パイプライン : StableDiffusionControlNetPipeline
- タスク : ControlNet 条件付けによるテキスト-to-画像生成 – Colab サンプル
使用例
以下では推論のために ControlNet チェック・ポイントを Diffusers で使用する方法の単純なサンプルを与えます。推論パイプラインはすべてのパイプラインに対して同じです :
- 画像を取りそれを前条件付け (pre-conditioning) プロセッサを通します。
- 前処理された画像を StableDiffusionControlNetPipeline に渡して実行します。
Canny エッジ ControlNet を使用した単純な例を見てみましょう。
from diffusers import StableDiffusionControlNetPipeline
from diffusers.utils import load_image
# Let's load the popular vermeer image
image = load_image(
"https://hf.co/datasets/huggingface/documentation-images/resolve/main/diffusers/input_image_vermeer.png"
)
次に、canny 画像を得るために画像を処理します。これがステップ 1 です。- 前条件付け (pre-conditioning) プロセッサを実行します。前条件付けプロセッサは ControlNet 毎に異なります。他のモデルの詳細は 公式チェックポイント のモデルカードを見てください。
First, we need to install opencv:
pip install opencv-contrib-python
Next, let’s also install all required Hugging Face libraries:
pip install diffusers transformers git+https://github.com/huggingface/accelerate.git
そして画像の canny エッジを取得できます。
import cv2
from PIL import Image
import numpy as np
image = np.array(image)
low_threshold = 100
high_threshold = 200
image = cv2.Canny(image, low_threshold, high_threshold)
image = image[:, :, None]
image = np.concatenate([image, image, image], axis=2)
canny_image = Image.fromarray(image)
Let’s take a look at the processed image.
次に、公式 Stable Diffusion 1.5 モデル と canny エッジ用の ControlNet をロードします。
from diffusers import StableDiffusionControlNetPipeline, ControlNetModel
import torch
controlnet = ControlNetModel.from_pretrained("lllyasviel/sd-controlnet-canny", torch_dtype=torch.float16)
pipe = StableDiffusionControlNetPipeline.from_pretrained(
"runwayml/stable-diffusion-v1-5", controlnet=controlnet, torch_dtype=torch.float16
)
高速化してメモリ使用量を削減するために、モデルオフローディングを有効にして高速な UniPCMultistepScheduler を使用しましょう。
from diffusers import UniPCMultistepScheduler
pipe.scheduler = UniPCMultistepScheduler.from_config(pipe.scheduler.config)
# this command loads the individual model components on GPU on-demand.
pipe.enable_model_cpu_offload()
Finally, we can run the pipeline:
generator = torch.manual_seed(0)
out_image = pipe(
"disco dancer with colorful lights", num_inference_steps=20, generator=generator, image=canny_image
).images[0]
This should take only around 3-4 seconds on GPU (depending on hardware). The output image then looks as follows:
複数の条件付けの組み合わせ
単一の画像生成のために複数の ControlNet 条件付けを組み合わせることができます。ControlNet のリストをパイプラインのコンストラクタに、対応する条件付けのリストを __call__ に渡します。
条件付けを組み合わせるとき、オーバーラップしないように条件付けをマスクすることは役立ちます。この例では、ポーズの条件付けが配置されている canny マップの中央をマスクします。
一つの条件付けを他よりも強調するために controlnet_conditioning_scales を変化させることも役立つ可能性があります。
Canny 条件付け
The original image:
Prepare the conditioning:
from diffusers.utils import load_image
from PIL import Image
import cv2
import numpy as np
from diffusers.utils import load_image
canny_image = load_image(
"https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/landscape.png"
)
canny_image = np.array(canny_image)
low_threshold = 100
high_threshold = 200
canny_image = cv2.Canny(canny_image, low_threshold, high_threshold)
# zero out middle columns of image where pose will be overlayed
zero_start = canny_image.shape[1] // 4
zero_end = zero_start + canny_image.shape[1] // 2
canny_image[:, zero_start:zero_end] = 0
canny_image = canny_image[:, :, None]
canny_image = np.concatenate([canny_image, canny_image, canny_image], axis=2)
canny_image = Image.fromarray(canny_image)
Openpose 条件付け
The original image:
Prepare the conditioning:
from controlnet_aux import OpenposeDetector
from diffusers.utils import load_image
openpose = OpenposeDetector.from_pretrained("lllyasviel/ControlNet")
openpose_image = load_image(
"https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/person.png"
)
openpose_image = openpose(openpose_image)
複数の条件付けで ControlNet を実行する
from diffusers import StableDiffusionControlNetPipeline, ControlNetModel, UniPCMultistepScheduler
import torch
controlnet = [
ControlNetModel.from_pretrained("lllyasviel/sd-controlnet-openpose", torch_dtype=torch.float16),
ControlNetModel.from_pretrained("lllyasviel/sd-controlnet-canny", 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_xformers_memory_efficient_attention()
pipe.enable_model_cpu_offload()
prompt = "a giant standing in a fantasy landscape, best quality"
negative_prompt = "monochrome, lowres, bad anatomy, worst quality, low quality"
generator = torch.Generator(device="cpu").manual_seed(1)
images = [openpose_image, canny_image]
image = pipe(
prompt,
images,
num_inference_steps=20,
generator=generator,
negative_prompt=negative_prompt,
controlnet_conditioning_scale=[1.0, 0.8],
).images[0]
image.save("./multi_controlnet_output.png")
利用可能なチェックポイント
ControlNet はテキスト-to-画像変換プロンプトに加えて制御画像を必要とします。各事前訓練済みモデルは、生成出力を条件付けするために異なる画像を必要とする、異なる条件付け手法を使用して訓練されています。例えば、Canny エッジ条件付けは Canny の出力である制御画像を必要とし、深度条件付けは深度マップである制御画像を必要とします。See the overview and image examples below to know more.
All checkpoints can be found under the authors’ namespace lllyasviel.
ControlNet with Stable Diffusion 1.5
lllyasviel/sd-controlnet-canny
- canny エッジ検出で訓練済み。
- 制御画像概要 : 黒い背景に白いエッジを持つモノクロ画像。
lllyasviel/sd-controlnet-depth
- Midas 深度推定で訓練済み。
- 制御画像概要 : 深い領域を表す黒色と浅い領域を表す白色を含むグレースケール画像。
- HED エッジ検出 (ソフトエッジ) で訓練済み。
- 制御画像概要 : 黒い背景に白いソフトエッジを持つモノクロ画像。
- M-LSD ライン検出で訓練済み。
- 制御画像概要 : 黒い背景に白い直線だけで構成されるモノクロ画像。
lllyasviel/sd-controlnet-normal
- 法線マップで訓練済み。
- 制御画像概要 : 法線マップされた 画像。
lllyasviel/sd-controlnet-openpose
- OpenPose ボーン画像で訓練済み。
- 制御画像概要 : OpenPose ボーン 画像。
lllyasviel/sd-controlnet-scribble
- 人間の走り描きで訓練済み。
- 制御画像概要 : 黒い背景に白いアウトラインを持つ手書きのモノクロ画像。
- セマンティックセグメンテーションで訓練済み。
- 制御画像概要 : ADE20K のセグメンテーション・プロトコル画像。
以上