作りたい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画像検索
学習元素材を集めるためには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
クロップ
絵が引きの構図ばっかりだと顔面がぐちゃぐちゃになる問題が発生する
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に変換して少しでもファイルサイズを小さくしてメモリー消費を抑える
タグ付け
極めようとするともはや沼を超えて魔界
"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
大元の更新が途絶えてフォークを使ってたんだけどフォークが消えてる!とショックを受けてたらオリジナルのとしあきが戻ってきてた
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に聞きながらガチャガチャやった結果うまく行ったからやり方を説明できない
パラメーター解説
意味わかってないやつが山ほどある
理論とかもなく大体でやってるから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なら最大値だからそのぐらいでも問題なさそうな気もする
トークン長とシャッフル
とりあえず長くする、TriggerWord以外はシャッフルする
仕上がりを早くしたいならタグを短くしてシャッフルもやめたほうがいいが俺は必ずやる
走り出したらすることもあまりない
WANDBで途中経過を確認
WANDBのアカウントは作っとけ API Key 発行してちゃんと設定しとけ
出来上がったLoRAで絵を出すときぐらい楽しいかも
Lossがスケジューラーの動作に合わせて学習率が底付近で低下して頂上付近で上がってるとうまく学習できてる
順調に低下傾向が見られるならうまくいってる
何故かサンプルは出力できない
どこの問題かはわからないがサンプルを出力するときに生成時に使用したVRAMの開放がうまくいってないようで1、2枚生成するとOOMを起こして学習が止まる