ComfyUIのImpact Wildcardを使って、プロンプトとLoRAをランダムに組み合わせ、バリエーション豊かな画像を生成する方法を解説します。
Wildcardとは
Wildcardは、プロンプトの一部をランダムに置き換えることで予想外の組み合わせで生成することができます。
ランダム性を導入したい場合におすすめです。
Wildcard導入
WildcardはImpact-Packの一部の機能です。
ComfyUI Managerから “Impact Pack” をインストールします。
Wildcardの使い方
ワークフローを “ダブルクリック” して検索ボックスを表示します。
“wild” と検索すると、”ImpactWildcardProcessor” と “ImpactWildcardEncode” が表示されます。
Processorがプロンプトをランダム化させるノードで、
EncodeがLoRAをランダム化させるノードです。
Processorを使う人が大半だと思いますのでこちらから解説していきます。
ノードには2つのテキスト入力欄がありますが、Wildcardを使った入力は上部のWildcard Promptでのみ有効です。
入力欄の下にmodeという項目があります。
Populateモードでは、Wildcardを含むプロンプトを処理し、生成されたテキストをPopulated Promptセクションに自動的に入力(populate)します。※Show TextはComfyUI Custom Scriptsに含まれています。
モード設定には PopulateとFixedの2つのオプションがありますが、基本的にPopulateモード以外で使うことはありません。
Processorノードの出力をText Encodeノードに接続するには、Text Encodeノードを右クリックし、表示されるメニューから「Convert text to input」を選択します。
一番下にあるSelect to add Wildcardはあらかじめ保存しておいたテキストファイルからランダムにプロンプトを生成する機能です。
またテキストファイルとして保存したワイルドカードはComfyUI Managerから “Restart” するまで反映されません。
Syntax(構文)の解説
動的プロンプト
{a|b|c}
のように、|で区切られたプロンプトからランダムに1つが選択されます。
パイプと呼ばれるこの記号はBack Spaceキーの隣にあります。
ネストが可能で、{a|{d|e|f}|c}
のように内部に別の動的プロンプトを含めることができます。
選択確率を設定するには、{5::red|4::green|7::blue|black}
のように、各プロンプトの前に数字を付けます。確率は全プロンプトの合計を100%として正規化されます。
{2::black|2::white|red}
の場合、内部的には以下のようになっています。
数字が付いているプロンプトの重みの合計を計算します。 2 + 2 + 1 = 5
各プロンプトの選択確率を計算します。
- black: 2 / 5 = 0.4 (40%)
- white: 2 / 5 = 0.4 (40%)
- red: 1 / 5 = 0.2 (20%)
最終的に、black
とwhite
がそれぞれ40%の確率で、red
が20%の確率で選択されることになります。
Wildcard
wildcards ディレクトリ内にperson.txt
というファイルがある場合、__person__
というワイルドカードを使うと、そのファイル内からランダムに1つのプロンプトが選択されます。
ワイルドカードファイル(.txtまたは.yamlファイル)は、custom_wildcards
またはwildcards
のパスに配置することで使用できます。
ComfyUI/
└── custom_nodes/
└── ComfyUI-Impact-Pack/
├── custom_wildcards
└── wildcards
アグリゲーションパターン(*)
これは、特定のパスとそのワイルドカードファイルからすべてのアイテムを1つのコレクションにグループ化し、その中からランダムに選択できるようにするものです。
例えば、custom_wildcards/emotion/
ディレクトリの下に、happy.txt
、angry.txt
、sad.txt
というワイルドカードファイルがあるとします。
custom_wildcards/emotion/
├── happy.txt
├── angry.txt
└── sad.txt
通常、これらのワイルドカードを使うには、__emotion/happy__
、__emotion/angry__
、__emotion/sad__
のように個別に指定する必要があります。
しかし、アグリゲーションパターン(*)を使えば、__emotion/*__
と指定することで、emotion/
ディレクトリ下のすべてのワイルドカードファイルからアイテムを1つのコレクションにグループ化し、その中からランダムに選択することができます。
つまり、__emotion/*__
は、happy.txt
、angry.txt
、sad.txt
の内容を全て含む1つのワイルドカードとして扱われます。
マルチセレクト($$)
利用可能な選択肢から複数のアイテムを選択します。
{n1-n2$$sel1|sel2|...}
:sel1, sel2, …の中からn1個以上n2個以下のアイテムをランダムに選択します。
{-n$$sel1|sel2|...}
:sel1, sel2, …の中から1個以上n個以下のアイテムをランダムに選択します。
{n$$sel1|sel2|...}
:n個のアイテムを選択します。
例えば、{2-4$$apple|banana|cherry|durian}
と指定すると、apple, banana, cherry, durianの中から2個以上4個以下のアイテムがランダムに選択されます。選択された項目は、デフォルトではスペースで区切られます。
また、カスタムセパレータを使うこともできます。セパレータを指定するには、$$
の後にセパレータを記述します。
{2$$ and $$apple|banana|cherry}
:選択されたアイテムはand
で区切られます(例:apple and cherry)
{1-3$$, $$red|green|blue|yellow}
:選択されたアイテムは,
で区切られます(例:red, blue, yellow)
ImpactWildcardEncode
このノードについて
LoRAとプロンプトをランダム化することができるノードです。主にLoRAをランダム化するために使います。
ImpactWildcardEncodeでは、Wildcard Promt内で直接LoRAを指定して読み込むことができます。以下の形式を使用します。
<lora:loraname:model_weight:clip_weight>
loraname
:読み込むLoRAの名前
model_weight
:LoRAをモデルに適用する際の重み
clip_weight
:LoRAをCLIPに適用する際の重み(省略した場合、model_weight
と同じ値が使用されます)
例:<lora:SuperCUTE:0.5:0.3>
LoRA Block Weightも使える(上級者)
Inspire Packがインストールされている場合、Lora Block Weightを使用できます。以下の形式で指定します。
LBW=lbw spec;
lbw spec
:Lora Block Weightの設定を指定する文字列
例:<lora:my_lora:0.8:1.2:LBW=0,0,0,0,0,0,0,0,0,0,A,B,0,0,0,0,0;A=0.5;B=0.2;>
A=
とB=
は、Lora Block Weight(LBW)を使用する際に、特定のブロックの重みを個別に指定するためのパラメータです。これらは、Inspire PackのLora Loader (Block Weight)
ノードのA
とB
のパラメータに対応しています。
この例では、A
とB
という2つのブロックが指定されています。A=0.5
は、A
ブロックの重みを0.5に設定することを意味し、B=0.2
は、B
ブロックの重みを0.2に設定することを意味します。
ここで重要なのは、A
とB
はユーザーが任意に選んだ名前だということです。実際のブロックの名前や位置は、LBW=
の後に続く数字の列(この例では0,0,0,0,0,0,0,0,0,0,A,B,0,0,0,0,0
)によって決まります。
しかし、A=
とB=
は、必ずしも必要ではありません。
数字(0
や1
など)を直接指定することで、対応するブロックの重みを設定できます。
ただし、A=
やB=
を使用することで、同じ重みを複数のブロックに適用したり、重みの値を変数化したりすることができます。これは、複雑なLora Block Weightの設定を管理する際に便利です。
例えば、以下の2つの設定は同等です。
<lora:my_lora:1:1:LBW=0,0,0,0,0.5,0.5,0,0,0,0,0.5,0.5,0,0,0.5,0.5,0.5;>
<lora:my_lora:1:1:LBW=0,0,0,0,A,A,0,0,0,0,A,A,0,0,A,A,A;A=0.5;>
掲示板