プロンプトの違いを確認するために、毎回プロンプトを書き換えて生成するのは面倒ですよね。
これ、「XY Plot」を使うと、一括で確認できます!
こんにちわ、AICU media編集部です。
「ComfyUI マスターガイド」第19回目になります。
本記事では、カスタムノード「Efficiency Nodes for ComfyUI」の「XY Plot」ノードを使い、プロンプトの動的置換と生成結果の変化をマトリクス形式で表示させる方法を解説します。
前回はこちら
1. 使用したカスタムノード
今回は、「Efficiency Nodes for ComfyUI」というカスタムノードを使用します。「Efficiency Nodes for ComfyUI」は、ComfyUIのワークフローを効率化し、ノードの総数を減らすために開発されたカスタムノードのコレクションです。これにより、画像生成や編集プロセスがよりシンプルかつ効果的になります。
https://cdn.iframe.ly/pZOur17?v=1&app=1
このカスタムノードに含まれる「XY Plot」を使用して、パラメータによる生成結果の変化を一括で確認したいと思います。「XY Plot」は、パラメータを指定してグリッド上にプロットするノードで、生成結果の比較が容易になります。
2. Efficiency Nodes for ComfyUIのインストール
- メニューの「Manager」をクリックし、「ComfyUI Manager Menu」を開きます。
- 「Custom Nodes Manager」をクリックします。
- 上部の検索バーに「Efficiency Nodes for ComfyUI」と入力し、表示されたカスタムノードの「Install」をクリックします。
- インストールが完了すると、再起動が求められるので、「Restart」をクリックします。
- トップ画面に戻るので、メニューの「Refresh」をクリックします。
- 再度「Custom Nodes Manager」画面を開き、上部の検索バーで「Efficiency Nodes for ComfyUI」を検索します。以下の画像のように表示されていれば、インストールが完了しています。
3. 使用ノード解説
Eff. Loader SDXL
Eff. Loader SDXLは、「Load Checkpoint」や「CLIP Text Encode (Prompt)」ノードを1つにまとめて使いやすくしたノードです。以下のような特徴を持ちます。
- モデルのロードとキャッシュ: Checkpoint、VAE、およびLoRAタイプのモデルをロードおよびキャッシュすることができます。キャッシュ設定はnode_settings.jsonファイルで管理されます。
- LoRA & Control Netスタックの適用: lora_stackおよびcnet_stack入力を介して、LoRAおよびControl Netスタックを適用することができます。これにより、複数のLoRAやControl Netモデルを一括で管理し、適用することが可能です。
- プロンプト入力ボックス: ポジティブおよびネガティブプロンプトのテキストボックスが付属しており、プロンプトのエンコード方法をtoken_normalizationおよびweight_interpretationウィジェットを使用して設定することができます。
- XY Plotノードとの連携: 「DEPENDENCIES」出力を「XY Plot」ノードに接続することで、XY Plotノードを用いた、パラメータごとの生成結果を一括で確認することができます。
各ウィジェットの用途は以下のとおりです。
- base_ckpt_name: 生成に使用するモデルを設定します。
- base_clip_skip: ベースCLIPモデルでスキップするレイヤーの数を決定します。CLIP Skipは、入力したプロンプト(呪文)をどれだけ正確に画像に反映させるかを制御する指標です。CLIPのレイヤーは12層となっているため、1から12までの整数値で設定でき、値が小さいほどプロンプトを忠実に反映し、大きいほどプロンプトから離れた解釈をする傾向があります。SDXLの場合、CLIP Skipの効果は低いと言われています。
- refiner_ckpt_name: リファイナーチェックポイントの名前を指定します。ベースモデルによって生成された出力を強化し、詳細と品質を向上させます。
- refiner_clip_skip: リファイナーCLIPモデルでスキップするレイヤーの数を決定します。デフォルト値は0です。
- vae_name: 使用する変分オートエンコーダ(VAE)の名前を指定します。VAEは画像生成プロセスで重要な役割を果たし、画像のエンコードとデコードを行います。VAEが含まれているモデルの場合、「Baked VAE」を選択することで、モデルのVAEを使用できます。
- positive: ポジティブプロンプトを入力します。
- negative: ネガティブプロンプトを入力します。
- token_normalization: プロンプトにトークン正規化を適用するかどうかを決定します。トークン正規化は入力テキストの標準化に役立ち、モデルの理解と性能を向上させる可能性があります。設定値は以下のとおりです。
- none(変更なし): このオプションでは、トークンの重みは変更されません。つまり、モデルが各トークンに割り当てる重みをそのまま使用します。重みの調整が不要な場合や、他の要因でトークンの影響を管理したい場合に使います。
- 例:テキスト「beautiful cat」が入力され、トークン「beautiful」には重み1.2、「cat」には重み1.0が割り当てられたとします。この設定では、トークンの重みはそのままで、各単語が入力された通りの影響を持ちます。つまり、「beautiful」が「cat」よりも少し強調されます。
- mean(平均調整): すべてのトークンの重みをシフトさせ、意味のあるトークンの平均が1になるように調整します。たとえば、入力テキストにいくつかの単語が含まれており、それぞれのトークンに異なる重みが付与されていた場合、この設定は全体のバランスを取って、過剰に重みが偏ることを防ぎます。これにより、特定のトークンが他のトークンより過剰に強調されることがなくなります。
- 例:テキスト「beautiful cat」を入力し、トークン「beautiful」に重み1.2、「cat」に重み1.0が割り当てられた場合、この設定では、トークンの重みがシフトされて、全体の重みの平均が1になるように調整されます。例えば、結果として「beautiful」の重みが1.1、「cat」の重みが0.9になるかもしれません。これにより、全体のバランスが取れ、過度な強調が防がれます。
- length(長さに基づく調整): 長い単語や埋め込みに関連するトークンの重みを、その長さに応じて均等に分割します。この分割は、異なる長さのトークンに対しても重みの大きさを一定に保つために行われます。
- 例:テキスト「transformation」をトークン化したときに、単語が3つのトークン(「trans」「for」「mation」)に分割され、それぞれに重み1.5が割り当てられたとします。この設定では、単語全体の重みが均等に分配され、各トークンの重みは1.29になります(具体的には sqrt(3 * pow(0.35, 2)) = 0.5 に基づきます)。長い単語でも重みのバランスが保たれ、他の単語と比較して過剰に強調されることがありません。
- length+mean(長さと平均の組み合わせ): この設定では、まずトークンの長さに基づいて重みを分割し、その後、重みの平均を1にシフトします。長い単語が過剰に強調されることを防ぎつつ、全体のバランスも調整するという、2つの手法を組み合わせた方法です。これは、長い単語がテキストの意味に不均衡な影響を与えないようにするのに役立ちます。
- 例:テキスト「beautiful transformation」で、「beautiful」に重み1.2、「transformation」に重み1.5が割り当てられたとします。この設定では、まず「transformation」の重みを3つのトークン間で分割し(各トークンの重みは1.29)、その後、全体のトークンの重みの平均を1にシフトします。これにより、全体のバランスがさらに調整されます。
- none(変更なし): このオプションでは、トークンの重みは変更されません。つまり、モデルが各トークンに割り当てる重みをそのまま使用します。重みの調整が不要な場合や、他の要因でトークンの影響を管理したい場合に使います。
- weight_interpretation: この設定は、特定のトークンや単語に割り当てられた重みをどのように処理するか、特に「重みを増加させる(up-weight)」または「減少させる(down-weight)」ときにどのようなアプローチを取るかを制御します。設定値は以下のとおりです。
- comfy(ComfyUIのデフォルト): デフォルト設定です。この方法では、CLIPベクトルがプロンプト(入力テキスト)と空のプロンプト(何もない状態)との間で線形補間されます。つまり、プロンプトの重みを「0から100%」の間で調整することが可能です。このため、特定の単語やトークンの重要性を調整したい場合に柔軟に対応できます。
- 例:テキスト「beautiful cat」で、「beautiful」に重み1.5を割り当てたとします。この設定では、「beautiful」と「完全に空のプロンプト」の間で線形補間されます。結果として、「beautiful」がやや強調されつつも、完全に突出しないように調整されます。これは「beautiful」が一定以上強調される一方で、「cat」の影響も保持されます。
- A1111: このオプションでは、CLIPベクトルがその重みに基づいてスケーリングされます。具体的には、トークンに与えられた重みが大きくなるほど、そのトークンがテキスト全体に与える影響も大きくなります。たとえば、重みを2倍に設定した場合、そのトークンは通常の2倍の強調度で扱われます。逆に、重みを0.5倍にすると、影響度は半分になります。
- 例:テキスト「beautiful cat」に対し、「beautiful」の重みを2倍に設定すると、この設定では「beautiful」の重みが2倍にスケーリングされます。つまり、「beautiful」の影響が「cat」の2倍になるため、「beautiful」がかなり強調されます。逆に、重みを0.5に設定すると、「beautiful」の影響が半減し、「cat」とのバランスが取られる形になります。
- compel: compel方式の重み付けは、ComfyUIと似ていますが、特定の条件下で異なる動作をします。特に、down-weight(重みを下げる)場合に、マスクされた埋め込みを使用してトークンの影響を減らします。これは、トークンの影響を完全に無視するのではなく、段階的にその影響を減らす手法です。上方の重み付け(up-weight)はComfyと同じように扱われます。
- 例:テキスト「beautiful cat」で「beautiful」に重み2.0、「cat」に重み0.5を割り当てたとします。この設定では、compelは上方の重み付けをcomfyと同じように処理しますが、「cat」のダウンウェイトはマスクされた埋め込みを使って実行されます。つまり、「cat」の影響は完全に消えるのではなく、少しずつ減少します。この手法は、特定の単語を完全に無視せず、少し影響を残すという意味で微調整が可能です。
- comfy++: 上方の重み付けでは、単語がプロンプトと、その単語がマスクされたプロンプトの間で線形補間されます。つまり、ある単語の影響を徐々に消していくという動作です。また、compelスタイルのダウンウェイトも採用されており、特定の単語の影響を段階的に減少させることができます。この方法は、細かい調整が必要な場面で有効です。
- 例:テキスト「beautiful cat」で「beautiful」に重み2.0を設定し、comfy++を使用します。この場合、「beautiful」はプロンプトと「beautiful」がマスクされたプロンプトの間で線形補間されます。つまり、「beautiful」の影響を少し抑えつつも、完全に無視するわけではありません。また、ダウンウェイトはcompel方式と同様に行われます。
- down_weight: 最大の重みが「1」になるように重みを再スケーリングします。つまり、常にdown-weight(重みの減少)操作しか行いません。この方式では、特定のトークンが他のトークンに比べて過度に強調されることはありません。compelスタイルのダウンウェイトを使用するため、徐々に重みが減少していく過程でトークンの影響が最小化されます。
- 例:テキスト「beautiful cat」で「beautiful」に重み1.5、「cat」に重み1.0が割り当てられたとします。この設定では、最大重みを1にスケーリングするため、「beautiful」の重みが1に再スケーリングされます。結果として、「beautiful」と「cat」のバランスが取れ、過度に強調されることがなくなります。常にダウンウェイトのみが行われるため、重みが1以上になることはありません。
- comfy(ComfyUIのデフォルト): デフォルト設定です。この方法では、CLIPベクトルがプロンプト(入力テキスト)と空のプロンプト(何もない状態)との間で線形補間されます。つまり、プロンプトの重みを「0から100%」の間で調整することが可能です。このため、特定の単語やトークンの重要性を調整したい場合に柔軟に対応できます。
- empty_latent_width / empty_latent_height: 空の潜在空間の幅と高さを設定します。潜在空間の次元は、生成される画像の解像度とアスペクト比を定義するために重要です。
- batch_size: 一度に生成される画像の数を指定します。バッチサイズが大きいほど処理時間が短縮されますが、より多くの計算リソースが必要です。
- lora_stack / cnet_stack: LoRAモデルやControlNetモデルのスタックを指定できます。これらはベースモデルを微調整し、特定のスタイルや特徴を追加するために使用されます。
KSampler SDXL (Eff.)
「KSampler SDXL (Eff.)」ノードは、「KSampler」ノードに以下のような便利な機能を加えた拡張ノードになります。
- ライブプレビューで生成を確認したり、VAEで画像をデコードする機能を備えています。
- シードをより明確に管理できる特別なシードボックスを搭載しています。(選択されたシードの動作を適用するために-1のシードを使用)
- XYプロットスクリプトなど、さまざまなスクリプトを実行できます。スクリプトを有効化するには、入力接続を接続するだけです。
各ウィジェットの用途は以下になります。
- noise_seed: シード値を設定します。シード値は、直接入力の他に、「Randomize / Last Queued Seed」ボタンをクリックすることで、-1と最後の生成に使用されたシード値を切り替えることが可能です。
- steps: サンプリングのステップ数を指定します。値が大きいほど高品質な画像が生成されますが、処理時間も長くなります。
- cfg: Classifier-Free Guidanceのスケールを制御します。値が高いほど、プロンプトに忠実な画像が生成されます。
- sampler_name: 使用するサンプリングアルゴリズムを選択します。初期値はeulerになります。
- scheduler: サンプリングプロセスのスケジューリング戦略を指定します。初期値はnormalになります。
- start_at_step: サンプリングを開始するステップを指定します。部分的なサンプリングや既存画像の改良に使用できます。
- refine_at_step: リファイナーモデルに切り替えるステップを指定します。-1に設定するとリファイナーは無効になります。
- preview_method: 生成中の画像のプレビュー方法を指定します。
- auto: システムが最適なプレビュー方法を自動的に選択します。通常は最も効率的なオプションです。
- latent2rgb: 潜在空間の画像を直接RGBに変換してプレビューします。高速ですが、品質は低くなります。
- taesd: Tiny AutoEncoder for Stable Diffusionを使用してプレビューを生成します。品質と速度のバランスが取れています。
- none: プレビューを生成しません。最も高速ですが、進捗を視覚的に確認できません。
- vae_decode: VAE(Variational Autoencoder)を使用して潜在画像を最終出力画像にデコードするかどうかを制御します。
- true: 標準的なVAEデコードを実行します。
- true (tiled): タイル化されたVAEデコードを実行します。大きな画像や高解像度画像に適しています。
- false: VAEデコードを実行せず、潜在画像のままにします。この時、出力「IMAGE」は機能しないため、ノードを接続しているとエラーになります。
- output only: 最終結果のみをVAEデコードします。中間ステップはデコードしません。
- output only (tiled): 最終結果のみをタイル化されたVAEデコードで処理します。
XY Plot
「XY Plot」ノードは、特定のウィジェットの値やプロンプトなどを指定の条件で変化させ、その変化をX/Y軸に一度に表示するために使用するノードです。XY Plotノードの特徴は以下になります。
- 2次元グリッド形式での表示: X軸とY軸に異なるパラメータを設定し、それらの組み合わせによる画像生成結果を2次元グリッドで表示します。
- 多様なパラメータ比較: CFG、シード値、チェックポイント、LoRA強度など、様々なパラメータを比較できます。
- スクリプト生成: XY Plotノードは内部的にスクリプトを生成し、KSampler (Efficient)ノードと連携して動作します。
各ウィジェットの用途は以下になります。
- grid_spacing: グリッド間のスペースを設定します。
- XY_flip: X軸とY軸を入れ替えるオプションです。
- Y_label_orientation: Y軸のラベルの向きを設定します。
- cache_models: モデルをキャッシュするかどうかを設定します。
- ksampler_output_image: KSamplerの出力画像の形式を指定します。「Images」の場合、プロットされた1枚ずつの画像が出力されます。「Plot」の場合、1枚に全ての生成画像がプロットされた画像が出力されます。
XY Input: Prompt S/R
「XY Input: Prompt S/R」ノードは、XY Inputノードの入力「X」「Y」に接続し、プロンプトを制御するノードです。search_txtで指定した文字列をreplace_1, replace_2…で指定した文字列に次々と置換しながら生成を行います。
各ウィジェットの用途は以下になります。
- target_prompt: 置換対象のプロンプトをポジティブ、ネガティブから選択します。
- search_txt: 置換対象の文字列を指定します。例えば、「1girl, portrait」というプロンプトがある場合、「portrait」をsearch_txtに設定することで、次のウィジェット「replace_1」「replace_2」…の文字列に「portrait」を置換します。
- replace_count: 置換する回数を設定します。この回数を増減させることで、「replace_x」の入力欄が増減します。
- replace_x: 置換元の文字列を設定します。
4. ワークフロー
ワークフローの全体像は以下になります。
ワークフローは、文末で配布しています。
プロンプトと置換元文字列の設定
ポジティブプロンプト、ネガティブプロンプトには、以下を設定しました。
// ポジティブプロンプト
best quality, 1girl, solo, long_hair, smile, casual dress, very_long_hair, blonde_hair, standing relaxed, portrait,
// ネガティブプロンプト text, watermark,
置換元文字列は、X軸に「portrait」の置換として、「full body」「from side」「from behind」、Y軸に「standing relaxed」の置換として、「crossing arms」「hands on hips」「raising one hand」を設定しています。
5. 実行結果を確認する
それでは、メニューの「Queue Prompt」をクリックして、ワークフローを実行してみましょう。以下が生成結果になります。X軸、Y軸でプロンプトによる生成結果の違いを一目で確認できます。
今回は、プロンプトの比較をしてみましたが、これ以外にも「XY Input: CFG Scale」ノードや「XY Input: Steps」ノードなど、プロットに使えるノードがあるので、これらのノードを使ってウィジェットの変化を確認してみてください。
次回は、ComfyUIをAPI化する方法を紹介します。乞うご期待!
X(Twitter)@AICUai もフォローよろしくお願いいたします!
画像生成AI「ComfyUI」マスターPlan
画像生成AI「Stable Diffusion」特に「ComfyUI」を中心としたプロ向け映像制作・次世代の画像生成を学びたい方に向けたプランです。最新・実用的な記事を優先して、ゼロから学ぶ「ComfyUI」マガジンからまとめて購読できます。 メンバーシップ掲示板を使った質問も歓迎です。
- メンバー限定の会員証が発行されます
- 活動期間に応じたバッジを表示
- メンバー限定掲示板を閲覧できます
- メンバー特典記事を閲覧できます
- メンバー特典マガジンを閲覧できます
- 動画資料やworkflowといった資料への優先アクセスも予定
ゼロから学ぶ「ComfyUI」マガジン
https://note.com/aicu/m/md2f2e57c0f3c
マガジン単体の販売は1件あたり500円を予定しております。
2件以上読むのであればメンバーシップ参加のほうがお得です!というのもメンバーシップ参加者にはもれなく「AICU Creator Union」へのDiscordリンクをお伝えし、メンバーオンリー掲示板の利用が可能になります。
https://note.com/aicu/membership/boards/61ab0aa9374e/posts/db2f06cd3487?from=self
もちろん、初月は無料でお試しいただけます!
毎日新鮮で確かな情報が配信されるAICUメンバーシップ。
退会率はとても低く、みなさまにご満足いただいております。
✨️オトクなメンバーシップについての詳細はこちら
メンバーシップ向けボーナストラック
この記事の続きはこちらから https://note.com/aicu/n/ncb1141cab2ae
Originally published at https://note.com on Sept 19, 2024.