seed1234 と 1235 は全く別物

シードを変更すれば出力される画像も変わる、というのは経験があると思います。

では seed=1234 で生成したあとに、seed=1235 でもう一度生成してみましょう。
数値が近いので、似たような画像が生成される……と思いきや、まったく違う画像になります。

なぜでしょうか?


ノイズと生成画像の関係

拡散モデルは、ノイズから始めて、少しずつノイズを取り除くことで画像を作ります。
(詳しくは拡散モデルのページで)

つまり、最初のノイズが違えば、最終的な画像も当然違ってきます。


ノイズとシード値の関係

text2image では、最初にノイズを作る必要があります。
このノイズを作るときに、乱数(ランダムな数字列)が使われています。

seedは、その乱数の出し方を決める番号です。

seedは「乱数を初期化する番号」

コンピュータは「完全な乱数」を作っているわけではなく、擬似乱数生成器(PRNG)で“それっぽい乱数列”を作ります。

「seedが近いなら乱数列も近いのでは?」と思うかもしれません。しかし、そうはなりません。

  • 12341235 は人間には「1違いで近い数字」ですが
  • PRNGにとっては「別の初期化入力」で、生成される乱数列は基本的に無関係です

例えるなら、辞書の「1234ページ」と「1235ページ」は隣ですが、載っている単語が似ている保証はない、という感じです。


では似た画像を作るには?

シード値の近さと出力の近さに関係がないことは分かりました。
では seed=1234 で素敵な画像が作れたとして、似たような画像を作るにはどうしたらいいでしょうか?

1. image2imageを使う

最もシンプルな方法ですね。

生成した画像を入力として、弱めの denoise を使えば少し変化した画像が作れます。

2. ノイズを混ぜる(blend)

考え方は単純です。

    1. seed_A でノイズAを作る
    1. seed_B でノイズBを作る
    1. AをベースとしてBを少しだけ混ぜる

seed_B の値を変えたり、混ぜる量を調整することで、少し変化した画像が作れます。

3. ノイズを足す(injection)

もう一つは、ベースの latent に対して、少量のノイズ latent を足す方法です。

    1. seed_A でノイズAを作る
    1. 別の乱数で作った小さなノイズを、係数 0.01 などで足す

ノイズを注入するため、全体のノイズ量は増えていきます。

多少増えたくらいでは問題ありませんが、strength1.02.0 にすると、サンプラーがデノイズしきれず、ただのノイズ画像が出力されやすくなります。

workflow

通常の workflow では、ノイズの生成と注入は KSampler が内部で行います。 ただ今回のテクニックでは、KSampler に入れる前にノイズ(latent)を作り、そこに操作を加えます。

ComfyUIとしては少しイレギュラーなので、シンプルに image2image でいいかもしれませんね。

ノイズを混ぜる(blend)

Latent_Blend.json
  • 🟩Generate Noise + KSampler (Advanced) (add_noise=disable) という設定をすることで、ノイズを外部で作れるようにします。
  • 🟪こちらのGenerate Noise では、混ぜたい別のノイズ(latent)を生成します。
  • 🟨Latent Blendノードで、2つの latent を混ぜます。
    • blend_factor=1.0 で samples1 のみ、blend_factor=0.0 で samples2 のみになります。

ノイズを足す(injection)

Inject_Noise_To_Latent.json
  • 🟨Inject Noise To Latentstrengthを少しずつ上げていくことで、ベース latent に2つ目のノイズを追加していきます。
    • mix_randn_amountを上げると更に別のノイズが追加されますが、ここでは 0 にしておきます。