KSampler (Advanced)とは?

KSampler (Advanced)ノードは、無印KSamplerノードの上位互換です。 パラメータはdenoiseが消えて以下の四つが増えています。

  • add_noise
  • start_at_step
  • end_at_step
  • return_with_leftsover_noise

ComfyUIの中でも、最も面白い機能の一つだと思っているので、ゆっくり見ていきましょう。


拡散モデルとSamplingの復習

拡散モデルというのは、完全なノイズから、徐々にノイズを取り除いていくことで画像を生成する仕組みでした。

上の画像ならば、0ステップ目に満量のノイズを追加し、20ステップ目には全てのノイズが取り除かれ、画像が完成します。


パラメータ

start_at_stepend_at_step

KSampler (Advanced)では、start_at_stepend_at_step を設定することで、どこからサンプリングを開始し、どこまでサンプリングを進めるかを制御できます。

例えば、start_at_step4 / end_at_step11と設定したとき、画像の白い部分しかサンプリングを行いません。

add_noise

何度も繰り返しになりますが、拡散モデルはノイズ画像を作り、ノイズを徐々に取り除いていく仕組みです。

では、そのノイズはどこから来るのでしょう?
そうです、ノイズを追加するのもKSamplerが行っています。

KSampler (Advanced)では、add_noiseパラメータでノイズを追加するかしないかを選択できます。

SD1.5_KSampler_(Advanced)-add_noise.json

🟫仮にadd_noiseをdisableに設定してサンプリングを行うと、ノイズのない画像からノイズを除去し続けるため何も生成されません。


サンプリングを分割する

中間のステップしかサンプリングしなかったり、ノイズを追加しなかったり、一体どこで役に立つのでしょうか?

このKSampler (Advanced)だからこそ出来ることとして、一つのサンプリングを2つ以上のKSamplerに分割する、というものがあります。

図のように、前半 0 ~ 10stepは🟪Ksample (Advanced)、11~20stepは🟨KSampler (Advanced)で行ってみましょう。

SD1.5_KSampler_(Advanced)-divide.json

2つに分割しても生成される画像が全く同じであるのがわかると思います。 パラメータが少しややこしいので、丁寧に見ていきます。

🟪KSampler (Advanced)

  • add_noise : enable
  • start_at_step : 0
  • end_at_step : 10
  • return_with_leftover_noise : enable
    • ノイズを残したままlatentを返します。

🟨KSampler (Advanced)

  • add_noise : disable
    • ノイズが残ったlatentが渡されるので、ここでノイズは追加しません。
  • start_at_step : 10
    • 🟪のend_at_stepと同じにします。
  • end_at_step : 20
    • 全体のstep数より大きな値にした場合、内部的にはstepsと同じになっています。
  • return_with_leftover_noise : disable

分割することに意味はなさそうですが、これが面白いのです。


KSampler (Advanced)だからできること

プロンプトの切り替え

最初は"A"のプロンプトを使い、サンプリングの途中から"B"のプロンプトに切り替える、といったことが出来ます。

SD1.5_KSampler_(Advanced)-Prompt_Editing.json

このworkflowでは、最初の10stepを赤いりんご、残りを赤いうさぎというプロンプトで生成しています。

もっとわかりやすくするために、切り替えステップを1ずつ変えたときの生成画像を動画にしてみました。
100%りんごだったものが、徐々にうさぎになっていきます。

Stable Diffusion web UIユーザーであれば、Prompt Editingを思い出すかもしれません。実際、似たようなものです。
その中で1stepsごとにプロンプトを切り替えるというものがありましたが、ComfyUIでは、残念ながらカスタムノードがなければ出来ません。
KSampler (Advanced)を20個並べれば出来ますが、まぁ…やりませんね……

モデル(LoRA)の切り替え

同じように、途中からモデルやLoRAを切り替えることもできます。

SD1.5_KSampler_(Advanced)-LoRA.json

ノードが増えて少しややこしくなってきましたね。
ただ、よく見るとtext2imageのworkflowが2つ並んでおり、途中で切り替えているだけです。

最初の6stepをLoRAなしで、残りをLoRAありで生成しています。

これはドット絵にするLoRAですが、LoRAは"ドット絵にする"という概念以外にも、学習素材にした絵の記憶も持ってしまっています。

そのため、LoRAなしで生成した時の画像がそのままドット絵になるわけではありません。
LoRAを使わなかったときと全step適用したときを見比べてみると、ドット絵スタイルになっただけでなく、りんごの形まで変わってしまっています。

拡散モデルは、序盤のステップで形を作り、後半で細部を描いていきます。
形を作る最初のstepはLoRAをかけず、後半だけにLoRAをかけることで、モデル本来の能力を生かしつつLoRAによる絵柄変換ができるのです。


image2image

途中からノイズを追加する、というのはそのままimage2imageの仕組みつながります。
それでは、このままimage2imageの仕組みを見てみましょう。

image2image