大量のキャラを同時再現!「作品LoRA」と「ForgeCouple」 (Pixiv Fanbox)
Content
こんばんは、スタジオ真榊です。
今回は、「着せ替え可能な高性能キャラLoRAを作ろう!」の記事の最後に触れた、
「主要登場人物の容姿を一つのLoRAでまとめて追加学習させれば、"作品LoRA"が作れる」
「それによって、複数のキャラクターが登場する1枚絵を生成できるのではないか」
…というアイデアの検証結果について報告したいと思います。
まずは結論から。一つ目は、大勢のキャラクターを同時学習させた「作品LoRA」は問題なく作れることが分かりました。これは前回の「ミオリネスキーム」を使って、登場人物の数だけトリガーワードを作ればよいだけです。だいたい1キャラあたり20-30枚程度、横からや背後から、全身やアップの画像も交えて用意すればOK。総勢17人分の容姿を同時学習することができました。
こちらが学習させたキャラクターのうち6人を自分モデルiomagineXLで生成したもの。比較的よい生成結果をチェリーピックしていますが、プロンプトをさほど練っていなくても、おおむね問題ない出来かと思います。少なくとも、soloで生成するだけならキャラ同士の容姿が混ざってしまうことはありませんでした。(右下にいるヌーノくんのフードつきアスティカシア制服はなかなか再現性が低かったですが)
もう一つは、学習させた複数キャラを絡ませる(同時に一つのキャンバス上に生成する)ことはできるか?という問題です。普通にやると、これはなかなか難しいことが分かりました。
こちらは「dressletta(ドレス姿のスレッタ)」と「dressmio(ドレス姿のミオリネ)」を同時生成したものです。
単純に2girl、dressletta、dressmio…とプロンプト指定すると、上の出力例のように破綻したり、おのおのの容姿が混じってしまったりします。使用したプロンプトはこのような感じ。
PP:<lora:作品LoRA:0.6> 2girls,dressletta,dressmio,hug,from behind,arm around neck,closed eyes,couple,love,yuri,, white background, simple background,, white pupils,masterpiece, best quality, very aesthetic, absurdres,, open mouth,red dress,blue dress,white hair,red hair
正直、一番手っ取り早いのは、それぞれのキャラを1枚絵として生成して背景を切り出し、Clipstudioなどでレイヤー合成してしまうことです。少しの破綻なら、NovelAIのV3インペイントでどうとでも直せるので、工数が少なく済むことは確か。
ただ、これだとそれぞれが一緒に何かをしていたり、触れ合ったりしている構図は生成できませんね。そこで、「RegionalPrompter」や「Forge Couple」といった拡張機能を使ってトリガーワードや各プロンプトを整理してみたところ、複数キャラを上手に生成することができました。
いろいろ実験してみましたが、4人くらいまでならこの通り、微妙な破綻(右端のアリヤさんのおさげが一つ足りない等)はありますが、おおむねプロンプトを分けて生成することができました。
今回の記事ではこのように、多数の登場人物を再現可能な「作品LoRA」の学習から、それを使った複数キャラ同時生成までのやり方を詳しく紹介したいと思います。
目次
1.「作品LoRA」を学習させるには(データセット編)
<重要:複数キャラが一緒にいる画像を混ぜよう>
2.「作品LoRA」を学習させるには(タギング編)
3.「作品LoRA」を学習させるには(学習設定編)
<余談:avr_lossの変動を監視してみよう>
4.できたLoRAで生成してみよう
5.作品LoRAだけで複数人を同時生成できる?
6.Forge Coupleを導入しよう
<インストール方法>
<操作方法>
<生成テスト>
<Global Effectの使い方>
<"高度な設定"の使い方>※自環境では活用できず
7.Forge Coupleで複数キャラLoRAを使ってみよう
1.作品LoRAを学習させるには(データセット編)
まずは前回のおさらい。「ミオリネスキーム」は、覚えさせたいキャラクターの容姿の数だけフォルダを用意して、それぞれ20~50枚程度の画像データセットを入れて作るやり方でした。前回はミオリネという1人のキャラクターの複数のすがたを追加学習させたわけですが、今回はそれぞれ違う人物の容姿を学習させるわけです。
LoRA/ ←ルートフォルダ(名前はなんでもよい)
└ training/ ←学習データを入れるフォルダ(名前はなんでもよい)
└ suiseichara/ ←LoRAごとに作るフォルダ(名前はなんでもよい)
├ 4_guel_jeturk/
├ 4_shaddiq_zenelli/
├ 4_prospera mercury/
├ 4_nuno_kargan/
├ 4_ojelo_gabel/
︙
トリガーワードは、それぞれのキャラを示すdanbooruタグ(基本的にはフルネーム)に準拠しました。これは、それぞれ覚えさせる容姿が一つだけのパターンでよいためですので、複数のパターンを作りたい場合は独自タグを使ったほうがよいでしょう。例えば、グエルというキャラは作中で長髪から短髪に変化しますが、両方の容姿を別々に学習させたい場合は、「shortguel」「longguel」といった独自タグを新たに作った方が容姿が混線しないはずです。
これまでに作ったLoRA用のデータセットを全部雑に放り込んでも、多人数の容姿を再現できるLoRAを作ることができます。ただし、別々のキャラに同一のタグがついていた場合、LoRA内で概念が混じってしまうので、その点だけ気を付けましょう。
例えば赤いドレスを着ているキャラが二人いると、それぞれのドレスのデザインが混じりがちになってしまいます。
<重要:複数キャラが一緒にいる画像を混ぜよう>
キャラLoRAを作るときは、純粋にその容姿だけを覚えてほしいため、背景や別のキャラの映り込みを除去するケースが多いです。ただ、今回のようにキャラクター同士の絡みを生成したい場合は、あえてデータセット内に複数キャラが一緒に映っている画像を入れると良いようです。例えば、スレッタとミオリネ、アスカとレイのように、一緒に描かれることが非常に多いペアは、どんどん2ショットの画像をデータセットに含めて構いません。
▲普段ならキャラLoRAに使わない複数人の画像
なぜこれが重要かというと、それぞれのキャラが単独で映っている画像だけで学習すると、AIにとってはそのキャラが一体どれくらいの身長なのかがよくわからないし、一緒にいるところも想像がつかないまま描くことになるからです。原作で縁のあるキャラクター同士は、今後そのLoRAを使うときに一緒に生成したくなることも多いと思います。一緒にいるときどれくらいの距離感なのか、背の高さの違いは、どういう仕草をするのか…といったこともAIはデータセットから学ぶので、普段と違って複数人でいる画像や背景のある画像を混ぜたほうがよいわけです。
注意する点は以下の3つ。
①今回覚えさせないキャラが映り込んだ画像は避ける(もしくはトリミングする)
②映り込んだ別キャラは、今回使うトリガーワードでタグ付けする
③単独(solo)でいる画像の方が、複数人でいる画像より圧倒的に多くする
例えば、オジェロとヌーノが一緒にいる画像を学習させるときは、今回学習させないティルが映り込んでいる画像は避け、「ojelo_gabel」と「nuno_kargan」というタグを必ず入れて学習させるようにしましょう。そして、オジェロ、ヌーノがそれぞれ単独で映っている画像のほうが、複数人でいる画像より圧倒的に多くなるようにデータセットを整えましょう。ここをきちんと守らないと、オジェロをsolo生成しようとしても高確率で背景に地球寮メンバーが生成されてしまうLoRAになりがちです。
2.作品LoRAを学習させるには(タギング編)
タギングについても、ミオリネスキームと同様です。いつも通り、トリガーワードをadditional tagsに入れて、除去するタグをExclude Tagsに入れればOK。「しきい値(Weight threshold)」は0.28~0.35前後、最低抽出率は0にするのがオススメです。
タガーは前回同様「wd-EVA02-Large-v3」を使っています。(タガーの追加方法はSDXL用LoRA学習が理解る!参照)
キャラクター名のdanbooruタグをそのままトリガーワードにしたい場合(例:miorine_rembranなど)、検出タグの中にも同じタグが検出されていることがあるので、その場合はAdditional tags、Keep tags、Exclude Tagsにいずれも同じタグを入れれば一つ目に固定されます。
Exclude Tagsには、どんなときにもそのキャラクターを生成したら不可避な容姿タグを記入します。目や髪の色、身体的特徴などです。衣装や髪型も含めて固定で出したい場合は、衣装タグや髪型タグも記入します。Exclude Tagsに何を記入したかはLoRAメモにきちんと書き残しておきましょう。トリガーワード+除去タグで、そのキャラを上手に呼び出せるようになります。(※誤タグは除く)
3.作品LoRAを学習させるには(学習設定編)
覚えさせるキャラクターが増えても、基本的には前回紹介したミオリネスキームと同じ考え方で画像を集めるだけなので、さほど迷うことはないかと思います。データセットが準備できたら、いつも通りKohya_lora_param_guiでさっそく学習させていきましょう。
普段は「Animagine汎用プリセット.xmlora」を選び、「batch1相当」の数字が2000~3000の間になるように調整しますが、今回はなにしろトリガーワードが多く学習させる枚数も多いので、ステップ数がかなり多くなってしまいます。私はdim64/alpha32でいつも通り学習させていきますが、どうせ1日放置するので4万ステップまで学習させてみました。
キャプションの1個めをトリガーワードにするので、「キャプションのシャッフル」にチェックを入れ、トークン保持数は1とします。
<余談:avr_lossの変動を監視してみよう>
学習が進んでいくときのコマンドプロンプト画面では、このように「avr_loss=0.0XXX」という文字が表示されています。この値は、0.1からスタートして、小さくなるほど学習データ画像そのものに近づいていくことを示しています。ステップが進むごとに数値は上下しながらおおむね減少していきますが、小さくなるほどデータセット再現率が高い代わりに応用力が低いLoRAになったことを示しており、0.02より小さくなった場合はほとんど過学習を起こしています。
avr_lossの値は学習が進むほどに小さくなるので、単純に「小さいほど良いLoRA」という気がしますが、学習データと同じ画像ばかり出るコピー機LoRAになってしまっては何にもならないので、バランスが重要というわけですね。
①データセットが多数・多様なほど、avr_lossは小さくなりにくいため、多くの学習ステップを回す必要がある
②LR(学習率)が低いと学習に時間が掛かる。逆に高い(=一気に詰め込み学習させる)と発散しやすい。(※Prodigyのような自動型のオプティマイザでは、学習率を自動調整してくれるので関係ない)
③数値が急上昇・急減少した場合、発散や過学習(いずれも追加学習失敗)を起こしていることがうかがわれる
ーといった法則があるようです。今回は0.07までしか削れませんでしたが、おおむねキャラクターの特徴は覚えられていました。さほど気にしすぎず、「おっ順調に減ってるな、感心感心」程度に見ておくと良いかなと思います。
4.できたLoRAで生成してみよう
さて、RTX4080(VRAM16GB)環境で、だいたい12時間半程度で「suiseichara.safetensors」の学習が終わりました。以前単品で学習させたキャラクターのデータセットも含め、計17人分(※同一人物の別衣装も含む)の容姿を学習させたことになります。
生成試験を行ってみましょう。LoRAを発動して、アリヤさんの画像を生成してみます。ただし、制服姿ではなく、学習データセットにはない水着に着替えられるかを試してみます。
プロンプトはこちら。
PP:<lora:suiseicharaXLv1:0.7>1girl,aliya mahvash,partially underwater shot,white bikini,smile,sky,beach,backlighting, white pupils,masterpiece, best quality, very aesthetic, absurdres, graphite \(medium\), colored pencil \(medium\),looking at viewer, sketch
問題なく、データセットにない服装やポーズを出すことができました。また、顔立ちもデータセットの画像に引っ張られず、自分画風モデル(iomagineXL)の画風で出せていると思います。
過学習を起こしていると、学習データセットにない画像を出そうとしても破綻してしまうので、テストにはこうした応用力があるかどうかを試すのがよいと思います。
さきほども掲載しましたが、他のキャラクターの再現もこのような感じで、微細なミスはあるにせよ、なかなかのクォリティで再現できていると思います。
では、ここからが本題。これらのキャラクターを同時に生成することはできるでしょうか?
5.作品LoRAだけで複数人を同時生成できる?
単純に、一緒にいることが多いオジェロとヌーノを同時生成してみます。
プロンプトは以下の通り。
PP:<lora:suiseicharaXLv1:0.7>2boys ojelo gabel, nuno kargan,laughing,sitting,playing_card,holding card,asticassia school uniform,green jacket, hat,beanie,afro, white pupils,masterpiece, best quality, very aesthetic, absurdres, graphite \(medium\), colored pencil \(medium\),looking at viewer, sketch
できたのがこちら。
かなり頑張ってはくれているものの、キャラの容姿が混じってしまい、オジェロの額にヌーノの帽子のようなハチマキが出てしまったり、袖が破綻してしまったりしています。
他にもこのような感じで、フードがまじったり顔立ちが混じったり…1人1人で生成することはできても、これでは使い物になりません。
6.Forge Coupleを導入しよう
そこで、今回はSDwebUI Forgeで使える拡張機能「Forge Couple」を使って、プロンプトの分割適用を行います。この拡張機能はAutomatic1111 Webuiでは動作しないため、Forgeをお使いではない方は「Regional Prompter」を使うことをおすすめします。UIは異なりますが、おおむね同様の生成結果が得られます。
個人的な感覚としては、こちらの「Forge Couple」の方が操作感がシンプルで、直感的に使いやすいと感じています。一方、Regional Prompterでは、細かくキャンバスを分割してキャラクター位置や背景などを調整するのに便利なので、これから生成したい画像の複雑度などで選ぶのが良いかと思います。
<Forge Coupleのインストール方法>
いつも通り「https://github.com/Haoming02/sd-forge-couple」を「URLからインストール」に放り込んで再起動するだけです。成功していれば、Controlnetなどに並んでこちらのメニューが追加されています。
<操作方法>
Regional Prompterに比べ、非常にシンプルなインターフェイスなので安心された方も多いのではないでしょうか。基本的に「有効化」を押したら、プロンプトを分割する方向を水平方向か、垂直方向かを選ぶだけでOK。2人のキャラクターが横に並んでいる画像を生成したい場合は「水平方向」を選びます。
ここからがポイント。Forge Coupleにおいて、プロンプトの分割はエンターキーによる改行で行います。例えば、女子キャラクターAとBを並べたい場合は次のようにポジティブプロンプト欄に記入します。
2girls,characterA(キャラタグ),white bikini,beach+クオリティタグ
2girls,characterB(キャラタグ),black bikini,beach+クォリティタグ
行数が2行なので、キャンバスは水平方向に自動で均等に2分割されます。向かってキャンバス左側にAキャラのプロンプトが、右側にBキャラのプロンプトが適用されます。普通に考えると、それぞれの人数指定は「1girl」としたくなるところなのですが、ここには画面全体の総人数を指定しないと、2人のキャラデザがフュージョンしたような女の子が出てきてしまうことが多いです。
ここで重要なのが、「あくまでその範囲にプロンプトが適用されるだけ」であって、「その範囲にキャラクターが必ず描かれるわけではない」ということ。たまたま2人が中心線より右側に描かれた場合、二人ともBの容姿になってしまうことを覚えておきましょう。
<生成テスト>
前置きが長くなりました。実際に生成してみます。
まずはLoRAなしで再現できるキャラクターでやってみましょう。「水平方向」にチェックを入れて、次の2行プロンプトで生成してみます。
2girls,ayanami rei,glasses,white bikini,,looking back,expressionless,white pupils,beach,standing,masterpiece, gradient eyes, best quality, very aesthetic, absurdres,sketch,<lora:sdxl-flat:-1> small chest,
2girls,souryuu asuka langley,black hoodie, hand on hip,red bikini,beach,standing,glaring,,white pupils,gradient eyes, masterpiece, best quality, very aesthetic, absurdres,sketch,small chest,
左に綾波、右にアスカが立つようにし、それぞれ眼鏡や表情、服装に差をつけています。ポイントは、それぞれの領域に描かれるのが1girlずつだとしても、「2girls」と総勢人数を表記するところ。「1girl,solo」でも崩壊はしませんが、プロンプト分割の仕組み上、こちらの方が打率が良いようです。
生成結果がこちら。ポーズや服装など、おおむね想定した通りに分割適用ができているように見えます。
ちなみに、Forge Coupleをオフにして同プロンプトで生成すると、次のようになります。正中線でプロンプト分割が行われないため、すべてのタグが二人のキャラに影響してしまっていることが分かります。
<Global Effectの使い方>
さきほどは割愛しましたが、「Global Effect」という欄を使うと、画面全体に薄く適用したいタグを設定することができます。「First line」と「Last line」のどちらかにチェックを入れると起動し、前者ならプロンプトの最初の行に、後者なら最後の行に記入した内容が、画面分割して適用された上に影響するイメージです。(当然、指定した行は画面分割の計算からは外れるので、計3行でもキャンバスは2分割になります)
例えば、先ほどのプロンプトでGlobal Effectを使う場合は次のような3行プロンプトになります。1行目のグローバルエフェクト行にも2girlsと入れておかないと、構図が1girlに引っ張られるので、ここにも2girlsは入れておく必要があります。
2girls,white pupils,masterpiece, gradient eyes, best quality, very aesthetic, absurdres,sketch,<lora:sdxl-flat:-1> small chest,
2girls,ayanami rei,rimless eyewear, glasses,facing away,white bikini,beach,standing,looking back,expressionless,
2girls,souryuu asuka langley,black hoodie, hand on hip,red bikini,beach,standing,glaring
<"高度な設定"の使い方>※自環境では活用できず
「高度な設定」という欄にチェックを入れると、以下のような画面が展開されます。Regional Prompterなどのカップル系機能を使ったことがある方にはおなじみの、縦横にキャンバスを細かく分割する機能です。パラメータ数値の入力ではなく、選択範囲のドラッグで範囲指定を行うことができます。
結論から言って、この機能は手元の環境ではうまく適用できませんでした。ですので、ここでは使い方だけ紹介しておきます。
まずは、現在PP欄に入力されている文字列が、このように行ごとに分割されて表示されています。文字列をクリックすると、このように青い「New」ボタンが出ますので、これを押すと、さらに行数(=プロンプトの適用範囲)を増やすこともできます。
各プロンプト欄をクリックすると、こちらの枠内の対応する範囲が光り、各頂点をドラッグして範囲を動かすことができるようになります。
枠内で範囲指定した通りの数値がこちらの欄に入力されます。「x1、x2」が水平方向の座標、「y1,y2」で垂直方向の座標を示しており、それぞれ開始位置と終了位置を示していますので、例えばx1x2が「0~0.5」ならキャンバス左から中央まで、y1y2が「0.33~1」なら、キャンバスの下3分の2を範囲選択しているという意味です。「w」はウェイトのことですので、ここで各プロンプトの重みに差をつけることができます。
例えばこのように、画面を左右に二分割して二人を配置したあと、さらに頭上にそれぞれ「空・飛行機」「木・太陽」のプロンプトを適用してみます。(1行目はキャンバス全体を選択しており、global effectの役割を果たしています。公式によると、範囲の一つはこのようにキャンバス全体を覆うものにすべきとのことです)
が、このようにそれぞれの位置や服装、怒り顔といった要素が混じってしまい、思ったような結果にはなりませんでした。もう一つのマスク機能も、うまく使用することができない状態でした。何かしらパラメータ設定が間違っているか、不具合が起きているのかもしれませんが、この記事ではありのままを紹介しておきます。
7.Forge Coupleで複数キャラLoRAを使ってみよう
さて、アドバンスドモードはうまく使えませんでしたが、以上の機能を使って複数キャラの再現をしてみます。プロンプトはこちら。
1行目がグローバルエフェクトで、2~6行目が5人分のプロンプトとなっています。左から、アリヤ・リリッケ・ドレススレッタ・ドレスミオリネ・プロスペラの順に並ぶはずです。
①<lora:suiseicharaXLv2:0.7>5girls,white pupils,masterpiece, best quality, very aesthetic, absurdres,indoor,lineup,cowboy shot,looking at viewer,smile,
②5girls,aliya mahvash, brown eyes,asticassia school uniform, green jacket, green shorts,masterpiece, best quality, very aesthetic, absurdres
③5girls, lilique kadoka lipati, fat,plump,asticassia school uniform, green jacket, green shorts,masterpiece, best quality, very aesthetic, absurdres
④5girls,dressletta,tiara,green eyes,thick eyebrows, red hair, short ponytail,hairband,bare shoulders,red dress,long skirt,ahoge,,masterpiece, best quality, very aesthetic, absurdres
⑤5girls,dressmio,blue dress,flat chest,grey eyes,single hair bun,shawl,side slit,bare shoulders,white flower,ahoge,, masterpiece, best quality, very aesthetic, absurdres
⑥5girls,prospera mercury,helmet, grey jacket, solo,grey pants, jacket, mask, suit, hair behind ear, long hair,, masterpiece, best quality, very aesthetic, absurdres
しかし、これをこのままForge Coupleで生成すると…
このように、5人の立ち位置が均等にならないため、プロンプトの狙いが外れてよくわからない生成結果となりがちです。先ほど説明した「あくまでその範囲にプロンプトが適用されるだけ」であって、「その範囲にキャラクターが必ず描かれるわけではない」ということですね。
これを解決するためには、キャラクターの配置をControlnetによって誘導してやる必要があります。depth系などさまざまな手法がありますが、ここはOpenposeを使うのがよいでしょう。
1.ポーズ素材を入手する
自分でボーンを描いたり、拡張機能で配置したりすることもできますが、やや面倒なので、今回はフリー素材サイト(PhotoACなど)から均等に5人並んだ画像を持ってきます。イラストでも構いませんが、プリプロセッサは写真のほうがポーズを認識しやすいようです。
2.OpenposeDWでボーンを取得
Controlnetでボーンを取得します。基本的な使い方はこちらの記事を参照。
Controlnetを開き、DWOpenposeでボーンを取得しましょう。背の高さが違うのが気になる場合は、画面右の「Edit」ボタンから操作することもできます。読み込ませるモデルはSDXL用のOpenposeモデルを指定しましょう。今回は「kohya_controllllite_xl_openpose_anime」を使います。
正確にこのポーズをさせたいわけではなく、立ち位置さえ合っていれば構わないので、EndingControlStepは「0.3」と早めに切り上げます。ControlModeは「プロンプト重視(My prompt is more important)」を選ぶと生成結果がよりよくなるようです。
ちなみに、首から下のポーズが写真に引っ張られるのが嫌な場合、このようにEditによって顔だけを残すこともできます。こうしておくと、顔の位置だけを固定することができます。
DW Openposeの概要や抽出したポーズの編集方法については、こちらの記事にまとまっていますので、併せてお読みください。
3.ForgeCouple+Controlnetで生成
この状態で生成すると、このように5人の立ち位置が均等に割り振られるので、プロンプトがきちんと5人にターゲットされ、要素の混線を避けることができます。
こちらが生成結果の一例。細かなミスはありますが、おおむね狙った通りの結果が得られていると思います。ただ、この手法で複数人が上下に大きく入り乱れるようなイラストを作るのはまだまだ難しいでしょう。棒立ちでは面白いイラストとは言えませんので、「この技術を使って何をするか」が次に重要になってきますね。
個人的に印象に残っている集合絵というと、こちらのジブリ飲み会のイラストが思い浮かびます。インターネット老人会には有名な1枚ですね。
これをAI絵でやるのはめちゃくちゃ大変!偶然性が許されないので、一つ一つ立ち位置や小さなギミックを考案していって、一つの大きな漫画にするような作りをしなくてはなりません。もしこれを「作品LoRA」で再現するとしても、今回のやり方ではなく1人ずつの生成やインペイントで地道に組み合わせていくようなやり方になるだろうなと思います。
Forge Coupleでは上下左右に細かくプロンプト範囲を分割する手法がうまくできませんでしたが、Regional Prompterでは可能と思いますので、「ジブリ飲み会」ほどの作品は無理でも、何か面白いイラストを作れないか苦心してみようと思います。
それでは、今回はこのへんで。スタジオ真榊でした。