ジャコ Lab

プログラミング関連のメモ帳的ブログです

Seed って何?? diffusers で Seed を設定してみる

生成された画像

Stable Diffusion を触り始めてから 3日目の記事 です。
今回は Seed についての記事になります。

パイプラインを実行すると毎回ランダムで画像が作られますが、
生成された画像にはシードが割り振られています。
シードを固定すると生成される画像が 少しだけ 固定されるっぽいです。
※まだ全然上手く使えていません。

この記事では、そのシード値を調べたりしてみます。

シード値の設定方法

パイプラインに torch の Generator を渡します。

generator = torch.Generator()
generator.manual_seed(123)

prompt = "super fine illustration,masterpiece,best quality,cute ghost"
negative_prompt = "worst quality,ugly"
image = pipe(
    prompt,
    negative_prompt=negative_prompt,
    generator=generator,  # これを追加してます
    width=768,
    height=512,
).images[0]
image

※パイプラインの準備は前の記事をご確認ください。

zako-lab929.hatenablog.com

実行結果

コンソールログに以下が出力されました。

生成された画像

もう一度実行してみる

同じ画像が出力されました。

プロンプトをちょっと変えてみる

1匹になってほしかったので 1 cute ghost にしてみました。

  generator = torch.Generator()
  generator.manual_seed(123)
  print(f"Seed: {generator.initial_seed()}")

- prompt = "super fine illustration,masterpiece,best quality,cute ghost"
+ prompt = "super fine illustration,masterpiece,best quality,1 cute ghost"
  negative_prompt = "worst quality,ugly"
  image = pipe(
      prompt,
      negative_prompt=negative_prompt,
      generator=generator,  # これを追加してます
      width=768,
      height=512,
  ).images[0]
  image

実行結果

コンソールログに以下が出力されました。

Seed: 123

生成された画像

1匹にはなってくれませんでしたが、同じような見た目で出力されました。

solo も追加してみる

- prompt = "super fine illustration,masterpiece,best quality,1 cute ghost"
+ prompt = "super fine illustration,masterpiece,best quality,1 cute ghost,solo"

実行結果

全然違う見た目になってしまいました

生成された画像

ランダムシードで値を確認してみる

シード値をランダムに設定しつつ、値を確認したい場合は以下のようにします。

  generator = torch.Generator()
- generator.manual_seed(123)
+ generator.seed()
  print(f"Seed: {generator.initial_seed()}")

実行結果

Seed: 17432345433372292963

生成された画像

上記で出力されたシード値を使用して同じプロンプトを実行してみる

  generator = torch.Generator()
- generator.seed()
+ generator.manual_seed(17432345433372292963)
  print(f"Seed: {generator.initial_seed()}")

実行結果

同じ画像が出力されました。

まとめ

同じパラメータであれば同じ画像が出力されるが、
プロンプトや画角など変えてしまうと、シード値を固定しても別の画像が出力されてしまい、
今のところ自分は上手く扱えませんでした。