今回の記事では Stable Diffusionの最新モデルであるSDXLによる画像生成する方法を紹介します。
Google Colabを使用して簡単に実装できますので、ぜひ最後までご覧ください。
今回の内容
・Stable Diffusionとは
・SDXLとは
・SDXLの実装方法
Stable Diffusionとは
Stable Diffusionは、2022年にリリースされた深層学習に基づく革新的なテキストから画像への生成モデルです。これは、スタートアップ企業のStability AIと多くの学術研究者、非営利組織の共同作業により開発されました。このモデルは、テキストの説明に基づいて詳細な画像を生成する主要な用途を持つ一方で、画像の補完(inpainting)、画像の拡張(outpainting)、テキストプロンプトによってガイドされた画像から画像への変換(image-to-image translations)などの他のタスクにも適用可能です。
Stable Diffusionの特性とアーキテクチャ
Stable Diffusionは「潜在拡散モデル」(latent diffusion model)という深層生成型ニューラルネットワークの一種で、そのソースコードとモデルの重みは公開されています。8GB以上のVRAMを持つ一般的なGPU搭載ハードウェアで動作します。これは以前のモデルがクラウドサービスを介してのみアクセス可能だったのとは異なる特性です。
Stable Diffusionのアーキテクチャは三つの主要な部分から構成されています: 変分オートエンコーダ(VAE)、U-Net、そしてオプショナルなテキストエンコーダです。変分オートエンコーダ(VAE): VAEエンコーダは画像をピクセル空間からより小さな次元の潜在空間に圧縮します。これにより、画像の基本的なセマンティックな意味を捉えます。U-Net: U-NetブロックはResNetバックボーンで構成され、前方拡散からの出力をノイズ除去して潜在表現を得ます。テキストエンコーダ: テキストに条件付けするために、CLIP ViT-L/14テキストエンコーダが使用されてテキストプロンプトをエンベディング空間に変換します。
Stable Diffusionの開発
Stable Diffusionの開発は、Stability AIが資金提供し、形成しました。その技術的なライセンスは、ミュンヘンのルートヴィヒ・マクシミリアン大学のCompVisグループによってリリースされました。開発は、RunwayのPatrick EsserとCompVisのRobin Rombachが率い、これらの研究者はStable Diffusionで使用される潜在拡散モデルのアーキテクチャを以前に発明した人々の中にいます。
Stable Diffusionの訓練は、LAION-5Bという公開データセットから取得された画像とキャプションのペアに対して訓練されました。このデータセットは、ウェブからスクレイプしたCommon Crawlデータから派生したもので、50億組の画像-テキストペアが言語に基づいて分類され、解像度、ウォーターマークの含有可能性の予測、および「美的」スコア(例えば、主観的な視覚的品質)の予測によって別々のデータセットに分けられました。
関連情報
https://huggingface.co/blog/stable_diffusion
https://huggingface.co/spaces/stabilityai/stable-diffusion
SDXLとは
Stable Diffusion XL (SDXL)は、実際の顔、画像内の読みやすいテキスト、そしてより良い画像構成を生成できる能力を持っています。このモデルは、より短く簡単なプロンプトを使用してこれらのタスクを実行できる点で注目されています1。SDXLはStability AI社によって開発され、以前のモデルに比べて、細かい部分がより正確に反映され、より高画質なイラストの生成が可能になっています。
SDXLモデルの特定のバージョン、SDXL 0.9は、研究用途に限定されて先行リリースされ、モデルパラメータの数が大幅に増加しています。これは、テキストと画像の関係を理解するCLIPモデルの使用により、高解像度で奥行きのある画像を簡単に生成できるようになったためです。このモデルは、一般的なPC、Windows 10/11、Linux、およびNvidiaなどのグラフィックボードを搭載した環境で動作し、従来のモデルと比較して画像と構図のディテールが大幅に改善され、高性能な画像生成AIモデルとして注目されています。
また、SDXLは以前のStable Diffusionモデルを3つの主要な点で進化させています。UNetが3倍大きくなり、SDXLは2つ目のテキストエンコーダ(OpenCLIP ViT-bigG)をオリジナルのテキストエンコーダと組み合わせて、パラメータの数を大幅に増加させています。そして、SDXLは、短いプロンプトを使用して記述的な画像を作成し、画像内に単語を生成する能力を提供しています。これは画像生成能力の重要な進歩であり、画像構成と顔生成の強化を提供し、驚くべき視覚効果とリアルな美学をもたらしています。
リリース情報:https://ja.stability.ai/blog/sdxl10
解説:https://huggingface.co/docs/diffusers/api/pipelines/stable_diffusion/stable_diffusion_xl
SDXLの基本実装
ここからはGoogle colabを使用して、SDXLによる画像生成を実装していきましょう。
Google colabの使い方はこちら
まずはGPUを使用できるように設定をします。
「ランタイムのタイプを変更」→「ハードウェアアクセラレータ」をGPUに変更
モデルの準備
必要なライブラリをインストールします。
!pip install diffusers transformers
モデルをダウンロードして、読み込みます。
import torch
from diffusers import StableDiffusionXLPipeline
pipe = StableDiffusionXLPipeline.from_pretrained(
"stabilityai/stable-diffusion-xl-base-1.0", torch_dtype=torch.float16
)
pipe = pipe.to("cuda")
以上で準備が完了しました。
画像生成
まずは「a photo of an astronaut riding a horse on mars」というプロンプトを与えて画像生成してみます。
prompt = "a photo of an astronaut riding a horse on mars"
image = pipe(prompt).images[0]
image
生成画像を保存する
image.save(“output.png”)とすることで画像を保存できます。
ファイル名は変更することができます。
prompt = "a photo of an astronaut riding a horse on mars"
image = pipe(prompt,generator=generator).images[0]
# 画像を保存する
image.save("output.png")
出力結果を固定する
seed 値を固定して、何回実行しても同じ画像が出力されるように設定することができます。
seed =1234を変更することで、出力結果を調整することができます。
seed =1234
generator = torch.manual_seed(seed)
prompt = "a photo of an astronaut riding a horse on mars"
image = pipe(prompt,generator=generator).images[0]
以下では出力結果の比較を行います。
①seedを固定した場合
以下の例ではseed =1234と固定することで、3回とも同じ画像が出力されます。
# seedを固定した場合
num_images = 3
prompt = "a photo of an astronaut riding a horse on mars"
for steps in range(num_images):
seed =1234
generator = torch.manual_seed(seed)
image = pipe(prompt,generator=generator).images[0]
filename = f"output_seed_{steps}.png"
image.save(filename)
②seedを固定しない場合
以下の例ではseedを固定していないため、生成するごとに違う画像を出力されます。
# seedを固定しない場合
num_images = 3
prompt = "a photo of an astronaut riding a horse on mars"
for steps in range(num_images):
image = pipe(prompt).images[0]
filename = f"output_noseed_{steps}.png"
image.save(filename)
画像の高さと幅を指定する
出力画像の高さと幅を変えることができます。
通常は1024×1024ですが、以下の例では512×512に変更しています。
# 画像の高さと幅を指定する
prompt = "a photo of an astronaut riding a horse on mars"
h,w = 512,512
image = pipe(prompt,height=h,width=w).images[0]
image.save("output_512.png")
image
ノイズ除去ステップの数(num_inference_steps)を指定する
ノイズ除去ステップの数を指定することができます。(通常は50)
一般に、ノイズ除去ステップを増やすと推論が遅くなりますが、画像の品質は高くなります。
# num_inference_stepsの違い
for steps in range(10, 100, 10):
seed =1234
generator = torch.manual_seed(seed)
image = pipe(prompt, generator=generator, num_inference_steps=steps).images[0]
filename = f"output_step{steps}.png"
image.save(filename)
guidance_scaleを指定する
guidance_scaleを指定することができます。(通常は5.0)
ガイダンス スケールを高くすると、テキストに密接にリンクした画像が生成されますが、通常は画質が低下します。
計算式はこちらの論文の式2を参照して下さい。
# guide_scaleの違い
prompt = "a photo of an astronaut riding a horse on mars"
for steps in range(2, 11, 1):
seed =1234
generator = torch.manual_seed(seed)
image = pipe(prompt, generator=generator, guidance_scale=float(steps)).images[0]
filename = f"output_gs{steps}.png"
image.save(filename)
まとめ
最後までご覧いただきありがとうございました。
今回の記事ではSDXLで画像生成する方法を紹介しました。