低グラボのゲーミングPCでAI画像学習させてみた(StableDiffusion Lora sd-scripts web-ui).Vroid(VRM)から画像を作り,学習させる方法.
はじめに
こんにちは,ザッキーラボのザッキーです.
今回は低グラフィックボードのゲーミングPCでLoraの画像追加学習をしてみました.この学習内容をStable-Diffusionに入れて使い物になるかという検証です.
画像学習・Stable-Diffusion・Loraとは
画像学習とは
Stable-Diffusionとは
Loraとは
この記事について
私の使っているPCはWindowsのノートPCで,メモリが32GB,グラボが4GBです.
この環境では一般的にはAI画像学習(追加学習)はできないといわれています.ほとんどの場合ではエラーで動きすらしないのではないでしょうか.
今回,とりあえずエラーが起きないプロントをなんとか見つけたので,そのプロントの公開と,実際に作ったモデルは使い物になるのかということを検証していきたいと思います.
実際のやり方についてはこのYoutubeを参考にさせていただきました.
この方法と違う点を中心にお話していきたいと思います.
なお,この記事はあくまで私がうまくいったやり方の紹介です.この方法によりいかなる損害が生じても責任は負いかねますのでご了承ください.
方法
Windowsの実行ポリシーの変更
上記Youtubeでは実行ポリシーの変更方法が書いてあります.
私がこれを行うとエラーが出てしまいました.
しかし,そのまま進めることができましたので,とりあえずエラーが出てもそのまま続けてみることをおすすめします.
sd-scriptsの導入
基本的には下記のURLのREADME.jaに書いてあるWindows環境でのインストールに沿って行います.
基本的には動画の通りに行うのですが,一番最後にaccelerate configを行った際に出てくる選択肢を変更しました.
そのままのものも含め順番に,this machine,No distributed training ,NO,NO,NO,1,NOを選びました.
この設定はあくまで動いたというだけなので,どういう意味なのかなどについては省略させていただきます.
素材の準備
今回私は自作のキャラクターの画像を作ることにしました.
前準備として,Vroidで作成したアバターをvrm方式で保存してあります.
このアバターをVRM Automatic Photographingでポージングし,計110枚の背景透過画像を作成しました.
ポーズを選ぶ際には,動きが激しすぎないこと(足を上げすぎていたり座っていたりしないこと),服から体がはみ出ていたり股などが見えるポーズなどではないことなどを確認しました.
作成した画像を縮小革命というソフトを使い,640×640に縮小しました.
この際に画像形式はPNG,保存名に書いてある「s-」を削除し連番にし,連番をクリックすると出てくる桁数を2に現在値を01にしました.こうすることで01から連番にした名前で出力されます.
キャプションの準備
動画の通りにキャプションを作成します.
キャプションの編集にはBooruDatasetTagManagerを使用すると便利です.
私は右側のALL tagsで学習させたい要素を削除しました.(×はその右にあります)
datasetconfogのコマンド
学習ステップ数を減らすために
num_repeats = 1
と変更しました.
commandlineのコマンド
以下のように変更しました.
accelerate launch
--num_cpu_threads_per_process 1 train_network.py
--pretrained_model_name_or_path="モデルの場所"
--output_dir=outputsの場所
--output_name=作った学習モデルにつけたい名前
--dataset_config="datasetconfig.tomlの場所"
--train_batch_size=1
--max_train_epochs=1
--resolution=512,512
--optimizer_type=AdaFactor
--learning_rate=1e-4
--network_dim=128
--network_alpha=64
--enable_bucket
--bucket_no_upscale
--lr_scheduler=cosine_with_restarts
--lr_scheduler_num_cycles=4
--keep_tokens=1
--shuffle_caption
--caption_dropout_rate=0.05
--save_model_as=safetensors
--clip_skip=2 --seed=42
--color_aug
--mixed_precision=no
--network_module=networks.lora
--persistent_data_loader_workers
--max_data_loader_n_workers=1
一応解説
基本的には数字を小さくして学習ステップを減らしています.
モデルの場所はstable-diffusion-webui\models\Stable-diffusionの中です.入れていない場合はネットで探して入れてください.
optimizer_typeも変更しなくては動かなかったので変更しています.
ただでさえ学習ステップが少ないので,lr_warmup_stepsを削除します.
xformersを入れると軽くなるらしいですが,これも動かないので削除.
mixed_precision=fp16はsd-scriptを入れる際にNOにしたため,削除(NOにしないと動かなかったです).
メモリの使用も抑えたいため --max_data_loader_n_workers=1を追加.
そんなこんなの設定で何とか動きました.
実行
今回は
110枚の画像×繰り返し1回×エポック1÷バッチサイズ1=110ステップ
で学習を行いました.
この学習に約1時間15分かかりました.
作ったモデルから画像を生成してみる
outputsの中にできたモデルを,stable-diffusion-webui\models\Loraの中に入れます.
いつも通りStable Diffusion web uiを起動して,txt2imgでGenrerateの下にあるピンクの四角いマーク(花札?)をクリック.
Loraをクリック.
作ったモデルをクリックするとプロンプトに<lora:モデルの名前:1>と出ます.(もしモデルが出なければRefreshをクリック)
好きなようにプロンプトを入れてGenerateを入れれば出来上がり.
※<lora:モデルの名前:1>の1を小さくすればするほど(0に近づけるほど)学習の影響を弱められる(同じような画像しか出ない→数字を小さくする.関係ない画像になった→数字を大きくする)
結論:キャラクターは出力されない
今回のモデルでいろいろ値をいじりながら,プロンプトも変えながら推論を行いましたが,学習させたキャラクターらしきものは出力されませんでした.
おそらく学習ステップが少なすぎるのだと思います.
まとめ
今回,Vroidから作った画像から追加学習を行ってみました.
1時間15分の学習を行いましたが,キャラクターを生成することはできませんでした.
学習ステップを増やす必要がありそうです.
この記事自体が無駄なのかとも考えたのですが,このプロンプトにたどり着くまで学習を実行することすらできませんでした.
なので,学習にすら至らない方がいれば是非参考にしてください.
追記
うまくいった学習(ステップ数を増やしたりモデルを変えたり)についての記事を書きました.ぜひこちらもごらんください.
よろしければサポートをよろしくお願いします! これからの活動経費としてつかわせていただきます. でも無理はしないでくださいね.