TADA! Text to Animatable Digital Avatarsを動かす

前回調べたTADAを動かしてみる
論文・実装調査(TADA! Text to Animatable Digital Avatars) - MEMOcho-

環境構築

公式のこちらに書いてある通り

https://github.com/TingtingLiao/TADA?tab=readme-ov-file#install

dataにはいろいろ書いてあるが、メインの生成をやるだけであればSMPL-X ModelとTADA Extra Dataを書いてあるように入れれば問題なし。

python環境についてpipでやる場合はこれでOK

pip install --upgrade pip
pip install torch==1.12.1+cu116 torchvision==0.13.1+cu116 torchaudio==0.12.1 cuda-python pytorch-lightning omegaconf --extra-index-url https://download.pytorch.org/whl/cu116
pip install -r requirements.txt

cd smplx
python setup.py install

実行

stable diffusionが知っていそうなキャラクターということでゼルダの伝説のリンクを生成してみる。

事前確認としてsd単体でリンクの画像が生成できるか試す。TADAと同じくsd2.1を使用。 謎の絵になっているものもあるが、リンクを知っているのは間違いなさそう。

TADAによる生成の実行コマンド

python -m apps.run --config configs/tada_w_dpt.yaml --text "the link in legend of zelda"

デフォルトの設定だと15000 stepsとなっているが今回はその半分の7500 stepsで生成。3090でだいたい1 step/secであり結構時間がかかるのと、最初にAladdinで生成した際に確認したところ半分の時点で十分きれいな形になっていたため。

ちなみに実行時の使用メモリは20GB程度だった。fp16のフラグは実装上は入ってるものの、ONにするとbackwardの計算でエラーになることは確認済み。

生成結果

単純にテキストから生成したことを考えるとかなり高クオリティに見える

  • 全体的な形状がしっかりしている
  • ベルトや胸のあたりのマークも描かれている
  • multiviewの一貫性も取れている

顔がしっかり描けているのはface closeupでの学習を入れているからと考えられるが、closeupを入れていない手もちゃんと形になっているのはsmplxを使っている強みか(sdの画像生成では手はおかしくなりがちなので)

残念な点としては、テクスチャが粘土細工っぽい状態になっていることだが、これは学習step数の影響もあるかもしれない。

ちなみに最初にAladdinで生成してみたときの7500 step目のviewはこちら リンクに比べるとテクスチャもきれいに見える。Aladdinの方がsmplxの形状と近いためそれによって細かい部分の最適化まで早く進んだのかもしれない。

調査

sdにおいてどの程度のものが生成できているのか確認してみる。3d生成時にsdsを行っている部分はこちら
https://github.com/TingtingLiao/TADA/blob/6131e52f4a4270749bd1a2d7b61f4c2f5aacd7d1/lib/guidance/sd.py#L96-L140

pred_rgbはreconstruct中の3d modelをrenderingした画像(or normal)のことであり、これにrandomなtimestep時点のnoiseを付与、それをt時点のlatentとして1 stepのみdenoiseした際の予測noiseでlossを取る。

簡単のため、sd webuiによるimg2imgでdenoising strengthを変えて結果を見てみる。

timestepによる違い

最左が学習開始時を想定した元画像で、その後左からdenoising strengh=[0.25, 0.50, 0.75, 0.98](最後が1.0じゃないのはsds時は0.02~0.98でサンプリングするよう制約をかけているため)

1000 step目付近で正面近いrendering画像を元にして同じことをした場合

ちなみに条件はある程度はTADAの学習時と同じになるよう以下のようにしている

  • prompt: a front view 3D rendering of the link in legend of zelda , full-body
  • sampler: DDIM
  • seed: 0
  • CFG: 30
    • sdsの場合は100だがsd webuiは上限30の設定になっているようだったため

0.98の右下の絵はreconstructした結果と似ている。あと0.75の左下とか。

TADAの場合、timestepのサンプリングは常に[0.02, 0.98]の範囲で固定の設定だったが、他の3d生成の手法を見ると学習前半はt=1に近いところから重点的にサンプリングするようscheduleを組んでるものもありその理由がよくわかる。

camera poseによる違い

もう一つ気になるものとして、multiview条件での生成がどの程度のクオリティになっているのかがある。

smplxの前向き、右向き、後ろ向きrendering画像

からdenosing strength=0.75でimg2imgをしたのがこちら

その他条件はpromptのみ上記の"front"の部分をそれぞれside, backと書き換えただけの違い。

0.75だと余計なものが描かれている率が高いものの、元画像のstructureをちゃんと反映してキャラの向きは正しいままリンクの性質が付加されているように見える。