2024-02-26: Get/Setノードとどっち使えば良い? の項を追加
ComfyUIはノードの線は右へ行ったり左へ行ったりすることがよくある。
また、ちょっと複雑な処理をするとノード数も無駄に多くなる。
特にVAEやCheckpointのように一つのノードのピンを何度も再利用するケースが無駄に感じる
Use Everywhereを使うとこれをめちゃくちゃスマートにまとめられるので紹介する。
KJNodesを始め、いくつかのカスタムノードにGet/Setノードが存在する。
これらはプログラミング的にSetで定数として保存しておきGetでそれを読み込むというノードで線のごちゃごちゃを解決するために作用する。
しかしながらこれらは同じインプットがたくさんある時に結局ノードがごちゃごちゃするデメリットがある。
Use Everywhereは言い換えれば各ピンのデフォルト値を決めるノード。
したがって何度も再利用するケースで更にスマートな外観にできる。
ピンが繋がなくても良いというちょっと特殊なノードなので理解が難しいかもしれないが、この記事を最後まで読んでもらえればわかると思う。
ComfyUI ManagerからはそのままUse Everywhere (UE Nodes)で検索。
GitHubのリンク:GitHub - chrisgoringe/cg-use-everywhere
例えば1度小さい画像で生成して、更にそれをアップスケールする場合。
基本的なノードのつなぎ方は次になる。
一部省略しているが、それでもチェックポイントやClip Text周りからは何本もの線が出てしまう。
なんと次のようになる
確かに見やすくなっている。が...
何度も言うが実際はKSampler間にはアップスケール系のノードが入るが省略している
そう、このUse Everywhere (UE Nodes)なのだが、省略パワーがすごすぎてちゃんと動作原理を理解していないと何が起こっているのかさっぱりわからなくなる
逆に笑ってしまう。
まずは基本の基本。
Anything Everywhereノードを「使わない」例を先に出すと
これを変化させて、チェックポイントをKSamplerに繋がないでUse Everywhereノードに繋いで見る
KSamplerのmodelには何も繋がない
ここで気づいただろうか?
KSamplerのmodelのピンの表示が変わっている
ここが光っていればAnything Everywhereノードから見えない線で繋がっている
なんでこういう接続になるのかわからないと思うので、これを先に解説する。
コレを見ると「あれ、じゃぁ何個もmodelのインプットがあるノードがある場合どうなるの?」となるだろう
例を見ると
modelの入力があるノードには全て繋がっている。
つまり1個Anything Everywhereを繋げるだけで、画面上のすべてのインプットに自動で接続される。
そうすると今度はmodelを分けたい場合どうするか。
これは簡単で、別途用意して直接繋げばOKだ。
この下側のLoad CheckpointもAnything Everywhere化したい場合、後の項で紹介するAnything Everywhere?ノードを使用する。
Anything Everywhereの他にAnything Everywhere3というノードがある。
これは単純にAnything Everywhere3個分を一つにまとめただけのノードだ。
Anything EveryWhere?(最後にクエスチョンマーク)のノードを使うと自動でつなぐピンを限定できる
このノードは入力蘭が2つあり、ここを指定してやらないといけないので解説する。
ここはノードのタイトルの一部を入れる(正規表現)
例えばKSamplerと入れてやるとノードの表示名(タイトル)にKSamplerと入っているノードにしか繋がらなくなる。
したがって、上の例のようにタイトルがFaceDetailerになっているノードには繋がらなくなる。
regexとは正規表現を意味する。
正規表現はプログラミングの領域に入るので細かい表記法は別サイトに譲るが、タイトルの途中にKSamplerと入っていればヒットしてしまうので注意
タイトルの中程にKSamplerが入っているので、この場合は繋がってしまう。
正規表現を覚えると「タイトルに数字が入っているものだけ」とか「aが3個以上連続するものだけ」のような複雑なものにもヒットする。
ここを勉強すると良いかも知れない。
input_regexを使用すると入力ピンの名前を限定できる
これは次の項で詳しく解説する。
次のケースは最初に躓くポイントだと思う。
ポジティブとネガティブのプロンプトをClip Text Encodeで作成しAnything Everywhereに入れた。
しかし、KSamplerの入力ピンを見ると光ってない=繋がってない。
これはKSampler自体にconditioningという同じ入力ピンが2本あるから。
どっちに繋げばよいかはAnything Everywhereが勝手に決める訳にはいかず、ユーザーが明示する必要がある箇所になる。
そこで上で紹介したAnything Everywhere?のinput_regexを使う。
ここでAnything Everywhere?のinput_regexを使うことで、同じconditioningの入力ピンがあってもその名前でつなぐピンを明示できる
これを使えばポジティブとネガティブをどちらにつなぐべきか明示できるため正しく接続される。
上でプロンプトのつなぎ分けを紹介したわけだが... 実はそもそもこれ専用のノードがある。
それがPrompts Everywhere
これははじめからポジティブネガティブを分けてくれるノードで、わざわざ上のようなAnything Everywhere?を使ったノードをくまなくても良い。
上のピンがポジティブ、下がネガティブになるようだ
ここはconditioningを入れるところであってテキストを直接入れても繋がらないので注意。
Seed値のEverywhereノードもある。
ただし、これを使う場合はKSamplerを右クリックしてメニューを出し、seedとcontrol_after_generateピンをConvertしておく必要があるので注意。
コンバートすれば直接入力をインプットピンに変更できる。
現在control_afeter_generateがうまく接続できないのを確認。これはConvertする必要がないかも?
要調査
Everywhere系ノードを使っていると、逆に線が省略されすぎてどこから出たピンかわからなくなることが有る。
こういったときにはなにもないところを右クリック > Show UE linksをクリックしてみると良い。
最近このノードを使った海外のワークフローをよく見かけるので記事にしてみた。
他にも線をスマートにするカスタムノードはいくつも有ると思うが一つの選択肢として持っておくと良いと思う。
