SDXL Pony での LoRAの作り方

作りたいLoRAを決める

キャラ、衣装、コンセプト、スタイル

解説するまでもない話ではあるが、最初に明確にしておいて損はない

キャラクターを作りたい場合公式デザインに寄せたいのか、キャラクターの特徴を絞り出して色んな絵柄でそのキャラクターを出したいのかで収集すべき画像やそのタグ付けのしかたが変わってくる

データセットの整備

LoRA作りの手間の7、8割がこれ

妥協してもそれなりには仕上がる

実は自己満足の世界かもしれないと最近思ってる

素材の収集

高品質な画像を集める

そう一口に言っても正直定義が定まってない

作りたいLoRAの狙いが絞れた画像が高品質であると俺は結論した

例:睫毛-XL Jie_Mao-XL (ベアゲルター/Die Wergelder) - v1.0 | Stable Diffusion LoRA | Civitai

沙村広明のベアゲルターの登場人物である睫毛

沙村広明はフォロワーは多いがファンアートが書かれるタイプの漫画家じゃないので必然的にdanbooruタグで「official art」の絵柄しかないこれで一つ狙いが絞れた

漫画のコマはだいたい「grayscale」で作画は安定しない。1枚で一つのイラストではないから狙いは絞れないが人物の特徴は捉えてる。ファジーな特徴を絞り出したいときは枚数でカバー。ノベルゲーのような崩れのない一枚絵が高品質で学習ステップも減らせるがそううまい話もない

仮説:下手な絵は入れないほうがいい?

高品質というとうまい絵という印象を持たれてるが、俺はそれだけじゃない説を信じている

今SDXLの派生モデルで主流のPonyは大量のケモ画像を学習している事で行為*1の抽象的概念の理解が進んだのではないかという説*2

心理学ワールド 90号 人を区別する 乳幼児は顔を区別する | 日本心理学会

そして絵の巧さ以上に学習データとしての高品質さはタグ付け

あえてケモい画像をいれる

おまじない程度の隠し味。効くかは知らない

ケモ特化モデルであるPonyに服だとかを教えるときは少しだが入れておく

cherryscraper

https://chromewebstore.google.com/detail/cherryscraper/dmgibfaenicepbmjcbejibgbaohfkido

danbooruやe621で画像とタグを保存してくれるchrome拡張 metatagもそのまま保存される。俺は学習時には消してる

bing画像検索

Bing 画像 のインスピレーション フィード

学習元素材を集めるためにはGoogleより優秀、解像度とサイズを指定できる。検索にかかる画像もGoogleより多い気がする

クリーニング

世代が進むに連れて学習力も上がって要らない情報まで拾い上げてくるのでロゴや枠を地道に消す アップスケール前にやれよ。画像がでかいと処理に時間がかかる

GitHub - aka7774/sd_lama_cleaner: Lama Cleaner 1111 Extension for Windows

アップスケール

使いたい素材が少ない、とても気に入った画像が長辺1024に満たないときはアップスケーラーに頼る

よく使うアニメ系モデル

Akumetsu971/SD_Anime_Futuristic_Armor at main

4x_fatal_Anime_500000_G

並べて比較検討しないとどれがいいとか画像によって変わるから、比較検討用スライダーHTML

Lorayougazouwoiroirosurusukuriputo/compareImages.html at main · NEXTAltair/Lorayougazouwoiroirosurusukuriputo · GitHub

クロップ

絵が引きの構図ばっかりだと顔面がぐちゃぐちゃになる問題が発生する

wedding dress-XLPony - v003 | Stable Diffusion LoRA | Civitai

ドレスのサンプルは全身を写す構図が多かったせいでv001はその問題が発生。解決策としてバストアップ「portrait」をアップスケール後の画像から1024x1024でクロップして素材に足した

リサイズ

1.5なら512x512、SDXLなら1024x1024がベスト

ベストじゃなくてもベターな1024x1024以下でアスペクト比維持しながら32の倍数にリサイズするスクリプト

GitHub - NEXTAltair/Lorayougazouwoiroirosurusukuriputo

32の倍数にすると処理が軽くなるらしいよという話をsd-webui-GPT4V-Image-Captioneで見た

ついでにwebpに変換して少しでもファイルサイズを小さくしてメモリー消費を抑える

GitHub - SleeeepyZhou/sd-webui-GPT4V-Image-Captioner: Stable Diffusion WebUI extension for GPT4V-Image-Captioner

タグ付け

極めようとするともはや沼を超えて魔界

"LoRAの狙いが絞れた画像が高品質"と書いたな。狙いを確実にモデルに伝えられるタグと揃って初めて高品質なデータセットになる

全部AI任せのタグ付でもそれなりのものができるので自己満足の世界、故に魔界

タグの長さ

説明は細ければ細かいほど良いか? とも言えないSDの扱うトークン数の基本は72トークンで約72wordと短いそれに過不足ないタグ付けなんて俺は無理

だからTriggerWord以外のトークンは常にシャッフルする総ステップは伸びるが情報を切り落としたくはない

flat chestは要る

Civitaiに消されやすいLoRA*3を作る場合

サンプルはLargeとかつけて盛るんだよ

ゴスロリも弾くナーバスさなので「gothic」や「gothic style fashion」とかで回避する

GPT-4o

完成とは言えないが一応は動く自作のスクリプト

https://github.com/NEXTAltair/Lorayougazouwoiroirosurusukuriputo/blob/main/caption_tags.py

これだけでタグ付けしてTriggerWordだけ追加してテストをしてみたが意外といける

WD Tagger v3

大元の更新が途絶えてフォークを使ってたんだけどフォークが消えてる!とショックを受けてたらオリジナルのとしあきが戻ってきてた

GitHub - toshiaki1729/stable-diffusion-webui-dataset-tag-editor: Extension to edit dataset captions for SD web UI by AUTOMATIC1111

WD Tagger v3はなんか無駄に流行りに流されてやたら「お前もVTuberだ!」といってくるが、そこに共通するキャラデザとかないだろう

手動クリーンナップ

自作のスクリプトの中にkohya_ss/sd-scriptsから流用したクリーンナップスクリプトはあるがまだ美しくない

GPT-4oでのタグはbanbooru語でもe621語でもないからそのへんの翻訳も必要

アップスケールしてちょっと汚くなった画像

「jpeg artifact」とか「upscaled」とかを入れる

キャラの特徴は消す?残す?

例えば黒髪の人物を学習させるとしよう「black hair」は必要か?

ケース・バイ・ケースだ

TriggerWordにその特徴を覚え込ませてpromptを圧縮したい場合は消す

汎用性を持たせて髪色違いとかを出したい場合は残す

おれはstep数増えても残す

promt-all-in-one用YAML

AIが自動認識しにくいんで人物の時は画角や方向を手動で入れたほうがいい気がするが面倒なので飛ばしてること多し

ところで左を向いている、右を向いてるとかも入れたほうがいい気はするがそれは被写体から見た方向にすべきなのかカメラ絡みた方向にすべきなのかはわかってない

    - name: 人物向き
      color:
      tags:
        looking at viewer: カメラを見ている
        facing viewer: カメラを向いている目は別の方向
        looking ahead: 前を見ている(体の向き基準)
        facing ahead: 前を向いている(体の向き基準目は閉じる)
        looking away: カメラに向いてない
        facing back: 振り向く目は閉じる
        looking back: 振り向く目は開ける
        from side: 首を動かす横向き
        facing to the side: 体ごと横を向いている
        looking to the side: 顔を横に向けている
        looking down: 下を向いている
        head down: 頭を下げている
        looking up: 上を向いている
        facing up: 上を向いている目は閉じる
        looking afar: 遠くを見つめている
        sideways glance: 横目
    - name: 人物写った部位
      color:
      tags:
        full body: 全身
        tachi-e: 立ち絵
        face: 顔のみ
        upper body: 上半身
        lower body: 下半身
        a close up of a face: 顔のクローズアップ
        portrait: バストアップ(脇まで)
        cowboy shot: 太腿から上
        feet out of frame: 足がフレーム外
        head out of frame: 頭がフレーム外

そのうちLLMにクリーンナップさせたい

手動でキレイにする処理がまあ時間かかる

英語わからん人なのでプロンプトオールインワンやタグコンプリートに力を借りながらやっても丸一日かけてタグをクリーンナップしてたりするのはめんどくさい

理想はタグ付け段階で全部ええ感じにしてくれることだがそこまでのものを作ろうとするととてもコストが高い

トレーニングスクリプト/bmaltais/kohya_ss

kohya-ss/sd-scriptsのdevブランチを使う

LoRA Plusを使うためにsd-scriptのdevを使えるようにした

ChatGPTに聞きながらガチャガチャやった結果うまく行ったからやり方を説明できない

kohya_ss/examples/pull kohya_ss sd-scripts updates in.md at 5ed56238b2c5c93e1510876c20524d391793161d · bmaltais/kohya_ss · GitHub

パラメーター解説

意味わかってないやつが山ほどある

理論とかもなく大体でやってるからChatGPTオススメパラメーターとか聞いたりしてる

繰り返し回数

画像を入れたフォルダのプレフィックス「 10_ 」 とかのやつ

基本的に 「1_」 で学習させてる総ステップ数はepoch数で調整

特にお気に入りとか、細かいニュアンスを拾ってほしい画像は値を増やしして重点的に学習させる

キャラと衣装でフォルダを分けて特定の衣装の枚数が少ないときとかも回数増やして対応したり

総ステップ

だいたい30epoch回す

繰り返し10回だと3epochに相当

スケジューラー

prodigy の推奨がコサインアーリニングだったんでLoRA Plusになっても使ってるが結果として悪くない物ができる

わかりにくかった! CosineAnnealingLR ! (コサインアーリニング) - NEXTAltair's diary

使う上での注意点は設定した学習率を最大値とするので高く設定する

LoRA Plusの場合設定値の n 倍の学習率の計算を同時にやってるので低くする必要はあまりないかもしれないと思うが試してはない

オプティマイザー

LoRA Plusはprodigy が対応してないのでAdow8bitをよく使ってる

prodigy の場合はリスタート系スケジューラーのsafeguard_warmup=Trueにするほうがいい。実際有り無し確かめてはないけど

"eight_decay=0.01" "d_coef=0.8" "use_bias_correction=True" "safeguard_warmup=True" "betas=0.9,0.99"

Lora Plusの倍率

8に設定

16が推奨値らしいがunet lr1e-5 だと16倍で0.00016だと高すぎる気がする

CosineAnnealingLRなら最大値だからそのぐらいでも問題なさそうな気もする

arxiv.org

トークン長とシャッフル

とりあえず長くする、TriggerWord以外はシャッフルする

仕上がりを早くしたいならタグを短くしてシャッフルもやめたほうがいいが俺は必ずやる

走り出したらすることもあまりない

WANDBで途中経過を確認

WANDBのアカウントは作っとけ API Key 発行してちゃんと設定しとけ

出来上がったLoRAで絵を出すときぐらい楽しいかも

Lossがスケジューラーの動作に合わせて学習率が底付近で低下して頂上付近で上がってるとうまく学習できてる

順調に低下傾向が見られるならうまくいってる

何故かサンプルは出力できない

どこの問題かはわからないがサンプルを出力するときに生成時に使用したVRAMの開放がうまくいってないようで1、2枚生成するとOOMを起こして学習が止まる

完成

*1:いやらしい話に限らず

*2:検証はしてないがアニマジンとの比較で人体への理解度が高い

*3:婉曲表現