Magicode logo
Magicode
5 min read

Stable Diffusionで画像を生成

https://cdn.apollon.ai/media/notebox/acab1e53-53a1-4e0e-90eb-e6ba2d3848d6.jpeg

Stable Diffusionとは?

Stable Diffusionとは、PyTorchを使用した画像処理&生成のプロジェクトで、オープンソースなのでGPUを搭載したPCを使うと簡単(?)に推し(但し世界的に有名なものに限る)や風景などの画像を生成できます。

検証環境

項目名
OSUbuntu 22.04
PythonConda 14.0.0 (Python 3.8.5)
GPUNVIDIA GTX 1660 SUPER 6GB
CUDA Toolkitv11.7.9
NVIDIA Driver515.65.01
アーキテクチャx86_64
メモリ合計15Gi
スワップ合計32Gi

準備

1. cloneする

Stable Diffusionはこのリポジトリにあります。
これをcloneし、環境構築する...と思いきや、GTX1660S1のメモリ6GBでは足りず、実行時CUDA out of memoryエラーになります。
ってことで、最適化されたこちらを使います。
git clone https://github.com/basujindal/stable-diffusion
# git clone git@github.com/basujindal/stable-diffusion
# gh repo clone basujindal/stable-diffusion
cd stable-diffusion

2. データセットのダウンロード

データセットをダウンロードします。 データセットは、このリポジトリ(?)で配布されています。ユーザー登録してから利用規約(というかライセンス?)をチェックして同意にチェックを入れます。
そうするとブラウザやwgetとかでダウンロードできるようになります。
mkdir models/ldm/stable-diffusion-v1
wget https://ユーザー名:パスワード@huggingface.co/CompVis/stable-diffusion-v-1-4-original/resolve/main/sd-v1-4.ckpt -Omodels/ldm/stable-diffusion-v1/model.ckpt # パスワードに記号が含まれている場合URLエンコードする

3. Anacondaの環境の構築

conda env create -f environment.yaml
conda activate ldm #シェルを再起動したときはこのコマンドを実行する
conda install pytorch torchvision -c pytorch
python -m pip install transformers==4.19.2 diffusers invisible-watermark
python -m pip install -e .

Footnotes

  1. NVIDIA GTX 1660 SUPERの略称。


画像の生成

Stable Diffusionではプロンプト1とシート2などを指定するだけで画像が出力されます。
こんな感じの形式なコマンドを打つことでoutputs/txt2img-samples/プロンプト/seed_シード_000**.pngに画像が出力されます。(prompt以外は省略できます)
python optimizedSD/optimized_txt2img.py --n_samples 出力数 --seed シード --prompt "プロンプト" --H 画像の縦サイズ(px) --W 画像の横サイズ(px)

画像生成の例です。3
python optimizedSD/optimized_txt2img.py --n_samples 1 --seed 53612863 --prompt "nice boat." --H 512 --W 512
python optimizedSD/optimized_txt2img.py --n_samples 1 --seed 21543892 --prompt "nice boat." --H 256 --W 1024
python optimizedSD/optimized_txt2img.py --n_samples 1 --seed 32546475 --prompt "nice boat."
python optimizedSD/optimized_txt2img.py --n_samples 1 --prompt "nice boat."
python optimizedSD/optimized_txt2img.py --prompt "nice boat."
(五個出力されます。取り敢えずランダムに選びました。)

注意事項

  • GTX1660Sを使用した場合に限り出力される画像が真っ黒になる不具合があります。これを防ぐためには、--precision fullオプションを指定してください。
  • 出力数が多すぎるとCUDA out of memoryになる可能性があります。もしこのエラーが出た場合出力数(--n_samplesオプションの引数)を減らしてください。
  • stable-diffusionは非常に大量のメモリを消費します。筆者の環境(メモリ16G)ではギリギリで、よく端末ごと消えてることがあります。GUIで実行する際はブラウザなどを完全に終了し、メモリを可能な限り空けて置きましょう。

余談

実は一番上の写真もstable-diffusionで作りました。まじで最近のAIってすごいですよねぇ...
ちなみに、筆者がを作っているときに、メモリ不足でいつの間にか二回くらい端末ごとが消失していました。
筆者がCUDA out of memoryエラーに対処するためにoptimized_txt2img.pyを覗いたとき、「やっぱりAIって難しいなぁ...」と思いました。誰かあの呪文の意味を教えてください。

Footnotes

  1. 画像の概要的なやつです。ここにどんな画像を作るか指示します。キャラクター名を入れると運が良ければ出てきます。実は指定が非常に難しく、呪文という別名をもっています。
  2. 1~4294967295のランダムな数で、同じ数を指定すると同じ画像が出てくるらしい。
  3. 他意はありません。

Discussion

コメントにはログインが必要です。