LoRA (Low-Rank Adaptation) を利用した画像学習でLoRAモデルを作成する - Stable Diffusion

LoRA (Low-Rank Adaptation) を利用した画像学習でLoRAモデルを作成する手順を紹介します。

概要

LoRA (Low-Rank Adaptation) を使用すると、比較的低コストで画像を追加で学習できモデルを作成できます。
作成したモデルをStable Diffusionで読み込み既存のモデルと組み合わせて画像生成に利用できます。
この記事では、LoRAによる学習でLoRAモデルを作成して、Stable Diffusion利用する手順を紹介します。

動作環境

UIは"Stable Diffusion Web UI"を使用します。モデルは"Counterfeit-V3.0"を使用します。

事前準備

LoRA学習をするためのプログラム、sd-scriptsをインストールします。 インストール手順はこちらの記事を参照してください。

学習データの準備

学習データのダウンロード

LoRAで学習させる画像データを準備します。今回は、「東北ずん子」の学習データが公開されているため、この学習データを利用します。
学習データを(https://zunko.jp/con_illust.html#illust_07000) (https://drive.google.com/drive/folders/1NIZcBRvr5i8YfPsPYwvVMC7SoH-cWLIk) からダウンロードします。

学習データの配置

ファイルを展開して、東北ずん子の画像とキャプションテキストのファイルのみを取得します。


学習データを作業ディレクトリに配置します。今回は、C:\data\lora-data\zunoko ディレクトリに画像とキャプションテキストを配置しています。

config.tomlの準備

学習データを配置したディレクトリの一つ上のディレクトリに、config.tomlファイルを作成します。
ファイルの内容は以下となります。
config.tom (記述内容)
[general]
enable_bucket = true 

[[datasets]]
resolution = 512
batch_size = 4

[[datasets.subsets]]
image_dir = '(学習データの配置パス)'
caption_extension = '(キャプションデータの拡張指名)'
num_repeats = (学習回数)
config.tom (今回のデモの例)
[general]
enable_bucket = true 

[[datasets]]
resolution = 512
batch_size = 4

[[datasets.subsets]]
image_dir = 'C:\data\lora-data\zunko'
caption_extension = '.txt'
num_repeats = 10

メモ
num_repeats = 10が記述されていますが、今回の例では正則画像がないことと、複数のデータセットではないため、num_repeats = 1 でも結果は変化しないとのこと。(未検証)
メモ
enable_bucket = true を指定ることで、Aspect Ratio Bucketing が有効になり正方形以外の画像での学習が実行できます。




出力データを保存する"output"ディレクトリも作成します。


train_network.py 起動コマンドの作成

学習を実行するためのコマンドを作成します。
以下のコマンドを作成します。
accelerate launch 
--num_cpu_threads_per_process 1 
train_network.py 
--pretrained_model_name_or_path=(事前学習済みモデルデータのパス)
--dataset_config=(config.toml のパス) 
--output_dir=(結果出力ディレクトリのパス) 
--output_name=(出力名) 
--save_model_as=safetensors 
--prior_loss_weight=1.0 
--resolution=512,512 
--train_batch_size=1 
--max_train_epochs=10 
--learning_rate=1e-4 
--optimizer_type=AdamW8bit 
--xformers 
--mixed_precision=fp16 
--cache_latents 
--gradient_checkpointing 
--save_every_n_epochs=1 
--network_module=networks.lora
今回利用したコマンド
accelerate launch 
--num_cpu_threads_per_process 1 
train_network.py 
--pretrained_model_name_or_path=C:\Storage\Image-Gen\stable-diffusion-webui-master\models\Stable-diffusion\Counterfeit-V3.0.safetensors 
--dataset_config=C:\data\lora-data\config.toml 
--output_dir=C:\data\lora-data\output 
--output_name=zunko 
--save_model_as=safetensors 
--prior_loss_weight=1.0 
--resolution=512,512 
--train_batch_size=1 
--max_train_epochs=10 
--learning_rate=1e-4 
--optimizer_type=AdamW8bit 
--xformers 
--mixed_precision=fp16 
--cache_latents 
--gradient_checkpointing 
--save_every_n_epochs=1 
--network_module=networks.lora

メモ
今回はテスト目的でもあるため、手持ちのモデル "Counterfeit-V3.0.safetensors" を学習元のモデルにしていますが、 実用の場合は、チューニングが進んでいないモデル、リアル系の画像の場合は、"Stable Diffusion"のモデル、 イラスト系の場合は、"Waifu Diffusion" "ACertainModel" を学習元のモデルにしたほうが良いです。
チューニングが進んでいるモデルに対して学習させた場合、過学習になる傾向にあるといわれています。

編集ができたら、コマンドは改行を削除して1行にまとめます。
accelerate launch --num_cpu_threads_per_process 1 train_network.py --pretrained_model_name_or_path=C:\Storage\Image-Gen\stable-diffusion-webui-master\models\Stable-diffusion\Counterfeit-V3.0.safetensors --dataset_config=C:\data\lora-data\config.toml --output_dir=C:\data\lora-data\output --output_name=zunko --save_model_as=safetensors --prior_loss_weight=1.0 --resolution=512,512 --train_batch_size=1 --max_train_epochs=10 --learning_rate=1e-4 --optimizer_type=AdamW8bit --xformers --mixed_precision=fp16 --cache_latents --gradient_checkpointing --save_every_n_epochs=1 --network_module=networks.lora

--optimizer_type=AdamW8bitでエラーが発生する場合は、--optimizer_type=AdamW に変更します。
accelerate launch --num_cpu_threads_per_process 1 train_network.py --pretrained_model_name_or_path=C:\Storage\Image-Gen\stable-diffusion-webui-master\models\Stable-diffusion\Counterfeit-V3.0.safetensors --dataset_config=C:\data\lora-data\config.toml --output_dir=C:\data\lora-data\output --output_name=zunko --save_model_as=safetensors --prior_loss_weight=1.0 --resolution=512,512 --train_batch_size=1 --max_train_epochs=10 --learning_rate=1e-4 --optimizer_type=AdamW --xformers --mixed_precision=fp16 --cache_latents --gradient_checkpointing --save_every_n_epochs=1 --network_module=networks.lora

バッチファイルで用意する場合は、以下のパッチファイルを作成します。行末に^を記述します。
exec.bat
accelerate launch ^
--num_cpu_threads_per_process 1 train_network.py ^
--pretrained_model_name_or_path='C:\Storage\Image-Gen\stable-diffusion-webui-master\models\Stable-diffusion\Counterfeit-V3.0.safetensors' ^
--dataset_config='C:\data\lora-data\config.toml' ^
--output_dir='C:\data\lora-data\output' ^
--output_name='zunko' ^
--save_model_as=safetensors ^
--prior_loss_weight=1.0 ^
--resolution=512,512 ^
--train_batch_size=1 ^
--max_train_epochs=10 ^
--learning_rate=1e-4 ^
--optimizer_type="AdamW8bit" ^
--xformers ^
--mixed_precision="fp16" ^
--cache_latents ^
--gradient_checkpointing ^
--save_every_n_epochs=1 ^
--network_module=networks.lora

学習の実行

コマンドプロンプトを表示し、作成したコマンドをコピー&ペーストしてコマンドを実行します。

学習処理が始まります。


今回、61枚の画像があり、処理時間は4時間45分でした。 最新のGPUでは、スペック上は3倍ほど高速になるので、学習用に最新のGPUを使いたくなる気持ちがわかります。


出力ディレクトリに、LoRAモデルの".safetensors"ファイルが作成されています。 10回目の学習結果がzunko.safetensors 手前の学習結果のモデルがzunko-nnnnnn.safetensorsファイルです。
最後の結果である、zunko.safetensorsを利用します。

LoRAモデルの配置: Stable Diffusion Web UI

Stable Diffusion Web UI を利用する場合の、作成したLoRAのモデルファイルを配置します。
以下のディレクトリに配置します。
(Stable Diffusion Web UI のプログラムディレクトリ)\models\Lora
デフォルトでは空になっています。


先の手順で作成した、zunko.safetensorsをコピーして配置します。

LoRAモデルのインストール・読み込み

Stable Diffusion Web UIを起動し、Webブラウザでアクセスします。下図のページが表示されます。


画面右側の[Generate]ボタンの下部の[Show/hide extra networks]のボタンをクリックします。



ボタンをクリックすると下図の表示に切り替わります。


画面中央部のタブの[Lora]のタブをクリックします。下図の表示に切り替わります。


LoRAのモデルファイルがない旨の表示がされています。[Refresh]ボタンをクリックします。

ボタンをクリックすると、LoRAのモデルが読み込まれます。"zunko"のLoRAモデルが表示されます。"zunko"のLoRAのタイルをクリックして選択します。


クリックすると、Promptのエリアに <lora:zunko:1> が追加されます。この表記によりLoRAモデルの参照をします。


始めに "<lora:zunko:1> 1 girl"で画像を生成します。


ずん子の指定が無いため、一般的な女性の画像が生成されました。


学習データのキャプションを確認します。キャプションでは "zunoko" の文字列がありますので、"zunko"で学習させていることがわかります。



プロンプトを "<lora:zunko:1> 1 girl zunko" として画像を生成します。東北ずん子のキャラクターのイメージが生成できました。


なお、"1 girl zunko" としてLoRAを利用しないプロンプトで画像を生成した場合には、 東北ずん子とは似ていないキャラクターの画像が生成されます。LoRAモデルの効果が出ていることが確認できます。


プロンプトを変更していくつか画像を生成してみます。東北ずん子のキャラクターが描画できています。


出力例1

"water color painting"の影響が強すぎるためか、床が濡れてしまっています。(EasyNegativeV2を利用)


<lora:zunko:1> (water color painting), pale color, 1girl, extreme pretty zunko, full body, in coffee shop, official art, dramatic lighting
Negative prompt: EasyNegativeV2
Steps: 20, Sampler: Euler a, CFG scale: 7, Seed: 3504904157, Size: 1024x512, Model hash: db6cd0a62d, Model: Counterfeit-V3.0

出力例2

こちらも "water color painting"の影響が強すぎるためか、床が濡れてしまっています。ベネツィアのアックア・アルタの雰囲気ではありますが。


<lora:zunko:1> (water color painting), pale color, 1girl, extreme pretty zunko, full body, in coffee shop, official art, dramatic lighting
Negative prompt: EasyNegativeV2
Steps: 30, Sampler: DPM2 Karras, CFG scale: 7, Seed: 620378045, Size: 1024x512, Model hash: db6cd0a62d, Model: Counterfeit-V3.0
著者
iPentecのメインデザイナー
Webページ、Webクリエイティブのデザインを担当。PhotoshopやIllustratorの作業もする。
掲載日: 2023-05-15
iPentec all rights reserverd.