見出し画像

今更ながらSDXL LoRA学習してみた

先日SunoのCover機能を活用して『LASER (Love Amplification by Stimulated Emission of Radiation)」という曲を生成したのですが、我ながらいい感じにできそうな手応えがあったのでそろそろちゃんとミュージックビデオを作ろうと思い始めています。

そんな折に高性能そうな動画生成モデルCogvideoX-5Bが公開され、ComfyUI用のカスタムノードも提供されているので早速試してみたのですが、二次元絵の動画化は得意じゃない様子であまりいい感じにはできませんでした。
生成で2次絵アニメーションをするならやっぱ一旦3次か2.5次ぐらいの絵でi2vしてから各フレームを2次絵に変換するしかないかなーと思い始めています。
そしてそのためにはおそらくキャラの一貫性上げるためのLoRAが必要だろうなーと思い、これまでほぼ触っていなかったLoRAに着手してみました。
結果的にはタイトル画像のボブカットガールをうまく学習させられた様子です。
普通にAnimagine XL 3.1でプロンプトで指定すれば普通に出てくるのですが、i2vとかに使う上では安定性が上がるのではないかと期待しています(この点はまだ検証できてないです)。
できた画像のサンプルを載せておきます。

なぜSDXL?FLUX1の方がいいのでは?

世の中的にはFLUX1の方が注目度は高そうで、生成される画像のクオリティも高そうですが、(1) 2次絵のモデルはまだまだ少ない、(2) 学習の方法など情報が少ない気がする、(3) 生成速度が速い方が学習素材作りがしやすい、などの理由により今回はSDXLでやってみることにしました。

つまづきポイント

SDXLのLoRA学習方法なんてもういくらでも情報ありそうな気がしてましたが、実際やろうとするといくつかつまづきポイントがあったので記事にしておきます。おそらくまだまだ同じような理由でSDXLのLoRA学習したい人もいるはずなので参考になるといいなと思います。
つまづいたポイントは下記の通りです。

  1. どんな画像を用意すればいいのか不明
    1枚でもできそうだったり、やっぱり20枚ぐらいは必要そうだったり、画像サイズは揃えた方が良さそうだったりバラバラでも良さそうだったり、白背景がいいという情報もあれば背景ありでも問題ないという情報もあり、色々な手法の情報がある分自分にとってどの方法がいいのか何基準で選べばいいのかみたいなところで悩みました。結論としてはとりあえずやってみる、です。

  2. 画像の修正が必要
    ある程度は想定していましたが、手作業での修正は必要っぽいのでそれなりに手間がかかります。
    特に手がちゃんと出てない場合は変な絵を学習させないためにちゃんとした手を描かないといけない気がするので、描き慣れてないとちょっと大変です。Inpaintでガチャる手もあるのだと思いますが、そっちはそっちで沼がありそうな予感がしたので今回は大人しく手書き修正にしました。

  3. キャプショニングがよくわからない
    これは初めは誰しもそうだと思いますが「学習させたいタグを消す」、という作業ななんとなく直感的に理解しにくいことと、キャプショニング用のツールの情報が古いものが多いのか、動かしてみるとエラーで動かないとか説明と表記が違うとかでなぜかうまくいかない状態になりました。わかってしまえば大した問題ではないのですがわからないうちはなんとも言えない手詰まり感でMP削られます。

  4. 学習ツールのパラメータ多すぎる
    学習ツールはKohya tech氏のKohya-SSがベストっぽい感じだったので選定は迷わなかったのですが、実際使おうとするとどう設定していいかわからないパラメータが多くて戸惑います。これも結論としてはとりあえずやってみる、なのですがヘタをすると異常に学習時間かかったりしそうな気がして慎重になるのでこちらもMP削られます。

上記のつまづきポイントにフォーカスしつつ、今回やったLoRA学習の流れを書いていきます。

1. 用意する画像

今回はそもそもLoRAをできるようになること自体が目的なので、あまり凝ったことは考えずにAnimagine XL 3.1で出せるシンプルめのキャラを使うことにします。とは言えせっかくなのでできたらMVに使えるように曲のイメージに合いそうなキャラにしたいので、ちょっと元気っぽいイメージにすることにしました。
プロンプトの基本的な指定要素として、”1 girl, 19yo, (smile:1.2),dark brown hair,airy bob cut,(white background), no simbol yellow orange hoodie”としています。Animagine XL 3.1は結構安定して白背景が出るので今回は基本白背景にしてみました。
実際に学習用画像を用意する上で意識したことは下記の通りです。

1.前後の全身絵

MVを作る上では色々な姿勢、色々な距離からの構図に対応できた方がいいので全身を学習できるようにします。
全身絵ってfull bodyとかプロンプトに書いてもなかなかうまく反映されないことが多い上に、前後のスタイルが一貫した絵を出すとなると個別にだすのは大変そうなので、プロンプトで”whole body, front side back angles view, character sheet”と記入することでいい感じに複数アングルの画像の生成を試みます。今回採用したのは下記の画像です。

表情差分的な画像も一緒に入っていますが、実際に使ったのは立ち絵だけです。後ろ姿の方は変な袋のようなものを持っているので、これは後ほど削除します。
本当は前、横、後の三面があったほうがいいのかもしれませんが、今回たまたま斜め前と斜め後ろの画像がでたのでこの2つを使いました。

2. 色々な角度からの上半身

立ち絵だと顔の書き込みが少ないのでそのあたりを補うつもりで用意しました。基本のプロンプトに加えて、”viewed from front”などの視点系の指示を記入しました。

正面
横1(振り向き中)
横2(こっち見てる)
横3(目を閉じてる)

また、全身絵の補助的な感じでヒザ下あたりまでの準全身絵ぐらいの絵も入れておきました。これも”character sheet”でたまたま出てきたのを使ってます。顔の雰囲気はちょっと違いますがこれはこれでいいので気にせず使ってみます。

準立ち絵

あと、表情差分的な感じでラブコメ的に使えそうな下記のようなものをいくつか入れておきました。ただ、学習素材の生成もLoRAのベースモデルも同じモデル(Animagine XL 3.1)にするのでこのあたりはモデル側で作れるから不要かもしれません。

つ、付き合ってるとかじゃないよぉ〜!的な表情

2. 画像の修正が必要

前の項目でキャラクターシート的に前後の立ち絵をつくりましたが、これらから前側だけ、後側だけ、など切り出して個別の画像にしていきます。
とくにテクニックは使わずGIMPで手作業で切り抜きして768x768のキャンバスサイズのファイルに貼り付け→レイヤー固定してエクスポートしました。
立ち絵の後ろ姿については元画像で変な袋のようなものを持っていたので消しました。これに伴い手の形の修正も必要になり、ちょっと手こずりましたが手書きで修正しました。最初は横着してGIMP上でマウスで修正してましたが逆に大変だったのでおとなしくiPad上のAffinity Photoで修正しました。

立ち絵斜め前
立ち絵斜め後ろ(もともと手に持ってた袋を消して手の形を手書き)

準立ち絵も同様です。

立ち絵前(ヒザ下まで)
立ち絵斜め後ろ(ヒザ下まで)
立ち絵後ろ(膝上ぐらいまで)

用意した画像全部のイメージは下記のとおりです。
ファイル名を連番にする必要があるのかどうかも未確認ですが、とりあえず連番にしておきました。

3. キャプショニング(タグ付け)のやり方

ネットで探すとstable-diffusion-webui-wd14-tagger(以下wd14 tagger)stable-diffusion-webui-dataset-tag-editor(dataset tag editor)が二強な感じで、どちらもAutomatic 1111 WebUI用のExtensionのようです。このあたりも当初よくわかっておらず、ComfyUI用のLoRAを作りたいならA1111用のツールを使うとA1111に最適化されたタグがついてしまってよくないのでは?的な疑念がありました。なので他にツールがないか探したりしましたが、結論としては特に気にする必要はない、が答えだと思います。
で、どちらのツールを使うかですが、今回はwd14-taggerを使いました。というか、私の環境ではataset tag editorがエラーで動かせませんでした。
今回試したときのA1111などのバージョンは下記のとおりです。

タグ付けの手順についてはこちらのことらさんの記事を参考にしました。

でも上記の記事とUIが変わっていて戸惑ったので、現状のUIでの流れを書いておきます。
全体の流れとして、前記のことらさんの記事を参考に(1)単一画像で共通のタグを抽出する、(2)学習用画像全体にタグを適用する、(3)各画像のタグを編集する、というステップの作業をします。
まず、画面の全体は下記のような感じです。

Single process:単一画像のタブ
Batch from directory:フォルダ内画像一括処理のタブ

では順番に手順を書いていきます。

(1)単一画像で共通のタグを抽出する

Single processタブの状態で画像を1枚ドラッグ・アンド・ドロップします。このときの画像はなるべく他の全部の画像に共通になりそうな要素を含む画像を選びます。例えば全身立ち絵だとデニムとかスニーカーとかのタグも抽出されると思いますが、上半身絵を生成するときには不要なのでそれらは含まない絵を選びました(この方針が正しいかどうかはわかりませんが今回はそうしました)。

画像が1枚読み込まれた状態

Presetは "default.json"、Interrogatorは "WD14 moat tagger v2" にしました。あまり詳細はわかりませんが"WD14 moat tagger v2"は処理が軽くキャラクターや一般的なタグの抽出に向いているようです。
その他設定はデフォルトのままにしておきます。
ここで "Interrogate image" をクリックすればタグが抽出されます。
それぞれのセクションがどういう意味かよくわかりませんが抽出されたタグが表示されます。

次に、抽出されたタグの中から各画像に付与していくタグと付与しないタグを設定していきます。
このタグ付けについて自分なりの理解を書いておきます。

付与するタグ(Keep tag)
各画像に対応するタグファイルに記載されるタグです。このタグファイルに記載されたタグは次のLoRA学習ステップで既にタグがついたものとして扱われるのでLoRAのモデルには追加されません。つまり追加学習させる必要のない要素をKeep tagに記入していきます。例えば、”smile”などはLoRAで学習させたい要素ではないのでKeep tagに記載します。

付与しないタグ(Exclude tag)
LoRA学習対象にしたいタグです。例えば今回のキャラであれば黄色のパーカーを学習させたいので”yellow hoodie”というタグを記載します。ここに記載されたタグはこのあとフォルダ内の全部の画像に対してバッチ処理で自動抽出されるタグから除外されます。
LoRAの学習ステップではタグファイルに記載されていない情報がLoRAのモデルに追加されるので、Exclude tagに記載された要素がLoRAで学習されることになります。

トリガーワードの設定(Additional tags)
画像生成の際にLoRAの設定を反映させるためにプロンプトに記入する単語です。今回学習させるキャラ名 "yagchan" をAdditional tagsに設定します。

(2)学習用画像全体にタグを適用する

Single processの時点で設定したKeep tag、Exclude tag、Additional tagsに記載された内容に従い、指定したフォルダパス内の画像全部のタグファイルを一括で生成します。
例えば下記のように設定して、フォルダ内の画像全部に対してタグ付けをします。

"Interrogate image" を実行すると下記のようにタグファイルが作成されます。

例えば後ろ姿の立ち絵 ”image_1.png” のタグファイルには下記のように記載されています。

最初の "yagchan" がトリガーワード、その他Keep tagに記載した”1girl, smile, white background” が含まれています。後ろ向きにも関わらず、Keep tagに記載したsmileが追加されていることがわかります。こういうことになるのでKeep tagにはこういう画像によってありなしが変わるような項目は書かないほうがいいです。また、Exclude tagに記載した "yellow hoodie" などは検出されているはずでも記入されません。でも "hood, hoodie, hood down" などは記入されています。
学習させたいキャラの特徴に関する単語はこの時点で一つもタグファイルに含まれていないことが理想ですが、現実的には上記のようにいろいろな表現で記入されてしまうので、Single processの時点で検出された類似タグは全部Exclude tagに登録したほうがいいと思います。

(3)各画像のタグを編集する

先程書いたとおり、キャラの特徴として学習させたい単語はタグファイルから消しておく必要があります。
全部のテキストファイルを開いて編集していく必要があります。当初はそんなことしなくてもツールでうまいことできると思っていましたが、この編集作業は必要っぽいです。
”image_1.png” のタグファイルを例にすると、編集は下記のようにします。

  1. 学習させたいタグを消す
    今回の場合生成されたタグファイルのうち ”hood, denim, brown hair, hood down, hoodie, short hair, jeans, bob cut” は学習させたいキャラの特徴なので、これらの単語を消します。

  2. 画像に関連のない単語(間違って付与された単語)を消す
    今回の例だと ”smile” は間違って付与されたタグなので削除しておきます。同様に、対象の絵にふさわしくないタグがついていた場合は消します。

全部の画像のタグファイルについてこれが終わったら画像の準備完了、つぎはやっとLoRA学習です。

4. 学習ツールのパラメータ多すぎる

LoRA学習にはKohya_ss GUIを使います。
このツールはパラメータで設定できる項目が多いのでちゃんとやろうとするとなかなか大変ですが、とりあえず最低限決めることとしては下記の4点です。

  1. LoRAタブを選択する
    起動直後はDreamboothタブが選択されています。ツールの中身が似ているので気づかず設定を勧めてしまいがちなので注意しましょう。

  2. 学習のベースモデル指定
    LoRAのベースにするモデルのパスをPretrained model name or pathに設定します。今回はAnimagine XL 3.1のモデルファイルのパスを指定します。

  3. 学習用画像フォルダ指定
    前のステップで作成した学習用画像とタグファイルが入ったフォルダのパスを指定します。

  4. モデルの種類を指定
    SDXLにチェックを入れます。

  5. 学習パラメータ設定
    今回の設定は下記画像のとおりです。項目は色々ありますが、デフォルトから変えた気がする部分は黄色線の部分です。

  • Presers:none
    色々選択肢がありますがそれぞれどういう特徴があるのかよくわからなかったので変な設定になると困るのでnoneにしました。

  • LoRA type:Standard
    これも各選択肢の特徴がわからなかったので標準っぽいやつを選びました。

  • Train batch size:4
    一度に学習に使う画像の枚数らしいです。4にすると4枚の画像を全部並べて全部眺めながら特徴を学習する感じっぽいです。1枚ずつ学習するより過学習になりにくかったりより共通する特徴を学習できたりするような気がするので4にしてみました。
    ただし値を大きくするとその分VRAMが必要になるらしいので要注意らしいです。

  • Epoch:3
    学習画像フォルダの画像全部を1周学習するのが1Epochらしいです。3Epochだと3周分なので、今回の画像は21枚、これが3周なので63回の学習になるのかなと思いますが実際はMax train epochの1600ステップ実行されたので理屈はよくわかりません。

  • Save every N epoch:3
    3エポックごとにモデルを保存することを意味します。今回は学習のエポック数を3にしているので、学習が全部終わるまでは保存せず、全部終わったら1回保存する設定です。まあ、1回だけ保存すればいいかなと思ってそうしました。

  • Caption file extension:.txt
    デフォルトのままです。キャプションのファイル形式が.txtなのでこのままでOKです。

  • LR Scheduler:cosine
    学習の局所解からの抜け出しトライのパターンを指定するっぽいです。どれがいいのか、どういう特徴があるのかよくわからないので最初は一番標準的なcosineにしておきました。

  • Optimizer:AdamW8bit
    学習を収束させるためのパターンのようです。これが人気があるようなのでとりあえず選んでみました。

  • Max resolution:1024,1024
    学習に用いる画像の最大幅と高さ指定です。今回の画像の最大が1024なのでそれに合わせて設定しました。

こんな感じでとりあえずLoRA学習はできたのですが、いざMVに使おうと曲を聞いてみるとなんとなくイメージに合わない気がしてきたので別のキャラのLoRAを作ろうと思います。
もし参考になったらスキよろしくおねがいします!
ではまた!


いいなと思ったら応援しよう!