論文・実装調査(TADA! Text to Animatable Digital Avatars)
animationまで可能なavatar生成としてTADAについてメモ
論文はこちら
[2308.10899] TADA! Text to Animatable Digital Avatars
公式でコードがgithubに公開されている
GitHub - TingtingLiao/TADA: [3DV 2024] Official Repository for "TADA! Text to Animatable Digital Avatars".
手法概要
- text条件づけでsmpl-xとそこからのmeshの変形差分を学習
- 学習元の情報はSDSによりdiffusion modelから抽出
- smpl-xのpose paramを指定motionに合わせて変更することでobj sequenceによるanimationを生成可能
avatar特化ということで、よくあるtext-3d modelと違うのはsmpl-xそのものをdeformしても目的の形状に最適化していく点。text-3dだとNeRFや3DGSを利用した手法が多くそれらの表現によって学習後にmeshを抽出するものが多いが、avatarという形状がある程度決まっているものを対象にしているためこのような形を取っていると考えられる。
pros/consとしては
- ◯人型の形状に対する強いpriorとなり人型を保ちやすい
- ✗人型以外のものは表現しづらい(大きなドレスを着てるなど衣服によって形状が外れる場合も)
また、smpl-xを直接使っているためそちらの機能によりposeを指定して姿勢を変更できそれによるanimationが簡単に作れる。デメリットはsmpl-xのposeで表現できる姿勢以外には対応できなくなることで、元がモーションキャプチャのデータである以上奇抜な姿勢はおかしくなるはず。
ただ個人的には、boneの構造が常に共通のものとしてavatarの生成ができるのは実用上では大きな利点だと思われる。
meshについて
ある程度までの服やリアルな人型以外(キャラクターなど)も扱えるようにするため、smpl-xそのままではなく以下の点で拡張して使う
- meshの細分化
- 各頂点の変形差分(displacement)を学習可能パラメータとして追加
smpl-xはfaceで4000、bodyで6000程度の頂点数となっており、そのままだとtext入力によっていろんなavatarを生成するには少なく詳細の表現もしづらい。なので頂点数を増やして使いたいが、単純に各頂点の中間に均等に増やすのような方法だと最適化時に邪魔になる可能性もあるため、元のmeshの密度が小さい部分を選んで増やすとのこと。
学習方法
学習パラメータは
- smpl-xのパラメータ(shape β, expression ψ)
- poseは固定
- albedo Ψ(texture map)
- 拡張で追加したdisplacement D
であり、SDSによりstable diffusion(sd)のdenoisingにおけるスコアを教師データとして利用する。
- meshをrandom camera poseでレンダリングした512x512の画像を生成
- latent化、random timestepによりnoise付与し1 step denoiseして予測noiseを算出
- loss計算
上記をtexture/geometryそれぞれの学習において行うが工夫点として
- textureの学習の場合
- レンダリング時のresolutionを32~512まで学習中にannealingすることで安定させる
- geometryの学習の場合
- RGB画像、normal画像をそれぞれレンダリングし、encodeしたlatent z_I、z_Nをハイパラaによって線形補間して入力として使う
- texture/geometryの一貫性を保つのが目的
論文から式を引用しておく



ちなみにγ = {β, ψ, D}のことであり、geometry用lossによるtexture mapの更新は行わない。また、color, normalの寄与(lambdaの設定値)は等しい。
というのが論文にあった内容だが、geometryの学習に関しては実装が更新されたようで、repoを見るとこう書いてある
NEWS (2023.9.24): Using Omnidata normal prediction model to improve the normal&image consistency
実装を確認すると以下のようになっていた
https://github.com/TingtingLiao/TADA/blob/e8e39c0/lib/trainer.py#L278-L286
- 学習初期(の30%) or 50%の確率でレンダリングされたnormal画像のみからSDS
- それ以外の場合、RGB画像をomnidataのmodelに通すことでnormal画像を取得しレンダリング結果とcosine similarityでloss
なのでstable diffusionから得られるnormalのpriorだけだと足りない模様。text promptに合わせた概形を取るにはよいが、細かい部分の凹凸には不十分だったという感じか。確かにsdはnormal画像による学習も含まれているものの、RGB画像に比べればごく一部のデータだけのはずなのでRGBから別モデルで推定する方が精度が高いというのはありうる。
viewの制御
学習時のcamera poseは真正面からみた場合を0°としたとき以下の範囲でランダム
- full body view: elevation [0, 30], azimuth [-180, 180]
- face view: elevation [5, 15], azimuth [-30, 30]
face viewは顔のみのcloseup viewであり、full body viewのみだと顔のパーツの解像度が低すぎてちゃんと描けない。学習時は30%の割合でface viewを使っている。
ちなみに設定だとsmpl-xでの座標系に合わせてあるため頭上から見た角度基準になっている
https://github.com/TingtingLiao/TADA/blob/e8e39c048a69da9c63413643ff2af5caef845a4f/configs/tada_w_dpt.yaml#L19-L22
multi viewの制御については論文にかかれていないが、camera poseに合わせてfront, side, back, overheadというワードをtext promptに追加するだけのシンプルなもの
https://github.com/TingtingLiao/TADA/blob/e8e39c048a69da9c63413643ff2af5caef845a4f/lib/trainer.py#L181-L192
closeupか否かについてもfull body, faceというワードをつけてコントロールのみなので、stable diffusionがある程度以上知っている人物やキャラクターじゃないと生成はうまくいかない可能性がありそう(前から見た画像は生成できるけど横や後ろのviewの生成は完全に壊れる場合など)。
ただ、NeRFなどと違ってsmpl-xの変形なのである程度は人型の形状を保ってくれるはずで、多少うまく生成できなくても完全崩壊はしないかもしれない。
動かしてみるところまで書こうと思ったが少し長くなったのでそれは次で