Stable DiffusionでSDXLになってWebUIでは重かったり、一部機能がうまく使えなかったりしているようなので、ComfyUIを導入してみます。以前、インストールしたいことがあったのですが、使い勝手がWebUIの方がよかったり、使いこなすのが難しかったので、結局使わず仕舞いでした。今回、SDXL用にインストールして検証してみます。
ComfyUIとは
ComfyUIはノードベースのGUIツールです。Unreal Engineをお使いの方はお馴染みですが、処理の流れを視覚的に組み立てる手法を取ります。

プログラムの処理をグラフィカルに表しているので、プログラムのコードより視覚的に分かりやすいですが、内部の処理の流れをそのまま記述するのでStable Diffusionの中身を知る必要があり、WebUIよりはハードルは高いです。ただ、Stable Diffusionでの画像生成の流れさえ覚えてしまえば、あとはWebUIと同じように使えるので、恐れることはないです。
ComfyUIのインストール
Windowsの方は下のリンクからComfyUIをダウンロードできます。
ファイルは7z形式で圧縮されているので、7-zipのアプリを使って解凍します。7-zipのインストール方法はこちらのYouTube動画でも解説しています。ダウンロードしたファイルをシフトを押しながら右クリックをして、7-zipから「ここに展開」を選択すると任意の場所に解凍できます。解凍済みのファイルは5GB以上あるので、容量の余裕のあるストレージに解凍しましょう。

ベースモデルのセットアップ
モデルは「\ComfyUI_windows_portable\ComfyUI\models\checkpoints」の中に入れます。ここでは、ComfyUIのサンプルを使うためにベースモデル+リファイナーモデルの組み合わせをセットアップしてみます。今回はVAEが組み込まれた下の2つのファイルを使います。
ベースモデル
sd_xl_base_1.0_0.9vae.safetensors
リファイナーモデル
sd_xl_refiner_1.0_0.9vae.safetensors
ComfyUIの起動
ComfyUIは解凍したフォルダの下のバッチファイルをクリックすることで起動できます。基本はNVIDIA製GPUがあったほうがいいですが、CPUでも動かすことができるようです。WebUIよりも軽量なので、GPUはWebUIの2/3ほどでも動作可能です。

SDXL用設定ファイルの読み込み
起動したら、SDXL用の設定ファイルを読み込みます。ComfyUIの作者によって様々なサンプルフローが公開されています。今回、SDXL用のリファイナーモデルを使ったフローがありますので、それを使います。
上記のリンク先にいって下のボトルの画像をComfyUIの画面にドラッグします。

画像をドラッグするとこのボトルを生成した時の条件が読み込まれます。

これをアレンジします。このフォローの左上でモデルを選ぶところがあるので、ここで、さきほどダウンロードしたモデルを選択します。

サンプル画像の生成
コントロールボックスの「Queue Prompt」のボタンを1回押します。すると上のQueue sizeが1になって画像生成の準備を始めます。モデルを変えた初回のみ数分、モデル情報の最適化のため時間が掛かります。2回目からはすぐに画像生成できるので、1回目のみ少し気長にお待ちください。

画像生成が終わると右端にある「Save image」のボックスに生成された画像が表示されます。また、生成した画像はoutputフォルダに保存されています。

好きなプロンプトでの画像の生成
サンプル画像が生成できたことを確認したら好きなプロンプトで画像を生成してみます。
左の方にある「Text Prompt」のグループにプロンプトとネガティブプロンプトに好きなプロンプトを入れます。

また、画像サイズは「Empty Latent Image」のボックスに設定します。下のノートにあるようにSDXLではお勧めのサイズがいくつかありますので、その中から選ぶと良いでしょう。今回は縦長の896×1152にしてみます。

また、サンプラーなどの条件はKSampler(Advanced)のボックスで設定できます。ここではsamplerを変えました。シードの固定などもできるので、その場合は「control_after_generate」を「fixed」にします。

これで試しに画像を生成します。

画像は生成できましたが、ノイズがのぞき切れていないことが分かります。今回、ベースモデルで20stepで画像生成した後、一旦ノイズを付与して、リファイナーモデルで5stepで仕上げをする設定になっています。少し仕上げの時間が少ないようなので、ステップ数を増やしてみます。
「Step Control」のグループのstepsは総ステップ数、end_at_stepはベースモデルからリファイナーモデルに切り替えるステップを示しています。今回、総ステップ数を40回に増やします。

今回は美しい女性の画像が生成できました。ただし、見たら分りますが、やや腕が不自然な感じがします。私のプロンプトが良くないのかもしれませんが、今回のSDXLのベースモデル+リファイナーモデルは手指の表現がなかなか難しい印象を受けました。

おまけ:Refinerモデルを外した設定
RefinerモデルはBaseモデルで生成した画像に対して、少しノイズを加えた上で再度画像生成しなおして画質を高める手法ですが、公式ページによると人物に対しては対応していないとのことですので、ここではリファイナーモデルを外したフローに変えてみます。

リファイナーモデルの設定部分は下の「×」で示した3か所です。

削除した上でベースモデルのKSamplerとVAE-Decoderをノードで結ぶのと、ベースモデルのVAEとVAE-Decoderを結びます。(下図参照)

また、ステップ数の設定とベースモデルでの生成後のノイズ処理のオフ設定をします。


上の画像は生成したpngのまま貼っているので、もし、うまく設定できない方はこの画像をComfyUIの画面にドラッグして設定を呼び出してみてください。
生成した画像を見ると細部のノイズ除去があまい感じはするので、リファイナーモデルを使った方が高画質にできるように思います。(設定がまずいのかも??)
最後に
以上、ComfyUIを使ったSDXLでの画像生成を試してみました。Refinerという新しい手順を使うことにより、高画質な画像ができることが分かりました。また、ComfyUIを使うことで画像生成のフローがよく理解できました。
ComfyUIでの設定は電子工作のようでなかなか楽しいです。
コメント