Bucketの生成を修正してみた。

 前回と前々回でAspect ratio bucketingを使いましたが、実はWaifu diffusion(以下WD)で実装されているものと、NovelAI(以下NAI)が紹介したアルゴリズムでは少し違いがあります。

比較

 というわけで同じ設定で比較してみましょう。でも分かりづらいのでとりあえずresolution(幅×高さ)だけみてください。

WDの場合
buckets: [(512, 1024), (448, 832), (384, 704), (320, 576), (576, 1024), (512, 896), (448, 768), (576, 960), (512, 832), (320, 512), (448, 704), (576, 896), (512, 768), (576, 832), (448, 640), (640, 896), (512, 704), (576, 768), (640, 832), (448, 576), (512, 640), (576, 704), (640, 768), (704, 832), (384, 448), (448, 512), (512, 576), (576, 640), (640, 704), (704, 768), (768, 768), (768, 704), (704, 640), (640, 576), (576, 512), (512, 448), (448, 384), (832, 704), (768, 640), (704, 576), (640, 512), (576, 448), (832, 640), (768, 576), (704, 512), (896, 640), (640, 448), (832, 576), (768, 512), (896, 576), (704, 448), (512, 320), (832, 512), (960, 576), (768, 448), (896, 512), (1024, 576), (576, 320), (704, 384), (832, 448), (1024, 512)]
ratios: [0.5 0.53846154 0.54545455 0.55555556 0.5625 0.57142857
0.58333333 0.6 0.61538462 0.625 0.63636364 0.64285714
0.66666667 0.69230769 0.7 0.71428571 0.72727273 0.75
0.76923077 0.77777778 0.8 0.81818182 0.83333333 0.84615385
0.85714286 0.875 0.88888889 0.9 0.90909091 0.91666667 1 1.16666667 1.18181818 1.2 1.22222222 1.25 1.28571429 1.3 1.33333333 1.375 1.4 1.42857143 1.44444444 1.5 1.55555556 1.57142857 1.6 1.625 1.66666667
1.71428571 1.75 1.77777778 1.8 1.83333333 1.85714286 2. ]
resolution [524288, 372736, 270336, 184320, 589824, 458752, 344064, 552960, 425984, 163840, 315392, 516096, 393216, 479232, 286720, 573440, 360448, 442368, 532480, 258048, 327680, 405504, 491520, 585728, 172032, 229376, 294912, 368640, 450560, 540672, 589824, 540672, 450560, 368640, 294912, 229376, 172032, 585728, 491520, 405504, 327680, 258048, 532480, 442368, 360448, 573440, 286720, 479232, 393216, 516096, 315392, 163840, 425984, 552960, 344064, 458752, 589824, 184320, 270336, 372736, 524288]

これって引用らしいけどこういう使い方もありですか?

NAIの場合
buckets: [(512, 1024), (576, 1024), (576, 960), (640, 896), (704, 832), (768, 768), (832, 704), (896, 640), (960, 576), (1024, 576), (1024, 512)]
ratios: [0.5 0.5625 0.6 0.71428571 0.84615385 1.
1.18181818 1.4 1.66666667 1.77777778 2. ]
resolution [524288, 589824, 552960, 573440, 585728, 589824, 585728, 573440, 552960, 589824, 524288]

 WDはとにかく数が多く、resolutionがバラバラなのがわかるでしょうか。NAIの場合resolutionはほぼ一定になっています。簡単に言えばNAIの方法では解像度が最大値に近いものしか選ばれません。WDの実装ではそういった制限がないため低解像度のbucketもできてしまいます。bucketの数を増やしたいならば、刻み幅を減らせばいい話なので、これは実装ミスなんじゃないの?前回までWDの実装に従って学習していたので、NAIの方法でやってみました。

追記:VAEで8分の1、Unetで8分の1に圧縮されるので刻み幅は64じゃないとだめですね...。

 低解像度のbucketが減るので、学習時間が増加します。しかし最大VRAM使用量は変わらないので、VRAMを効率的に利用できるはず・・・。学習用画像をbucketに合わせて前処理してみた結果がこちら。

 こうしてみると正方形に変換するなんてかなりもったいないですね。前回の学習では、最頻値であるアスペクト比0.714のbucketは(320:448)でした。それが今回は縦横それぞれ2倍の(640:896)になっています!実のところこれはアルゴリズムだけでなくbucketの最大長を768とした設定の問題でもあるのですが。

学習結果

 bucket以外前回と同じような設定でやってみました。

 前回より明らかに解像度が上がりました。ただなんか安定しないんですよね。ある部分の特徴が別の部位に現れたりすることが多いです。制服衣装を生成しようとしても鎧部分が出てきちゃったりします。細かい部分を再現しようとしすぎていて広い部分で変な感じになっちゃうというか・・。解像度を大きくしたことでまたちょっと調整が必要かもですね。
 でもこういう風に思うのは、AIのせいじゃなくて、細かいところが再現できるようになると、もっとキャラクターにフィットしてほしいという思いが強くなってしまうからかもしれません。

まとめ

 オベロン強すぎ。