Stable Diffusion を使って Python で絵を描いてみた。
2024年3月2日
最近は生成系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)
自分の描きたい画像を描くには、以下の部分を修正していきます。
- file_name: 出力ファイル名
- width, height: 画像の幅と高さ
- model_name: モデル名。ここでどのモデルを選ぶかで画像のタッチが変わってくる。モデルの一覧はHugging Face (人工知能のモデルやデータセットのポータルサイト) で確認することができる。
https://huggingface.co/models?other=stable-diffusion - prompt: 画像生成のプロンプト、ここでどの様な画像を書きたいかを指定する。(英語) 例えば今回の例では japanese (日本人), girl (少女), kimono (着物), cherry blossom (桜), long black hair (長い黒髪) を指定している。
- steps: モデルが絵を描く上での推論のステップ数。ステップ数が大きくなる程、じっくりと時間をかけて試行錯誤を繰り返しながら描いていくイメージです。ここの数を変えるだけでも絵のタッチがかなり変わりますし、実行時間にも大きく影響します。
それ以降は実際にモデルを呼び出して描画している部分ですが、これは Hugging Face の各々のモデルのページを開くと呼び出し方が描いてある事が多いので、そちらを参考にすると良いと思います。
ただし、今回の私の環境だとモデルのページに書かれているコードをそのまま書いたところ、次の様なエラーが出た為、
RuntimeError: "LayerNormKernelImpl" not implemented for 'Half'
torch_dtype の値を torch.float16 から torch.float32 に変更しました。
実際に上記のプログラムを実行すると、file_name で指定したファイル名で画像ファイルが生成されます。
これは初回はモデルをダウンロードしたりするので、凄く時間がかかりますが、2回目以降は軽減されます。(でもステップ数次第で結局時間がかかる事もあります。)
今回、上記のプログラムで次の様な画像が生成されました。
これは、同じパラメーターでも実行する度に違う画像が出るので、複数の候補が欲しい場合は一度に2枚以上の画像を生成する様にコードを描いてみても良いかもしれません。
もちろん、モデルやステップ数、プロンプトによっても生成される画像が変わるので、お気に入りの画像ができるまで、色々と試してみましょう。