StableDiffusionでいろいろ試してみる

# 筆者が思うオーソドックスな呪文

| モデル | Beautiful Realistic Asians |
|:-|:-|
|positive|(8k, RAW photo, best quality, masterpiece:1.2), (realistic, photo-realistic:1.4) japanese beautiful model upper body 28 years old wearing dress|
|negative|EasyNegative, (worst quality, low quality: 2.0), normal quality, ugly face, unclear eyes, bad mouth, bad anatomy, extra legs, beach, bad anatomy|


# Real-X

https://civitai.com/models/76343/real-x

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1573902/03ddc1ad-9542-1d78-134c-370612daba5b.png)


# Controlnet導入

Haggingface

https://huggingface.co/webui/ControlNet-modules-safetensors/tree/main

ひとまず`canny`と`openpose`だけ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1573902/b08184db-ebd0-6f53-547a-73a0066f74e0.png)
↑画像移動先

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1573902/6e5a51c2-66af-08d7-a06c-5967f1537fa0.png)

Openposeのmodelの箇所で先ほどDLしたファイルが扱えることを確認

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1573902/95c72e8b-be1d-a905-07cb-ff6b71f04030.png)

ポージングしている画像を試しにドロップ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1573902/9273c9cb-4f79-9b8f-042d-cd9a612bf7e2.png)

- `Enable`にチェック
- `Preprocessor`で`openpose`選択
- `Model`で`control_openpose...`を選択

これでいつも通り画像を生成してみる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1573902/d0ba4a48-5b0c-434c-c8b1-c4b6229c0cd4.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1573902/f6ff4e22-cdae-650e-386a-0b384a04807a.png)

ポージングしている女性と、
棒人間みたいな画像が生成される。

手をクロスしている画像はAIにとっては難しいかな？

## openpose_full

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1573902/c3175383-6028-4f59-3906-35026536f550.png)

プリプロセッサで`openpose_full`を選択してみる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1573902/e3691d1c-9b6e-d306-6412-ce22c1e683ae.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1573902/c37274ab-7274-0547-d667-d4406363e4ed.png)

顔や指まで表現しようとしている。
こちらのほうが有能なのかな？

## canny

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1573902/3d0d682d-ca7f-7587-8321-94273a6a4e62.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1573902/996ffca4-49c6-8000-0310-00006cb52687.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1573902/6686a47c-a6f2-5e01-1c8c-5fa3684bc3cb.png)

線画生成ね

## openpose-Editor

https://www.youtube.com/watch?v=nPpb3n_jyzo&t=520s

https://github.com/fkunn1326/openpose-editor

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1573902/379ab4a5-56ab-1ce5-cd95-4b5a1baceffc.png)

インストール

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1573902/7f0108f9-db98-dfe9-eb50-67ed2f7c9654.png)

初期状態こんな感じ

`Detect from Image`を押下したら画像選択タブが開くので、
先ほどの手クロス画像をインポートしてみよう

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1573902/3a6a6d00-37da-19ec-468e-01e3ce90054e.png)

棒人間が画像を検出してくれた！
ここから微調整

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1573902/095bdff0-e775-86b6-d044-114b222d55f2.png)

こんな感じか。PresetをSaveしておく。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1573902/5bd78aa6-c521-6e95-a22a-d08cd250e04e.png)

`Send to txt2img`か...


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1573902/91bc8571-d4d0-f676-4466-79efaa984e26.png)

:::note warn
txt2imgタブからControlNetをEnableにしていないと正しく機能しないかもしれない
:::

Openposeを使って微調整
→微調整をした棒人間をもとに画像を生成する詳しい方法がよくわからない

いろんなポーズのフリー素材まとめサイト
https://www.pakutaso.com/whiteposevol1.html

# LoRA 導入

参考
https://www.youtube.com/watch?v=N1tXVR9lplM&t=61s

## 実行ポリシーの変更

- `windows` + `R`
- `powerchell`と入力
- `Ctrl` + `Shift` + `Enter`で管理者実行
```sh: こちらを実行
set-executionpolicy remotesigned
```

## git-clone

https://github.com/kohya-ss/sd-scripts/blob/main/README-ja.md#windows%E7%92%B0%E5%A2%83%E3%81%A7%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB

```sh: こちらを実行
git clone https://github.com/kohya-ss/sd-scripts.git
cd sd-scripts

python -m venv venv
.\venv\Scripts\activate

pip install torch==2.0.1+cu118 torchvision==0.15.2+cu118 --index-url https://download.pytorch.org/whl/cu118
pip install --upgrade -r requirements.txt
pip install xformers==0.0.20

accelerate config
```

`accelerate config`コマンドの箇所で注意事項(選択時にカーソルキーを使ってはいけない)などあるので、
上記のGit、`README.md`を確認

## 学習の実行方式の種類

- `DB Class-ID方式`
- `DB キャプション方式`
- `ファインチューニング方式`

参考

https://wikiwiki.jp/sd_toshiaki/LoRA%EF%BC%8F%E5%AD%A6%E7%BF%92%E6%96%B9%E6%B3%95

### DB(DreamBooth) Class-ID方式

> 学習素材の内容を特定のワードに紐づけするやり方

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1573902/7d976812-db9a-1291-52d1-38b28e008ae3.png)

含まれた全要素を機械的に学習してしまう。
→着せ替えやシチュエーションの融通が利きにくくなる。

素材を置くフォルダに特殊な命名規則があるので、
その仕組みを理解する必要がある。

### DB(DreamBooth) キャプション方式

> 素材に加えてその内容を記したテキストファイルを添付する方法

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1573902/738a24e1-089a-1a2d-bec0-60773a0b3700.png)

記述する内容によってどこまで学習させるかを調整できるため、
融通が利くのが特徴。

要素に合わせて、服装LoRAや、顔LoRAなど、
素材から何を学習させるかを調整しやすい。

### ファインチューニング方式

> 作ったキャプションからさらにメタデータを作成する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1573902/9a84e7e9-2af0-f7fa-1d1e-2b9c58b2637a.png)

上級者的なやり方らしい。。。

## キャプション方式での強化学習

### キャプション方式に必要なもの

1. **学習素材(教師画像)**
2. **正則化画像(必要な場合のみ)**
:::note info
target_model = 女性
女性 ≠ target_model

ナースのモデルをプロンプトに記載すると
ナースが生成されるけど、
「女性」ってプロンプトで記載しても
ナースを生成するのは違うよ、ってこと。
:::
:::note warn
"ナース"ではない画像を生成する場合は、
LoRAを外してしまえばいいので、不要な場合が多い。
:::
  
3. **キャプション(テキスト)** 

:::note info
サイズは512～1024あたりが無難
:::

### 素材置き場を設定

ドライブ内にLoRAファイル置き場を作成。
フォルダ×3
テキスト×2
を新規作成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1573902/e2ee2541-48c3-7301-e348-a9dd2ce42185.png)

素材画像を`sozai`フォルダに入れ、
01, 02, 03...と連番で命名する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1573902/18fe96e2-9c27-3f95-2f64-1686225d13e9.png)

### 画像からプロンプトを生成する

https://github.com/picobyte/stable-diffusion-webui-wd14-tagger

動画では古いVerのリポジトリが紹介されていた。
上記リポジトリを拡張機能としてインストール

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1573902/8c7e354a-0588-d40e-5dff-1cc4f6c657d0.png)

すると`tagger`というタブが新規でできる。

`Batch from Directory`を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1573902/61e54320-241e-d090-eb45-b9a6178fd565.png)

この箇所に、読み込むファイルと
LoRAをoutputするファイルを入力する。
`ダブルクォーテーションは不要`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1573902/4ef9c2c5-9e23-a788-23b3-bdc64dd541a2.png)

`Additional tags`の箇所に`トリガー`となる単語を入力する。

`Interrogate`クリック！

outputフォルダを確認すると...
**キャプション方式で使用するキャプションが作成される！**

### キャプションの編集

一つキャプションを開いてみる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1573902/62b2ac91-9eea-8af2-aa92-c41620a364a8.png)

taggerが画像を分析して、関連する要素をプロンプトに変換してくれた。
この中から **学習させたい要素を削除する**

:::note warn
DBキャプション方式ではキャプションから削除した内容が
トリガーに関連付けられて学習される。

`素材画像` - `キャプション` = `学習データ`

削除した要素が`学習データ`になるので注意
:::

今回は顔を学習させたいので、
首から上に関連する要素を削除。
> animal ears, green hair, glasses, green eyes, cat ears, short hair, hair between eyes...

キャプションを編集し終えたら下記2点をチェック
- トリガーワードが先頭
- 改行の無い一行文

一旦素材ファイルとキャプションファイルを
同じフォルダにまとめておく。

### datasetconfig を開く

`detasetconfig.txt`を開く
>[general]
[[datasets]]
[[datasets.subsets]]
image_dir = '`{sozai画像フォルダのパス}`'
caption_extension = '.txt'
num_repeats = 1

`image_dir`を`sozai画像フォルダのパス`に書き換える。
`num_repeats`は繰り返し回数。
素材を何回繰り返し学習するか。

:::note warn
保存時に`文字コード`が`UTF8`であることを確認する。
:::

保存が終わったら`detasetconfig.txt`の拡張子を
`toml`に書き換える

### commandline を作成

>accelerate launch --num_cpu_threads_per_process 1 train_network.py
 --pretrained_model_name_or_path=`{学習に使用するA1111のモデルパス}`
 --output_dir=`{outputフォルダパス}`
 --output_name=`{outputするファイルの名前}`
 --dataset_config=`{detasetconfig.tomlパス}`
 --train_batch_size=1
 --max_train_epochs=10
 --resolution=512,512
 --optimizer_type=AdamW8bit
 --learning_rate=1e-4
 --network_dim=128
 --network_alpha=64
 --enable_bucket
 --bucket_no_upscale
 --lr_scheduler=cosine_with_restarts
 --lr_scheduler_num_cycles=4
 --lr_warmup_steps=500
 --keep_tokens=1
 --shuffle_caption
 --caption_dropout_rate=0.05
 --save_model_as=safetensors
 --clip_skip=2
 --seed=42
 --color_aug
 --xformers
 --mixed_precision=fp16
 --network_module=networks.lora
 --persistent_data_loader_workers

| 変数 | 説明 |
|:-|:-|
|  --pretrained_model_name_or_path | 学習に使用するA1111のモデルパス<br>例) C:\StableDiffusion\stable-diffusion-webui\models\Stable-diffusion\beautifulRealistic_v7.safetensors　|
| --output_dir|outputフォルダパス|
| --dataset_config|detasetconfig.tomlパス|

必要項目を修正したら、以下のようにファイルを修正
- 改行をとって一行文に
- コマンド間はスペースで区切る

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1573902/9e20e467-f091-db38-61b3-3d7040813293.png)

こんな感じ

### いよいよ、LoRA作成

[git-clone](#git-clone) で作成した`sd-scripts`を開く
sd-scriptsをルートとしてpowershellを開く

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1573902/8ace8efa-c058-4c1f-038a-ffe5a799056d.png)

シェルを開いたら以下コマンドを実行
```sh
./venv/scripts/activate
pip install -r requirements.txt
pip install bitsandbytes-windows
```
仮想環境がアクティベートされたら`commandline.txt`に
入力した文字列をコピペする。

動画では`pyパッケージのインストール`や
`bitsandbytes-windows`のインストールが抜けていたので
`pip install`から始まる2行を実行する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1573902/5a804bd6-e506-d55d-f532-a1b365e80084.png)

実行、`Enter`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1573902/a4fe2adf-9b76-bce5-2c13-1e6165e74fc7.png)

完了

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1573902/053893f9-17ce-b7a7-2808-b71c1df7e8d1.png)

無事ファイルが作成された。
**これがLoRAファイル**

このファイルをモデルフォルダに配置し、
プロンプトに`トリガーワード`を含めて実行してみる。

| モデル | lora-ja-actress-model(自作) |
|:-|:-|
|positive|(8k, RAW photo, best quality, masterpiece:1.2), (realistic, photo-realistic:1.4) japanese beautiful model upper body 20 years old wearing dress, lora-ja-actress|
|negative|EasyNegative, (worst quality, low quality: 2.0), normal quality, ugly face, unclear eyes, bad mouth, bad anatomy, extra legs, beach, bad anatomy|

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1573902/c12b6314-c296-00ae-5ead-afd82aa39d12.png)

流石に`5枚+1回強化学習`では上手くいかないね💦

別記事でLoRAで遊んでみる。

### 過学習

同じような素材を学習しすぎるとべたべたになってしまう。

> 素材枚数 × 繰り返し回数 × エポック(周)

`エポック`…素材フォルダを何周するか。
例) 5 * 10 * 10
`5枚`の素材の学習を`10回`繰り返し
そのセットを`10周`するという意味。

> `ステップ` 
= (素材枚数 × 繰り返し回数 × エポック) / バッチサイズ

最初は`300~500`ステップを目安に生成してみるのがおすすめとのこと。

マシンパワーがあり、学習強度を上げたい場合
- 繰り返し回数&エポック ↑
- --save_every_n_epochs=N
`エポック毎書き出し`?

# 適当に呪文を唱えて遊んでみる

https://civitai.com/images/2822346

このモデル。
個人的に色合いとかが好きで、本物の人みたい。

| モデル | Beautiful Realistic Asians |
|:-|:-|
| DL URL | https://civitai.com/models/25494/beautiful-realistic-asians?modelVersionId=177164 |
|positive|Cinematic Photo of a beautiful korean fashion model bokeh train|
|negative|(worst_quality:2.0) (MajicNegative_V2:0.8) BadNegAnatomyV1-neg bradhands cartoon, cgi, render, illustration, painting, drawing|


korean　→　日本人に変えてうまくやりたい


### 「最強呪文」と調べてみて、いろいろ試してみた

参考

https://kindanai.com/prompt-mastering-guide/

||プロンプト|
|:-|:-|
|positive|(8k, RAW photo, best quality, masterpiece:1.2), (realistic, photo-realistic:1.4), (extremely detailed 8k wallpaper), sharp focus, depth of field, blur background, bokeh,  cinematic lighting, **night**, upper body, 30 years old cute actress, short hair, smile|
|negative|EasyNegative, (worst quality, low quality: 2.0), normal quality, ugly face, unclear eyes, bad mouth, bad anatomy, extra legs, beach, bad anatomy|

↓

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1573902/f0ec3782-d5f7-0da6-8465-6103c01583be.png)

50枚目くらいで港区OLみたいなのができた。


next...

||プロンプト|
|:-|:-|
|positive|(8k, RAW photo, best quality, masterpiece:1.2), (realistic, photo-realistic:1.4), (extremely detailed 8k wallpaper), sharp focus, depth of field, blur background, bokeh,  cinematic lighting, night, **upper body shot**, **25** years old cute **japanese** actress, long hair, smile **with a cat**|
|negative|EasyNegative, (worst quality, low quality: 2.0), normal quality, ugly face, unclear eyes, bad mouth, bad anatomy, extra legs, beach, bad anatomy|

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1573902/dc20f562-9734-b7a1-bd65-3273dc5dffaf.png)

これはなかなかの出来？
20枚くらいでできた。
藤田ニ〇ルみたいな