独自のキャラクター(人型でないキャラクター)をLoHAを利用して学習する - Stable Diffusion

独自のキャラクター(人型でないキャラクター)をLoHAを利用して学習する手順の紹介です。

概要

こちらこちらの記事でLoRAを作成する手順を紹介しました。
この記事では、より新しい学習方式のLoHAを利用した学習で、LoRAを作成する手順を紹介します。 LoHAを利用して作成したLoRAはLyCORISと呼ばれます。
メモ
人型でないキャラクターを学習するのは難易度が高く、学習が苦手とされています。今回の記事でも実用面では不十分な結果となっています。

手順

sd-scriptsのインストール

こちらの記事を参照して、sd-scriptsをインストールします。

sd-scripts の PyTorch を 2.0 にする

こちらの記事の「補足: PyTorch 2.0を利用する手順」を 参照して、PyTorchを 2.0にします。

LyCORISのインストール

以下のコマンドを実行してgitコマンドでGitHubからLyCORISのリポジトリをクローン(ダウンロード)します。
cd (sd-scriptsのフォルダ)
git clone https://github.com/KohakuBlueleaf/LyCORIS
cd (sd-scriptsのフォルダ)
(git.exeのフルパス) clone https://github.com/KohakuBlueleaf/LyCORIS

カレントディレクトリをLyCORISのディレクトリに変更します。
cd LyCORIS

下記コマンドを実行して、LyCORISをインストールします。
pip install .

学習データセットの準備

学習用のデータセットを準備します。今回はこちらの記事の 「学習データ (パーツ削除、borderなし版)」を使用します。
画像ファイルとキャプションファイルは C:\data\loha-toricchi\toricchi に配置します。

Tomlファイルの作成

config.tomlファイルを作成します。
C:\data\loha-toricchi\config.toml
[general]
enable_bucket = true 

[[datasets]]
resolution = 512
batch_size = 4

[[datasets.subsets]]
image_dir = 'C:\data\loha-toricchi\toricchi'
caption_extension = '.txt'
num_repeats = 1

バッチファイルの作成

以下のバッチファイルを作成します。
C:\data\loha-toricchi\exec.bat
accelerate launch ^
--num_cpu_threads_per_process 1 ^
train_network.py ^
--pretrained_model_name_or_path=C:\Storage\Image-Gen\model\featurelessMix_v20202307.safetensors ^
--dataset_config=C:\data\loha-toricchi\config.toml ^
--output_dir=C:\data\loha-toricchi\output ^
--output_name=toricchi ^
--save_model_as=safetensors ^
--prior_loss_weight=1.0 ^
--max_train_steps=5000 ^
--learning_rate=1e-4 ^
--optimizer_type=AdamW8bit ^
--xformers ^
--mixed_precision="bf16" ^
--cache_latents ^
--gradient_checkpointing ^
--save_every_n_epochs=1 ^
--persistent_data_loader_workers ^
--network_args "algo=loha" "conv_dim=16" "conv_alpha=1" "dropout=0" ^
--network_module=lycoris.kohya

--network_args "algo=loha" "conv_dim=16" "conv_alpha=1" "dropout=0" のオプションで学習アルゴリズムがLoHAとなります。 今回は dim=16, alpha=1 の設定としています。

LoHAを利用しているため、--network_module=lycoris.kohya のオプションを設定し、LyCORISの作成とします。

学習の実行

作成した、exec.batファイルを実行します。
ValueErrorが発生する場合
以下のValueErrorが発生する場合は、torch, torchvision, xformers, cudaの組み合わせに問題がある可能性があります。
ValueError: torch.cuda.is_available() should be True but is False. xformers' memory efficient attention is only available for GPU
ModuleNotFoundErrorが発生する場合
以下のModule Not Found Errorが発生する場合は、LyCORISのインストールが正しくできていない可能性があります。
ModuleNotFoundError: No module named 'lycoris.kohya'
TypeErrorが発生する場合
以下のエラーが発生する場合は、.\venv\Scripts\accelerate.exe configを再実行して、再設定で解消される場合があります。
ClusterConfig.__init__() got an unexpected keyword argument 'tpu_env'
TypeError: ClusterConfig.__init__() got an unexpected keyword 'downcase_fp16'

学習の結果

作成したLyCORISを読み込み画像を生成します。次の3種類のプロンプトで画像を生成します。
LyCORISはデフォルトの状態では利用できませんこちらの記事を参照して、 "a1111-sd-webui-lycoris"をインストールします。

学習結果のLyCORIS の safetensors ファイルは、次のディレクトリに配置します。
(stable diffusion webuiのディレクトリ)\models\LyCORIS
Prompt1
Prompt: toricchi <lyco:toricchi-00nn00:1.0>
Negative Prompt: worst quality, low quality
Prompt2
Prompt: 1girl <lyco:toricchi-00nn00:1.0>
Negative Prompt: worst quality, low quality
Prompt3
Prompt: 1girl, holding toriddhi <lyco:toricchi-00nn00:1.0>
Negative Prompt: worst quality, low quality
LyCORISなし
"Toricchi"ではピンク色の髪の毛の女の子の画像が表示されます。
Prompt1:Toricchi
Prompt1:Toricchi
Prompt2:Girl
Prompt2:Girl
Prompt3:Girl+Toricchi
Prompt3:Girl+Toricchi
Epoch 75 : 675 Step
Toricchi単体では微妙なキャラクターが生成されますが、Toricchi+Girlだと、プロンプトの意図に近い画像が生成されます。"Toricchi"が入ると、絵全体のテイストが学習画像に近づきます。
Prompt1:Toricchi
Prompt1:Toricchi

Prompt2:Girl
Prompt2:Girl

Prompt3:Girl+Toricchi
Prompt3:Girl+Toricchi

Epoch 100 : 900 Step
学習元画像のキャラクターに似てきます。Toricchi+Girlだと、プロンプトの意図に近い画像が生成される場合もありますが、崩れてしまう場合もあります。
Prompt1:Toricchi
Prompt1:Toricchi

Prompt2:Girl
Prompt2:Girl

Prompt3:Girl+Toricchi
Prompt3:Girl+Toricchi

Epoch 200 : 1,800 Step
学習元画像のキャラクターにほぼ忠実な出力にあります。 Girlだけのプロンプトの場合でもLyCORISの学習画像に影響され、線の太いコミカルな画像が生成されます。 Girl + ToricchiでもGirlが反映されていない画像の出力が増えます。
Prompt1:Toricchi
Prompt1:Toricchi

Prompt2:Girl
Prompt2:Girl

Prompt3:Girl+Toricchi
Prompt3:Girl+Toricchi

Epoch 300 : 2,700 Step
Toricchi単体ではほぼ学習画像と同じ画像が生成されます。GirlにもLyCORISの影響が強く出るため、線の太いコミカルな画像が生成されます。 Girl + Toricchiのプロンプトでは、Girlはほとんど表示されず、Toricchiになってしまいます。
Prompt1:Toricchi
Prompt1:Toricchi

Prompt2:Girl
Prompt2:Girl

Prompt3:Girl+Toricchi
Prompt3:Girl+Toricchi

Epoch 400 : 3,600 Step
Epoch 400以上では、GirlやGirl+Toricchi のプロンプトの生成画像で崩れが目立ちます。
Prompt1:Toricchi
Prompt1:Toricchi

Prompt2:Girl
Prompt2:Girl

Prompt3:Girl+Toricchi
Prompt3:Girl+Toricchi

Epoch 500 : 4,500 Step
Prompt1:Toricchi
Prompt1:Toricchi

Prompt2:Girl
Prompt2:Girl

Prompt3:Girl+Toricchi
Prompt3:Girl+Toricchi

Class Tokenを利用して学習する

Class Tokenを利用して Duckに対して学習させるとどうなるか確認します。

学習データ

先の学習用のデータセットと同じこちらの記事の「学習データ (パーツ削除、borderなし版)」を使用します。

Tomlファイルの作成

以下のTomlファイルを作成します。
class_tokens = 'toricchi duck'を追加しています。
C:\data\loha-toricchi-ct\config.toml
[general]
enable_bucket = true 

[[datasets]]
resolution = 512
batch_size = 4
keep_tokens = 3

[[datasets.subsets]]
image_dir = 'C:\data\loha-toricchi-ct\toricchi'
caption_extension = '.txt'
class_tokens = 'toricchi duck'
num_repeats = 1

バッチファイルの作成

以下のバッチファイルを作成します。
C:\data\loha-toricchi-ct\exec.bat
accelerate launch ^
--num_cpu_threads_per_process 1 ^
train_network.py ^
--pretrained_model_name_or_path=C:\Storage\Image-Gen\model\featurelessMix_v20202307.safetensors ^
--dataset_config=C:\data\loha-toricchi-ct\config.toml ^
--output_dir=C:\data\loha-toricchi-ct\output ^
--output_name=toricchi ^
--save_model_as=safetensors ^
--prior_loss_weight=1.0 ^
--max_train_steps=3000 ^
--learning_rate=1e-4 ^
--optimizer_type=AdamW8bit ^
--xformers ^
--mixed_precision="bf16" ^
--cache_latents ^
--gradient_checkpointing ^
--save_every_n_epochs=1 ^
--persistent_data_loader_workers ^
--network_args "algo=loha" "conv_dim=16" "conv_alpha=1" "dropout=0" ^
--network_module=lycoris.kohya

学習の結果

次のプロンプトで生成します。
Prompt1
Prompt: toricchi duck <lyco:toricchi-00nn00:1.0>
Negative Prompt: worst quality, low quality
Prompt2
Prompt: 1girl <lyco:toricchi-00nn00:1.0>
Negative Prompt: worst quality, low quality
Prompt3
Prompt: 1girl, holding toriddhi duck <lyco:toricchi-00nn00:1.0>
Negative Prompt: worst quality, low quality
LyCORISなし
Prompt1:Toricchi
Prompt1:Toricchi

Prompt2:Girl
Prompt2:Girl

Prompt3:Girl+Toricchi
Prompt3:Girl+Toricchi

Epoch 50 : 450 Step
あひるの輪郭線が太くなり、学習結果が反映されつつあります。
Prompt1:Toricchi
Prompt1:Toricchi

Prompt2:Girl
Prompt2:Girl

Prompt3:Girl+Toricchi
Prompt3:Girl+Toricchi

Epoch 100 : 900 Step
学習データが反映されてきています。girlの絵柄にも影響が出始めています。
Prompt1:Toricchi
Prompt1:Toricchi

Prompt2:Girl
Prompt2:Girl

Prompt3:Girl+Toricchi
Prompt3:Girl+Toricchi

Epoch 200 : 1,800 Step
学習元のデータにかなり忠実です。一方でgirlや組み合わせたプロンプトの場合には画像が一部崩れています。
Prompt1:Toricchi
Prompt1:Toricchi

Prompt2:Girl
Prompt2:Girl

Prompt3:Girl+Toricchi
Prompt3:Girl+Toricchi

キャラクターを忠実に出力したいのであれば、200 Epoch前後の利用が良さそうですが、組み合わせでの利用を考慮すると、100 Epoch前後かなという印象です。
著者
iPentecのメインデザイナー
Webページ、Webクリエイティブのデザインを担当。PhotoshopやIllustratorの作業もする。
掲載日: 2023-07-16
iPentec all rights reserverd.