TadaoYamaokaの開発日記

個人開発しているスマホアプリや将棋AIの開発ネタを中心に書いていきます。

Stable Diffusionにdanbooruデータセットを追加学習する その2

前回danbooruデータセットを使用してStable Diffusionに追加学習を行う手順について記載した。

今回は、追加学習したモデルで、生成する画像がどう変わるか確認する。

追加学習の結果

98エポックまで学習を行った。

エポック数とステップ数

エポック数とステップ数の関係は以下の通り。
訓練データは、9685枚の画像で、バッチサイズ4で、4GPUで学習しており、1エポック=605ステップである。

元のStable Diffusionのモデルが6エポック(470kステップ)学習済みのため、6エポックから始まっている。

訓練損失


評価損失

評価損失は安定しておらず、8、14、68エポックで最小を更新している。

生成画像確認

8、14、68エポック目のモデルで、promptを「cat」として猫の画像を生成してみた。

元のStable Diffusion


epoch=8


epoch=14


epoch=68


※職場での閲覧に不適切な画像も生成される場合もある

Waifu Diffusion

8エポックのモデルでは、スタイルがイラスト調に変わっているが、猫=4本足でしっぽがある動物という概念は残っている。
14エポックのモデルでは、よくわからない画像が生成されるようになっている。
68エポックのモデルでは、猫=動物の概念を忘れてしまい、猫=猫耳になってしまった。
Waifu Diffusionのモデルは、写真ぽさが残っている。


今度は、訓練画像に含まれていそうな人物の画像を生成してみた。
プロンプト:「short hair girl reading with glasses」

元のStable Diffusion


epoch=8


epoch=14


epoch=68


Waifu Diffusion

8エポックのモデルでは、イラスト調でそれなりの質の画像が生成されている。
14エポックと68エポックのモデルでは、読書の概念を忘れかけており、生成画像の質も良くない。
Waifu Diffusionのモデルは、写真とイラストの中間くらいになっている。

考察

追加学習は、学習しすぎると、元のモデルにあった概念を忘れてしまう傾向が確認できた。
Waifu Diffusionのモデルと比べると、8エポックのモデルでも追加学習の特徴が強く現れている。

Waifu Diffusionは、Danbooruの画像を56000枚使用して、学習率5.0e-6で、4エポック学習している。
また、画像は、CLIP Aesthetic Scoringが6以上のものを使用している。
CLIP Aesthetic Scoringは、画像の審美を予測するモデルであり、Stable Diffusionでも使用されている。

今回行った学習をWaifu Diffusionと比較すると、画像枚数が17%くらいしかなく、CLIP Aesthetic Scoringも使用していないため、生成される画像の質が高くないことが要因となったと考える。
また、学習率はデフォルトの1.0e-4で学習していた。これも、過学習の原因になったと考えられる。

まとめ

danbooruデータセットで追加学習したモデルで、生成した画像がどのように変化するかを確認した。
追加学習により生成される画像が変化することが確認できた。
また、学習しすぎると、元の概念を忘れてしまう傾向があることが確認できた。

Waifu Diffusionと比べると、追加学習の特徴が反映され過ぎてしまった。
追加学習する際は、学習率を小さくして少ないエポック数で学習する必要がある。

Waifu DiffusionではCLIP Aesthetic Scoringを使用しているが、今回の学習では使用していなかったため、使用した場合にどう変化するかも別途検証したい。

Stable Diffusionにdanbooruデータセットを追加学習する

Stable Diffusionに独自データセットで追加学習できるようになるために、まずは既存のデータセットを使用した学習方法を試した。

追加学習の方法には、画像3~5枚を用いてスタイルを学習させるTextual Inversionという方法があるが、ここでは追加学習にデータセットを用いて画像をテキスト条件付きで追加学習する方法を試す。

GitHubStable Diffusionには追加学習の方法についてドキュメントが用意されていないため、Waifu Diffusionの方法を参考にした。

Waifu Diffusionは、Stable Diffusionをdanbooruデータセットでファイチューニングしたものである。
Waifu Diffusionがどのように追加学習を行ったか手順は書かれていないが、ファインチューニング用のconfigファイルが用意されているため、それを使って、トライ&エラーでなんとか追加学習できるようになった。

以下、追加学習の手順について記述する。

環境準備

NVIDIAのPyTorchのdockerイメージを使用する。

docker run --gpus all --shm-size=32g --network host -v /work:/work -w /work -it nvcr.io/nvidia/pytorch:21.10-py3
ライブラリインストール

requirements.txtに書かれているライブラリをインストールする。

pip install albumentations==0.4.3 opencv-python==4.5.5.64 opencv-python-headless==4.5.5.64 pudb==2019.2 imageio==2.9.0 imageio-ffmpeg==0.4.2 pytorch-lightning==1.4.2 omegaconf==2.1.1 test-tube streamlit einops==0.3.0 torch-fidelity==0.3.0 transformers==4.19.2 torchmetrics==0.6.0 kornia==0.6 gradio Pillow==9.2.0

opencv-pythonとPillowは、使用しているdockerイメージで動作するバージョンに変更している。

以下のライブラリはGitHubリポジトリからインストールする。

pip install git+https://github.com/openai/CLIP.git@main#egg=clip
pip install git+https://github.com/hlky/k-diffusion-sd#egg=k_diffusion

git clone https://github.com/CompVis/taming-transformers.git
cd taming-transformers
pip install -e .

Waifu Diffusionのリポジトリclone

cd /work
git clone https://github.com/harubaru/waifu-diffusion.git

danbooruデータセットダウンロード

あらかじめdanbooruで、アカウント作成を行い、APIキーを作成しておく。

スクレイピング
cd waifu-diffusion
python danbooru_data/scrape.py -user username -key apikey -t "solo -rating:general order:score age:<1month"

usernameとapikeyの部分は書き換える。

-tオプションで指定するタグの条件は、デフォルトのままだと複数タグ指定によるエラーになったため、soloのみにしている。

カレントディレクトリにlinks.jsonができる。

画像とキャプションのダウンロード
python danbooru_data/download.py -f links.json -o danbooru-aesthetic/

danbooru-aestheticディレクトリ配下のimgとtextディレクトリにそれぞれ画像とキャプションがダウンロードされる。
※画像は、職場での閲覧に不適切な画像を含むので注意

画像変換

画像サイズを512×512に変換する。

danbooru_data/local/convert.pyを以下のように書き換える。

from PIL import Image, ImageOps

import os
import argparse

parser = argparse.ArgumentParser()
parser.add_argument('in_dir')
parser.add_argument('out_dir')
args = parser.parse_args()

directory = args.in_dir

for filename in os.listdir(directory):
    var1 = os.path.join(directory, filename)
    if os.path.isfile(var1):
        print(var1)
        try:
            im = Image.open(var1)
            im = ImageOps.pad(im, (512, 512), color='black')
            im.save(os.path.join(args.out_dir, filename))
        except:
            print('skip')

元のディレクトリ名を変更してから、変換を行う。

cd danbooru-aesthetic
mv img img_org
python ../danbooru_data/local/convert.py img_org img
textディレクトリの名前変更

キャプションのディレクトリ名は、txtにする必要があるので変更する。

mv text txt

Stable Diffusionのモデル準備

apt update
apt install git-lfs
git lfs install
cd /work
git clone https://huggingface.co/CompVis/stable-diffusion-v-1-4-original

cloneにはHuggingfaceのアカウントが必要になる。

チェックポイントに空のoptimizer_statesを追加

Stable Diffusionのチェックポイントファイルには、追加学習時のresumeに必要となるoptimizer_statesが含まれていないため、以下のようなスクリプトで空のoptimizer_statesを追加して保存する。

import torch
ckpt = torch.load('/work/stable-diffusion-v-1-4-original/sd-v1-4-full-ema.ckpt')
ckpt['optimizer_states'] = []
torch.save(ckpt, '/work/waifu-diffusion/logs/original/model.ckpt')

スクリプトの実行前に、waifu-diffusionのディレクトリにlogs/originalディレクトリを作成しておく。

DejaVuSans.ttfのダウンロード

学習時にDejaVuSans.ttfがないとエラーになるため、ダウンロードする。

cd /work
wget http://sourceforge.net/projects/dejavu/files/dejavu/2.37/dejavu-fonts-ttf-2.37.zip
unzip dejavu-fonts-ttf-2.37.zip
cp dejavu-fonts-ttf-2.37/ttf/DejaVuSans.ttf waifu-diffusion/data/

追加学習

準備が整ったので、追加学習を実行する。
GPUはA100×4を使用した。V100だとCUDA out of memoryで学習できなかった。

cd waifu-diffusion
python main.py --resume logs/original/model.ckpt --base ./configs/stable-diffusion/v1-finetune-4gpu.yaml -t --no-test --seed 25 --scale_lr False --gpus 0,1,2,3

なお、使用しているdockerイメージだとPillowのワーニングが大量に表示されるため、抑止したい場合は、main.pyの先頭に以下のコードを追加する。

import warnings
warnings.simplefilter('ignore')

学習結果

logs/images/trainに学習時に生成された画像が出力される。
元のStable Diffusionが5エポック学習されているため、6エポックから開始して13エポック時点で生成された画像は以下の通り。

プロンプトは訓練データに含まれるものである。

※職場での閲覧に適さない画像が生成される場合があるので要注意

まとめ

Waifu Diffusionのリポジトリを使用して、Stable Diffusionにdanbooruデータセットを追加学習することができた。
画像とキャプションを1行記載したテキストファイルを用意できれば、独自のデータセットでも同じ手順で追加学習することができる。

別途、独自データセットでの学習を試したい。

Latent Diffusionの学習を試す その2

昨日の記事の続きで、CelebA-HQデータセットでLatent Diffusionの学習を続けた場合に生成画像の質が上がるか確認した。

昨日の記事で、5000バッチ(51エポック)時点のモデルで、潜在空間からランダムにサンプリングして生成した画像は以下の通りであった。

学習を続けると、9649バッチ(98エポック)で評価損失が最小となり、15349バッチ(156エポック)あたりで訓練損失が発散して学習できなくなった。


※グラフの色が2色なのは途中から再開したためで特に意味はない

潜在空間からランダムにサンプリングした画像

5000バッチおきに評価された際に出力された画像は以下の通り。

1000バッチ(102エポック)時点

1500バッチ(153エポック)時点

2000バッチ(204エポック)時点

1000バッチ(102エポック)時点で、昨日の出力結果より質が上がっていることが確認できる。
2000バッチ(204エポック)時点では、損失が発散しておりノイズだけの画像になっている。

ベストモデルで生成

評価損失が最小となった9649バッチ(98エポック)時点のモデルで生成を行った。

学習済みモデルから生成するには、scripts/sample_diffusion.pyを使用する。

チェックポイントが保存されたディレクトリ(例:logs/2022-09-09T11-02-28_celebahq-ldm-vq-4/checkpoints)にconfig.yamlが必要になるため、configs/latent-diffusion/celebahq-ldm-vq-4.yamlからシンボリックリンクを張る。

以下のようなコマンドで生成を行う。

python scripts/sample_diffusion.py -r logs/2022-09-09T11-02-28_celebahq-ldm-vq-4/checkpoints/epoch=000098.ckpt -n 10

-nには、生成する枚数を指定する。
DDIMステップ数はデフォルトで50になっている。

DDIM steps=50

-cオプションでDDIMステップ数を500にすると以下のような画像になる。

DDIM steps=500

DDIMステップ数を増やすと、よりはっきりした画像になる。

白っぽい画像や、真っ黒な画像も含まれおり、潜在空間上のランダムにサンプリングした点からは生成が必ず上手くいくとも限らないようだ。

まとめ

CelebA-HQデータセットで、Latent Diffusionを条件なしで学習を行ったところ、98エポックで評価損失が最小となるモデルが学習できた。
また、156エポック以上学習すると訓練損失が発散し、生成される画像はノイズのみの画像となった。

98エポック学習したモデルで生成した画像は、生成がうまく行ったものは質の良いが生成できている。
潜在空間をランダムにサンプリングした点では、白っぽい画像や真っ黒な画像が含まれる。

学習を試せたので、実行しながらソースコードを理解していけるようになった。
論文と照らし合わせながら仕組みの理解を進めていきたい。
また、独自のデータセットでの学習も試してみたい。

Latent Diffusionの学習を試す

話題のStable Diffusionは、 LAION-5Bデータセットを用いて学習された、CLIPのテキスト埋め込みを条件としたLatent Diffusionモデルである。

Stable Diffusionの仕組みを理解したいと思っており、そのために、まずは比較的小さいデータセットでLatent Diffusionの学習を試してみた。

GitHubLatent Diffusionでは、CelebA-HQ、LSUN、ImageNetの3つのデータセットでの学習設定が用意されている。
ここでは、画像数が比較的小さいCelebA-HQで学習を試してみた。

環境構築

NVIDIAのPyTorchのイメージを使用する。

docker run --gpus all --shm-size=32g -it nvcr.io/nvidia/pytorch:21.10-py3
ライブラリインストール

必要なライブラリをインストールする。

pip install transformers omegaconf pytorch_lightning==1.4.2 torchmetrics==0.6.0 opencv-python==4.5.5.64 test-tube einops albumentations

バージョンを指定しているライブラリはこのバージョンでないと動かない。

なお、ImageNetの学習を行う場合は、albumentationsを使用してTorrentからデータセットがダウンロードされるが、ここでインストールされるバージョンだとエラーが起きる。
albumentationsを最新にすると、pytorch_lightningと競合するため、pytorch_lightningのバージョン指定を外すとインストールできる。
だだし、学習時にpytorch_lightningのバージョン不整合でエラーになるため、ダウンロードだけ行ってバージョンを戻すとよい。
もしくは、ImageNetのダウンロードは別の方法で行いキャッシュディレクトリ(~/.cache/autoencoders/data/ILSVRC2012_trainとILSVRC2012_validation)にシンボリックリンクを張ると良い。キャッシュディレクトリには.readyファイルが必要である。


albumentationsをインストールするとopencv-python-headlessがインストールされてしまうので、一旦アンインストールしてopencv-pythonを入れ直す。

pip uninstall opencv-python opencv-python-headless
pip install opencv-python==4.5.5.64

OpenCVの実行に必要なUbuntuのパッケージをインストールする。

apt update
apt install libgl1-mesa-dev
taming-transformersインストール

taming-transformersをGitHubからcloneしてインストールする。

git clone https://github.com/CompVis/taming-transformers.git
cd taming-transformers
pip install -e .

CelebA-HQデータセットの準備

CelebAデータセットと、CelebA-HQの差分データをダウンロードする。

CelebAは、公式ページGoogle Driveのリンクからダウンロードする。
必要なのは、Img/img_celeba.7z/*.7zと、Anno/list_landmarks_celeba.txtである。

CelebA-HQは、taming-transformersのREADMEに説明がある通り、 PGGANのREADMEに従って準備する。
PGGANのREADMEにあるGoogle Driveのリンクからimage_list.txtと、deltas*.zipをダウンロードする。

zipを直接ダウンロードするとサードパーティーcookieのエラーが起きる場合があるので、一度自分のGoogleドライブにコピーを作成するとよい。

なお、手動でダウンロードすると時間がかかるのでrcloneを使用した。

.npy形式に変換

Latent Diffusionは、CelebA-HQのデータセットが.npy形式になっていることを要求する。
PGGANの説明に従って準備するように書いているが、PGGANのREADMEには.npyにする方法は書いていない。

ネットでいろいろ調べたら、.npyに変換するコードを公開しているレポジトリが見つかった。
https://github.com/mazzzystar/make-CelebA-HQ

こちらで公開されているスクリプトを使用して変換を行った。
ダウンロードしたデータセットを格納するディレクトリ構成は、READMEに従う。

python make_HQ_images.py ./

Latent Diffusionの準備

GitHubからLatent Diffusionをcloneして準備を行う。
/workにcloneする例)

cd /work
git clone https://github.com/CompVis/latent-diffusion.git
cd latent-diffusion
pip install -e .

CelebA-HQの学習に必要なファイルをダウンロードする。

cd data
wget https://github.com/CompVis/taming-transformers/raw/master/data/celebahqtrain.txt
wget https://github.com/CompVis/taming-transformers/raw/master/data/celebahqvalidation.txt

.npy形式に変換したCelebA-HQデータセットディレクトリへのシンボリックリンクを作成する。
.npyが/work/celeba/celebahqに格納されている場合の例)

ln -s /work/celeba/celebahq celebahq

学習

CelebA-HQのLatent Diffusionモデルの学習を行う。

Latent Diffusionの学習は、オートエンコーダーと、拡散モデルの2つのモデルの学習に分かれている。

オートエンコーダーの学習済みモデルダウンロード

オートエンコーダーの学習方法も記載されているが、ここでは、オートエンコーダーは学習済みモデルを使うことにする。

cd /work/latent-diffusion
wget https://ommer-lab.com/files/latent-diffusion/vq-f4.zip
unzip vq-f4.zip
mv model.ckpt models/first_stage_models/vq-f4/
設定変更

デフォルトの設定だと、GPUがV100だとGPUメモリが足りず、CUDA out of memoryが発生する。
そこで、バッチサイズを変更する。
/work/latent-diffusion/configs/latent-diffusion/celebahq-ldm-vq-4.yaml
の以下の2箇所を変更する。
変更前:batch_size: 48
変更後:batch_size: 32

変更前:max_images: 8
変更後:max_images: 6

学習実行

V100 8GPUで学習する場合の例)

python main.py --base configs/latent-diffusion/celebahq-ldm-vq-4.yaml -t --gpus 0,1,2,3,4,5,6,7

学習結果

5000バッチ(51エポック)ごとに、評価が行われ、結果がlogsに出力される。

5000バッチ(51エポック)学習時点で出力された画像は以下の通り。

ノイズ画像から再構成

Diffusion過程でノイズを加えた画像

再構成した画像

潜在空間からランダムにサンプリングした画像


ノイズ除去過程


Inpainting(修復)

入力

マスク

修復画像

学習時間

V100 8GPUを使用して、5000バッチ(51エポック)の学習に3時間23分かかった。
51エポックではまだ画像品質は高くない。

まとめ

CelebA-HQデータセットでLatent Diffusionモデルを学習する手順について記載した。
V100×8で3時間学習したくらいだと、比較的小さいデータセットでも品質が良い画像は生成できなかった。
さらに学習を進めてどれくらい生成画像の品質が上がるか確認したい。

stable-diffusion-webuiをWSL2で動かす その2

昨日導入方法を書いたstable-diffusion-webuiにGFPGANとRealESRGANを導入する。

GFPGANは、顔を改善するモデルで、RealESRGANは解像度2倍にするモデルである。
それぞれ適用した場合の比較画像は、公式のページにサンプルがある。
GitHub - hlky/stable-diffusion-webui: Stable Diffusion web UI

ライブラリインストール

GFPGANとRealESRGANに必要になるライブラリをインストールする。
バージョン不整合を防ぐために、以前のpipでインストールしたライブラリも再度同時にインストールする。

pip install diffusers transformers scipy ftfy invisible-watermark gradio pynvml omegaconf pytorch_lightning realesrgan basicsr

モデルダウンロード

GFPGAN
cd ~/stable-diffusion
mkdir -p src/gfpgan/experiments/pretrained_models
cd src/gfpgan/experiments/pretrained_models
wget https://github.com/TencentARC/GFPGAN/releases/download/v1.3.0/GFPGANv1.3.pth
RealESRGAN
cd ~/stable-diffusion
mkdir -p src/realesrgan/experiments/pretrained_models
cd src/realesrgan/experiments/pretrained_models
wget https://github.com/xinntao/Real-ESRGAN/releases/download/v0.1.0/RealESRGAN_x4plus.pth
wget https://github.com/xinntao/Real-ESRGAN/releases/download/v0.2.2.4/RealESRGAN_x4plus_anime_6B.pth

起動確認

cd ~/stable-diffusion
python webui.py

初回はモデルのダウンロードに少し時間がかかる。

/home/kei/anaconda3/envs/stable-diffusion/lib/python3.9/site-packages/torchvision/models/_utils.py:208: UserWarning: The parameter 'pretrained' is deprecated since 0.13 and will be removed in 0.15, please use 'weights' instead.
  warnings.warn(
/home/kei/anaconda3/envs/stable-diffusion/lib/python3.9/site-packages/torchvision/models/_utils.py:223: UserWarning: Arguments other than a weight enum or `None` for 'weights' are deprecated since 0.13 and will be removed in 0.15. The current behavior is equivalent to passing `weights=None`.
  warnings.warn(msg)
Downloading: "https://github.com/xinntao/facexlib/releases/download/v0.1.0/detection_Resnet50_Final.pth" to /home/kei/anaconda3/envs/stable-diffusion/lib/python3.9/site-packages/facexlib/weights/detection_Resnet50_Final.pth

100%|████████████████████████████████████████████████████████████████████| 104M/104M [00:12<00:00, 8.72MB/s]
Downloading: "https://github.com/xinntao/facexlib/releases/download/v0.2.2/parsing_parsenet.pth" to /home/kei/anaconda3/envs/stable-diffusion/lib/python3.9/site-packages/facexlib/weights/parsing_parsenet.pth

100%|██████████████████████████████████████████████████████████████████| 81.4M/81.4M [00:07<00:00, 11.4MB/s]
Loaded GFPGAN
Loaded RealESRGAN with model RealESRGAN_x4plus
Loading model from models/ldm/stable-diffusion-v1/model.ckpt
Global Step: 470000
LatentDiffusion: Running in eps-prediction mode
DiffusionWrapper has 859.52 M params.
making attention of type 'vanilla' with 512 in_channels
Working with z of shape (1, 4, 32, 32) = 4096 dimensions.
making attention of type 'vanilla' with 512 in_channels
/home/kei/anaconda3/envs/stable-diffusion/lib/python3.9/site-packages/gradio/deprecation.py:43: UserWarning: You have unused kwarg parameters in Button, please remove them: {'full_width': True}
  warnings.warn(
Running on local URL:  http://localhost:7860/

To create a public link, set `share=True` in `launch()`.

ブラウザでhttp://localhost:7860/にアクセスする。

Advancedタブから、「Fix faces using GFPGAN」及び「Upscale images using RealESRGAN」が選べるようになっている。

まとめ

stable-diffusion-webuiにGFPGANとRealESRGANを導入する方法について記載した。
生成画像が良くないと適用しても印象は変わらないので、元画像で良い画像がでるようにするにはプロンプトで頑張らないといけなそうである。

stable-diffusion-webuiをWSL2で動かす

この議事の内容は古いです。現在この手順では動きません。

Stable Diffusionが公開されて一週間もたたないうちに便利なUIがいくつもリリースされている。
その中でも、stable-diffusion-webuiが機能が充実している。
GitHub - hlky/stable-diffusion-webui: Stable Diffusion web UI


ということで、stable-diffusion-webuiをローカルPCのWindows11のWSL2上で動かせるようにした。

以下、構築手順を示す。

Conda環境とPyTorchの構築は、前回の記事の内容と同じである。
なお、後々バージョン不整合が起きたため、前回の記事の内容を修正している。

WSL2上にconda環境作成

WSL2のUbuntu 20.04上に環境構築する。

wget https://repo.anaconda.com/archive/Anaconda3-2022.05-Linux-x86_64.sh
sh Anaconda3-2022.05-Linux-x86_64.sh
conda環境作成

conda環境を作成する。

conda create -n stable-diffusion python=3.9
conda activate stable-diffusion

PyTorchインストール

PyTorchをインストールする。

conda install pytorch torchvision torchaudio cudatoolkit=11.6 -c pytorch -c conda-forge

Jupyterとpandas、matplotlibをインストールする。バージョン不整合を避けるためにconda-forgeからインストールする。

conda install jupyter pandas matplotlib -c conda-forge

必須ライブラリインストール

Stable Diffusionおよびstable-diffusion-webuiで必要となるライブラリをインストールする(scipyをcondaでインストールすると不整合が起きたのでpipでインストールしている)。

pip install diffusers transformers scipy ftfy invisible-watermark gradio pynvml omegaconf pytorch_lightning

pipにないパッケージインストール

k-diffusion

k-diffusionをgitからインストールする。

pip install git+https://github.com/crowsonkb/k-diffusion/
taming-transformers

taming-transformersをソースからインストールする(pipからインストールできるパッケージでは動作しない)。

cd ~
git clone https://github.com/CompVis/taming-transformers.git
cd taming-transformers
pip install -e .

stable-diffusionのソースインストール

cd ~
git clone https://github.com/CompVis/stable-diffusion.git

stable-diffusion-webuiのソースインストール

cd ~
git clone https://github.com/hlky/stable-diffusion-webui.git

stable-diffusionのソースディレクトリにコピーする。

cd stable-diffusion-webui
cp -r * ../stable-diffusion/

モデルダウンロード

Stable Diffusionのモデルをgithubからダウンロードする。

git lfsを使用するため、セットアップしていない場合は、セットアップする。

sudo apt install git-lfs
git lfs install

リポジトリをクローンする。

cd ~
git clone https://huggingface.co/CompVis/stable-diffusion-v-1-4-original

cloneにはHuggingfaceのアカウントが必要になる。

シンボリックリンク作成

モデルのチェックポイントのシンボリックリンクをstable-diffusionのソースディレクトリに作成する。

cd stable-diffusion/models/ldm/stable-diffusion-v1
ln -s ~/stable-diffusion-v-1-4-original/sd-v1-4.ckpt model.ckpt

stable-diffusionのパッケージインストール

cd ~
cd stable-diffusion
pip install -e .

stable-diffusion-webuiの起動

stable-diffusion-webuiを起動する。

python webui.py

初回は、各種ファイルのダウンロードが入るため、起動までに数分かかる。

Loading model from models/ldm/stable-diffusion-v1/model.ckpt
Global Step: 470000
LatentDiffusion: Running in eps-prediction mode
DiffusionWrapper has 859.52 M params.
making attention of type 'vanilla' with 512 in_channels
Working with z of shape (1, 4, 32, 32) = 4096 dimensions.
making attention of type 'vanilla' with 512 in_channels
Downloading vocab.json: 100%|█████████████████████████████████████████████| 939k/939k [00:00<00:00, 987kB/s]
Downloading merges.txt: 100%|█████████████████████████████████████████████| 512k/512k [00:00<00:00, 646kB/s]
Downloading special_tokens_map.json: 100%|██████████████████████████████████| 389/389 [00:00<00:00, 446kB/s]
Downloading tokenizer_config.json: 100%|████████████████████████████████████| 905/905 [00:00<00:00, 905kB/s]
Downloading config.json: 100%|█████████████████████████████████████████| 4.31k/4.31k [00:00<00:00, 3.62MB/s]
Downloading pytorch_model.bin: 100%|███████████████████████████████████| 1.59G/1.59G [00:32<00:00, 52.2MB/s]
/home/kei/anaconda3/envs/stable-diffusion/lib/python3.9/site-packages/gradio/deprecation.py:43: UserWarning: You have unused kwarg parameters in Button, please remove them: {'full_width': True}
  warnings.warn(
Running on local URL:  http://localhost:7860/

To create a public link, set `share=True` in `launch()`.

起動確認

ブラウザで、http://localhost:7860/にアクセスする。

プロンプトを入力して、Generateをクリックして画像が生成されることを確認する。

まとめ

stable-diffusion-webuiの実行環境をローカルPCで構築する手順について記載した。
GFPGANとRealESRGANの設定を行うと、顔の修正などさらに高度なことができる。
そちらの設定手順は、別途記載したい。

Stable Diffusionを試す

拡散モデルを使用した画像生成AIであるStable Diffusionがオープンソースで公開された。
ソースだけでなくモデルの重みも自由に利用できる。商用利用も可能だ。

Stable Diffusion Public Release — Stability.Ai

早速、ローカルのPCで試してみた。
丁寧な使ったみた記事は他にあるのでほぼ個人メモである。

手順は、公式ブログのリンクにあるノートブックがすべてなので、この記事を見る必要はない。

WSL2上にconda環境作成

WSL2のUbuntu 20.04上に環境構築する。

wget https://repo.anaconda.com/archive/Anaconda3-2022.05-Linux-x86_64.sh
sh Anaconda3-2022.05-Linux-x86_64.sh
conda環境作成

conda環境を作成する。

conda create -n stable-diffusion python=3.9
conda activate stable-diffusion

PyTorchインストール

PyTorchをインストールする。

conda install pytorch torchvision torchaudio cudatoolkit=11.6 -c pytorch -c conda-forge

Jupyterをインストールする(Stable Diffutionには不要だが、ついでにpandasとmatplotlibも)。バージョン不整合を避けるためにconda-forgeからインストールする。

conda install jupyter pandas matplotlib -c conda-forge

Hugging Faceセットアップ

公式ブログにあるHugging Faceのリンクから、stable-diffusion-v1-4をクリックし、Stable Diffusion v1-4 Model Cardのページの説明の通りセットアップする。
CompVis/stable-diffusion · Hugging Face

Hugging Faceアカウントが必要になるので、アカウントを作成する。

ライブラリインストール

必要なライブラリをインストールする。モデルロード時に警告がでるのでftfyもインストールする。

pip install diffusers transformers scipy ftfy

ログインする。

huggingface-cli login

トークンの入力が必要になるので、説明文に従いURLにアクセスしてトークンを作成する。

git config --global credential.helper store

を実行するように提案されるので実行しておく。

多重ログインはできない仕様のようなので、一旦ログオフする。

huggingface-cli logout

ノートブックから実行

Jupyterノートブックから実行する。
VS CodeでRemote-WSLに接続して、適当な名前でノートブック(work.ipynbなど)を作成する。
VS Codeで開く。
カーネルにcondaのstable-diffusion環境を選択する。

モデルロード

モデルをダウンロードしてロードする。
use_auth_tokenには、上記で作成したトークン文字列を指定する。
ソース中にトークンを記述したくない場合は、

from huggingface_hub import notebook_login
notebook_login()

で入力する方法もある。

import torch
from torch import autocast
from diffusers import StableDiffusionPipeline

model_id = "CompVis/stable-diffusion-v1-4"
device = "cuda"

pipe = StableDiffusionPipeline.from_pretrained(model_id, use_auth_token=r'xxxxxxxx')
pipe = pipe.to(device)

初回ダウンロードには12分くらいかかった。

2回目からはキャッシュされるため、10秒くらいでロードできる。

GPUメモリが足りない場合は、float16モデルも用意されている。
詳細はノートブックを参照。

画像生成

「a photograph of an astronaut riding a horse(馬に乗った宇宙飛行士の写真)」というプロンプト(サンプルのまま)で画像を生成する。

from torch import autocast

prompt = "a photograph of an astronaut riding a horse"
with autocast("cuda"):
  image = pipe(prompt)["sample"][0]  # image here is in [PIL format](https://pillow.readthedocs.io/en/stable/)

# Now to display an image you can do either save it such as:
image.save(f"astronaut_rides_horse.png")

# or if you're in a google colab you can directly display it with 
image

ノートブックには複数枚生成してタイル表示する方法や、画像解像度を変える方法も記載されている。

まとめ

Stable DiffusionをWindowsのWSL2上でJupyterノートブックで動かす手順について記載した。
Stable Diffusionは重みとソースが公開されているため、ファインチューニングや、日本語化対応とかも工夫すればできそうである。
しばらくは、いろんなプロンプトで画像生成して遊んでみたい。