Stable Diffusion Pipelineまとめ(1)text2img

スポンサーリンク
Stable Diffusion
スポンサーリンク

公式ページリンク

日本語でのかみくだき

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)

関連記事

WindowsネイティブへのCUDA, PyTorchの環境構築
WindowsネイティブへのCUDA、Pytorchの環境構築をまとめます。PyTorchは今機械学習の世界で最も使われているフレームワークの一つです。導入難易度も、TensorFlowよりも低めとのことです。今回はWindowsネイティブへの環境構築を行っていきます。
Stable Diffusion 2で高画質画像生成
Stable Diffusion2での画像生成に挑戦してみます。以前のv1に比べて、高解像度の768x768に対応した新しい安定拡散モデルを用いて、高画質の画像生成が可能になっているそうです。
Stable Diffusionのモデルをローカルに保存
Stable Diffusionのモデルは、デフォルトでは実行時にwebからダウンロードされ、キャッシュに保存されます。2度目以降は、キャッシュから使用されますが、ローカルで安定してStable Diffusionを使用するために、特定の場所に保存する方法をまとめました。
Stable Diffusion Pipelineまとめ(1)text2img
Stable Diffusion Pipelineを公式ページをChatGPTの解説にしてもらいながらかみくだきました。パラメータの意味などをしっかり理解すると生成する画像の意味もよく理解できます。
WindowsでGitとGitHubを使う
WindowsでGitとGit-Hubの基本的な使い方をまとめていきます。Gitは作成したプログラムのソースコードなどの変更履歴を管理するアプリです。Gitでは、それぞれの変更履歴ごとにリポジトリと呼ばれる場所にファイルの状態を保存することによって、バージョンを管理し、複数人での共同作業をやり易くします。一方で、GitHubはGitHub社が提供する世界有数のGitホスティングサービスで、有料の商用プランの他、無料でのリポジトリ環境が提供されている。今回は、GitやGitHubのサービスを利用する上での最低限の知識をまとめてみます。今回は個人でGitとGitHubを使う場合に役立つコマンドを中心にまとめました。
WebUIでStable Diffusion 1からの手順
WebUI(AUTOMATIC1111)でStable Diffusionを動かしてみます。比較的軽い環境で動くので、folk版のStable Difuusionしか動かなくても使える可能性はあります。今回は1から導入の手順をまとめました。

コメント