TadaoYamaokaの開発日記

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

Stable Diffusionを「いらすとや」で追加学習する

前回、Stable Diffusionをdanbooruデータセットを使用して追加学習することを試した。

今回は、自分でデータセットを作成して追加学習することを試す。
データセットには、画像とキャプションが揃っている必要があり、キャプションがない場合はCLIPで疑似ラベルを生成するなどする必要がある。
今回は、画像に対するキャプションがある「いらすとや」をスクレイピングして、データセットを作成した。

データセット作成

「いらすとや」から全ての画像とキャプションを取得した。
画像に複数バリエーションがある場合は、1つ目の画像のみを使用した。

キャプションは、日本語になっているため、Googleスレッドシートで、「=GOOGLETRANSLATE(XX,"ja","en")」を使って英語に変換を行った。

合計で、22891枚の画像とキャプションのセットが用意できた。

画像サイズ変換

画像は、512x512に変換した。

キャプションの加工

キャプションには、末尾に「, irasutoya」を付与して、「いらすとや」の画像であることを説明に加えることにした。

学習

前回、学習率をデフォルトとして追加学習のスタイルが反映され過ぎたため、学習率は5.0e-6とした。

結果

各エポックで訓練データのキャプションから生成された画像は、以下の通り。
Stable Diffusionが5エポック学習されているため、6エポック目から開始している。

6エポック目

また、写真ぽさがある。

7エポック目

絵画風になってきた。

8エポック目

人物がいらすとやぽくなってきた。

9エポック目

だいぶ特徴が表れている。

10エポック目

このあたりでほぼ特徴を学習していそうである。

19エポック目

19エポック目では、人物の特徴はほぼ学習できている。

画像生成

9エポック目と19エポック目のモデルを使用して画像生成して、スタイルを学習できているか確認する。

猫の画像を生成した結果は以下の通り。
プロンプト:「cat」

9エポック目

プロンプトに「, irasutoya」を付与しなくても、ほぼ「いらすとや」の画風になっている。

「, irasutoya」を付けた場合は、以下の通り。

ほとんど変わっていないように見える。
追加学習する場合、学習時に「, irasutoya」を付与するのは意味がなさそうである。

19エポック目

一番左の画像は、本物と区別がつかないくらいになっている。


次に、評価用データにあるキャプションで試してみた。
プロンプト:「It is an illustration of a girl playing with Rubikube(ルービックキューブで遊んでいる女の子のイラストです)」

9エポック目

ルービックキューブが描けていないが、人物は「いらすとや」ぽくなっている。

19エポック目

やはりルービックキューブは難しいようである。


次に、比較的分かりやすそうなキャプションで試してみた。
プロンプト:「Illustration of a boy who is happy to raise his hands and say banzai(両手を挙げて万歳をして喜んでいる男の子のイラスト)」

9エポック目


19エポック目

手が増え過ぎている。
数の制約の概念は苦手なようである。



次に、抽象的で難しめのプロンプトで試してみた。
プロンプト:「Illustration of a human wearing a collar and being pulled by a string by an artificial intelligence(首輪をつけて人工知能に紐で引っ張られている人間のイラスト)」

9エポック目


19エポック目

少し解釈が難しかったようである。

まとめ

「いらすとや」の画像とキャプションを使って、Stable Diffusionの追加学習を試した。
4エポック学習することで、ほぼ特徴が学習でき、生成画像も単純な画像であれば本物と区別がつかないクオリティになった。

ただし、抽象的な説明は、難しかったようである。

今回、オートエンコーダーとCLIPのパラメータは固定で、Latent Diffusionのみ学習したが、オートエンコーダーとCLIPもチューニングすることでさらに良くできる可能性はある。