見出し画像

ポーズ指定ができるControlNetをAUTOMATIC1111版WebUIで使う方法

 2月10日に、人物のポーズを指定してAIイラストの生成ができるControlNet論文が発表され、すぐにStable Diffusion用のモデルがGitHubで公開されて、ネットで話題になっています。
 今回、このControlNetをWebUIに導入して使用する方法を紹介します。
(2023/03/09追記)WD 1.5 Beta 2用のControlNetの使用方法を追加しました。
(2023/04/18追記)WebUI用ControlNet 1.1のColabノートへのリンクを追加しました。


1.ControlNetの概要

 ControlNetは、入力画像の構造を維持したまま別の画像に変換することができる画像生成AI技術です。
 例えば、棒人間のような3Dモデルを使用して、キャラクターのポーズや構図を指定したイラストを生成したり、入力画像から輪郭線、深度、セグメンテーションなどの情報を抽出し、指示内容に合わせて画像を変換したりすることができます。

ControlNetの仕組み

 ControlNetは、事前学習済みの大規模な拡散モデルを制御して、追加の入力条件に対応させることができます。
 具体的には、まず、上の右側の図のように拡散モデルのニューラルネットワークの重みを固定したモデル(locked)とその重みをコピーした訓練可能なモデル(trainable copy)の2つに分けます。
 そして、訓練可能なモデルのみで追加条件を学習することにより、小さなデータセットでも、効率的かつ効果的に学習することができます。
 また、zero convolutionという畳み込み層の重みを 0 に初期化したブロックを訓練可能なモデルに加えることにより、学習を安定させ、高速に学習を進められるようにしています。
 さらに、ControlNetは、小規模な個人のパソコンでも簡単に学習することができます。

Stable Diffusion における ControlNet のアーキテクチャ

 Stable DiffusionにおけるControlNetのアーキテクチャは上の図のようになっています。ControlNet側のニューラルネットワーク(Unet)のエンコーダー部分がtrainable copyとなり、入力の前とUnetのデコーダー部分が zero convolutionに置き換わって、Stable Diffusion側(重みを固定したモデル)のUnetに繋がっています。


2.ControlNetをWebUIに導入する方法

 今回も、camenduruさんのGoogle Colabノートを利用します。
 例えば、Openjourneyのモデルを使用する場合は、以下のサイトにアクセスしてください。他のモデルに切り替えることもできます。

 すると、以下のようなコードが現れます。このコードをColabノートにコピーして使用することもできます。

%cd /content
!git clone --recurse-submodules https://github.com/camenduru/ControlNet-with-other-models
!sudo apt-get install aria2
!pip install gradio -r /content/ControlNet-with-other-models/requirements.txt

!sed -i -e 's/launch()/launch(share=True)/g' /content/ControlNet-with-other-models/app.py
!sed -i -e 's|\.\/annotator\/ckpts\/network-bsds500\.pth|\/content\/ControlNet-with-other-models\/ControlNet\/annotator\/ckpts\/network-bsds500.pth|g' /content/ControlNet-with-other-models/ControlNet/annotator/hed/__init__.py
!sed -i -e 's|annotator\/ckpts\/dpt_large-midas-2f21e586\.pt|\/content\/ControlNet-with-other-models\/ControlNet\/annotator\/ckpts\/dpt_large-midas-2f21e586.pt|g' /content/ControlNet-with-other-models/ControlNet/annotator/midas/api.py
!sed -i -e 's|annotator\/ckpts\/dpt_hybrid-midas-501f0c75\.pt|\/content\/ControlNet-with-other-models\/ControlNet\/annotator\/ckpts\/dpt_hybrid-midas-501f0c75.pt|g' /content/ControlNet-with-other-models/ControlNet/annotator/midas/api.py
!sed -i -e 's|\.\/annotator\/ckpts/mlsd_large_512_fp32.pth|\/content\/ControlNet-with-other-models\/ControlNet\/annotator\/ckpts\/mlsd_large_512_fp32.pth|g' /content/ControlNet-with-other-models/ControlNet/annotator/mlsd/__init__.py
!sed -i -e 's|\.\/annotator\/ckpts\/body_pose_model\.pth|\/content\/ControlNet-with-other-models\/ControlNet\/annotator\/ckpts/body_pose_model.pth|g' /content/ControlNet-with-other-models/ControlNet/annotator/openpose/__init__.py
!sed -i -e 's|\.\/annotator\/ckpts\/hand_pose_model\.pth|\/content\/ControlNet-with-other-models\/ControlNet\/annotator\/ckpts/hand_pose_model.pth|g' /content/ControlNet-with-other-models/ControlNet/annotator/openpose/__init__.py
!sed -i -e 's|annotator\/ckpts\/upernet_global_small.pth|\/content\/ControlNet-with-other-models\/ControlNet\/annotator\/ckpts\/upernet_global_small.pth|g' /content/ControlNet-with-other-models/ControlNet/annotator/uniformer/__init__.py
!sed -i -e 's|annotator\/uniformer\/exp\/upernet_global_small\/config\.py|\/content\/ControlNet-with-other-models\/ControlNet\/annotator\/uniformer\/exp\/upernet_global_small\/config.py|g' /content/ControlNet-with-other-models/ControlNet/annotator/uniformer/__init__.py

!sed -i -e 's|DEFAULT_BASE_MODEL_REPO_PLACEHOLDER|ckpt\/midjourney-v4-diffusion|g' /content/ControlNet-with-other-models/model.py 
!sed -i -e 's|DEFAULT_BASE_MODEL_FILENAME_PLACEHOLDER|mdjrny-v4.ckpt|g' /content/ControlNet-with-other-models/model.py 
!sed -i -e 's|DEFAULT_BASE_MODEL_URL_PLACEHOLDER|https:\/\/huggingface.co\/ckpt\/midjourney-v4-diffusion\/resolve\/main\/mdjrny-v4.ckpt|g' /content/ControlNet-with-other-models/model.py

%cd /content/ControlNet-with-other-models
!python /content/ControlNet-with-other-models/app.py

 次に、GPUを選択してセルを実行し、Running on public URL: の後のリンクをクリックすると、ControlNetの操作画面が立ち上がります。

ControlNetの操作画面

 参考のため、Anything V4.5用のモデルも載せておきます。


3.ControlNetの10種類の機能

 ControlNetには、以下の10種類の機能があり、タブを選択して使用することができます。

  1. Canny 入力画像の輪郭線を抽出して画像変換する機能

  2. Hough 建物などの直線的な輪郭線のみを抽出して画像変換する機能

  3. HED 入力画像のエッジ(大雑把な輪郭)を抽出して画像変換する機能

  4. Scribble 入力したラフ画像の構図を維持して画像変換する機能

  5. Scribble Interactive 操作画面上に自分でラフ画像を描き、その構図を基に画像変換する機能

  6. Fake Scribble 入力画像をラフ画像に変換した上で、その構図を基に画像変換する機能

  7. Pose 入力画像の人体の姿勢を検出して画像変換する機能

  8. Segmentation 入力画像の領域を要素ごとに塗り分け、その配置に従って画像変換する機能

  9. Depth 入力画像の深度情報を抽出して画像変換する機能

  10. Normal map 入力画像の法線情報を抽出して、画像の凹凸に忠実に画像変換する機能


4.ControlNetの使用方法

 今回は、Canny、Pose、Scribbleの3つの機能を試してみます。

(1) Canny

 まず、輪郭線を抽出して画像を変換するCannyを試してみます。
 Cannyのタブを選び、Image欄に手持ちの画像をドロップしてください。今回は3枚の画像を新たに生成するので、Advanced optionsを開いて、Imagesを3に指定します。そして、Promptに指示を入力してRunボタンをクリックすると、しばらくして4枚の画像が現れます。

 最初の線画が輪郭線を抽出したものとなり、残り3枚の画像が輪郭線を維持して変換した画像となります。

(2) Pose

 次に、人体の姿勢を検出して画像を変換するPoseを試してみます。
 Poseのタブを選び、先程と同じようにImage欄に手持ちの画像をドロップしてください。今回も3枚の画像を新たに生成するので、Advanced optionsを開いて、Imagesを3に指定します。そして、Promptに指示を入力してRunボタンをクリックすると、しばらくして4枚の画像が現れます。

 最初の画像がポーズを表すボーン画像となり、残り3枚の画像がポーズを維持して変換した画像となります。

ポーズを維持して、様々なPromptで描き替えた画像の例

(3) Scribble

 最後にラフ画像の構図を維持して画像変換すScribbleを試してみます。
 Scribbleのタブを選び、Image欄に自分で描いた落書き画像をドロップしてください。今回も3枚の画像を新たに生成するので、Advanced optionsを開いて、Imagesを3に指定します。そして、Promptに指示を入力してRunボタンをクリックすると、しばらくして4枚の画像が現れます。

 最初の画像が入力した落書き画像となり、残り3枚の画像が構図を維持して変換した画像となります。


5.デザインドールを使って思い通りのポーズの画像を生成する方法

デザインドールというソフトウェアとControlNetを使って、思い通りのポーズの画像を生成することができます。
 まず、以下のサイトからデザインドール Version 5.6.0(無料版)をダウンロードして、インストールしてください。

 起動すると、以下のような画面になりますので、マウスで手足などをドラッグしてお好みのポーズを作成します。

デザインドール操作画面

 納得するポーズが作成できたら、左上の「ファイル」→「画像を書きだす」をクリックして、画像ファイル(jpgなど)を保存します。

デザインドールで作成した画像ファイルの例

 あとは、上記3.(2)のPoseの使用方法と同じですので、Image欄にこの画像をドロップして画像を生成してください。

AUTOMATIC1111版WebUIの操作画面
生成された画像の例

 少し顔が崩れていますが、指定通りのポーズの画像が生成されました。プロンプトやモデルを工夫すれば、もっとよい画像が生成できると思います。


6.棒人形画像による指定ポーズでの画像生成など

 上記2.で紹介した以外の方法についても紹介します。
 以下のコードをColabノートにコピーし、GPUを選択してセルを実行し、Running on public URL: の後のリンクをクリックすると、AUTOMATIC1111版WebUIの操作画面が立ち上がります。
 モデルは、AbyssOrangeMix3を使用しています。download_modelで始まる最初の2行がモデルとVAEのダウンロードを指示しているところで、ここを書き換えれば、新しいモデルを入れることができます。

!git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui
!git clone https://github.com/Mikubill/sd-webui-controlnet /content/stable-diffusion-webui/extensions/sd-webui-controlnet
!git clone https://github.com/camenduru/openpose-editor /content/stable-diffusion-webui/extensions/openpose-editor
%cd /content/stable-diffusion-webui
!apt-get -y install -qq aria2
def download_model(download_model_url, output_dir):
  file_name_path = download_model_url.split('/')[-1]
  !aria2c --console-log-level=error -c -x 16 -s 16 -k 1M {download_model_url} -d {output_dir} -o {file_name_path}
download_model("https://huggingface.co/WarriorMama777/OrangeMixs/resolve/main/Models/AbyssOrangeMix3/AOM3A1B_orangemixs.safetensors", "/content/stable-diffusion-webui/models/Stable-diffusion")
download_model("https://huggingface.co/WarriorMama777/OrangeMixs/resolve/main/VAEs/orangemix.vae.pt", "/content/stable-diffusion-webui/models/Stable-diffusion")
download_model("https://huggingface.co/webui/ControlNet-modules-safetensors/resolve/main/control_canny-fp16.safetensors", "/content/stable-diffusion-webui/extensions/sd-webui-controlnet/models")
download_model("https://huggingface.co/webui/ControlNet-modules-safetensors/resolve/main/control_depth-fp16.safetensors", "/content/stable-diffusion-webui/extensions/sd-webui-controlnet/models")
download_model("https://huggingface.co/webui/ControlNet-modules-safetensors/resolve/main/control_hed-fp16.safetensors", "/content/stable-diffusion-webui/extensions/sd-webui-controlnet/models")
download_model("https://huggingface.co/webui/ControlNet-modules-safetensors/blob/main/control_mlsd-fp16.safetensors", "/content/stable-diffusion-webui/extensions/sd-webui-controlnet/models")
download_model("https://huggingface.co/webui/ControlNet-modules-safetensors/resolve/main/control_normal-fp16.safetensors", "/content/stable-diffusion-webui/extensions/sd-webui-controlnet/models")
download_model("https://huggingface.co/webui/ControlNet-modules-safetensors/resolve/main/control_openpose-fp16.safetensors", "/content/stable-diffusion-webui/extensions/sd-webui-controlnet/models")
download_model("https://huggingface.co/webui/ControlNet-modules-safetensors/resolve/main/control_scribble-fp16.safetensors", "/content/stable-diffusion-webui/extensions/sd-webui-controlnet/models")
download_model("https://huggingface.co/webui/ControlNet-modules-safetensors/resolve/main/control_seg-fp16.safetensors", "/content/stable-diffusion-webui/extensions/sd-webui-controlnet/models")
!python launch.py --share --xformers --enable-insecure-extension-access

 ControlNetを使用するには、操作画面で下の方のControlNetを開き、画像をドロップして、Enableにチェックをつけます。そして、preprocessorとModelから適当なものを選択します。

AUTOMATIC1111版WebUIの操作画面

 今回は、棒人形画像による指定ポーズでの画像生成を試しますので、最初にOpenpose Editorで棒人形画像を作成します。
 Openpose Editorのタブをクリックすると、以下の操作画面が現れます。

Openpose Editorの操作画面

 画面上の棒人形の関節をマウスでドラッグして、好みのポーズの棒人形画像を作成します。完成したら、Send to ControlNetのボタンをクリックして、画像をControlNetに送ります。

 次に、txt2imgのタブをクリックして、ControlNetの操作画面に戻ります。
preprocessorはnoneModelはcontrol_openpose-fp16を選択してください。
 あとは、通常の画像生成と同じようにPromptに指示を入力してRunボタンをクリックすると、しばらくして生成された画像が現れます。

基になった棒人形画像
生成された画像の例

 ControlNetには、全部で10種類の機能がありますので、是非色々と試してみてください。


7.WD 1.5 Beta 2用のControlNetの使用方法

 これまで、ControlNetは、Stable Diffusion v2.1ベースのモデルには対応していなかったため、WD 1.5などではControlNetは使えませんでした。
 しかし、最近、WD 1.5に対応するControlNetが公開されましたので紹介します。

 以下が、WD 1.5 Beta 2 用ControlNetのコードです。このコードをColabノートにコピーし、GPUを選択してセルを実行し、Public WebUI Colab URL:の後のリンクをクリックすると、6.と同じAUTOMATIC1111版WebUIの操作画面が立ち上がります。

import os
from google.colab.output import eval_js
os.environ['colab_url'] = eval_js("google.colab.kernel.proxyPort(7860, {'cache': false})")

!apt -y update -qq
!wget http://launchpadlibrarian.net/367274644/libgoogle-perftools-dev_2.5-2.2ubuntu3_amd64.deb
!wget https://launchpad.net/ubuntu/+source/google-perftools/2.5-2.2ubuntu3/+build/14795286/+files/google-perftools_2.5-2.2ubuntu3_all.deb
!wget https://launchpad.net/ubuntu/+source/google-perftools/2.5-2.2ubuntu3/+build/14795286/+files/libtcmalloc-minimal4_2.5-2.2ubuntu3_amd64.deb
!wget https://launchpad.net/ubuntu/+source/google-perftools/2.5-2.2ubuntu3/+build/14795286/+files/libgoogle-perftools4_2.5-2.2ubuntu3_amd64.deb
!apt install -qq libunwind8-dev
!dpkg -i *.deb
%env LD_PRELOAD=libtcmalloc.so
!rm *.deb

!apt -y install -qq aria2
!pip install -q --pre xformers
!pip install -q --pre triton

!git clone -b v2.0 https://github.com/camenduru/stable-diffusion-webui
!wget https://raw.githubusercontent.com/camenduru/stable-diffusion-webui-scripts/main/run_n_times.py -O /content/stable-diffusion-webui/scripts/run_n_times.py
!git clone https://github.com/Mikubill/sd-webui-controlnet /content/stable-diffusion-webui/extensions/sd-webui-controlnet
!git clone https://github.com/camenduru/openpose-editor /content/stable-diffusion-webui/extensions/openpose-editor
!git clone https://github.com/jexom/sd-webui-depth-lib /content/stable-diffusion-webui/extensions/sd-webui-depth-lib
!git clone https://github.com/hnmr293/posex /content/stable-diffusion-webui/extensions/posex
!git clone https://github.com/camenduru/sd-webui-tunnels /content/stable-diffusion-webui/extensions/sd-webui-tunnels
%cd /content/stable-diffusion-webui
!git reset --hard

!aria2c --console-log-level=error -c -x 16 -s 16 -k 1M https://huggingface.co/ckpt/ControlNet/resolve/main/diff_control_wd15beta2_canny.safetensors -d /content/stable-diffusion-webui/extensions/sd-webui-controlnet/models -o diff_control_wd15beta2_canny.safetensors
!aria2c --console-log-level=error -c -x 16 -s 16 -k 1M https://huggingface.co/ckpt/ControlNet/raw/main/diff_control_wd15beta2_canny.yaml -d /content/stable-diffusion-webui/extensions/sd-webui-controlnet/models -o diff_control_wd15beta2_canny.yaml
!aria2c --console-log-level=error -c -x 16 -s 16 -k 1M https://huggingface.co/ckpt/ControlNet/resolve/main/diff_control_wd15beta2_depth.safetensors -d /content/stable-diffusion-webui/extensions/sd-webui-controlnet/models -o diff_control_wd15beta2_depth.safetensors
!aria2c --console-log-level=error -c -x 16 -s 16 -k 1M https://huggingface.co/ckpt/ControlNet/raw/main/diff_control_wd15beta2_depth.yaml -d /content/stable-diffusion-webui/extensions/sd-webui-controlnet/models -o diff_control_wd15beta2_depth.yaml
!aria2c --console-log-level=error -c -x 16 -s 16 -k 1M https://huggingface.co/ckpt/ControlNet/resolve/main/diff_control_wd15beta2_pose.safetensors -d /content/stable-diffusion-webui/extensions/sd-webui-controlnet/models -o diff_control_wd15beta2_pose.safetensors
!aria2c --console-log-level=error -c -x 16 -s 16 -k 1M https://huggingface.co/furusu/ControlNet/raw/main/diff_control_wd15beta2_pose.yaml -d /content/stable-diffusion-webui/extensions/sd-webui-controlnet/models -o diff_control_wd15beta2_pose.yaml

!aria2c --console-log-level=error -c -x 16 -s 16 -k 1M https://huggingface.co/waifu-diffusion/wd-1-5-beta2/resolve/main/checkpoints/wd-1-5-beta2-fp32.safetensors -d /content/stable-diffusion-webui/models/Stable-diffusion -o wd-1-5-beta2-fp32.safetensors
!aria2c --console-log-level=error -c -x 16 -s 16 -k 1M https://huggingface.co/hakurei/waifu-diffusion-v1-4/resolve/main/vae/kl-f8-anime2.ckpt -d /content/stable-diffusion-webui/models/Stable-diffusion -o kl-f8-anime2.vae.pt
!aria2c --console-log-level=error -c -x 16 -s 16 -k 1M https://huggingface.co/waifu-diffusion/wd-1-5-beta2/raw/main/checkpoints/wd-1-5-beta2-fp32.yaml -d /content/stable-diffusion-webui/models/Stable-diffusion -o wd-1-5-beta2-fp32.yaml
!aria2c --console-log-level=error -c -x 16 -s 16 -k 1M https://huggingface.co/waifu-diffusion/wd-1-5-beta2/resolve/main/checkpoints/wd-1-5-beta2-aesthetic-fp32.safetensors -d /content/stable-diffusion-webui/models/Stable-diffusion -o wd-1-5-beta2-aesthetic-fp32.safetensors
!aria2c --console-log-level=error -c -x 16 -s 16 -k 1M https://huggingface.co/waifu-diffusion/wd-1-5-beta2/raw/main/checkpoints/wd-1-5-beta2-aesthetic-fp32.yaml -d /content/stable-diffusion-webui/models/Stable-diffusion -o wd-1-5-beta2-aesthetic-fp32.yaml
!aria2c --console-log-level=error -c -x 16 -s 16 -k 1M https://huggingface.co/waifu-diffusion/wd-1-5-beta2-extra/resolve/main/wd15-beta2-frosty-aesthetic-fp32.safetensors -d /content/stable-diffusion-webui/models/Stable-diffusion -o wd15-beta2-frosty-aesthetic-fp32.safetensors
!aria2c --console-log-level=error -c -x 16 -s 16 -k 1M https://huggingface.co/waifu-diffusion/wd-1-5-beta2/raw/main/checkpoints/wd-1-5-beta2-aesthetic-fp32.yaml -d /content/stable-diffusion-webui/models/Stable-diffusion -o wd-1-5-beta2-frosty-aesthetic-fp32.yaml
!python launch.py --share --xformers --enable-insecure-extension-access --theme dark --gradio-queue --cloudflared

 最初に、VAEを変更します。操作画面のSettingsのタブをクリックし、左側のStable Diffusionの文字をクリックし、SD VAEをkl-f8-anime2.vae.ptに変更して、オレンジ色のApply settingsをクリックしてください。

 左上のStable Diffusion checkpointの欄で、通常のWD 1.5 Beta 2AestheticバージョンFrosty Aestheticバージョンの3種類を切り替えることができます。

 また、オプションとして、棒人形画像を作成するOpenpose EditorPosex、Depthの拡張機能で手の形を整形するDepth map library and poserが使えます。

(1) Canny

 ControlNetを使用するには、操作画面で下の方のControlNetを開き、画像をドロップして、Enableにチェックをつけます。
 そして、Cannyを利用する場合は、preprocessorからcannyModelからdiff_control_wd15beta2_cannyを選択します。

WD 1.5 Beta 2用ControlNetのCanny使用中の操作画面
WD 1.5 Beta 2 Aesthetic ver.のCannyで生成した画像の例

(2) Depth

 Depthを利用する場合は、preprocessorからdepthModelからdiff_control_wd15beta2_depthを選択します。また、拡張機能として、Depth map library and poserが使えます。

WD 1.5 Beta 2用ControlNetのDepth使用中の操作画面
WD 1.5 Beta 2のDepthで生成した画像の例

(3) Pose

 Poseを利用する場合は、preprocessorからopenposeModelからdiff_control_wd15beta2_poseを選択します。
 Poseでは、Openpose EditorPosexで作成した棒人形画像を使用することもできます。なお、棒人形画像を使用する場合は、preprocessorからnoneを選択してください。Modelは上と同じです。

元画像
棒人形画像
WD 1.5 Beta 2 Frosty Aesthetic ver.のPoseで生成した画像の例

8.WebUI用ControlNet 1.1のColabノート

GitHubのCamenduruさんのサイトから、AbyssOrangeMix3モデルでWebUI用CotrolNet 1.1を使用するためのリンクを紹介します。
以下のリンクにアクセスして、ランタイムのタイプをGPUに変更し、セルを実行してください。

ControlNet 1.1は、以下のように機能が相当増えており、様々な画像変換機能を使うことができます。

ControNet 1.1の機能の例

例えば、openpose_faceの機能を使うと、以下のように顔の表情や向きを認識して、同じ表情や顔の向きの画像に変換することができます。

WebUIのControlNet 1.1操作画面

ControlNet 1.1の機能の詳細は、以下のページをご覧ください。

この記事が気に入ったらサポートをしてみませんか?