アニメ風loraや制服loraをLECOで作る(stable diffusion)

2023年8月9日水曜日

stable-diffusion

t f B! P L

LECOで学習してみて色々試したときのメモ書き。学習のやり方自体は前回の記事参照。

LECO~特定の概念を削除したり強化したりするLoraの作り方

google colab上でAOM3を使って学習しAOM3A1Bで生成しています。

使うモデル、作用させるプロンプト、使用するLoRAなどによって学習時の設定や使用時のウェイトの適切な値が変わる。突き詰めるのは難しい。

作ったlora, config.yaml, prompts.yamlはここからダウンロードできます。https://mega.nz/folder/cu9x2KQa#2v6dGQfcW5s8sg2M6zYFeQ

LECOは人の作ったものを使うより自分が使うモデルで作ったものを使ったほうがいい結果が得られやすい気がするので、この人の環境ではこうなったんだなぐらいで見ていただけるとありがたい。

erase anime screencap

マイナス適用でアニメっぽくなるlora。

学習設定

config.yaml

prompts_file: "/content/drive/MyDrive/leco/eraseanimescreencap/prompts.yaml"

pretrained_model:
  name_or_path: "/content/drive/MyDrive/SD/AOM3.safetensors" # you can also use .ckpt or .safetensors models
  v2: false # true if model is v2.x
  v_pred: false # true if model uses v-prediction

network:
  type: "lierla" # or "c3lier"
  rank: 16
  alpha: 1.0
  training_method: "full"

train:
  precision: "float32"
  noise_scheduler: "ddim" # or "ddpm", "lms", "euler_a"
  iterations: 200
  lr: 1e-4
  optimizer: "AdamW"
  lr_scheduler: "cosine"
  max_denoising_steps: 20

save:
  name: "eraseanimescreencap"
  path: "/content/drive/MyDrive/leco/eraseanimescreencap/outputs"
  per_steps: 100
  precision: "float16"

logging:
  use_wandb: false
  verbose: false

other:
  use_xformers: true

prompt.yaml

- target: "anime screencap"
  action: "erase" # erase or enhance
  guidance_scale: 1.0
  resolution: 512
  batch_size: 2

結果

1girl単体とlora。alphaを1にしたせいか変化が小さい。-6からようやくアニメっぽくなった。プラス方向に強めても特にわかりやすく書き込みが増えたりはしない。

プロンプトにanime screencapを入れたものと比較。 weight-7のloraだけだとゲームの一枚絵のよう。weight-7 + anime screencapだと効きすぎてなんか濃い。-4から-2 + anime screencapでアニメの1フレームのような雰囲気。anime screencapだけだと変化がよくわからない。

感想

  • プロンプトにanime screencapを入れる場合、loraのweightを-2や-4にするとちょうどいいアニメっぽい画像が出力された。
  • 単純に(anime screencap:1.2)などプロンプトとウェイトだけで試みるよりは効果が高い。
  • eraseしたワードを入れると効果が強くなる。
  • weightが強いと構図が変わりやすい。
  • プロンプトにanime screencapを入れると字幕や動画サイトのUIのようなものが出てくることがある。

erase nightv2

夜を消したり強めたりする。LECOはざっくりと人や塗りなどの全体の雰囲気に作用する学習に向いていそうという偏見がある。

v2となっているが、v1はdim16, alpha1, lierla, AdamW, cosine, iteration200, denoise20, batch_size2で作って失敗した。多分alphaが低すぎた。

学習

alphaを8, typeをc3lierで学習。

config.yaml

prompts_file: "/content/drive/MyDrive/leco/erasenightv2/prompts.yaml"

pretrained_model:
  name_or_path: "/content/drive/MyDrive/SD/AOM3.safetensors" # you can also use .ckpt or .safetensors models
  v2: false # true if model is v2.x
  v_pred: false # true if model uses v-prediction

network:
  type: "c3lier" # "lierla" or "c3lier"
  rank: 16
  alpha: 8
  training_method: "full"

train:
  precision: "float32"
  noise_scheduler: "ddim" # or "ddpm", "lms", "euler_a"
  iterations: 200
  lr: 1e-4
  optimizer: "AdamW"
  lr_scheduler: "cosine"
  max_denoising_steps: 20

save:
  name: "erasenightv2"
  path: "/content/drive/MyDrive/leco/erasenightv2/outputs"
  per_steps: 100
  precision: "float16"

logging:
  use_wandb: false
  verbose: false

other:
  use_xformers: true

prompts.yaml。batch_sizeを1にした。

- target: "night"
  action: "erase" # erase or enhance
  guidance_scale: 1.0
  resolution: 512
  batch_size: 1

結果

うまくいかなかったv1との比較。v2では-2から夜っぽくなった。v1は変わらない。alphaとc3lierの分v1よりは効きが良い。

プロンプトにnightと関連性が高そうなskyを入れたテスト。期待通りの効き。プロンプトのみで生成するときもsky入れたほうがわかりやすいのは同じ。一応スライダーっぽいことができている。

感想

  • 生成時に入力するプロンプトと関連が薄いワードをeraseしたloraを適用しても影響は少ない。これはプロンプトも同じ。
  • それでもweightを強めると効果が出ることがある。だが崩れやすい。

白髪赤目

前回の記事のLECO~特定の概念を削除したり強化したりするLoraの作り方~(Stable Diffusion)で作った白髪赤目のやつ。

weight1ではまだ優しそうな顔をしているが

weight4あたりから強そうな雰囲気になる。

感想

  • weightを強くするとenhanceした要素(白髪赤目)に付随することが多い別の要素(鋭い目や闇堕ち衣装など)が発現することがある

enhance school uniform

school uniform(制服)をenhanceする。collarやpleated skirtなど特定のパーツを狙って出そうとしたテスト。

学習

1girlにschool uniform, black sailor collar, red_neckerchief, white shirt, short sleeves, black skirt, pleated skirt, white socks, loafersをenhanceする。夏仕様の白い半袖セーラー服をイメージ。

prompts.yaml

- target: "1girl"
  positive: "school uniform, black sailor collar, red_neckerchief, white shirt, short sleeves, black skirt, pleated skirt, white socks, loafers"
  action: "enhance" # erase or enhance
  guidance_scale: 1.0
  resolution: 512
  batch_size: 1

config.yaml

prompts_file: "/content/drive/MyDrive/leco/enhanceschooluniform/prompts.yaml"

pretrained_model:
  name_or_path: "/content/drive/MyDrive/SD/AOM3.safetensors" # you can also use .ckpt or .safetensors models
  v2: false # true if model is v2.x
  v_pred: false # true if model uses v-prediction

network:
  type: "lierla" # or "c3lier"
  rank: 16
  alpha: 8.0
  training_method: "full"

train:
  precision: "float32"
  noise_scheduler: "ddim" # or "ddpm", "lms", "euler_a"
  iterations: 100
  lr: "1e-4"
  optimizer: "AdamW"
  lr_scheduler: "cosine"
  max_denoising_steps: 20

save:
  name: "enhanceschooluniform"
  path: "/content/drive/MyDrive/leco/enhanceschooluniform/outputs"
  per_steps: 10
  precision: "float32"

logging:
  use_wandb: false
  verbose: false

other:
  use_xformers: true

結果

流石にbatch_size1とiteration100では制服が出てこない。

プロンプトにschool uniformを入れると出る。出る制服のパターンはバラバラ。一応enhanceした要素に多少引っ張られているような気がする。

調整

いくつか作ってみる。

  • enhanceschooluniformv2: iterationを100から200に増やした
  • enhanceschooluniformv2c3: v2のnetworkのtypeをlierlaからc3lierに変更
  • enhanceschooluniformv2taguni: targetを1girlからschool uniformに変更。networkのtypeはv2と同じlierla。

結果

プロンプトは1girlのみで各loraをweight別に比較。weightが3以上になると人物が溶けたので2まで。lierlaよりc3lierの方がセーラーになりやすい。1girlをenhanceしてないloraで制服が出ないのは期待通りだが、weight0と比べると絵が変わってしまっているあたり何か影響がありそう。

プロンプトにschool uniformを追加して比較。黒セーラーがよく出ている。c3lierとschool uniformをターゲットにしたやつはweight2で白セーラーの打率が上がった。指定通りといえばそうだが、不自然なローファーがよく出てくる。

loraではなくプロンプトで服装を指定したときと比較。leco学習するときのpositiveにserafukuを指定していないので、white shirtを内側に着ている黒セーラーや黒ベストの制服が出るのはわかる。プロンプトだと白セーラーの出現率が高い。

upper bodyを入れてみる。ほとんどwhite shirtを内側に着ている。プロンプト直接入力の方は白セーラーがいた。影響する範囲、強度が違うのだろう。いずれもローファーがでていない。良し。

lecoの方が効果がより限定的なのかもしれないと思ってpink hairを試す。色移りした。今回の設定だとプロンプトに色が引きずられる程度の強度。iterationを増やしたりすればまた変わってくるかもしれない。

ここまでの感想

  • 特定のパーツを出したいときはc3lierの方が効果が高い
  • 服装の指定なのだから服をtargetにしたほうが効果が高い
  • 1girlをターゲットにしたときpositiveにも1girlを入れても良かったかもしれない
  • プロンプト直接入力のほうが影響範囲が広く、強度が高い
  • 200iterationぐらいでは色移りを防げない

気がする。

positive調整1

prompts.yaml。serafukuを追加、red_neckerchiefのアンダースコアをスペースに修正。

- target: "school uniform"
  positive: "school uniform, serafuku, black sailor collar, neckerchief, red neckerchief, white shirt, short sleeves, black skirt, pleated skirt, white socks, loafers"
  action: "enhance" # erase or enhance
  guidance_scale: 1.0
  resolution: 512
  batch_size: 1

networkのtypeはc3lier。lr_schedulerをcosineからconstantに変更。

結果

1girl, school uniformにlora適用。schedulerをconstantにしたせいかweight3でも人が溶けにくくなった。serafukuを入れたのでセーラーが出る。

weight0のときブレザーだったものが無事セーラーになったが、loraの場合は黒も出る。プロンプト指定は相変わらず白セーラー安定。

positive調整2

黒が出ることに文句はないがせっかくなのでプロンプトと同じように白セーラーを出せるようにしたい。

prompts.yaml。serafuku, white serafukuなどパーツ単体と色付きパーツのタグを追加。

- target: "school uniform"
  positive: "school uniform, serafuku, white serafuku, sailor collor, black sailor collar, neckerchief, red neckerchief, white shirt, short sleeves, skirt, black skirt, pleated skirt, white socks, loafers"
  action: "enhance" # erase or enhance
  guidance_scale: 1.0
  resolution: 512
  batch_size: 1

白セーラー安定と引き換えに髪の色、襟、スカートなどが白くなることがある。

髪の色はプロンプトで指定してもええやろとblack short hairを指定。顔が見切れたが強度次第でそこそこの安定感。プロンプト指定がここで黒セーラーを出してくる。もうなんもわからん。

school uniformの感想

  • 長々と連ねていたプロンプトを一つのタグにまとめるという点では使える
  • optimizerがAdamWの場合lr_schedulerはconstantでいい

全体の感想

  • lecoは要素を他の要素に近づける(eraseの場合は遠ざける)もの
  • targetと同じタグ > targetと関連の高いタグ > targetと関連は薄いが潜在的に持っているタグの順に効きやすく、効きやすさとloraの強弱で発現するかどうかが決まってくるイメージ
  • 他のloraと併用する場合、適切なweightが変わることも多い

lecoが有効かそうでないかはやってみないとわからない。

副産物

1girl, <lora:enhanceschooluniformv2_last:-1> Negative prompt: (worst quality, low quality:1.4), nsfw, panties

1girlにschool uniformやwhite shirtなどをenhanceしたloraをマイナス適用すると装飾の多い水属性のファンタジー女が出てきた。モデル依存かもしれないが、これはこれでよい。

QooQ