原神キャラクター「夜蘭」に関する学習時の、パラメーターおよび個人的に注意すべきポイントについて解説します。
StableDiffusionでのファインチューニングには様々な手法が存在しており、今なお新しい実装が登場している最中ではありますが、
メジャーなものをいくつか挙げてみます。
・Textual Inversion
・Dream Booth
・Hyper Networking
・LoRA
私はTextual Inversionを主に使用してキャラクターの追加学習を実施しています。
Dream Boothを使用しない理由は単純で、生成されるファイル容量が大きすぎて取り回しが悪いからです。(1ファイル2~4GB)
その点Textual Inversionは1ファイル数十kbと非常に軽量です。ありがたい。
Textual InversionとHyper Networkingのみでも個人的には十分満足な結果を得られていると思いますので、今後もこの2つを中心に使用していくつもりです。
今回は、Textual Inversionによる学習になります。
現在最も広く利用されているUIです。
https://github.com/AUTOMATIC1111/stable-diffusion-webui
構築手順はここでは割愛します。
また、この記事は以下のコミット時点での説明になります。
commit 88e01b237e60730338823ac4f11972a98d698ce7
Fri Jan 6 07:59:44 2023 +0300
学習を始める前に、自分が使おうとしてるモデルで夜蘭が出るか試してみましょう。
今回はAnything-V3.0を使ってみます。
生成した画像がこちらです。
masterpiece, best quality, yelan, genshin impact
Negative prompt: (worst quality:1.3), (low quality:1.3),(mutated hands and fingers:1.3)
Steps: 30, Sampler: DDIM, CFG scale: 9, Seed: 855727417, Size: 384x512, Model hash: 2700c435
う~ん・・・努力は認めるけど・・・。
ここで満足いくキャラが出てくるようなら、追加学習は必要ないでしょう。
今回は学習をする意味はありそうです。
まずTextual Inversionの学習結果を格納するファイルを生成し、初期化します。
webuiの[Train]タブ-[Create Embedding]タブで以下のように入力します。
Name:ex-yelan
Initialization Text:bob_cut, chinese_clothes, sleeveless_dress, jewelry, green_eyes, short_hair, blue_hair, earrings, fur_trim, jacket, white_jacket, multicolored_hair, jacket_on_shoulders, black_thighhighs, elbow_gloves, asymmetrical_gloves,black_gloves, sleeveless, bare_shoulders, single_elbow_glove, fur-trimmedcoat, gloves
Number of vectors per token: 10
解説:
Name: ファイル名兼、プロンプト入力時の文字列になります。既にこの世にあるものとかぶらない、ユニークな名称がよいです。
Initialization Text(重要):夜蘭を表す特徴を示したプロンプトを入力します。ここから学習が始まるため、夜蘭とあまりにかけ離れたTextではよい結果が得られません。
ネット上ではここを1girlで始める等の記事も見つかりますが、私はこのようにしています。
Number of vectors per token(重要):学習させるものが複雑であるほど増加します。単純なものなら1でよいですが、複雑な場合は8~16あたり必要だそうです。キャラクターの場合は少なくとも6以上にはしたほうがよさそうです。
ちなみに、上記のInitialization Textで生成される画像はこのようなものになりました。
青髪ですらないのですが、ボブカット、チャイナ風服、ファー付きジャケット着崩し等の特徴は現れているため、よしとします。キャラに合わせて色々試してみて下さい。
上記のパラメーターを設定したら、[Create Embedding]ボタンでptファイルを生成します。
[Train]タブ-[Train]タブに移動し、学習パラメーターを設定していきます。
各パラメーターの設定は以下のとおりです。
Embedding: ex-yelan(先ほど作成したptファイルを指定)
Embedding Learning rate: 5e-03:2000, 5e-04:7000, 5e-05
Gradient Clipping: disabled
Batch size: 1
Dataset directory: (学習元の画像ファイルがあるディレクトリパスを指定)
Log directory: textual_inversion
Prompt template file: (テンプレートファイルのパス)/subject_filewords.txt
Width: 512
Height: 512
Max steps:20000(10000くらいでも十分ですがお好み)
Save an image to log directory every N steps, 0 to disabe: 500
Save a copy of embedding to log directory every N steps, 0 to disable: 500
Save images with embedding in PNG chunks: チェック
Read parameters (prompt, etc...) from txt2img tab when making previews: チェック
Shuffle tags by ',' when creating prompts..: チェックしない
Drop out tags when creating prompts: 0
Choose latent sampling method: random
トレーニングを開始する前に
[txt2img]タブに移ってプロンプトに以下のように入力しておきます。
Prompt: masterpiece, best quality, ex-yelan
Negative Prompt: (お好み)
Seed: 特定の値(お好み)
こうすることで、トレーニング500stepごとに出力してくれる画像に、上記のプロンプトを使ってくれるようになります。プロンプトにはex-yelan(作ったptファイル名)を間違えずに入れましょう。間違えた場合は全く関係ない画像が出力され続けます。また、Seedも固定値にします。同じSeedにすれば比較がし易いからです。
その他の生成パラメータもお好みで変更してください。
[txt2img]タブの変更が完了したら、[Train]タブに戻り、[Train Embedding]をクリックすると学習が始まります。
学習が終了したら、以下のフォルダに学習結果のptファイルが生成されています。
textual_inversion/yyyy-mm-dd/ex-yelan/embedding
早速確認してみましょう。
以下のプロンプトで出力してみます。
Prompt: masterpiece, best quality, ex-yelan
Negative Prompt: (worst quality:1.3), (low quality:1.3),(mutated hands and fingers:1.3)
全部並べると多いので1000step単位、10000まで出してみました。
ex-yelan-5000あたりから、夜蘭の特徴的な髪型が再現でき始めていますね。
この中からチョイスするなら7000あたりがよいでしょうか?このあたりはお好みだと思います。
実際には出力したい画像に合わせてptファイルを細かく使い分けていくのもアリだと思います。
私が原神キャラクターを学習する際には、この設定をベースにLearning RateやInitialization Textの調整をするところから開始しています。
この学習のクオリティについては、私のPixivの投稿等でご確認頂ければと思います。