Stable Diffusionで16:9の画像を生成する
Stable Diffusionを試していて、生成される画像が512x512だと使いづらいなと感じていました。
16:9で出力しようと試みたんですが、意外と大変だったのでその方法を残しておきます。
まず結論から
--W
で幅を896
に指定。--H
で高さを512
に指定する。
$ python scripts/txt2img.py --W 896 --H 512 --prompt "a photograph of an astronaut riding a horse" --plms --ckpt models/ldm/stable-diffusion-v1/sd-v1-4.ckpt
厳密に言えば、16:9ではなく、16:9.143ぐらいです。
896x504にすると16:9になるので、厳密に16:9の画像を使いたい場合は、生成した画像をPhotoshop等で加工する必要があります。
実際に生成したもの
本当は、1920x1080を出力したい
--W
で幅を1920
に指定。--H
で高さを1080
に指定すればいけそうですが。
$ python scripts/txt2img.py --W 1920 --H 1080 --prompt "a photograph of an astronaut riding a horse" --plms --ckpt models/ldm/stable-diffusion-v1/sd-v1-4.ckpt
これだと、2つ問題があります。
1つ目、--W
と--H
は64
の倍数しか受け付けない。
2つ目、スペックが足りない。
--W
と--H
は64
の倍数しか受け付けない
試しに、--W 896 --H 504
を指定してみます。
$ python scripts/txt2img.py --W 896 --H 504 --prompt "a photograph of an astronaut riding a horse" --plms --ckpt models/ldm/stable-diffusion-v1/sd-v1-4.ckpt
# 中略
RuntimeError: Sizes of tensors must match except in dimension 1. Expected size 64 but got size 63 for tensor number 1 in the list.
この場合、先の例のように、--H
を512
にすれば生成されます。
スペックが足りない
試しに、--W 1920 --H 1080
を指定してみます。
$ python scripts/txt2img.py --W 1920 --H 1080 --prompt "a photograph of an astronaut riding a horse" --plms --ckpt models/ldm/stable-diffusion-v1/sd-v1-4.ckpt
# 中略
RuntimeError: Invalid buffer size: 62.57 GB
M1MaxMBPのメモリ64GBなんですが、これでは足りないらしいです。
ということで、1920x1080(1080p)の画像を生成したい場合は以下のようにします。
- 896x512で生成する
- アップスケールする
- 1920x1080にリサイズする
アップスケールがはじめて出てきましたが、超解像とも呼ばれる低解像度の画像を高解像度に上げるAIを使った技術です。
これもAIですね。AIすごいなぁ
ということで冒頭の画像をUpscaylという超解像技術を使ったツールで解像度を4倍の3584x2048にします。
Upscaylの使い方はかんたんで、対象の画像を選択して、ボタンを押すだけです。
結果を左右で比較したりできます。もしよかったら使ってみてください。
そしてようやく出力したかった1920x1080の画像をPhotoshopで作ります。
さいごに
まとめます。
16:9の画像を作る場合は、--W 896 --H 512
を指定して、生成後に896x504に加工する
1920x1080の画像を作る場合は、--W 896 --H 512
を指定して、生成後にアップスケールして、1920x1080に加工する
でした。
アップスケールツールが対応していれば4Kのイラストとかも作れると思います。
それでは、良い画像生成ライフを!