HuggingFace Diffusers 0.12 : パイプライン [SD] ControlNet 条件付けによるテキスト-to-画像生成

HuggingFace Diffusers 0.12 : API : パイプライン [Stable Diffusion] ControlNet 条件付けによるテキスト-to-画像生成 (翻訳/解説)

翻訳 : (株)クラスキャット セールスインフォメーション
更新日時 : 04/19/2023
作成日時 : 03/28/2023 (v0.14.0)

* 本ページは、HuggingFace Diffusers の以下のドキュメントを翻訳した上で適宜、補足説明したものです:

* サンプルコードの動作確認はしておりますが、必要な場合には適宜、追加改変しています。
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。

 

クラスキャット 人工知能 研究開発支援サービス

クラスキャット は人工知能・テレワークに関する各種サービスを提供しています。お気軽にご相談ください :

◆ 人工知能とビジネスをテーマに WEB セミナーを定期的に開催しています。スケジュール
  • お住まいの地域に関係なく 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 ❤️ .

リソース

 

利用可能なパイプライン

 

使用例

以下では推論のために ControlNet チェック・ポイントを Diffusers で使用する方法の単純なサンプルを与えます。推論パイプラインはすべてのパイプラインに対して同じです :

  1. 画像を取りそれを前条件付け (pre-conditioning) プロセッサを通します。
  2. 前処理された画像を 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 深度推定で訓練済み。
  • 制御画像概要 : 深い領域を表す黒色と浅い領域を表す白色を含むグレースケール画像。

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 のセグメンテーション・プロトコル画像。

 

以上