ハイポリ LoRA ver.2 の学習時の知見まとめ
English Version Here: https://note.com/takumi__ncr/n/n21016c358ea5
ハイポリ LoRA ver.2 の学習時の知見をまとめる。
特に学習解像度に関して詳細に検証している。
長くなったため解像度に関する結論のみ最初に掲載しておく。
学習解像度を上げることは学習結果に影響する可能性がある
ただし、その効果が望ましいものとは限らないため、学習目的に応じて適切な解像度を選択する必要がある
(note の仕様なのか記事中の画像にバンディングが発生しているようです。細部の効果を検証する記事なので非常に問題なのですがご了承ください。オリジナルのサンプル画像は Civitai の LoRA 配布ページでご確認ください)
ハイポリ LoRA ver.2 の学習にあたって
ハイポリ LoRA は静止画用ハイポリゴン 3DCG を学習素材とした LoRA である。
ver.1 では 3D らしいテクスチャ感、奥行き感の再現に物足りなさを感じていたため ver.2 を作成することとした。
ver.1 からの主な変更点は以下。
学習画像の追加 (ver.1: 30枚, ver.2: 160 枚)
タグ付けの整理。トリガータグの削除。
学習パラメータの調整
dim の削減
learning rate の調整
学習 step 数の調整
学習解像度の向上 (ver.1: 768, ver.2: 896)
今回、以下の 7 つの組み合わせを試した。
最終的に採用したのは 7 番目の組み合わせである。
([学習ベースモデル] - [学習解像度] - [dim])
basil - 640 - 32
nai-sfw - 768 - 32
nai-sfw - 768 - 64
dalcefo_paintingV3 - 1024 - 64
AOM2 - 896 - 64
AOM2 - 1024 - 128
nai-sfw - 896 - 64
ver.1, ver.2 を同一条件で使用した場合の生成画像の違いを以下に示す。
ver.1 に比べ ver.2 はより 3D 的な肌の透明感や髪の毛束感がうまく表現できており、シースルーのレース表現も巧みである。
フィルライトをわずかに寒色に振って陰を引き締め、暖色のリムライトが際立たせた女性の輪郭が、グローバルイルミネーションによって空間と調和していく様は 3D ライティングの美しさを存分に示している。
そして何より、顔が衝撃的に筆者の好みだ。ときめいてしまっていることを否定しない。
LoRA 学習時の解像度の影響について
データセットの全体的な特性と学習目的を説明するために、自作の 3D モデルを例とする。
(実際の教師画像はずっとクオリティが高いことをお断りしておく)
もし 3D 自体の技術内容に興味がある方は以前書いた記事を参照してください。
解像度を向上させることで改善した点
3D 的なテクスチャ感を再現するためには、高周波成分 (つまり解像度を下げると潰れてしまう細部) が学習できているかどうかが問題であると考えた。
今回使用したデータセットは全体として、肌や衣服の凹凸やハイライトの高周波成分を強調することで質感をデフォルメし、クリーンに見せつつ単調にならずに目を引く手法を使用している。
また、髪についても現実のそれよりも流れやシルエットが明瞭に分かるように、毛束を意識して作られることが多い。
自作モデルでも(上手くいっているかは別として)同様の手法を意図して作成している。
組み合わせ 7 (解像度 896) で学習させることで、これらの細かい特徴を上手く捉えることができた。
細部の質感が重要な場合、解像度を向上させることの効果はあるように思われる。
解像度を向上させても変化が無かった点
全身が写る構図など画像における顔の面積が小さくなった場合、顔の対称性が崩れがちになる問題が見られる。
教師画像は基本的に頭身が高く全身画像では顔がかなり小さくなってしまうため、学習解像度を上げなければ引きの構図での顔の学習がうまくいかないのではないかと考えた。
しかし、結果として解像度を上げてもこの点にあまり改善は見られなかった。
また、手足の正確性についての向上も見られなかった。
そもそも現状の Stable Diffusion は小さな領域で整合性を保つことが苦手であり、LoRA で解決を試みることは難しそうである。
また顔は inpaint によって容易に修正可能であることから、最終的にこの点は学習目的から除外することとした。
解像度を向上させることで悪化した点
下記の画像のように、写実寄りの 3D においては肌表面に産毛の表現を行うことが一般的である。
学習解像度を 1024 に上げた際にこの部分が学習されたことが確認できた。
しかし、以下の囲んだ部分に現れた産毛表現は AI 生成画像では見た目に良いものとはならず、トゲあるいは部分的にイキかけているかのように見えてしまう。
解像度を上げることで意図しない細かい要素まで学習してしまい、結果として絵の品質を悪化させる可能性がある。
この結果を鑑みて、最終的な学習解像度には 896 を採用した。
タグ付けについて
DreamBooth キャプション方式を用いて学習を行うため、WD Tagger を使用して自動タグ付けを行い、その後手動でタグを整理した。
その際、特に以下の点に注意した。
トリガータグに代わる既存タグのハイジャック
ver.1 ではトリガータグを指定したが、画風 LoRA でトリガータグは不要との情報を見て削除した。
代わりに既存タグである `3d`, `realistic` を指定して、これらのタグに画風を一部吸収させることで、プロンプトによる調整を図れるのではないかと考えた。
なお、--keep_tokens は指定せず、一般のタグとして取り扱った。
結果これは効果があり、Positive Prompt に `3d`, `realistic` を指定すればより 3D 的なテクスチャやライティング感のある画風になり、逆に Negative に指定すると、元モデルの画風をあまり侵食せず、衣装のディテールなどを盛ることができるようになった。
またこれによる効果かどうかは不明だが、ver.1 ではプロンプトに `detailed`, `intricate` などのワードが含まれると絵柄を大きくリアル系に寄せてしまうという問題点があったのに対し、ver.2 ではこの現象は緩和されているようである。
ポージングに関わるタグ
ポーズやカメラの固定を避けるためにそれらに関係するタグは手動で追加・修正を行った。
特に注意したのは以下のタグである。
looking at viewer
自動タグ付けでは顔がおおよそ正面を向いていると高確率で `looking at viewer` タグが付与される。
しかし、実際には視線がこちらを向いていないにも関わらずこのタグを残してしまうと、画像生成時に `looking at viewer` を指定しても目線がカメラに合わないことが多くなってしまう。
従って、視線方向に正確になるよう `looking away`, `looking to the side` などのタグを手動で付け直した。from side, from behind
正面以外のカメラ位置を指定するタグを付与しない場合、カメラ位置が偏ってしまう場合が見受けられたため、これらのタグは手動で正しいものを付与した。hand on xxx, sitting, standing
手の所作や姿勢に関わるタグである。
手の位置は自動タグ付けではあまり付与されず、ポージングの固定を招く場合があったため、手動で `hand on own face`, `hand on hip` などを指定した。
`sitting`, `standing` 等は自動タグ付けが概ね正確に付与してくれるが、間違っている場合は修正する。
背景に関わるタグ
今回の教師画像は殆どが単色またはグラデーションの背景であったため、`simple background`, `gradient background` タグを指定して背景の固定化を防ぐことを目指した。
自動タグ付けでの付与成功率は 7 割ほどであるため、目視でのチェックを行った。
画像生成時には Negative Prompt に `(simple background:1.3)` 程度を指定すれば単色の背景に固定化される割合は下がり、さらに Positive に具体的な背景情報を記載していれば基本的にはそれに従うようになっている。
その他タグのマージ
自動タグ付けを行った場合、特に服装・装飾品や持ち物は重複する意味のタグが複数付与されやすい (例: `shirt`, `white shirt`, `collared shirt`)。
これらのタグは一つのタグにマージする方が良いとのことである (上の例なら `white collared shirt`) 。
ただし、今回は画像数・タグ数ともに多かったため手動での対応は諦めた。
チャット AI を使って重複する概念を一つのタグにまとめるよう指示を出すことも可能との情報を見たので今後試したい。
dim について
組み合わせ 2 (nai-sfw - res: 768 - dim: 32) と 3 (nai-sfw - res: 768 - dim: 64) を比較すると、dim: 64 の方が多少テクスチャ感・奥行き感を学習しているように見える。
dim:32 でも十分衣装のシルエットや細かい装飾は学習できているが、さらに細部の表現を学習するには dim が不足していた可能性が考えられる。
ただし、組み合わせ 3 と 7 (nai-sfw - res: 896 - dim: 64) を比較すると、dim を増やした場合よりもさらに明確な質感の向上が見られたため、dim よりも解像度を優先したほうが効果は大きいと思われる。
学習ベースモデルの選択について
自作マージモデルでの使用を前提に、各モデルの特徴を考慮した仮説に基づいて学習ベースモデルを変更して実験を行った。
basil
仮説
教師画像はアニメ画像よりも実写画像に近いディテールを持っているため、実写モデルである basil を使用することでより効果的に特徴を学習できるのではないか。
結果
Chillout など実写系のモデルでは LoRA の効果が得られたが、アニメ系のモデルでは効果があまり現れなくなってしまった。dalcefo_paintingV3
仮説
今回動作検証に使用した自作マージモデルの親モデルの一つが dalcefo_paintingV3 である。生成用モデルと近しい学習モデルを使用することで、LoRA で学習した特徴のみを生成に反映しやくすなるのではないか。
結果
モデルの絵柄がそのマージ元のモデルに巻き戻ってしまう現象(個人的に"先祖返り"と呼称)が発生してしまい、狙った絵柄を出すことができなくなってしまった。AOM2
仮説
アニメ系のモデルであり nai よりも優れた表現力を持つモデルであれば、より教師画像の特徴を拾いやすいのではないか。自作マージモデルからは血統的に距離があるため先祖返りも起こりにくいのではないか。
結果
衣装のディテールやシルエットはよく学習したものの、構図の固定化・顔や体の歪み・テクスチャ感を拾いきれない等の問題があり、自作マージモデルでは期待した結果にならなかった。
最終的に nai をベースにしたものが最もよく特徴を学習し、汎用性も高くなった。
今回この実験を行ったのは、実写の教師画像を用いた LoRA をアニメ系モデルに使用した場合に絵柄のリアル化が発生してしまう、という報告を見たからであった。
そこではベースにとなった nai のモデルの絵柄と教師画像が大きく離れていることが原因であると考察されており、実際 nai をベースとした ver.1 でも同様の問題が起きていた。
しかし、nai を引き続き使ったにも関わらず ver.2 では ver.1 に比べてリアル化の問題が抑制されており、その原因は不明である。
上述した既存タグのハイジャックに効果があったのかもしれないが、今後の検証が待たれる。
透明正則化画像について
これまでおまじない程度に透明 png の正則化画像を使用していたが、Kohya 氏の解説を読む限り必要性が疑問であり、悪影響として学習 step 数が正則化画像分増加すること・VRAM 消費が増えることから、組み合わせ 3 以降の試行では使用しないこととした。
厳密に結果を比較したわけではないが、目視する限り品質が劣化したようには見えないことから、今後も透明正則化は使わない方針である。
学習パラメータ
最終的に使用した学習パラメータを共有する。
sd-scripts/train_network.py の --config_file と --dataset_config に渡して動作する toml 形式となっている。
# config_file.toml
[model_arguments]
pretrained_model_name_or_path = "<path_to_nai_sfw>"
v_parameterization = false
[additional_network_arguments]
learning_rate = 5e-4
unet_lr = 5e-4
text_encoder_lr = 5e-5
network_module = "networks.lora"
network_dim = 64
network_alpha = 32
[optimizer_arguments]
optimizer_type = "AdamW8bit"
lr_scheduler = "cosine_with_restarts"
lr_scheduler_num_cycles = 1
lr_warmup_steps = 90 # 0.5% of the total steps
[dataset_arguments]
cache_latents = false
debug_dataset = false
[training_arguments]
output_dir = "<path_to_output>"
output_name = "hipoly_3dcg"
max_train_epochs = 15
save_every_n_epochs = 1
train_batch_size = 4
max_token_length = 225
noise_offset = 0
seed = 42
xformers = true
max_data_loader_n_workers = 8
persistent_data_loader_workers = true
save_precision = "fp16"
mixed_precision = "fp16"
clip_skip = 2
[dreambooth_arguments]
prior_loss_weight = 1.0
[saving_arguments]
save_model_as = "safetensors"
# dataset_config.toml
[general]
enable_bucket = true
min_bucket_reso = 256
max_bucket_reso = 1280
caption_extension = '.txt'
shuffle_caption = true
[[datasets]]
resolution = 896
[[datasets.subsets]]
image_dir = '<path_to_training_image_dir>'
num_repeats = 3
flip_aug = true
まとめ
ここまでの結論をまとめる。
学習解像度を上げるとより細かい部分の学習ができる可能性がある
ただし、それによって不要なディテールも拾ってしまう可能性があるため、学習画像の特性と学習目的を整理して適切な解像度を選択する
学習ベースモデルは"先祖返り"を防ぎつつ汎用性を持たせるために、基本的に nai で良いように思われる
ただし、本当の実写画像を教師画像にする場合は basil や stable-diffusion でも良いのかもしれない
タグ付けは可能な限り必要十分になるよう整理する
特に、全体的な構図に影響を及ぼす背景やポージングに関するタグは丁寧に処理する
dim は画風 LoRA であれば 32 - 64 あれば十分なようである
透明正則化は(少なくとも顕著に結果を左右するほどの)効果はなさそうである
なお、今回の知見には偶然や勘違いによる誤認が含まれている可能性が大いにあります。
今後の検証のための一事例としてご覧ください。
最後に余談として今後の展望を記しておく。
今回の LoRA を用いて、高品質な 3D 画像におけるテクスチャやライティングによる質感を再現することができた。
また、毛束感を感じさせつつ毛先にかけては軽やかにほぐれていく髪の表現、布の厚みを感じさせる衣服のダーツライン・パネルライン、精緻に縫い編まれたレースと刺繍など、個人的にフェティッシュである好みを再現できたことも非常に喜ばしい。
このような表現を行うにはスキルはもちろん、時間・金銭・計算リソースも大いに必要になり、個人で趣味で制作している身としては辛い思いをすることが多い。
また、ディテールが出揃い俯瞰的に画が見えるようになった終盤にこそ、全体的なシルエットや構図を調整したいのだが、すでに入れたディテールを崩さず調整を行うことが難しいため、泣く泣く諦めることもしきり。
この問題に対し、AI をフィルターの一種と考えて、マテリアルやレンダリングで得られる表現を作業の早い段階からプレビューできたり、細部の表現をモデルやテクスチャではなく AI によって生成を任せたりと、ワークフローに根本的な転回を起こすことが可能ではないかと思われる。
これにより、もっと大局的な構図や演出に時間を使い、作業負荷に負けない勇気ある画作りのための修正ができるようになれば、ずっと愉快に制作ができる気がするのだ。
今後も 3D と AI を効果的に組み合わせる方法について調査・実践を続けたい。
配布物
ハイポリ LoRA ver.2
動作検証に使用した自作マージモデル
同時に公開したスタイライズド 3D LoRA ver.3
主に参照したドキュメント
この記事が気に入ったらサポートをしてみませんか?