見出し画像

デルタもんを例にキャラクターLoRAを作る

 TrainTrainのLoRA作りについてチュートリアルを作ろうかと思っていたところで、AIに限り制限無く使用可能なキャラクター「デルタもん」が発表されました。大変素晴らしく面白い試みですね。早速デルタもんちゃんを例にしてLoRAを作ってみましょう。

デルタもんちゃん(-189)。ポケットに入れたふたつの物を融合させることができるらしい。入れる物の大きさに制限はあるのだろうか。人間の耳の他にケモ耳も備えるため、聴力には自信がありそうだ。プロフィールによると意外と重い使命を背負っているようである

 提供されている画像は前後2枚だけなのでLoRAを作ろうとすると教師画像が足りません。この対処法はいくつかあります。まず2枚でLoRAを作り、LoRAを使って画像を生成して、うまく生成できた画像でもう一度学習をするという蒸留法です。これは852話氏が試しているようです。ほかにもKatsushiro Koizumi氏が試しているひとつの画像を分解して様々な画像を作るという方法があります。この方法ではひとつの画像を部位ごとに分解し、角度を少しずつ変えた画像を作って学習を行います。

 ここではTrainTrainに追加した新機能を使いながら、Koizumi氏の方法を試してみましょう。まず画像をアップスケールします。Stable Diffusion 1.Xでは512*512で学習することが推奨されています。元の画像は1000*1300程度の大きさですが、パーツごとに拡大すると小さくなってしまうためです。また、後述の画像の補正の際にも大きい画像の方が都合が良いです。

 拡大にはwebサービスを使いました。一応リンクを張っておきますが自己責任と言うことで。いつの間にかドメイン乗っ取られて詐欺サイトに変貌しているとかありますからね。とりあえず2倍に拡大します。

 次にpaint3Dを使って各部位を取り出していきます。どこまで分解するかは迷いどころです。852話氏の実験では立ち絵だけでもそれなりに再現できているので、そこまで分解する必要も無いのかもしれません。

なぜ犯人はデルタもんちゃんをバラバラにしたのか・・・・・・。それは、生成AIに学習させるためだったのです!

 これを全部使うかどうかは学習結果を見ながら決めました。ここでTrainTrainに追加したimageタブの機能を使い、角度と大きさを変えた画像をたくさん作ります。Koizumi氏によると全身像は角度を変える過ぎると学習がうまくいかないようです。

ロボットは大量生産される運命

 これで2枚の画像から50枚のデータセットができました。やっと学習です。学習の設定は以下のようにしました。

    "network_type": "c3lier",
    "network_rank": "16",
    "network_alpha": "8",
    "image_size(height, width)": "768,512",
    "train_iterations": "2000",
    "train_batch_size": "4",
    "train_optimizer": "adamw",
    "train_learning_rate": "4e-4",
    "train_text_encoder_learning_rate": "2e-4",
    "image_buckets_step": "128",
    "image_min_length": "384",
    "image_max_ratio": "2",
    "sub_image_num": "1",
    "image_mirroring": false,
    "image_use_filename_as_tag": true,
    "lora_trigger_word": "deltamon, girl",

 細部まで再現して欲しいのでc3lierにしています。lohaでもいいともいますが、この設定のままlohaにはできないので注意して下さい。学習率の設定などを変える必要があります。VRAMに余裕がない場合はadam8bitを使うか、gradient checkpointingを有効にするとといいでしょう。lora trigger wordには「deltamon, girl」と入れます。image_use_filename_as_tagオプションは新しく追加されたもので、.txtや.captionファイルの代わりに画像のファイル名をタグとして扱う物です。full body.pngというファイル名の場合、trigger wordと合わせた「deltamon, girl, full body」のタグで学習が行われます。「_id_」以降は無視されます。

 SD XLは3060ちゃんには荷が重いので試してません。つよつよなGPUを持ってる人が居たら成功した設定を教えてくれると嬉しいです。

 今回は白背景(透明背景)で学習をしています。背景を消すかどうかについてはいろいろ議論がありますが、普段使用するプロンプトと同じ背景ならば消した方がいいと思います。普段「room」のプロンプトで生成することが多いときに「room」の背景の画像を学習させると「room」で生成される画像が変わってしまうからです。

 ここで少しStable Diffusionモデルの学習についておさらいしましょう。学習ではデルタもんちゃんの画像と「deltamon, girl, full body」というテキストをセットにして学習が行われます。モデルは画像とテキストを比べます。ここで、モデルはgirl, full bodyについて知っています。

 画像を見ながら、ふむふむ、女の子の全身だね。でも知っている女の子の特徴とは少し違うかな。deltamon? なるほど。その差がdeltamonに相当するわけだね。学習した。

 となるわけです。

 ここではタグと呼んでいますが、他にもキャプションやテキストとも呼ばれます。このタグは多すぎると面倒なことになるのでできるだけ少なくした方がいいです。先の説明ではモデルが知らない部分をdeltamonと学習するわけですが、入力したタグ、例えばgirlやfull bodyに関しても少し学習が行われます。つまり、full bodyに対しても学習してしまうわけですね。

 多くのタグを入力した場合、入力したすべてのタグに分散して学習が行われてしまい、「deltamon」に紐付けられるべき要素が他のタグに分散してしまうのです。その場合、deltamonとプロンプトに入力しても変化がなくなってしまいます。そうすると、キャラクターの出現をLoRAの強度で調節しなければならなくなり、調節が難しくなります。deltamonとプロンプトに入力したときだけデルタもんちゃんが現れるLoRAが目指すところです。

 さて、それでは完成したLoRAをテストしてみましょう。

ついに完成したデルタもんちゃんを大量生産できるAI

 完全なるコピー機が完成しました。失敗かよと言えばそうではありません。2枚の画像なのでこうなることは解っていました。じゃあなんでこんなの作ったんだよという話ですが、ここからが重要なのです。

 Stable DiffusionはU-Netと呼ばれるニューラルネットワークに画像(正確には潜在化された画像)を処理しますがこのニューラルネットワークにはいくつかの層が存在し、画像は順番に処理されていきます。この層には顔が得意な層だとか、塗りが得意な層だとかがあります。LoRAにも層に相当する部分があるわけですが、この層ごとにLoRAの強度を変えてやることで、このLoRAをつかいもんになるようなものにするわけですね。

 LoRAの層別適用にはLoRA Block Weightを使います。とりあえず、どの層が効いているのかを調べるために、Effective Block Checkerを使います。ここでは全26層ある層の内、ひとつずつ効果を0にしながら画像の変化を調べます。

Effective Block Checkerの設定
でかすぎて縮小しろって言われた
キャラクターはだいたいこの辺と覚えておけばいい

 結果を眺めると、OUT04, OUT05のところで大きく変わっています。デルタもんちゃんに特徴的なポケットが消えてしまっていますね。つまり、OUT04, OUT05が大事であって他は消してもいいかもしれないと言うわけです。
 ここからは少し時間が掛かるので省きますが、26層あるうちのどの層を残すかを決めていきます。基本的にはどれかを消して生成して、を繰り返すわけです。

 そして、最終的には1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1.3,1.3,1,1,0,0,0,0という層を残すことになりました。以下に各層のざっくりとした効果を書いておきますが、これはLoRAや学習したモデルによっても異なります。今回はanyloraで学習しています。

IN00-IN06:消しても影響は少ない
IN07,IN08:構図や背景等。ここを削ると白背景から解放される。逆に白背景を出して素材を作りたいときには有効化する。
IN09-IN11:消しても影響は少ない
M00:構図に大きく影響する。ここを消すとポーズに自由度が出る
OUT00-OUT02:ディテールに影響がある。消すと靴の色が別になったりする
OUT03-OUT05:キャラクターの姿形をになう。ここを消すとアイデンティティーが崩壊する
OUT06、OUT07:塗りに影響を与える。ここを消すと元絵の明るい画風から離れるが、キャラも少し崩壊する。消さないのが無難
OUT08-OUT11:画風や塗りに影響する。ここを消すとイラストタッチじゃなくモデルの画風に近づく

 さて、先の設定で生成してみましょう。

完全体

 きれいになりましたね。雑コラ感はありません。これでいいとも思えますが、少し気になるところがあります。

分身するミニデルタ

 ポケットの赤三角が分身する現象が結構な頻度で発生します。これは元画像の輪郭線を学習してしまった結果こうなっていると推測されます。

輪郭? 影?

 こればっかりはどうしようもないので元画像を修正した方がいいでしょう。ついでに他の箇所にも修正を入れます。デルタもんちゃんは名前の通り随所に三角があしらわれています。元の絵がラフ画なのでつぶれてしまったりしている箇所もあるのでそこらへんもついでに修正します。

 正面と背中で解釈に悩むところがありました。正面から見ると、ワンピースには枠が付いていないように見えますが、後ろから見ると枠があるように見えます。前から見た場合と後ろから見た場合で光学的に見た目を変える機能が付いていても良さそうなのでこのままにしておきます。

念のため言っておくが揚げ足を取りたいわけではない
オリジナル(左)と修正後(右)。ノイズ除去と彩度の修正も加える。使ったのはgimp

 この画像を分解し新しく作ったLoRAの結果がこちらです。

デルタもんちゃんは大自然に対し保護色をしているのでステルス性能が高い

 さて、これで完成でもいいのですが、LoRA Block Weightの値をいちいち設定するのは面倒ですし、公開するときに使う人にもLoRA Block Weightを使うことを強いるのもよろしくありません。そこで、LoRA Block Weightで設定した層別の設定をLoRAに焼き付けます。

 焼き付けにはSuperMergerを使います。LoRAタブでget from promptボタンを押し、same to strengthにチェックを入れてmerge LoRAsボタンを押すだけです。簡単ですね。そうやってできたデルタもんちゃんLoRAはcivitaiにアップロードしてあります。

Deltamon/デルタもん - v1.0 | Stable Diffusion LoRA | Civitai

この記事が気に入ったらサポートをしてみませんか?