SDXL 画風Lora(Locon)の作成

初めに(おことわり)


(このノートはSDXLで画風を学習したときのメモ代わりです。)
私はド素人ですので、間違った事を書いている可能性は十分にありますので、ご理解のほどお願いします。

Pony系は癖が強い?上手くいくやつとそれっぽい出来なのが出来ました。
animagineはとりあえず上手くいきました。
(3つづつ作成した)

Kohya_ss GUI(v23.0.15)を使用します。
古いver.であればアップデートしておいてください。

PCスペック
CPU : AMD Ryzen 7 5700X 8-Core Processor
RAM : 32GB
GPU : RTX3090(VRAM24GB)

教師画像(ここ大事)

画像の用意

1024×1024以上の解像度の画像を用意します。
ただし、私は普段より2:3の縦長のアスペクト比で画像を生成するため
1024×1536の画像を用意し、学習に使いました。
※厳密には普段の生成は896×1152で生成しますが、
 Lora学習の画像は解像度が高いほうが質が良くなると経験上考えてます。

教師画像の量は多いほど良いですが、品質が第一です。
 ここで言う品質とは、例えば葛飾北斎のLoraを作ろうとしている場合、
同じ絵師だからと言って、幼少期に書かれた作品と葛飾北斎を号した時代では作品の方向性に違いがあります。
なので教師画像の水増しを行わず、本当に欲しい画風の絵だけを取捨選択する必要があります。(多大なる影響がありますので慎重に)

また、私は全ての画像を1024×1536に切り取りを行いました。
Kohya_ss guiでは画像の解像度やアスペクト比を揃えずとも学習できますが、画像の中央部を切り取り、画像によっては見切れてしまうからです。
(ランダムで切り取りも出来ますが、Cache latents設定でRandom crop instead of center cropが使えなくなる。)

余談 (気がするだけ)
さらにアスペクト比を揃えておかないと bucket_reso_stepsで指定した解像度ごとにバケットを振り分けられ学習が安定しない(気がする)
もし、アスペクト比が異なるものを学習したい場合はそれぞれの数を揃えるほうが良いきがする。
背景などは削除や白背景にしなくて良い。
学習が失敗するわけではない。

タグ付け

forge版のstable diffusion web uiで行いました。
拡張は下記のもの、A1111でも使えるとの事。

使い方などは言及しません。
画風Loraの場合はタグは消す必要はありません。

下記ノートにもあるように、また経験的にもトリガープロンプトはあった方が良いです。

トリガーになるプロンプトは、そのプロンプトが画像生成に影響を与えないものが相応しいです。
仮にkatsushika hokusai styleをトリガーとした場合、katsushika hokusaiが反応してしまう可能性が十分にあります。
なので私はkatsushikahokusaistyleと詰めてトリガーにしてます。
要は元モデルが学習していないプロンプトにすれば良い。

Pony系はトリガーとは別にクオリティタグも必ず追加しなければいけない。
例、トリガー, score_9, score_8_up, score_7_up, source_anime

Kohya ss GUIでの学習

使い方などは調べてください。

簡単に抜粋して説明

〇学習に使うLoraのタイプはLocon
 画風はLoconが良い。線や色などの表現が豊か。
 ネット上にはLyCORIS Presetでunet-transformer-onlyを指定しているモノ
 もあるけど、fullのほうが発色が良い気がする。

〇LR Schedulerをcosineにしてても、LR warmupは使える。

〇Scale weight normsは効果を感じる。

〇Keep n tokensを1でタグ先頭のトークン(トリガープロンプト)を固定

〇Shuffle captionでタグの順番をシャッフル
  先頭の語の影響力が最も強く、後ろに行くにしたがって影響力が小さくなる。
キャプションをシャッフルしない場合、キャプション後方の語の概念をトリガーワードが学習してしまうリスクがある。
画像を学習するごとにトリガーワード以外のキャプションをシャッフルすることで、この学習の偏りを減らせる。

〇Gradient checkpointingをonにする。VRAMの消費が大幅に減る。

参考になるサイト


プリセットの配布

もともとインターネットで拾ったプリセットです。
自分の学習にあたって色々変えてます。
繰り返し4、枚数30の教師画像で使いました。
30epoch目が必ずしも最良とは限りません。
適当なepochを使うか強度を弱めて使うのが良い場合が多いと思います。
学習に使うモデルは、pony系モデルで画像を生成するならpony系のモデルで、animagine系ならanimagine系で学習したほうがよい。
自分は派生ではなく本家のモデルで学習している。
※生成に使うモデルで学習したほうが効きが良い。
 元のプリセットはepoch50だったので、30で不足だと思われたら50も試してみてください。

dim64で学習してます。容量が大きいのでリサイズをオススメします。

※下部に再条件を記載しました。上記jsonを書き換えてお使いください。

最後に

もっとこうした方が良いとか有れば、教えてください。
自分がぜんぜん理解してないので、質問はお控えください。
わからないので答えられません。

(自分のPCでちょうど1時間で学習が終わります。)


追記(2024/5/4)
画像30枚 × 繰り返し4 = 120step
で問題なく理想のLoraが出来上がったので、
画像120枚 × 繰り返し1 = 120step
でいけるはず。
総ステップ数も同じだから問題ないと思ったのですが、まったくの学習不足になりました。
同じ画像を繰り返し学習した方が覚えが早そうです。
時間があるなら、総stepsが増えるけど(学習時間が増える)繰り返しを増やしたほうが良いかも。柔軟性を上げるためにも画像枚数は多いほうが良いと考えるから。

画像枚数が多い場合もある程度は繰り返す。
epoch30で過学習になるようであれば、繰り返しとepochを減らす必要がありそうです。
もしくは、Additional parametersで【weight_decay=0.01】の数値を変えたほうが良さそうです。
(weight_decayはLearning rateに影響するらしいです。)

追記(2024/5/9)

2024/5/4に追加した内容を踏まえて、
わかった事は
①繰り返しが多ければ画像の学習が強い
 →画風の学習が強いけど、その他も強い
  学習した画像と同じ画像を出力したがる
②総ステップ数が同じでも繰り返し数が少なければ学習が弱い
 →画風の学習が弱いけど、自由度が高い

ということを踏まえて、
一度の学習を弱くゆっくりと学習するイメージで以下の条件で学習した。
画像数は30枚
繰り返し4→2に変更
エポック30→150に変更

これで満足のいく結果になりましたので、共有したいと思います。

animagineで出力 強度は0.75で適用

学習に使ったイラストの画風に近い塗りになりました。

前回の条件での学習では、animagineの【1girl, inoue takina, lycoris recoil】の学習が強いのか画風がそちらに引っ張られてしまったり、学習に使ったイラストの衣装に引っ張られる感じもありましたが今回はなく良い感じです。

ちなみに総ステップ数が増えましたので学習時間はトータルで3時間です。


2024/7/28 追記
学習したい絵柄が繊細で、表現しきれない場合は正直どうしようもないのですが、試しにNetwork Rank (Dimension)を128や256にして、Network Alphaをその半分の数値にすると64よりも学習すると思います。ただしかなりVRAMを消費し、出来上がったLoraの容量が大きくなります。出来上がったLoraをリサイズして小さくしても効果は減少しにくいと思いますので、リサイズしたほうが良いと思う。
あとScale weight normsで過学習を抑えているのでここも変えると効果があるかもしれない。ないかもしれない。


2024/9/22 追記
欲しいのが出ない場合は、学習と生成に使うモデルを変更すれば上手くいく可能性があります。pony系やanimagine系それぞれ得意な絵柄があってそれに近ければLoraで上手くいく可能性が上がりやすくなる気がする。

animagineでは上手くいかなかった学習も下記のモデルでは思い通りいった例もあります。

sanae:https://civitai.com/models/647664/sanaexl-anime-v10

artwaifu:https://civitai.com/models/435207/artiwaifu-diffusion

どうしてもお気に入りのモデルで画風を学習したいのであれば、finetuneを考慮してください。




この記事が気に入ったらサポートをしてみませんか?