Stable Diffusion を使って Python で絵を描いてみた。

最近は生成系AIが色々と話題になっています。

文章やアイデア、画像、そして最近は音声や動画、プログラムまでもが AI (人工知能) が自動で作ってくれる様になってきました。

その様な中、今回は普段 Python に触れている人なら気軽にできる、Stable Diffusion という画像生成 AI を使用したプログラムを紹介したいと思います。

1. 必要ライブラリのインストール

python で Stable Diffusion を扱うには diffusers モジュールを使用しますが、diffusers を使用するにはさらに、transformers と torch モジュールが必要となります。

そこで、それらのモジュールを使用する為にターミナルで以下のコマンドを実行します。

pip install diffusers transformers torch

これは、一度行えば、以降同じ PC で実行する必要はありません。

2. プログラム実行

続いて Python で実際に画像生成するプログラムを書いてみます。

from diffusers import AutoencoderKL, StableDiffusionXLPipeline, EulerAncestralDiscreteScheduler
import torch

file_name = 'image.png'
width, height = 600, 600
model_name = 'Linaqruf/animagine-xl-2.0'
prompt = 'japanese, girl, kimono, cherry blossom, long black hair'
steps = 50

vae = AutoencoderKL.from_pretrained(
    'madebyollin/sdxl-vae-fp16-fix', 
    torch_dtype=torch.float32
)

pipe = StableDiffusionXLPipeline.from_pretrained(
    model_name,
    vae=vae, torch_dtype=torch.float32, use_safetensors=True, variant='fp16'
)
pipe.scheduler = EulerAncestralDiscreteScheduler.from_config(pipe.scheduler.config)
result = pipe(
    prompt=prompt, width=width, height=height, num_inference_steps=steps
)
result.images[0].save(file_name)

自分の描きたい画像を描くには、以下の部分を修正していきます。

それ以降は実際にモデルを呼び出して描画している部分ですが、これは Hugging Face の各々のモデルのページを開くと呼び出し方が描いてある事が多いので、そちらを参考にすると良いと思います。

ただし、今回の私の環境だとモデルのページに書かれているコードをそのまま書いたところ、次の様なエラーが出た為、

RuntimeError: "LayerNormKernelImpl" not implemented for 'Half'

torch_dtype の値を torch.float16 から torch.float32 に変更しました。

実際に上記のプログラムを実行すると、file_name で指定したファイル名で画像ファイルが生成されます。

これは初回はモデルをダウンロードしたりするので、凄く時間がかかりますが、2回目以降は軽減されます。(でもステップ数次第で結局時間がかかる事もあります。)

今回、上記のプログラムで次の様な画像が生成されました。

これは、同じパラメーターでも実行する度に違う画像が出るので、複数の候補が欲しい場合は一度に2枚以上の画像を生成する様にコードを描いてみても良いかもしれません。

もちろん、モデルやステップ数、プロンプトによっても生成される画像が変わるので、お気に入りの画像ができるまで、色々と試してみましょう。