たねやつの木

Photographs, Keyboards and Programming

VRoidで作成した3DキャラクターをLoRA学習に使用してAI画像生成する

こんにちは、たねやつです。

今年に入ってAI関連技術が爆発的に広がってきていますが、自分もようやっと最近GPUを現代的なものに乗せ換えたのでローカル環境でいろいろ試してみました。手始めにVRoidで作成した推しキャラをLoRAを使用して好きに画像生成してみました。結果的にはかなり満足の行くものとなりましたので、備忘録等も兼ねて残しておきます。

PC環境

LoRA学習およびStable Diffusionによる画像生成に使用しているPCのスペックは以下の通りです。Windows 11で行っています。

NO モジュール 製品 備考
1 ケース NZXT H210i mini-ITX
2 マザーボード ASUS PRIME 320I-K
3 CPU AMD Ryzen 5 3600
4 GPU GeForce RTX 3060 (ASUS)
5 RAM CORSAIR VENGENCE RGB PRO 16GB
6 CPUクーラー NZXT Kraken M22 簡易水冷
7 電源 オウルテック 650W SILVER RA-650S

ちょっと前に新調したときの記事がコチラです。ここからGPUだけ変わっています。

GTX1060(VRAMが6GB)でもStable Diffusionはとりあえず動くのですが、LoRAを行おうとするとVRAMが足りないためなかなかキビシイです。仮に処理を行うことができても途方もない時間がかかりそうです...

お手頃価格でVRAMの多い(12GB)RTX 3060にしました。

手順

以下手順となります。各環境が整っている場合は飛ばしてください。また記事作成時点から変わることも往々にしてあるので、上手く行かない場合はリンク先のREADME等を参考にしてください。

stable-diffusion-webuiを導入

インストール

まずは画像生成するためのStable Diffusion web UIを導入していきます。といってもそこまで変なことは行わず、Python 3.10.6(以上)をインストール、git for Windowsをインストール後、READMEを参考に以下のコマンドをPowerShellで実行します。

git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui.git
cd stable-diffusion-webui
.\webui-user.bat

初回起動時に必要ファイルをダウンロードしたりするので時間がかかります。完了後コマンドライン上に以下のURLが表示されるのでブラウザからアクセスします。PowerShellであればCtrlを押しながら左クリックで標準のブラウザで開くことができます。

Running on local URL:  http://127.0.0.1:7860

既に後述のkohya_ss等も起動していて7860番ポートが開いていない場合は7861番ポート以降で起動します。

LAN内の他の端末(スマホ等)からアクセスできるようにする

今の状態だとwebuiを起動しているPC上でしか作業できないので、スマホ等で同一LAN内にいる他端末からもアクセスできるようにします。

stable-diffusion-webui内の先ほど起動に使用したwebui-user.batファイルを以下のようにCOMMANDLINE_ARGS--listenを追加します。

@echo off

set PYTHON=
set GIT=
set VENV_DIR=
set COMMANDLINE_ARGS=--listen

call webui.bat

その状態で起動してみると以下のようなログが表示されると思います。その状態でPCのIPアドレス:7860をスマホなどからアクセスして確認してください。

Launching Web UI with arguments: --listen
...
Running on local URL:  http://0.0.0.0:7860
↑ 0.0.0.0となっていればOK

これで寝っ転がりながらでも風呂に入りながらでも画像生成できるようになります👀。後はリモートデスクトップやWakeOnLanの設定等で起動・停止、PCの電源管理まで行えるようにすれば完璧ですね!

kohya_ssを導入

インストール

次にLoRAを行うための環境を作成します。

以下のコマンドを実行します。stable-diffusion-webuiをインストールしたディレクトリと同じ場所がいいと思います。

git clone https://github.com/bmaltais/kohya_ss.git
cd kohya_ss
.\setup.bat

setup.batを実行すると先ほどと同じように必要ファイルをダウンロードし始めます。これも結構時間がかかるので完了まで待ちましょう。

最近初期設定方法が変わったみたいですが、ダウンロードが完了するといくつか質問を聞かれます。

In which compute environment are you running?
This machine
------------------------------------------------------------------------------------------------------------------------Which type of machine are you using?
No distributed training
Do you want to run your training on CPU only (even if a GPU is available)? [yes/NO]:
Do you wish to optimize your script with torch dynamo?[yes/NO]:
Do you want to use DeepSpeed? [yes/NO]:
What GPU(s) (by id) should be used for training on this machine as a comma-seperated list? [all]:
------------------------------------------------------------------------------------------------------------------------Do you wish to use FP16 or BF16 (mixed precision)?
fp16

よくわからない場合は全部エンターを押しておけばOKです。ちなみに日本語環境で矢印キーでmixed precisionの選択を行うとするとエラーで落ちます。12等数字キーで設定してください。

後で設定を変更したければ以下で再度設定することができます。

(kohya_ssディレクトリ内で)
.\venv\Scripts\activate
accelerate config

RTX 3000/4000系を使用している人は追加設定をすると学習が早くなります

追加設定でNvidia RTX 3000/4000系を使用している場合は以下の手順で設定を行うと学習速度が早くなるそうです。(4090で約50%程)

ここからファイルをダウンロードしてkohya_ss内に置きます。リンク切れ等の場合はREADMEから取得してください。

ファイルを置いたら以下のコマンドをkohya_ss内で実行します。

.\venv\Scripts\activate
python .\tools\cudann_1.8_install.py

以上で完了です。

起動確認

kohya_ss内でgui.batを実行することで起動します。stable-diffusion-webuiと同じく表示されたURLにアクセスして起動を確認してください。

.\gui.bat
...
Running on local URL:  http://127.0.0.1:7860

モデル取得

Stable Diffusionで使用するためのモデル(.ckpt.safetensorsのファイル)を取得します。今回は3Dキャラを追加学習してやる予定なのでアニメっぽいモデルを取得しておきます。とりあえずAbyssOrangeMix2を使用します。以下リンクからダウンロードしてください。

露出表現の具合がファイルによって違います。sfw(suitable for work)が露出少な目(ナシ?)、nsfw(NOT suitable for work)が露出あり、hardが過度な露出ありとなっているようです。自分はとりあえずネガティブプロンプトで何とでもなるからと思ってhardを使っています👀

取得したファイルをstable-diffusion-webui内の以下のディレクトリに配置してくだださい。

\stable-diffusion-webui\models\Stable-diffusion

配置した状態で、webUIの画面下部にあるReload UIもしくは再度起動しなおう等すれば読み込まれます。

Stable Diffusion checkpointに表示されていればOKです。

生成

試しにちゃんと出力できるかやってみます。適当にプロンプトをmagin.AI等から拾ってきます。

Prompt、Sampling method、width x height、Seed、CFG Scaleを合わせて生成すると以下のようになりました。

使用しているモデルがリンク先(SFW)と異なりHardを使用しているためか出力結果が若干違いますが出力には問題ないですね。このふたり、靴下を共有している...w

VRoidからモデルを学習対象3Dキャラを作成

ここまででstable-diffusion-webuiの動作は確認できたので、LoRA学習を行うモデルを作成していきます。

VRoid Studioを持っていない方は以下のリンクからインストールしてください。サンプルモデルも一緒についてきます。

自分で作ったモデルを使用

以前作ったたねやつちゃんというモデルがいるので私はそれを使用します🐂

銀髪、褐色、アンダーリムメガネがかわいい!!!!!!!!!!!

面倒な場合はサンプルモデルを使用する

とりあえず動作だけでも確認したい場合はサンプルモデルを使用するのが手っ取り早いと思います。

学習用画像を作成

モデルが決まったところで、とりあえず学習用の画像を30枚ほど生成します。VRoidの撮影機能を利用していろんな角度・ポーズ・表情で生成しまくります。もはやただのイチャイチャしてるだけの時間となります🥳

自分が使っているVRoid Studioのバージョンが古いので若干レイアウトが違うかもしれませんが、画面右側ペインの表情ポーズ&アニメーションからいろいろ試してみます。

学習準備

生成した学習用ファイルを既定のディレクトリに置く

上記で作成した画像を以下のディレクトリ構造で置きます。私はとりあえずkohya_ss内にtrainningというディレクトリをつくって置いています。

kohya_ss
  └ trainning
      ├ model1
      │  └ train
      │      └ 20_taneyats 1girl
      ├ model2
      └ model3 ...
(model1の部分は各自好きな名前で置き換えてください)

最後の20_taneyats 1girlはclass+identifier方式にのっとっています。20は学習の繰り返し回数で、taneyatsはプロンプト内でLoRA学習した内容を使用するidentifier(起動フラグみたいな)、1girlはその学習モデルのクラス(どういう内容を学習したか)になります。identifierには絶対にかぶらない、現実で存在しないような文言にする必要があります。例えば、以下のようなものをkohya_ssのREADMEにてかかれています。

shs sts scs cpc coc cic msm usu ici lvl cic dii muk ori hru rik koo yos wny

私はとりあえず分かりやすく and 存在しないtaneyatsを使用していますが問題ないです👀

詳細は以下で説明されています。

正則化画像はとりあえずいらない

もう一つ重要な要素として正則化画像を使用するか否かがありますが、今回は特に使わないで進めます。

正則化画像を使用しないと、例えば上記のようにクラスに1girlを指定して学習すると、1girlの出力結果がどうしても学習したものに引っ張られてしまうということが発生します。とりあえずVRoidの学習したキャラが出力したいだけなので無視で問題ないです。

学習

本当は追加で各画像にタグ付けを行った方がいいのですが、一旦何もせずに学習を進めます。

kohya_ssの方の画面を開いて、Dreambooth LoRAを選択します。Pretrained model name or pathにStable Diffusion用に取得したAbyssOrangeMix2のパスを指定します。

次にFolderタブに移動して、Image folderの部分に先ほど作成した学習用ディレクトリ構造のtrainまでのディレクトリを指定します。Output folderにはその一つ上のmodel1を指定しておきます。Model output nameには出力される.safetensorsファイルにつく名前を指定できます。

(パスは適当にトリミングしています)

Training Parameterタブに移って細かい設定をします。Train batch sizeをあげることによって学習を早くすることができますがGPUの性能と相談して設定してみてください。性能を超過した設定の場合すぐにエラーとなり止まりますので、下げてトライしてください。

Epochは何世代(?)学習するかを設定しています。この数が多いほどしっかり学習してくれますが、学習しすぎて上手く行かない場合もあります。とりあえず20をセットしておきます。

Save every N epochsで学習途中の世代をどこまで保存しておくかを設定します。1にしておくと各世代毎に保存するので20 epochsの場合は20ファイル出来上がることになります。20世代目で学習しすぎで上手く行かない場合でも15世代目ぐらいが丁度イイ場合もあるらしいので、とりあえずディスク容量が許す限り全世代を残しておきます。

他の細かい設定は追々設定していけばいいのでとりあえず学習を回してみましょう!

画面下部のTrain modelを押すと学習が始まります。進捗等はこのブラウザ画面上にはでず、batファイルを起動したPowerShellの方に出力されます。

いろいろ表示された後に以下のような表示が出ます。

running training / 学習開始
  num train images * repeats / 学習画像の数×繰り返し回数: 420
  num reg images / 正則化画像の数: 0
  num batches per epoch / 1epochのバッチ数: 420
  num epochs / epoch数: 20
  batch size per device / バッチサイズ: 1
  gradient accumulation steps / 勾配を合計するステップ数 = 1
  total optimization steps / 学習ステップ数: 8400
steps:   4%|██▎                                                        | 321/8400 [01:47<44:59,  2.99it/s, loss=0.0611]

その後にプログレスバーが表示されます。マシン性能によると思いますが、RTX3060で上設定の場合50分ほどで完了します。

学習が完了するとOutput folderに指定した場所に.safetensorsファイルが出来ているはずです。

学習ファイルを使用してtxt2imgで画像生成

LoRA学習ファイルを指定場所に置く

最後にその学習ファイルを使用して画像生成してみます。先ほど生成したファイルの連番がついていないもの(最終世代)をstable-diffusion-webuiの以下の場所に置きます。

\stable-diffusion-webui\models\Lora

Stable Diffusion WebUIでそのファイルを指定する

Generateボタンの下にある花札の芒に月みたいな赤地に白丸のボタンを押して、LoRAタブを選択してRefreshを押します。そうすると先ほどの.safetensorsファイルが表示されます。

表示されたファイルをクリックするとプロンプトに<lora:[設定したidentifier]:1>と表示されるはずです。後は指定したクラス(1girl)を追加して生成してみます。

とりあえず何も指定してないのに銀髪褐色眼鏡っ子が生成されていますね!大分プレステ初代って感じのポリゴン感ですが、ここからmajinAIとかから拾ってきたプロンプトを使用して仕上げたものが以下になります。

<lora:taneyats:1.1> 1girl, ((masterpiece)), detailed, solo, ((night view background:1.2)), bokeh effects, hime-cut, under rim glasses, (subtle smiling:1.2), beautiful eyes, hair blowing, window
Negative prompt: jpeg artifacts, cropped, normal quality, jpeg artifacts, signature, (worst quality:1.3), (low quality:1.3), thick lips, jumbled fingers,
Nsfw, fat, ugly, blurry, blur, stain, lettering, elf ears, (Low Quality Low-res:1.4), (Poorly Made Bad 3D, Lousy Bad Realistic:1.1)
Steps: 20, Sampler: DPM++ SDE Karras, CFG scale: 7, Seed: 352324809, Size: 512x512, Model hash: cadf2c6654, Model: abyssorangemix2_Hard, Denoising strength: 0.7, Clip skip: 2, Hires upscale: 2, Hires upscaler: Latent

<lora:taneyats:0.8> 1girl, ((masterpiece)), detailed, solo, bokeh effects, hime-cut, under rim glasses, ahoge, (jitome:1.1), beautiful eyes, hair blowing, ((school)), ((shiney sun lighting)), real shadowing, sitting on floor
Negative prompt: jpeg artifacts, cropped, normal quality, jpeg artifacts, signature, (worst quality:1.3), (low quality:1.3), thick lips, jumbled fingers,
Nsfw, fat, ugly, blurry, blur, stain, lettering, elf ears, (Low Quality Low-res:1.4), (Poorly Made Bad 3D, Lousy Bad Realistic:1.1)
Steps: 20, Sampler: DPM++ SDE Karras, CFG scale: 9, Seed: 856847891, Size: 512x512, Model hash: cadf2c6654, Model: abyssorangemix2_Hard, Denoising strength: 0.5, Clip skip: 2, Hires upscale: 2, Hires upscaler: SwinIR 4x

いい感じですね!!!!

ついでにChilled_Remixでも生成してみました。元のモデルがイラスト系のモデルを使って学習しているのでちょっと塗り感がありますがこれはこれでアリな作例ができますね...!!個人的にはこの2.5次元な感じのがたまらなく好きです👀

<lora:taneyats:1.13> 1girl, High detail RAW color photo, professional photograph, hime-cut, under rim glasses, cowboyshot, ((best quality)), cinematic light, (finerly detailed face:1.2), (masterpiece:1.5), (best quality:1.2), (smiling:1.2), night view background
Negative prompt: (worst quality:2), (low quality:2), (normal quality:2), lowres, normal quality, ((monochrome)), ((grayscale)), skin spots, acnes, skin blemishes, age spot, (outdoor:1.6), hused arms, neck lace, analog, analog effects, (sunglass:1.4), nipples, blonde, short hair
Steps: 20, Sampler: DPM++ 2M Karras, CFG scale: 7, Seed: 90328974, Size: 512x512, Model hash: 70e66e96d7, Model: chilled_remix_v1vae, Denoising strength: 0.5, Clip skip: 2, Hires upscale: 2, Hires upscaler: Latent

こんな雰囲気のキャラを生成したいんだけど。。?という例示としては大いに使えそうです!

最後に

満足のいく感じに画像が生成することができました。ただ、どんなプロンプトを入れても髪の毛の毛束感がVRoidのままだったり、褐色肌を再現するのが難しい(モデルのサンプルが少ない?)、メガネの造形が安定しないなどいろんな問題点はありますが、VRoidで生成したキャラのいろんな画像を無限に生成できるのでメチャクチャ捗ります!!!

参考

自作キーボード仲間のめかぶさん(@sashimi_hangaku)の記事を最初に参考にさせていただきました。キーボードやゲームやいろいろと刺激を与えてくれるお方です🥰

https://note.com/uunin/n/n3f09b93df575

https://blogcake.net/sd-webui-smartphone/

https://note.com/kohya_ss/n/nba4eceaa4594

https://github.com/kohya-ss/sd-scripts/blob/main/train_README-ja.md