絵心ゼロでもマスコットは飼える──自作キャラLoRAを「検証→再学習」で仕上げるまで

テクノロジー

私は絵が描ける人を心の底から尊敬しています。頭の中のイメージがそのまま手から出てくるなんて、あれはもう魔法です。そして私はというと、丸と棒で構成された「人らしきもの」を描くのが精一杯。それでもこのブログに、うちの子と呼べるマスコットキャラクターを登場させたい——ずっとそう思っていました。

描けないなら、作ればいい。キャラクターをLoRA(画像生成AIの追加学習モデル)にしてしまえば、あとはプロンプトを書くだけで「手を振るうちの子」「ビールで乾杯するうちの子」が量産できます。おまけに、仕事柄一度ちゃんと手を動かしたかったLoRA学習の経験も手に入る。マスコットと知見の一石二鳥です。170万円で組んだ自宅AI環境の導入記事で「GALLERIAはLoRA学習担当」と宣言してから早幾日、ようやくその伏線を回収します。

というわけで、当ブログのマスコット「OYAJIくん」をご紹介します。

OYAJIくん。ハゲ・丸メガネ・無精ひげ・黒Tシャツがチャームポイントの、どこかで見たような誰かです
OYAJIくん。ハゲ・丸メガネ・無精ひげ・黒Tシャツがチャームポイントの、どこかで見たような誰かです

名前と風貌から誰をモデルにしたかはお察しください。本記事では、このキャラLoRAを作って、一度で満足せずに「体系的な検証 → データセット修正 → 再学習」で品質を仕上げるまでの一部始終を書きます。結論だけ先に言うと、このひと手間で重度の破綻率が20% → 7.5%まで下がりました。

材料と環境

  • 学習素材:Geminiで生成したキャラクターシート9枚を自動分割・文字除去・アップスケールした138枚(モノクロ線画)+ Danbooru形式キャプション
  • ベースモデル:Illustrious-XL v0.1(アニメ・イラスト系の定番)
  • 学習環境:GALLERIA(RTX 5090)+ kohya_ss(sd-scripts)+ PyTorch 2.7.0/CUDA 12.8
  • 作業パートナー:Claude Code(このPCの端末で動くAIエージェント。環境構築から検証まで、手を動かす系は今回ほぼ全部任せました)

データセットはトリガーワード方式にしました。キャラ固有の特徴(ハゲ・丸メガネ・無精ひげ・黒Tシャツ)はあえてキャプションに書かず、トリガーワード oyajikun に焼き込みます。こうすると呪文ひとつでキャラが呼び出せるわけです。

学習素材の例。ダンスの「動線」「星」「砂煙」……この賑やかな記号たちが後で事件を起こします
学習素材の例。ダンスの「動線」「星」「砂煙」……この賑やかな記号たちが後で事件を起こします

学習(v1):RTX 5090で46分

設定はnetwork_dim 16 / alpha 8、学習率1e-4、バッチ4、10エポック(約1,750ステップ)。RTX 5090で46分、VRAM使用は13GBほどでした。32GBのうち13GB。余裕です。買ってよかった(震え声。

注意点はひとつだけ。RTX 5090(Blackwell世代)はCUDA 12.8対応のPyTorchが必須です。最近のkohya_ssはセットアップ時に対応版を選べるので、これから試す方はそこだけ気をつけてください。

生成テストの結果はなかなかのもので、LoRA強度1.0+「full body」タグで、服装込みでキャラが再現できました。

v1での生成例。学習画像にないポーズでも黒Tシャツ・短パン・スニーカーまで揃います。かわいいじゃないか
v1での生成例。学習画像にないポーズでも黒Tシャツ・短パン・スニーカーまで揃います。かわいいじゃないか。でも、あれ?左手は?

一枚の成功で満足してはいけなかった

ここで終われば「LoRA作ってみた。できた。かわいい」という記事になるはずでした。ところがComfyUIで何枚か生成してみると、上の画像もそうですが、左腕が消えたOYAJIくんが出ています。腕があるべき場所には「シュッ」という謎の動線だけが漂っています。

そこで、Claudeに40パターンの体系的検証をやってもらいました。学習済みポーズ/未学習ポーズ/表情/視点/服装指定など20種×2 seed=40枚をseed固定で自動生成し、全数を目視評価します。

結果:良好58% / 軽微な問題22% / 重度の破綻20%

v1の破綻例。手を振る・横歩きなどの動的ポーズで体が崩壊。腕の代わりに動線や砂煙が描かれているのがポイントです
v1の破綻例。手を振る・横歩きなどの動的ポーズで体が崩壊。腕の代わりに動線や砂煙が描かれているのがポイントです

破綻には明確な傾向がありました。動的ポーズ(wave / running / jumping)に集中し、崩れた腕の位置には決まって動線や砂煙が出ています。あの賑やかな記号たち、伏線回収です。

原因:キャプションに書かれていない要素は暴走する

学習素材138枚を全数監査したところ、37枚に動線・強調線・擬音(ハハハ!、Zzz)が写っているのに、キャプションには一切タグ化されていないことがわかりました。

LoRA学習には「キャプションに書かれていない画像要素は、トリガーワード(=キャラの一部)として焼き込まれる」という原理があります。特徴をトリガーに焼き込むのに使ったのと同じ仕組みが、裏目に出るとこうなります。モデルは「このキャラの腕の周りには時々シュッという線が出るものだ」と学習してしまい、動的ポーズで腕の代わりに動線を描いて破綻していたわけです。しかもタグ化されていないので、ネガティブプロンプトに motion lines と書いても効きません。モデルの中でその要素はどの言葉とも結びついていないからです。

データセット修正と再学習(v2)

対処はシンプルで、「画像に写っているのにキャプションにない」要素をすべてタグとして追記しました。

  • motion lines / emphasis lines:動線・強調線が写っている30枚に追記
  • sound effects:「ハハハ!」「Zzz」などの擬音文字がある5枚に追記
  • その他(sighsquiggle?):3枚
  • おまけに監査中、1枚から文字の消し残りも発見して画像修正(こういうのが1枚あるだけで生成画像に謎の文字が出たりします)

タグ化すると、その要素は「プロンプトで頼んだときだけ出る」制御可能な存在に変わります。ハイパーパラメータは一切変えず、同じ設定で再学習。2回目も約49分でした。

v1 vs v2:同一seedでガチ比較

同じ40プロンプト・同じseedでv2を生成し、v1と並べて比較しました。seedを固定しているので、差分は純粋にデータセット修正の効果です。

評価v1v2
良好58%78%
軽微な問題22%15%
重度の破綻20%7.5%
左: v1 / 右: v2(同一seed)。崩壊していた「手を振る」ポーズが立て直りました
左: v1 / 右: v2(同一seed)。崩壊していた「手を振る」ポーズが立て直りました
ジャンプもv1(左)の破綻がv2(右)でクリーンに。タグを足して再学習しただけでこの差です
ジャンプもv1(左)の破綻がv2(右)でクリーンに。タグを足して再学習しただけでこの差です

重度の破綻は1/3以下になり、動線が勝手に出る現象はほぼ消えました。さらに副産物として、タグ化したことでネガティブプロンプト motion lines がちゃんと効くようになり、逆にポジティブに書けば意図的に動線を出せるようにもなりました。暴走していた要素が、飼い慣らされて手札に変わったわけです。

完成したv2。胸のOYAJIロゴまで安定して出ます
完成したv2。胸のOYAJIロゴまで安定して出ます

ちなみに素材が全部モノクロ線画なので「カラーは原理的に無理だろう」と思っていたのですが、試しに monochrome, greyscale タグを外したら普通にカラーで出てきました。思い込みも検証してみるものです。

カラー版OYAJIくん。彩度は控えめですが、紺Tシャツで出てきました
カラー版OYAJIくん。彩度は控えめですが、紺Tシャツで出てきました

人間がやったこと、AIに任せたこと

MV制作の記事に続き、今回も分担表を載せておきます。今回の相棒はClaude Code(端末で動くエージェント)です。

工程人間(私)Claude Code
素材準備Geminiでのシート生成・分割(別PC作業)
環境構築「プロジェクトフォルダに全部まとめたい」等の方針決めPython/kohya_ss導入、CUDA 12.8対応、学習実行と監視
検証「左手が消えてるのは何で?」と聞いた40プローブの設計・生成・全数評価、原因仮説の検証
データ修正修正方針の承認138枚の全数監査、34キャプションのタグ追記、画像修正
再学習・比較「進めて」と言ったv2学習、同一seed比較、デグレ検出
運用整備今後、失敗画像をフォルダに放り込む係失敗トリアージの仕組み化(自動再現+分類レポート)

私の仕事のほとんどが「方針を決める」「質問する」「承認する」に圧縮されているのがお分かりいただけるでしょうか。深夜、学習の進捗通知を眺めながらビールを飲む。OYAJIくんの素材画像とまったく同じ構図が現実にありました。

まとめ:失敗はテストケースである

  • キャラLoRAは素材138枚・学習46分でも十分実用になります(RTX 5090 + Illustrious-XL)
  • キャプションに書かれていない画像要素はトリガーワードに焼き込まれる。意図的に使えば必殺技、見落とすと暴走。動線・擬音・キラキラは要注意です
  • 1枚の成功で満足せず、seed固定のプローブ生成で破綻率を測ると、直すべきものが見えます
  • 失敗画像は「再現可能なテストケース」。プロンプト+seedが再現手順、プロンプト集がテストスイート、再学習がリリース。ソフトウェア開発と同じ構造に持ち込めば、生成AIの「なんか不安定」は案外系統的に潰せます

かくして、絵心ゼロのオヤジがマスコットを手に入れました。今後は記事のあちこちにOYAJIくんが出没する予定です。次はこの子に色を塗るか、それとも動かすか——GALLERIAの稼働率はまだまだ上がりそうです。

コメント

タイトルとURLをコピーしました