「パノラマ画像をStable Diffusionで簡単に生成したい」
「Stable Diffusionで大きなサイズの画像を作成したい」
このような場合には、MultiDiffusionがオススメです。
この記事では、MultiDiffusionについて解説しています。
本記事の内容
- MultiDiffusionとは?
- MultiDiffusionによるパノラマ画像の作成
それでは、上記に沿って解説していきます。
MultiDiffusionとは?
MultiDiffusionの公式ページは、以下。
MultiDiffusion: Fusing Diffusion Paths for Controlled Image Generation
https://multidiffusion.github.io/
MultiDiffusionとは、画像生成における制御力を向上させるための技術です。
MultiDiffusionを使った機能として、次の二つが紹介されています。
- Text-to-Panorama generation
- region-based generation
それぞれを以下で説明します。
Text-to-Panorama generation
パノラマ画像の生成が可能です。
MultiDiffusion – a Hugging Face Space by weizmannscience
https://huggingface.co/spaces/weizmannscience/MultiDiffusion
一応、デモページは用意されています。
多分、まともには動かないと思います。
そのため、Colabやローカルマシンで試す方が早くて確実です。
生成される画像として、公式では次の画像が公開されています。
この画像サイズは、「512×4609」と記載されています。
ただ、「512×4608」(「4608×512」)の誤記だと思うのですよね。
記載されているサイズを指定すると、エラーになります。
ValueError: `height` and `width` have to be divisible by 8 but are 512 and 4609.
とにかく、MultiDiffusionを利用すれば、このようなパノラマ画像を簡単に生成可能です。
なお、MultiDiffusionを利用しない場合には次のエラーが出てしまいます。
torch.cuda.OutOfMemoryError: CUDA out of memory.
また、パノラマ(風景中心)以外でも横長の画像は生成可能です。
「4608×512」のサイズで生成したパピルスが、以下となります。
品質を上げた設定で作成しているためか、7分ほどの時間がかかっています。
region-based generation
範囲指定による画像生成が可能です。
次の画像を見れば、イメージはつかめるでしょう。
各範囲(セグメンテーション)毎にプロンプトを指定可能です。
ControlNetにより、ハイレベルなimg2imgが可能になりました。
しかし、現状ではセグメンテーション単位でのプロンプト入力には未対応です。
これが本当に可能なら、さらに画像生成における制御力はUPしますね。
ただ、現状ではまだ「region-based generation」は試せません。
実装されるまでは、この機能は待ちです。
以上、MultiDiffusionについて説明しました。
次は、MultiDiffusionによるパノラマ画像の作成を説明します。
MultiDiffusionによるパノラマ画像の作成
MultiDiffusionを利用するには、Diffusersが必要です。
上記記事に従えば、自ずとDiffusersをインストールしています。
また、バージョンには注意してください。
Diffusers 0.13.0からMultiDiffusionに対応しています。
そのため、最新のDiffusersへ更新しておきましょう。
pip install -U diffusers
使い方は、次のコードを実行するだけです。
import torch from diffusers import StableDiffusionPanoramaPipeline, DDIMScheduler model_ckpt = "stabilityai/stable-diffusion-2-base" scheduler = DDIMScheduler.from_pretrained(model_ckpt, subfolder="scheduler") pipe = StableDiffusionPanoramaPipeline.from_pretrained(model_ckpt, scheduler=scheduler, torch_dtype=torch.float16) pipe = pipe.to("cuda") prompt = "a photo of the dolomites" image = pipe(prompt).images[0] image.save("dolomites.png")
モデルは、変更可能です。
ただ、スケジューラを自由に変更できないのが難点かもしれません。
上記コードを実行すれば、少し待たされます。
GPUメモリ次第では、数分はかかるのかもしれません。
GeForce RTX 3090の場合、次のような結果です。
生成される画像は、次のようなモノとなります。
デフォルト設定であれば、「2048×512」のサイズとなっています。
以上、MultiDiffusionによるパノラマ画像の作成を説明しました。