好きなモデルでControlNetによる画像生成を行う方法

好きなモデルでControlNetによる画像生成を行う方法 機械学習

「自分の好きなモデルでControlNetによる画像生成を行いたい」
「Stable Diffusion 1.5以外のモデルでControlNetを利用したい」

このような場合には、この記事の内容が参考になります。
この記事では、好きなモデルを利用したControlNetによる画像生成について解説しています。

本記事の内容

  • ControlNet用モデルとは?
  • ControlNet用モデルの作成
  • ControlNet with Human Poseの導入
  • ControlNet with Human Poseによる動作確認

それでは、上記に沿って解説していきます。

ControlNet用モデルとは?

ControlNetは、画像生成を進化させる技術です。
ControlNetをまだ利用していない場合は、インストールをオススメします。

もしくは、AUTOMATIC1111版web UIの拡張機能として利用することも可能です。

ControlNetにおいてデフォルトで用意されているモデルは、Stable Diffusion 1.5とほぼ同等です。
簡単に言うと、pix2pixができるようになっただけと言えます。
それでも十分スゴイんですけどね。

しかし、もっとスゴイことにControlNet用のモデルを自作可能なのです。
つまり、以下のようなモデルをControlNet用のモデルにすることができます。

Stable Diffusion 1.5をファインチューニングしたモデルなら、ControlNet用に変換できるようです。
実際、上記のChilloutMixはControlNet用モデルに変換できました。

その変換したモデルを利用すると、同じような構成・構造・ポーズで画像を生成できるようになります。

上の画像を入力して、次のような画像を生成することが可能です。

以上、ControlNet用モデルについて説明しました。
次は、ControlNet用モデルの作成を説明します。

ControlNet用モデルの作成

ControlNet用モデルの作成を説明します。
作成と言うより、変換と言った方が適切かもしれません。

その変換方法が、次のページで説明されています。

[Experiment] Transfer Control to Other SD1.X Models · Discussion #12 · lllyasviel/ControlNet
https://github.com/lllyasviel/ControlNet/discussions/12

詳細は、上記ページをご覧ください。
要約すると、次のような公式を用います。

AnythingV3_control_openpose = AnythingV3 + SD15_control_openpose – SD15

公式などと言ってますが、スクリプトが用意されています。
そのスクリプトを使えば、上記の公式とか知らなくても大丈夫です。

まず、ControlNetの最新版をGitHubから取得しましょう。
このあたりについては、次の記事で解説しています。

リポジトリルートに、「tool_transfer_control.py」を確認できます。
このファイルを利用して、モデルの変換を行います。

tool_transfer_control.py

今回は、ChilloutMixをControlNet用モデルに変換します。
次のように設定を書き換えます。

path_sd15 = './models/v1-5-pruned.ckpt'
path_sd15_with_control = './models/control_sd15_openpose.pth'
path_input = './models/chilloutmix_cilloutmixNi.safetensors'
path_output = './models/control_chilloutmix_cilloutmixNi_openpose.pth'

もちろん、この設定通りにファイルを設置する必要があります。

v1-5-pruned.ckpt
https://huggingface.co/runwayml/stable-diffusion-v1-5/blob/main/v1-5-pruned.ckpt

control_sd15_openpose.pth
https://huggingface.co/lllyasviel/ControlNet/blob/main/models/control_sd15_openpose.pth

「path_input」には、各自の変換したいモデルを設定します。
そして、実際にそのモデルを設置する必要があります。

「path_output」が、新たに作成されるControlNet用モデルになります。
ここまで準備ができたら、次のコマンドを実行します。

python tool_transfer_control.py

処理が完了したら、「path_output」にモデルを確認できるはずです。
また、途中で次のようなエラーが出るかもしれません。

ModuleNotFoundError: No module named 'safetensors'

その場合は、次のコマンドで解決できます。

pip install safetensors

以上、ControlNet用モデルの作成を説明しました。
次は、ControlNet with Human Poseの導入を説明します。

ControlNet with Human Poseの導入

ControlNet用モデルの動作確認には、ControlNet with Human Poseを利用します。
ControlNet with Human Poseの導入がまだの場合は、ここで利用できるようにしておきましょう。

そして、前提としてControlNetの動作確認は済みとします。
詳細は、次のページをご覧ください。

Human Poseの導入に必要なことは、ファイルの入手です。
以下のページから人体姿勢推定に関するファイルを取得します。

lllyasviel/ControlNet at main
https://huggingface.co/lllyasviel/ControlNet/tree/main/annotator/ckpts

下線を引いた2ファイルをダウンロードしましょう。

ダウンロードできたら、次の場所に保存します。

なお、「control_sd15_openpose.pth」も本来はダウンロードする必要があります。
ただし、このファイルはすでにダウンロード済みです。

以上、ControlNet with Human Poseの導入を説明しました。
次は、ControlNet with Human Poseによる動作確認を説明します。

ControlNet with Human Poseによる動作確認

ControlNet with Human Poseは、「gradio_pose2image.py」を利用します。
ただし、現状ではデフォルトの状態のままです。

デフォルトとは、「control_sd15_openpose.pth」を利用する設定ということです。

ここを新たに作成したモデルのパス(path_output)に変更します。

model.load_state_dict(load_state_dict('./models/control_chilloutmix_cilloutmixNi_openpose.pth', location='cuda'))

あと、ここの部分も変更しておきます。

block.launch()

ファイルを変更できたら、次のコマンドを実行します。

python gradio_pose2image.py

次のようにコンソールに表示されれば、起動成功です。

DiffusionWrapper has 859.52 M params.
making attention of type 'vanilla' with 512 in_channels
Working with z of shape (1, 4, 32, 32) = 4096 dimensions.
making attention of type 'vanilla' with 512 in_channels
Loaded model config from [./models/cldm_v15.yaml]
Loaded state_dict from [./models/control_chilloutmix_cilloutmixNi_openpose.pth]
Running on local URL:  http://127.0.0.1:7860

To create a public link, set `share=True` in `launch()`.

あとは、画像をアップロードしてプロンプトを入力するだけです。
そうすれば、次のように自作モデルを用いたControlNet による画像生成が可能となります。

以上、ControlNet with Human Poseによる動作確認を説明しました。

タイトルとURLをコピーしました