StableDiffusion (v1.4)を試した記録 その1

約1週間前、StableDiffusion v1.4がリリースされたと話題になりました。
ローカル環境で動く点に魅力を感じて、1週間試した記録を載せておきます。

内容が他のサイトと被っていたり、数か月後には陳腐化しているかもしれませんが、2022年8月の記録として…(記事が雑なのはゆるして)

環境

GeForce RTX3060 (VRAM 12GB, LHR版)でStableDiffusionのFork版を使っています。
(original版はサンプルコードがOutOfMemoryになったため断念しました。)

Fork版はこちら GitHub - basujindal/stable-diffusion

コマンド関連はOriginal版と同一のはずですが、promptによる実行結果は異なるかもしれません。

StableDiffusionの雑な解説

こんな感じで処理されるようです。(詳しくないので違うかも?)

  1. seedからノイズ画像を生成し、元画像とする。
  2. (img2imgの場合) 元画像と、1.で生成したノイズ画像をstrength倍した画像を合成し、元画像として使う
  3. promptから、出力物の概念を生成する。
    (個人的には、薄いマスク画像みたいなイメージで認識しています。)
  4. 生成したノイズ画像に、3で生成した概念を焼き込む
  5. steps数の分、3~4を繰り返す
  6. 結果を出力

パラメータ関連

パラメータと、それに対する個人的な解釈です。 txt2img / img2imgどちらも同様に使えるようです。

コマンド名 詳細
--prompt 描画させたいイメージを指示する引数
--H 縦の解像度 ※ エラーになる解像度・ならない解像度がある。
手元の環境で使えたのはこのあたり→ 256,512,576,768,1024
--W 横の解像度 ※ こちらも一部の指定値ではエラーになる。
使える値は縦と同様
--seed 元にするノイズ画像の基準値。
ほかのパラメータを変更する際に比較できるので、設定した方が良い。
--n_iter 同じパラメータで何回実行するかを指定する。
ほぼ最初からやり直す機能なので、VRAM不足で欲しい枚数が生成できない場合に使うのが良い。
結果を見たいなら1、大量に生成するため放置するなら2以上を指定するのが良い?
--n_samples 一度に何枚生成するかを指定する。
VRAMギリギリまで使った方が生成効率はいいが、時間やOutOfMemoryのリスクが上がる。
--ddim_steps 一度の処理で画像補正をかける回数を指定する。
基本的には高い値の方が良好な結果になるが、かけすぎると崩壊することも。
50~250が無難かも?
--strength (img2imgのみ)0.0~1.0の範囲で元画像をどこまで残すかを指定する。
元画像の内容を残すなら0.4以下、大幅に変えたいなら0.7以上が良いかも?
--output 出力先フォルダを指定する。
デフォルトではcmdの直下にoutputフォルダを作り、その下にpromptの文字列が入力されたフォルダが生成されました。

(参考)設定した枚数と解像度

RTX3060のVRAM(12GB)で一度に生成できた件数の目安です。
(※ 30分~2時間近くかかります。ご利用は計画的に。)

  • txt2img
サイズ サンプル数
512x512 120
768x576 50
576x1024 20
  • img2img
サイズ サンプル数
512x512 50
768x576 20

(参考)その他引数について

  • seed

    Randで生成した32bitの数字を使っています。
    画像への影響が大きいため、いくつか試すのが良さそうです。

  • ddim_steps

    50前後で概形が生成されて、100付近で良くなる印象です。
    150~200は改善されるもの・されないもの・崩壊するものがありました。
    私は基本的には50か100、prompt/seedが良さそうなものは150に上げて試しています。

  • (img2imgの場合) strength

    今回は元画像の雰囲気を残したかったため0.4前後を主に使いました…が、あまり芳しい結果とはなりませんでした。

実行例

試した結果を数件記載します。
※ 基本的には成功率が数%なので、20枚作って1枚当たれば上出来くらいの心構えが必要です。

英文法がどう動くか分からないのでカンマ区切りで適当に入れています。

※ 他に検証したものはその2以降に載せます。

写実系 (夕暮れに離陸する飛行機)

python optimizedSD/optimized_txt2img.py --prompt "looking up at the plane at twilight, takeoff, aviation guide lines, dynamic angle, taken with SLR, fullsize, 4k resolution, photo, wallpaper, professional photo" --H 576 --W 768 --seed 1731723048 --n_iter 1 --n_samples 20 --ddim_steps 100

生成された20枚
成功寄りの例
失敗例

テクスチャ系 (苔むした石垣ブロック)

python optimizedSD/optimized_txt2img.py --prompt "stone wall, andesite, moss, repeating pattern, seamless, background" --H 512 --W 512 --seed 12 --n_iter 2 --n_samples 50 --ddim_steps 50

生成結果
成功寄り
失敗寄り

アニメ絵系 (初音ミク)
StableDiffusionは日本語指定できます、有効活用しましょう

python optimizedSD/optimized_txt2img.py --outdir "g7-15" --prompt "初音ミク, alone, 緑, ツインテール, 長髪, 白, ドレス, 少女, solo, アニメ, キャラクター, ゲーム, イラスト, ピクシブ, 音楽" --H 512 --W 512 --seed 1731723048 --n_iter 1 --n_samples 50 --ddim_steps 150

生成結果
成功寄り①
成功寄り②
※ 失敗側は閲覧注意になりがちなので省略

最後に

前提部分で分かったことを公開しました。参考になれば幸いです。