StableDiffusionのファインチューニング(Hypernetworks)のやり方を手取り足取り解説するよ

皆さんこんにちは。

近年画像生成AIが流行しており、中でもモデルが無料で公開されているStableDiffusionの人気が爆発しています。

この記事では、Stable Diffusionのファインチューニング手法のひとつである Hypernetworks の使い方を解説します!

Hypernetworks は数枚から数十枚程度の画像を使って、StableDiffusionに新しいキャラクターや新しい画風を学習させる手法です。

他に同種の手法として、 Textual inversion や Dream Booth などがありますが、個人的に試した感触としては、Hypernetworks は Textual inversion より安定しているようです。また、数十枚の画像とそこそこのGPUでも気軽に試すことができる扱いやすい手法だと思います。

Stable DiffusionのUIとしてよく使われている[Stable Diffusion Web UI](https://github.com/AUTOMATIC1111/stable-diffusion-webui) には Hypernetworks の機能があらかじめ用意されていますが、解説などはまだ少なく、使い方は少しわかりにくいため、この記事で丁寧に説明します。

またここでは、Stable Diffusionの最新バージョンである 2.1 を利用します。GPUが足りるか心配だったのですが、手元の GeForce RTX 3060 でも十分に実行できました。

※ Stable Diffusion Web UI のインストール方法などについては説明しません。


### 0. 事前の注意

Stable Diffusionl 2以降のモデルでHypernetworksを学習させる際は、 `xformers` を無効化し、`--no-half` オプションをつけた状態でWeb UIを起動しておく必要があります。またStable Diffusion 2.1モデルのインストールなどはあらかじめ行なっておいてください。


### 1. 画像集め

まず学習させたい画像を集めます。ここでは、例として「[かわいいフリー素材集 いらすとや](https://www.irasutoya.com/)」さんの画像三十枚程度を利用させていただきました。画像は最終的には512x512にするので、それ以上のサイズが望ましいです。

今回用意した画像

![スクリーンショット 2022-12-21 12.54.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81883/e2f90e24-5186-f3f1-6510-b8642df8aa50.png)

### 2. 画像の前処理

まず、Stable Diffusion Web UI 上で画像の前処理を行ないます。`Train` タブの配下の `Preprocess Images` を選択します。

ここで画像のサイズを統一し、キャプションの作成を行ないます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81883/b7b259a1-8561-bbaf-908c-6bb2f8a9f13e.png" width=500 />

- **Source directory**: 元画像を配置するディレクトリ。1で集めた画像のディレクトリを指定。
- **Destination directory**: 保存先のディレクトリ。
- **Create flipped copies**: 左右反転した画像を作り、画像を水増しすることができます。
- **Split oversized images**: 512x512より大きい画像を分割してくれます。**今回はこれをオンにしました**。
- **Use BLIP for caption**: BLIPというモデルを使用し、画像のキャプションを自動で作成してくれます。**今回はこれをオンにしました**。
- **Use deepbooru for caption**: キャプション生成にdeepbooruモデルを使用します。BLIPとの比較は行なっていませんが、場合によってはこちらの方がいいかもしれません。


### 3. 画像の前処理 - 手動修正

Destination directory で指定したディレクトリを見て、手動で修正していきます。分割した結果、使えなさそうな画像はここで削除しておきましょう。

画像ファイルと同じ名前のテキストファイルが作成され、そこに BLIP が生成したキャプションが保存されています。キャプションは画像に対応する記述になっているはずですが、一部不正確なものもあるので、手動で修正します。

また、今回は `irasutoya style` といったキーワードでいらすとや風の画像が生成されるようにしたいので、キャプションも以下のように、`an irasutoya style illustration of...` とつけておきます(後述するテンプレートで一括で指定してもいいと思いますが、ここでは全テキストファイルに `an irasutoya style illustration of...` とつけることにします)。

```
an irasutoya style illustration of a woman sitting at a desk with a laptop computer in front of her, looking at the screen
```

### 4. Hypernetworks の作成

つづけて、Hypernetworks のモデルを作成します。`Train` タブの配下の `Create hypernetworks` タブを選択します。

Hypernetworksでは、ここで作成したレイヤーを既存のStable Diffusionのモデルに追加して、学習させます。

パラメーターは、デフォルトのままでも問題ありませんが、ここでは `Use dropout` のみ有効化しました。`Name` は何でもいいですが、`irasutoya_hypernetworks` などとつけておきましょう。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81883/dd895b37-ac40-2153-f4cd-ebe8be780273.png" width=500 />


### 5. 学習

`Train` タブを選択し、モデルを学習させます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81883/68aa7447-569c-0e61-09a7-5f02a92dd947.png" width=500 />



学習は、感覚的には7000〜15000ステップ程度で十分です。

先に学習用のプロンプトテンプレートを作成します。以下のような`[filewords]`とだけ書いたテキストファイルを用意しておきます。`[filewords]`は、学習時に、先程作成した画像と同じ名前のキャプションのテキストファイルと置き換えられます。

```
[filewords]
```

以下のように一括してプレフィックスを指定することもできます。

```
an irasutoya style illustration of [filewords]
```

また、学習中の結果をプレビューするため、一度 `txt2img` で画像を生成しておきます。プロンプトを`an irasutoya style of a girl`、シードを124に設定し、画像を生成します。

未学習の段階では以下のような画像が生成されました。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81883/5925afe0-1515-5657-1214-aead6390ff67.png" width=300 />



以下各設定項目を説明します。

- **Hypernetwork**: 先程作成した `irasutoya_hypernetworks` を指定。
- **Hypernetwork Learning rate**: 適当に調整しつつ、 `2e-5:1000, 1e-5:2000, 8e-6:7000, 6e-6:10000` に設定しました。0-1000ステップは2e-5、1000-2000ステップは1e-5というかたちで、ステップが進むにつれ、学習率を下げてあります。
- **Dataset directory**: 前処理が終わった画像のディレクトリを指定。
- **Prompt template file**: 上で作成したプロンプトテンプレートのファイルパスを指定。
- **Max Steps**: 学習するステップ数。15000に設定します。
- **Read parameters (prompt, etc...) from txt2img tab when making previews**: これを有効化すると、txt2imgで使用したプロンプトとシードを使って、途中経過の画像が作成されます。**必ず有効化します**(これがないと学習がうまくいっているのかよくわからなくなります)。

わたしの環境では、3、4時間程度で学習は終了しました。

### 6. 結果

学習が進むにつれ、それっぽい画像が生成されるようになっていきます。

![無題の図形描画.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81883/8b515482-f8d1-a20a-7dc3-e52ad9bb75eb.png)

できました！

さっそく学習済みのHypernetworksを使っていろいろ生成してみましょう。あまりうまくいかないものもありますが、一応それっぽい画像は作れるようになりました。

プロンプト: `an irasutoya style illustration of a frog`

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81883/28032e4c-51d2-7cbc-353a-4abe4cd81691.png" width=300 />

プロンプト: `an irasutoya style illustration of Obama`

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81883/604b3e4e-b60a-f2a2-8066-cee1672ade79.png" width=300 />


### まとめ

少ない画像でStable Diffusionに学習を追加できるHypernetworksを紹介しました。

なお、ちょうどこの記事を書いているタイミングで、「AIピカソ」「いらすとや」の提携による「AIいらすとや」がリリースされました。もしいらすとや風の画像をAIで生成する必要があれば、本来はこちらを使った方がよさそうです。

https://prtimes.jp/main/html/rd/p/000000002.000113219.html

いずれにしても、Hypernetworks は気軽に試せて、それなりに安定した結果も出るので興味のある方はぜひ試してみてください。