3Dモデルを使ったキャラクターLoRA作成フロー
それは7月14日のことでした。
矢木に 電流走る――!
過去の記事でも散々『ハニセレ2』『コイカツ』を買えとダイレクトマーケティングを繰り返してきましたが、改めて言っておきます、買いましょう、今のうちだぞ!(本当に)
今回はILLUSIONに哀悼の意を表するために、ILLUSION製品を使ったキャラクターLoRAの作成方法を具体的に説明します。
作業面の説明のみに絞るので、考え方の部分は過去の記事を見てください。
はじめに
現在の作成フローを図に表したものがこちら。
一見複雑に見えるが、「事前準備」と「踏み台モデルの作成」は一度やってしまえば使い回せるので、キャラクターごとに必要な作業は多くない。
以下、筆者が普段ハニセレ2を使用しているため、ハニセレ2の使用を前提に話を進めるが、コイカツでも同様の手順が可能である。
事前準備
教師データは画角とアングルを完全に固定する。
これによって教師データの性質を揃え、キャプションも汎用化が可能になる。
スクリーンショットの撮影はStudioで行うので、画角とアングルをStudioのシーンデータに記録しておく。
画角はズーム、アングルの調整はキャラクターのY軸回転で設定する。
ズームをセーブしておくだけでも良いが、VNGEというMODを使用してY軸回転まで保存しておくとより楽になる。
キャプションは表の通りに事前に作成しておく。髪や目などの特徴を一括置き換えするだけでキャプションが完成する。
踏み台モデルの作成
踏み台用3Dモデルの作成
踏み台用の3Dモデルを作成する。
どのようなキャラクターを用意するかは以前の記事に記載しているが、下記のように6種のバリエーションを作成する。
髪色(赤、緑、青、黄、白、黒)
髪型(長、中、短、ポニー、ツインテ、三つ編み)
胸のサイズ(大、大、中、中、小、小)
スクリーンショット撮影
事前準備で用意したシーンデータで、キャラクターを切り替えながらスクリーンショットを撮影する。「F11」キーで背景透過のスクリーンショットが撮影できる。
スクリーンショットはキャラクターごとにフォルダ分けしておくこと。
撮影後は背景を白にしつつファイル名を連番にする。筆者は適当にPythonのコードを書いて一括で処理している。
from PIL import Image, ImageFilter
import glob
files = glob.glob("*.png") # pngファイルのリストを取得
for i, file in enumerate(files): # リストを順番に処理
img = Image.open(file) # 画像ファイルを読み込む
width, height = img.size # 画像の幅と高さを取得する
left = (width - height)/2 # 切り出す左端の座標
top = (height - height)/2 # 切り出す上端の座標
right = (width + height)/2 # 切り出す右端の座標
bottom = (height + height)/2 # 切り出す下端の座標
img = img.crop((left, top, right, bottom)) # 画像を切り出す(正方形)
datas = img.getdata() # 画像のデータを取得する
newData = [] # 新しいデータのリスト
for item in datas: # データのリストをループで処理する
if item[3] == 0: # アルファ値が0なら(完全透明なら)
newData.append((255, 255, 255, 255)) # 白色で不透明にして追加する
else: # アルファ値が0でなければ
newData.append(item) # 元のデータをそのまま追加する
img.putdata(newData) # 新しいデータで画像を更新する
new_fname = '{:03d}.png'.format(i+1) # 新しいファイル名(連番.png)
img.save(new_fname) # 別名で保存する
キャプショニングの調整
事前準備で作成した汎用キャプションの調整を行う。
以下はキャプションの例。踏み台用のキャプションからはwhite backgroundは削除すること(生成を白背景に固定するため)
1girl, black short hair, black eyes, medium breasts, portrait
踏み台LoRAの作成
適当な生成モデルに作成した教師データで学習を行う。
ここで作成するのはいわゆるコピー機に近い、モデルの出力を絞るためのLoRAなので、どのような生成モデルでも最終的な結果に影響は無い(さすがに実写系モデルは影響がありそうなので避ける)
学習パラメータは以下の通り。適宜アレンジしてもらって構わない。
繰り返し回数は2、フォルダが6種あるので 45 × 2 × 6 × 10 = 5,400step
--network_module "networks.lora"
--network_dim 64
--network_alpha 16
--network_args "conv_dim=16" "conv_alpha=1"
--learning_rate 1e-4
--resolution 512
--train_batch_size 2
--max_train_epochs 10
--optimizer_type "AdamW"
--lr_warmup_steps 250
--lr_scheduler "cosine_with_restarts"
--caption_extension ".txt"
--network_train_unet_only
--noise_offset 0.1
--multires_noise_discount 0.3
--weighted_captions
モデルへのマージ
完成したLoRAを学習に使ったモデルにマージする。
これで踏み台用モデルが完成となる。
キャラLoRAの作成
教師データの準備は踏み台用LoRAの作成と同様のため割愛。
学習対象に踏み台用モデルを指定して学習を行う。
こちらの繰り返し回数は10とする 45 × 10 × 10 = 4,500step
LECOの作成
キャラLoRAの作成時に使用したキャプションでenhance LECOを作成する。
pretrained_modelは「普段使用している生成モデル」を指定すること。
config.yamlとprompts.yamlの例は以下(各種パス、positiveは要変更)
なお、config.yamlはお急ぎ設定(5分程で完了)になっているが、lrを1e-4、iterationsを1000程度に設定すると偏りが発生しづらい [要出典]
pretrained_model:
name_or_path: "xxxx"
v2: false
v_pred: false
network:
type: "lierla"
rank: 64
alpha: 1.0
training_method: "full"
train:
precision: "bfloat16"
noise_scheduler: "ddim"
iterations: 100
batch_size: 2
lr: 1e-3
optimizer: "AdamW"
lr_scheduler: "constant"
max_denoising_steps: 10
save:
name: "xxxx"
path: "xxxx"
per_steps: 100
precision: "bfloat16"
logging:
use_wandb: false
verbose: false
other:
use_xformers: true
- target: "1girl"
positive: "1girl, elf, blonde wavy medium hair, red eyes, small breasts"
unconditional: ""
neutral: ""
action: "enhance"
guidance_scale: 1.0
resolution: 512
batch_size: 2
LoRAとLECOのマージ
キャラLoRAとLECOをマージする。
Super Mergerでそのまま1:1でマージしても特に問題は感じられない(本来は単純に足し合わせたら結果が変わるはずだが、目視チェックでは差異がよくわからん)
これで1girlのみで脳内キャラクターが生成されるLoRAの完成となる。
完走した感想
ILLUSION製品は撮影に関する機能が充実していて、普通に撮影して遊ぶにもLoRAの素材として使うにも本当に便利でした(本編のシナリオ?そんなものは無い)
ILLUSIONの公式ホームページによれば、8月1日に公式通販が終了、8月18日には各所のダウンロード販売と共にアップデートファイルの配信も終了されるとのこと。
このアップデートファイルの配信は本当に重要で、MOD類も最新のアップデートが適用されていることを前提としているので、買うなら余裕をもって買いましょう。そしてアップデートを必ず適用しましょう。
今のうちだぞ!(n回目)
おしまい