(※筋肉老人もサンタも飽きたと思うのでアイキャッチは女の子です)
過去の記事では濁して書いた
「学習時のInstance&Class Prompt(とToken)は何をいれればいいか。そしてFilewordsとは?」問題。
ほんの一部だけど自分の中で結論が出来たので整理します。
2023/03/04
アクセスが増えてきたため、現在の知見を踏まえて書き直しました
忙しい人のために先に結論を書いておきます。
「Instance Promptはphoto_of_識別子_一般名詞、Class Promptにphoto_of_a_一般名詞を入れる」
が一番良いです。
前提
やりたいこと
Dreamboothでアニメモデルを学習する際、どんなInstance&Class Promptにすべきかを調べる。
理論とか一般論はおいておいて、一番狙った絵が出やすい=使いやすい追加学習モデルを作りたい。
使用モデル
Anything-V3.0.ckptでもやろうとしたけれどテストが膨大になったので諦め。
本当は中立ぽいhakurei/waifu-diffusion-v1-4でやりたかったけどDiffusers形式にコンバートできなかった。
学習画像
これまでと一緒です。
- 対象はキツめの顔をした女性キャラの画像。
- サイズは512×512。
- 合計30枚用意。フェイスアップ20枚、バストアップ4枚、全身5枚、座っているところ1枚。
- 髪型や服装はそろえる
- 奇抜でないポーズ。手やフレームなどは取り除く。
学習基本設定
AUTOMATIC1111のDreambooth Extensionを使い、以下の基本設定で学習を試しました。
- Training Steps:1,000
- Learning Rate:0.00000172(デフォルト)
- Apply Horizontal Flip:オフ
- Train EMA:オン
また読みやすくするために、難しい言葉を以降は以下に置き換えて書きます。
- scs:今回の識別子。Promptで学習内容を呼び出す際に使うランダムで無意味な単語。
- キャラ名:学習する画像に写ってる固有名詞。当然半角英数。
- woman:キャラが属する一般名詞。人ならgirlやwoman,manなど。他にはdog, car, guiterなど
PromptとTokenの組み合わせ例
今回選考したパターンを5つ挙げます。
それぞれInstance Prompt、Class Promptです。
TokenはAUTOMATIC1111 の Dream Booth の使い方によると[filewords]を使わない限り効果が無いそう。
1.Instanceに識別子、Classに固有名詞
GUIツールを使ったやり方に書いた方法。Gigazineを参照しました。
- Instance Prompt:scs
- Class Prompt:キャラ名
「どっちにも固有文字列を入れられる」パターン。
学習元モデルに最初から入るような有名キャラ(初音ミクとか)なら正攻法とも言えます。
2.Instanceに識別子_固有名詞、Classに一般名詞
こうしろと書いてる記事は無いけれど、結果を知りたかったのでテスト
- Instance Prompt:scs キャラ名(間に半角スペース)
- Class Prompt:woman
3.Instanceに識別子_一般名詞、Classに一般名詞
AUTOMATIC1111 の Dream Booth の使い方で例として上げられている方法
- Instance Prompt:scs woman(間に半角スペース)
- Class Prompt:woman
4.Instanceにphoto_of_識別子_一般名詞、Classにphoto_of_a_一般名詞
としあきdiffusion Wiki*やTowards Data Scienceで書かれている方法。
Photoかartかは迷うけれどサンプルに従いました。
- Instance Prompt:photo of scs woman
- Class Prompt:photo of a woman
5.[filewords]を使う
どうやら[filewords]という変数をPromptに含めると、学習画像と同名のタグTXTを読み取って学習するそうです。
学習画像はAUTOMATIC1111のPreprocess Imagesを通してタグtxtを作成してあります(過去記事参照)。
- Instance Prompt:scs [filewords]
- Class Prompt:[filewords]
- Instance Token:scs
- Class Token:woman,girl,
Tokenをこう書くと、filewordsとClass Tokenが合致した場合、頭にscsをつけて実行(学習?)してくれるそうです。
生成結果
それぞれの学習モデルを使い、サンプルを12枚づつ生成し傾向を観ました。
(Steps: 30, Sampler: Euler a, CFG scale: 7, Seed: 298727361, Size: 512×768, Eta: 0.67, Clip skip: 2, ENSD: 31337。
元素法典の基本的なNegative Prompt、Hypernetwork:なし、VAE:Anything V3.0)
以下コメントの番号は上の組み合わせ例の番号と同じです。
Prompt.1
最初に自由に絵を描いてもらうシンプルなプロンプト。
学習が元にしたモデルに対しどの程度浸透しているかを確認します。
beautiful woman, scs,
コメント
- 一番多い構図はバストアップで9/12枚。
ほぼ限られた構図。顔の変形も少なく、ほぼ学習画像のキャラそのまま。
全体的にoil paintingのように色濃い絵柄。 - 多い構図は腰から上で5/12枚。
1.よりも画角が広く、構図に多様性が出てきている。衣装や髪型の変化はまだ少ないが、顔立ちが1.よりアニメ絵になる傾向。
なぜか9/12枚が右下の何かをみている構図。 - 太ももより上が9/12枚で最も多く、うち2枚は全身(ただし顔崩れ)。
顔はかなり中和され、髪にキャラの面影が残るくらい。服も色は変わるが、デザインはまだ引き継いでいる。
2.よりさらに画角が広く光源や背景、ポーズも多様。フェイスアップ、バストアップは共に1枚のみ。
全体的に晴天の屋外のように色は浅く、柔らかな絵柄。 - 多いのは胸から上で7/12枚。
ただし1.よりも首の角度などが大分自然で構図も多い。
顔はキャラに似たものもあれば、別物もありかなりランダム。
髪色と髪飾りの特徴は残る。色は鮮やかでメリハリのあるCGイラストらしい絵柄。 - 太腿より上の構図が12/12枚。
しかしほぼ別人。Promptによる縛りは無いのにみんな似たポートレート構図なのは不思議。
一応Stepを上げてみたけれど、このPromptではあまり変化なし。
Prompt.2
次にシチュエーションや衣装など指定を多くつけたより実用に沿ったプロンプトでテスト。
指定に対して多様性があるか、破綻の傾向などをチェックします。
beautiful woman, scs,
ultra detailed, best quarity, dramatic lighting , detailed shadow,
ultra detailed,
wearing school uniform, winter,
drinking coffee in a starbucks coffee, holding cup,
これが生成したすべて同じSeed値の画像です。
コメント
- やはりバストアップが多く8/12枚。
色濃い描写はそのままながら、構図やポーズはいくらか多様性がある。指示通りの描写(学生服を着てコーヒーを飲んでる)問題なし。顔も学習画像のものが多いけれど、シードの画像に引きずられてか幾分柔らかい顔と融合してる。 - ほぼバストアップの構図が11/12枚。
1.との構図の差は少ないけれど、顔がイラスト寄りになり学習画像から離れているのはPrompt.1と同様。指示の描写は服の変更が出来ていないのが2枚。Promptへの追従性?が若干落ちそう。 - 太腿より上が4枚、腰から上が5枚。全身像が1枚と画角が広いけど構図は似た傾向あり。
様々な背景がよく書かれていてうまくキャラが融合できている。指示の描写は1枚だけ服が書ききれてないのがある程度。 - 構図がいい意味でバラバラで多彩。
光の表現(ライティング)も良く、CGイラストとして作品になりそう。指示の描写は三段組構図で主題(woman)が書ききれてないのもあり。ガチャしたら面白そう。 - ほぼ別人という感じのが4/12枚。まあ似てるのが2枚。
似ては居ないけど完成度の高い絵が出る。キャラが元絵?に融合出来ている絵が多く、構図が一辺倒ではない。
様々なパターンを出せる期待がある。
まとめ
上のグダグダしたコメントから結論をまとめます。
学習画像の忠実度 | 指示Promptへの適合度 | 構図の自由度 | 絵としての映え | |
1. Instanceに識別子 Classに固有名詞 | AA | B | C | B |
---|---|---|---|---|
2. Instance:識別子_固有名詞 Class:一般名詞 | A | C | B | B |
3. Instance:識別子_一般名詞 Class:一般名詞 | B | A | B | C |
4. Instance:photo_of_識別子_一般名詞 Class: photo_of_a_一般名詞 | B | B | A | AA |
5.:[filewords]を使う | D | B | A | A |
全くの主観でこう採点します。
「指示Promptへの適合度」はどの方法もほぼ出来ていて、ミスはガチャで弾けばいいので無視できるレベル。
これを集計すると(AA=5点~D=1点で集計すると)
「4.Instanceにphoto_of_識別子_一般名詞、Classにphoto_of_a_一般名詞」。
が一番良いという結果になりました。
当初は2.を推していましたが、使っているとどうしても学習画像に絵が寄ってしまう。
結局scsとキャラ名、2つのトークンに学習データが乗っかり影響が強いのかもしれません。
よって結局は一番実例が多い4.を普段使いしています。
scsだけに学習データが紐づけされる形です。
「5.[filewords]を使う」は、今回の学習に向かないと考えます。
Stable Diffusionの様に不特定多数の学習データを用意し、そこから特定のクラス(woman,girlなど)を選別して学習する時に使うのではないかと。
個人でDreamboothをするときはひたすらワンテーマなので不要です。
今回1,000Stepでテストしていますが、正規化画像も使うと3,000Step位が妥当にも思えます。
学習時のメモリも改善されているため、いつかもっとステップと解像度を上げてチェックしてみるつもり。