Stable Diffusion WebUI (on Colab) : ControlNet (2) Canny エッジ検出 (ブログ)
作成 : Masashi Okumura (@ClassCat)
作成日時 : 04/19/2023
* サンプルコードの動作確認はしておりますが、動作環境の違いやアップグレード等によりコードの修正が必要となるケースはあるかもしれません。
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。
- 人工知能研究開発支援
- 人工知能研修サービス(経営者層向けオンサイト研修)
- テクニカルコンサルティングサービス
- 実証実験(プロトタイプ構築)
- アプリケーションへの実装
- 人工知能研修サービス
- PoC(概念実証)を失敗させないための支援
- お住まいの地域に関係なく Web ブラウザからご参加頂けます。事前登録 が必要ですのでご注意ください。
◆ お問合せ : 本件に関するお問い合わせ先は下記までお願いいたします。
- 株式会社クラスキャット セールス・マーケティング本部 セールス・インフォメーション
- sales-info@classcat.com ; Website: www.classcat.com ; ClassCatJP
Stable Diffusion WebUI (on Colab) : ControlNet (2) Canny エッジ検出
Stable Diffusion の研究は生成過程の結果に対して更に制御を持てる方法を模索してきました。ControlNet はユーザが生成過程をかなりカスタマイズすることを可能にする最小限のインターフェイスを提供します。ControlNet を使用して、ユーザは、深度マップ, セグメンテーション・マップ, 走り描き, キー・ポイント, 等々のような様々な空間的コンテキストにより生成を簡単に条件付けることができます。
この記事では Stable Diffusion WebUI で ControlNet を使用する方法について簡単に説明します。今回は Canny エッジ検出による条件付けを扱います。🤗 Diffusers を使用した ControlNet の詳細については以下をご覧ください :
- HuggingFace Diffusers 0.12 : API : パイプライン [Stable Diffusion] ControlNet 条件付けによるテキスト-to-画像生成
- HuggingFace Diffusers 0.12 : ノートブック : ControlNet
前提条件 :
Stable Diffusion WebUI で ControlNet を試すには、別途 WebUI の動作環境が必要です。その構築方法については以下の 1 を参照してください :
- PyTorch 2.0 : Google Colab で Stable Diffusion WebUI 入門
- Stable Diffusion WebUI (on Colab) : HuggingFace モデル / VAE の導入
- Stable Diffusion WebUI (on Colab) : LoRA の利用
- Stable Diffusion WebUI (on Colab) : 🤗 Diffusers による LoRA 訓練
- Stable Diffusion WebUI (on Colab) : ControlNet (1) 深度マップ
なお、ControlNet : 深度マップの使い方については既に 5 で説明しています。
Canny エッジ検出
今回は Canny エッジ検出画像を条件とする ControlNet を扱いますが、OpenCV を使用した Canny エッジ検出方法については以下で説明されています :
ここでは必要な箇所を抜粋しておきます。まず、OpenCV と diffusers をインストールします :
!pip install opencv-contrib-python
!pip install diffusers==0.15.0
例として有名なフェルメールの画像を使用します :
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"
)
cv2.Canny を使用して 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)
もうひとつ、別の例として Canny エッジ検出した後で加工してみます :
image2 = load_image(
"https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/landscape.png"
)
画像の中段をゼロアウトします (元の例では、中段を別のオブジェクトでオーバーレイさせる (重ね合わせる) ために行なった処理です) :
image2 = np.array(image2)
low_threshold = 100
high_threshold = 200
canny_image2 = cv2.Canny(image2, low_threshold, high_threshold)
# zero out middle columns of image where pose will be overlayed
zero_start = canny_image2.shape[1] // 4
zero_end = zero_start + canny_image2.shape[1] // 2
canny_image2[:, zero_start:zero_end] = 0
canny_image2 = canny_image2[:, :, None]
canny_image2 = np.concatenate([canny_image2, canny_image2, canny_image2], axis=2)
canny_image2 = Image.fromarray(canny_image2)
ControlNet 用拡張ライブラリのインストール
Stable Diffusion WebUI で ControlNet を利用するためには、必要な拡張ライブラリとモデルチェックポイントのインストールが必要です。Stable Diffusion WebUI の構築は完了しているものとします。
◇ まず、ControlNet 用の WebUI 拡張 Mikubill/sd-webui-controlnet をインストールします。この拡張は、ControlNet を元の Stable Diffusion モデルに追加することを WebUI に可能にします。
この拡張は WebUI からでもインストールできますが、extensions ディレクトリに “git clone” すれば簡単です :
%cd /content/stable-diffusion-webui/extensions/
!git clone https://github.com/Mikubill/sd-webui-controlnet
◇ そして、lllyasviel/ControlNet のモデルチェックポイントを extensions/sd-webui-controlnet/models に配備します。ここでは safetensors 形式に変換されたチェックポイントを使用しています :
%cd /content/stable-diffusion-webui/extensions/sd-webui-controlnet/models/
!wget https://huggingface.co/webui/ControlNet-modules-safetensors/resolve/main/control_canny-fp16.safetensors
!wget https://huggingface.co/webui/ControlNet-modules-safetensors/resolve/main/control_depth-fp16.safetensors
!wget https://huggingface.co/webui/ControlNet-modules-safetensors/resolve/main/control_hed-fp16.safetensors
!wget https://huggingface.co/webui/ControlNet-modules-safetensors/resolve/main/control_mlsd-fp16.safetensors
!wget https://huggingface.co/webui/ControlNet-modules-safetensors/resolve/main/control_normal-fp16.safetensors
!wget https://huggingface.co/webui/ControlNet-modules-safetensors/resolve/main/control_openpose-fp16.safetensors
!wget https://huggingface.co/webui/ControlNet-modules-safetensors/resolve/main/control_scribble-fp16.safetensors
!wget https://huggingface.co/webui/ControlNet-modules-safetensors/resolve/main/control_seg-fp16.safetensors
今回は Canny エッジ検出を扱いますので、以下だけでも十分です :
%cd /content/stable-diffusion-webui/extensions/sd-webui-controlnet/models/
!wget https://huggingface.co/webui/ControlNet-modules-safetensors/resolve/main/control_canny-fp16.safetensors
WebUI での ControlNet (Canny エッジ) の使用方法
基本的な使い方は簡単です。(“Seed” のすぐ下の) “ControlNet” をクリックすると、ControlNet の設定に必要な UI が展開されます :
最小限必要な設定は以下です :
- Canny エッジ検出画像のアップロード
- “Enable” ボタンをクリックして有効にする。
- Preprocessor を “canny” に設定します。
- Model として “control_canny-fp16” を選択します。
以上を設定した上で、例えばプロンプトを “disco dancer with colorful lights” として “Generate” ボタンをクリックすれば画像生成されます :
また 2 つ目の canny エッジ検出画像にプロンプト “a great castle located in a fantasy landscape, best quality” で画像生成すると :
以上