MultiDiffusionによるパノラマ画像の自動生成

MultiDiffusionによるパノラマ画像の自動生成 機械学習

「パノラマ画像を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によるパノラマ画像の作成を説明しました。

タイトルとURLをコピーしました