公式ページリンク
日本語でのかみくだき
Stable Diffusion Pipelineを上記の公式ページをChatGPTの解説にしてもらいながらかみくだきました。パラメータの意味などをしっかり理解すると生成する画像の意味もよく理解できます。Stable Diffusionの導入については、別の記事にまとめいます。
Stable diffusion pipelinesとは
Stable Diffusionは、CompVis(※1)、Stability AI、LAION(※2)の研究者と技術者によって作られた、テキストから画像への潜在的拡散モデルです。このモデルはLAION-5Bデータセットのサブセットから512×512の画像で学習され、CLIP ViT-L/14テキストエンコーダー(※3)を使用してテキストプロンプトで条件付けられます。860MのUNetと123Mのテキストエンコーダを持つこのモデルは比較的軽量で、コンシューマー向けGPUで動作させることが可能です。
Stable Diffusionは安定拡散の研究に基づいており、論文「High-Resolution Image Synthesis with Latent Diffusion Models」で提案されたものです。詳細はDiffusersの潜伏拡散パイプラインで学ぶことができます。Stable Diffusionの仕組みや、潜伏拡散モデルとの違いについては、公式発表の投稿やブログ投稿を参照できます。
脚注
※1:CompVisは、画像処理やコンピュータビジョンの分野で活躍する研究者や技術者が集まるコミュニティです。CompVisは、画像処理やコンピュータビジョンの技術の発展や普及を目的として活動しています。特に、人工知能や深層学習を活用した画像処理やコンピュータビジョンに関する研究や技術開発に力を入れています。 CompVisは、技術者や研究者が交流する場として、オンラインのフォーラムやイベント、ワークショップを開催しています。また、CompVisは、技術的な質問や問題に対するサポートや情報提供を行うことで、技術者や研究者がより良い研究や開発を行うための支援を行っています。
※2:LAIONは、ライフサイエンスとコンピュータビジョンの分野で活躍する研究者や技術者が集まるコミュニティです。LAIONは、ライフサイエンス分野やコンピュータビジョンの分野での最先端の研究や技術を発展させることを目的として活動しています。特に、ライフサイエンス分野やコンピュータビジョンの分野における人工知能や深層学習の活用に力を入れています。LAIONは、技術者や研究者が交流する場として、オンラインのフォーラムやイベント、ワークショップを開催しています。また、LAIONは、技術的な質問や問題に対するサポートや情報提供を行うことで、技術者や研究者がより良い研究や開発を行うための支援を行っています。
※3:CLIP ViT-L/14テキストエンコーダーとは、OpenAIが開発した文章を入力すると、その文章を表す数値のベクトルを出力するニューラルネットワークモデルです。CLIP ViT-L/14テキストエンコーダーは、Transformerと呼ばれる深層学習手法を採用しており、自然言語処理タスクに特化した高い性能を発揮します。また、CLIP ViT-L/14テキストエンコーダーは、大量の訓練データを用いて訓練されており、さまざまな文章を入力として処理することができます。Stable Diffusionでは、CLIP ViT-L/14テキストエンコーダーを凍結した状態で使用しており、テキストプロンプトを入力として、画像を生成するモデルを条件付けるために使用されています。
class: diffusers.StableDiffusionPipeline
クラスdiffusers.StableDiffusionPipelineは、Stable Diffusionを用いたテキストから画像への変換を行うためのパイプラインです。このパイプラインは、DiffusionPipelineを継承しており、ライブラリが実装している汎用メソッド(ダウンロードや保存、特定のデバイスでの実行など)をすべて利用することができます。
関数:モデルの読み込み(from_pretrained)
StableDiffusionPipeline.from_pretrained(モデル名またはPATH, **kwargs)
pipe = StableDiffusionPipeline.from_pretrained('hakurei/waifu-diffusion', torch_dtype=torch.float32)
「diffusers.StableDiffusionPipeline.from_pretrained」は、Stable Diffusionモデルをロードするための関数です。この関数には、以下のような主なパラメーターがあります。
- model_name_or_path: Stable Diffusionモデルをロードするためのパスやモデルの名前を指定するパラメーターです。ここには、huggingface.coでホストされている訓練済みStable DiffusionモデルのリポジトリIDを指定することができます。また、ローカルに保存されているモデルのパスを指定することもできます。
- torch_dtype: Stable Diffusionモデルをロードする際のtorch.dtypeを指定するパラメーターです。このパラメーターでは、特定のdtypeを指定することができます。また、”auto”を指定すると、モデルの重みから自動的にdtypeが決定されます。
- revision: 特定のモデルのバージョンを指定するためのオプション引数です。このとき、「revision」には、「git」で許可された任意の識別子を指定することができます。「git」とは、バージョン管理システムの一種で、「huggingface.co」では、モデルや他の成果物を保存するためにこのシステムを採用しています。つまり、「revision」を指定することで、「huggingface.co」上に保存された特定のモデルのバージョンを指定することができます。
これらのパラメーターを指定することで、Stable Diffusionモデルをロードし、テキストから画像への変換を行うことができます。
関数:torchデバイスの指定(to)
クラスdiffusers.StableDiffusionPipelineのインスタンスpipeに対して、
GPUの場合:pipe.to(‘cuda’)
CPUの場合:pipe.to(‘cpu’)
img2imgやinpaintのインスタンス化
text2imgのインスタンスからコンポーネント機能でimg2imgやinpaintのインスタンス化できる。
from diffusers import (
StableDiffusionPipeline,
StableDiffusionImg2ImgPipeline,
StableDiffusionInpaintPipeline,
)
text2img = StableDiffusionPipeline.from_pretrained("CompVis/stable-diffusion-v1-4")
img2img = StableDiffusionImg2ImgPipeline(**text2img.components)
inpaint = StableDiffusionInpaintPipeline(**text2img.components)
__call__引数
StableDiffusionPipelineの__call__メソッドは、次のようなパラメータを受け取ります。
- prompt: 画像の生成をガイドするためのプロンプト(またはプロンプトのリスト)。
- height: 生成される画像の高さ(ピクセル単位)。デフォルトでは、unet.config.sample_size * vae_scale_factorとなります。
- width: 生成される画像の幅(ピクセル単位)。デフォルトでは、unet.config.sample_size * vae_scale_factorとなります。
- num_inference_steps: ノイズ除去のステップ数。ノイズ除去のステップ数を増やすと、通常、より高品質な画像が得られますが、その代わりに推論速度が低下します。
- guidance_scale: Classifier-Free Diffusion Guidanceによって定義されたガイダンススケール。ガイダンススケールを大きくすると、テキストプロンプトと密接に関連した画像を生成するようになりますが、通常は画質を犠牲にします。
- negative_prompt: 画像生成をガイドしないプロンプト(またはプロンプトのリスト)。ガイダンスを利用しない場合は無視される。(guidance_scale が1より小さい場合は無視される)
- num_images_per_prompt :(int, デフォルトは1) -プロンプトごとに生成する画像の数。
- eta:DDIMの論文: 「DDIMの論文」において「η」と呼ばれるパラメータに相当するものです。このパラメータは「schedulers.DDIMScheduler」にのみ適用され、他の箇所では無視されます。
- generator (torch.Generator):seedを与えて、毎回同じ画像を生成するためのトーチジェネレータです。
- latents(torch.FloatTensor, オプション):「torch.FloatTensor」型の変数であり、これは事前に生成されたノイズの多い「ラテント」として画像生成の入力として使用されます。
※4:「ラテント」は、一般的に「ノイズ」や「隠れた変数」と呼ばれるもので、画像生成のための入力として使用されます。この「ラテント」を使用することで、異なるプロンプトで同じ生成を微調整することができます。「latents」が提供されない場合は、与えられたランダムジェネレータを用いてサンプリングにより「レイテント」が生成されます。「レイテント」は、「latents」と同様のものですが、ランダムジェネレータを用いて生成されたものです。つまり、「latents」が提供されない場合は、「generator」はランダムに生成された「レイテント」を用いて画像を生成することになります。
出力
Stable Diffusion pipelinesは、画像を扱うためのパラメータであるimagesを持っています。このパラメータは、batch_size分のPIL image(※5)のリストやnumpy配列を受け取ることができます。PIL画像やnumpy配列で画像情報(バッチサイズ:batch_size、高さ:height、幅:width、チャンネル数:num_channels)を出力します。これらの画像は、拡散パイプラインによってノイズが除去されたものです。
※5:PIL imagesとは、Python用の画像処理ライブラリ「Python Imaging Library (PIL)」で扱う画像フォーマットのことです。PIL imagesは、画像を表すためのデータ構造を定義しており、画像処理や画像変換などの操作を行うことができます。PIL imagesは、画像データを扱うアプリケーションやライブラリで頻繁に利用されています。また、PIL imagesは、様々な画像フォーマットを扱うことができます。例えば、JPEGやPNGなどの一般的な画像フォーマットを扱うことができます。PIL imagesを使用することで、画像データを効率的かつ簡単に処理することができます。
処理の分割(enable_attention_slicing)
「enable_attention_slicing」は、計算処理を分割することで、メモリを節約することができる機能です。これにより、「OutOfMemoryError」のようなメモリ不足のエラーを防ぐことができるほか、メモリの使用量を抑えることができます。「slice_size」で処理の分割サイズを指定します。「”auto”」(デフォルト)を指定すると、処理を2段階に分割します。「”max”」を指定すると、1回の計算処理に最大限の節約を行います。数値を指定すると、「attention_head_dim/slice_size」に応じて多くの分割を使用します。これにより、計算処理を効率化することができます。
import torch
from diffusers import StableDiffusionPipeline
# モデルを保存したディレクトリを指定
model_PATH = "CompVis/stable-diffusion-v1-4"
pipe = StableDiffusionPipeline.from_pretrained(model_PATH, torch_dtype=torch.float16, revision="fp16")
pipe = pipe.to("cuda")
pipe.enable_attention_slicing()
prompt = "cute cats"
image = pipe(prompt).images[0]
image.save("output.png")
「disable_attention_slicing」で分割を無効にできます。
torch.Generator
Generatorでシードを固定できます。
# imagesの生成時の引数にgeneratorを追加
generator = torch.Generator(device='cuda').manual_seed(1)
image = pipe(prompt, generator=generator).images[0]
with torch.autocastの中への記載
「with autocast(“cuda”)」の中に計算を記述することで、計算が早くなるようです。計算が早くなるのは、PyTorchが特定のGPU演算をFP32精度から混合精度に自動的に変換するためです。この変換により、計算が高速化され、性能が向上します。また、混合精度により、メモリの効率が向上することもあります。
サンプルコード
以下に上記の内容をまとめます。画像生成のための深層学習モデルを使用すると、特定のプロンプトから画像を生成できます。例えば、”cute cats”というプロンプトに対して、かわいらしい猫の画像が生成されるかもしれません。さらに、特定のシードを指定して複数のイメージを生成することもできます。また、サイズや、必要に応じてネガティブプロンプトを指定することで、思い通りの画像生成ができます。
サンプルコード:
import torch
from torch import autocast
from diffusers import StableDiffusionPipeline
# モデルを保存したディレクトリを指定
model_PATH = "CompVis/stable-diffusion-v1-4"
pipe = StableDiffusionPipeline.from_pretrained(model_PATH, torch_dtype=torch.float32)
pipe = pipe.to("cuda")
pipe.enable_attention_slicing()
prompt = "cute cats"
INIT_SEED = 1
for i in range(100):
with autocast("cuda"):
generator = torch.Generator(device='cuda').manual_seed(INIT_SEED+i)
image = pipe(prompt, height = 512, width =512, nagative_prompt = "", generator = generator).images[0]
file_name = "./output/image_"+str(INIT_SEED+i)+".png"
image.save(file_name)
コメント