かんたん☆コピー機学習法(中級編書きかけだけど公開しちゃうぞ?)

まーだ書きかけなんですが……もう公開しちゃうぜっ!
貼る予定の画像とかまだ出来てないので文字ばっかになってます、読みづらいね。こっから追記していって内容増やしていきます。
もし「こっとココ詳しく!」って箇所があったら教えてくださいな、追記します。



……えー、実のところ学習については初級編で書いたのが基本で全てみたいなアレなので、コレは中級編というか……応用編?そんな感じで書いてます。


LoRAの事前マージ機能を使ってみるのだ!

これ、今の所コマンドからの学習じゃないと使えない(多分)ですが、sd-scriptsにはコマンドにbase_weightsオプションを付けることで、指定したLoRAをモデルにマージしてから学習を始めてくれる、LoRAの事前マージ機能があります。
いちいちコピー機オプションLoRAをモデルにマージする手間が省けるので、とてもありがたい機能です。ストレージの圧迫も減るしね!
使う時は --base_weights "LoRAのパス" の様に指定します、まぁ簡単!
これを入れたコマンドをbatファイルにずらーっと何行も書いて連続処理とかもできます……素材用意してコマンド書いて、寝る前にbatファイル実行!起きたらLoRAが仕上がってるって寸法よ!

svd_merge_lora.pyでLoRAを作るのだ!


初級編では、素材Aからコピー機LoRAを作る⇒学習元モデルにマージ⇒それを元に素材Bで学習する……という方法を使いましたね。
実はそれ以外にも「svd_merge_lora.py」というスクリプトを使い、素材AとBのコピー機LoRAをマージすることで、目的のLoRAを作るという方法もあったりします。差分学習法とか呼ばれてる。
で、それはどうやって作るのかというと、まず素材Aと素材Bでそれぞれのコピー機LoRAを作っておいて、それをsvd_merge_lora.pyでマージすることで目的のLoRAが出来ます。

たとえば前回のモノクロ化LoRAなら
(ココに画像入れる)
こんな感じでコピー機LoRA2つ作りまして、
あとはsd-scriptsフォルダでpowershell開いてvenv入ってコマンド実行(ファイルのパスとか書き換えて使ってね)

python .\networks\svd_merge_lora.py --save_to "G:\LoRA\monochLoRA.safetensors" --models "G:\LoRA\copyB.safetensors" "G:\LoRA\copyA.safetensors" --ratios 1 -1 --new_rank 32 --device cuda --save_precision fp16

・--save_to にマージ後したLoRAの保存先
・--models に素材AとBのコピー機LoRAパス
・--ratios は2つのLoRAが打ち消し合う様に、1と-1にします
・--new_rank は2つのLoRAのdimサイズの合計を入力、今回はdim16が2つなので32にしたよ

……といった感じでPowerShellとかでコマンド実行すると、2つのLoRAの差分が抽出されて目的のLoRAが出来上がりますよ。

コピー機化したモデルから学習する場合とsvdマージで作る場合では、仕上がりに結構違いが出ることもあるよ。素材を複数枚使うと違いが出やすい感じかな。
どっちの方法を使うのが良い結果になるのかは、実際作ってみないとわかんないので気になったらsvdマージの方も試してみてくださいね……

素材枚数を増やすのだ!

初級編では元素材1枚からLoRAを作ったわけですが、それだと効果が弱い場合がありますよね、色とか構図への対応力が弱い感じで。
イラストはまぁ、多様な要素によって構成されているわけですが、コピー機モデルからの学習では素材につかった画像からの差分しか得られません、当たり前っちゃ当たり前ですが……
なので、出力時に素材と異なる構図、大きさ、色などが指定されると、途端に効果が落ちることがあります。
で、それを解決するにはどうすればいいのかって話です……簡単に言うと、素材枚数を増やせば大体は解決します……しないこともままあります。

そして「コピー機作成時の素材」と「そこから差分を学習するための素材」のどっちを増やすのかって話ですが、それは作りたいLoRAによって変わりますね……可能なら両方増やしたいところです。
尚、素材増やしたコピー機から作ったLoRAは、素材1枚から作ったLoRAに比べて絵柄や構図に多少の影響は出てしまうかもしれません。

ところで、素材増やしたらそもそもコピー機にならなくね?って疑問もあるかもしれませんね。確かに素材を増やすと出力との完全一致はしなくなります。
ですが大体の場合は問題ありません。Dimsサイズとステップ数を増やしてしっかりと学習すると、素材に使った画像…に近いモノがランダムで出力される「コピー機ガチャ」みたいなLoRAが出来上がります。その状態から学習すれば、問題なく差分を学習出来ます。
まぁ完全一致してると余計な影響を最低限に抑えられるってだけで、多少出力にブレがある程度なら大した影響は出ませんので。

色のバリエーションを増やすのだ

まず目や髪の色とかその辺問題への対処ね。
たとえば「プロンプトで特定の色を指定すると効果が無かったりグチャる」とか「効果は問題ないんだけど、特定の色以外が出なくなった」とかそういうやつ。

こういう場合、素材の学習したい部分の色にいくつかのバリエーションを作って、それで学習することで解決することがあります。
ただコレ地味で面倒で時間がかかります。画像編集ソフトの機能とか使ってある程度自動化しないと、とてもじゃないけどやってられませんねコレ。

構図のバリエーションを増やすのだ

色の次は構図、これも結構重要。学習していない構図・角度もある程度は補完して出力してくれますが、それも限界がありますし。
たとえば目に効果のあるLoRAを顔アップ素材1枚で作ったとして「顔アップ構図での出力では問題なく効果が出ているけど、斜めや横を向いたり全身写す構図だと効果ない・グチャる」みたいなのですね。

そういう時は、正面顔以外にも、上下左右斜め向いた顔の素材を用意しましょう。
そして、引きの構図でグチャるのは、(画像サイズ的に)小さい顔を学習してないから起こることも多いのです、素材画像の大きさも複数用意しましょう。無論その逆もまた然り、学習対象の部位が小さい画像ばかりでも対応力が下がります。

で、どうやって素材用意するのよ?

その辺については別記事を書きます、ここではさらっと大まかな方法だけ。

色については……
画像編集ソフト使って色を変える方法、合成モードを彩度とかカラーに設定したレイヤーでどうにか、あるいは調整レイヤーとか。
ソフトとしてはPhotoshopとかクリスタとか……あとなんかあったかな?
3DCGなら部位の色設定とかテクスチャを編集するとかそういう感じになるかな。キャラクリ出来る系の3DゲーとかVRoidとかのツール系もありですね。

構図は……
構図は3DCGならどうとでもなるけど、イラストの場合は……どうにか集めてください。まぁそれこそAIで生成してもいいんじゃない?
でまぁ、素材を大きめの解像度で作って、縮小したり一部を切り取って素材にするとか、そういう風に素材は増やします。

あと、画風とかはなるべく統一された素材を用意しましょう、余計な学習をしてほしくないので。
……って所を考えると、やはり3D系使うのがいいのかも知れませんね。

学習設定を変えるのだ

複数の素材でコピー機学習する時は、当然ですがDimサイズやステップ数を上げないといけません。
実際どの程度に設定すれば良いのか、その辺はケースバイケース……素材の大きさや色・構図の多様さで変わるのでなんとも言えません。
まぁコピー機法の場合、その辺の設定が大きくて失敗するコトはあんまり無いので、VRAM超過エラーが出ない程度に大きい数値設定しとくのはアリです……まぁ時間とストレージと電気代を余分に消費しますが、半端に小さい設定で学習しきれないよりはマシな気がします。
私の場合、素材が多い時はdim256とか512になる時もありますし、ステップ数も5000とか万超えることもありますね。その辺まだまだ要研究なのです。

同系LoRAの合体技なのだ!

えーと、上で書いた素材増やしにも近い内容なんですが……LoRAの効果を上げたり構図とかへの影響減らしたりする方法の話ね。
皆さん、画像生成の時に同系統のプロンプトやLoRAを複数弱めの強度で使うことってありませんか?要はソレです。
まぁ簡単に説明すると、コピー機学習法で同じ系統のLoRAをいくつか作ってSVDマージでまとめるって手法。素材枚数増やす代わりにLoRA増やして混ぜようぜ!って考えですね。
これにより、それぞれLoRA欠点を同種のLoRAで補完させ合うことで、より効果的なLoRAが生み出せます。……単に欠点を濃縮しただけのゴミが出来ることもあります。

マージの方法は上の方で書いたSVDマージのコマンドを書き換えて使ってください。まーいったん普通にLoRAとして適用して画像生成してみて、強度とか組み合わせを決めてくといいんじゃないでしょうかね多分。


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