Contents — 7 sections
アニメやMVの動きを、VRChatのAnimationClipへ持っていけないか試している。
最終的に欲しいのは3Dモーション。
でも最初からDeepMotionやCascadeurへ動画を丸ごと投げるのはやめた。
先に、
この動画のどの区間なら、人間の動きとしてまともに読めるのか
を2D段階で選別することにした。
最初のPipelineは4段階
作った入口は、
pose2d
↓
analyze
↓
clip
↓
3D化(まだ未着手)
pose2d
RTMW WholeBody系を使い、各frameから133点を推定。
複数人がいる場合は追跡対象1人を選ぶ。
結果を骨格overlay動画として出す。
analyze
動画をshotへ分ける。
さらに、
- アップへ無理やり当てはめられた架空の全身骨格
- 群衆
- 煙
- 1 frameだけ飛ぶkeypoint
- 左右の入れ替わり
などを警告対象にする。
代表Poseも抜く。
clip
3D化サービスや後段Toolへ渡したい区間を、frame単位で切る。
overlay
保存済みkeypointからoverlayだけ描き直す。
Pose推論を毎回やり直さない。
試した動画は82秒、33 shots
検証に使った動画は、
- 640 × 360
- 30fps
- 82秒
- 33 shots
だった。
この動画に対して2D骨格を取り、overlayとcontact sheetを見ながら閾値を合わせた。
48.97〜53.47秒付近の連打shotでは、全身骨格をほぼ全frameで取れた。
この区間なら、次の3D化候補として使える。
「骨格が出た」を成功にしない
Pose Estimationは、何かしら骨格を返してくる。
でも返ってきたから正しいとは限らない。
たとえば顔や上半身のアップでも、Modelが画面外に脚があるような「それっぽい全身」を補ってしまうことがある。
煙や群衆でも同じ。
だから確認したいのは、
「133点が出たか」
ではなく、
その133点を後段のMotion Reconstructionへ渡してよいか。
ここを分けた。
左右反転や1frame jumpは後段でかなり痛い
2D上では一瞬のノイズでも、3D Motionにすると大きな破綻になる。
左手と右手が入れ替わる。
1frameだけ手首が画面の反対側へ飛ぶ。
人物追跡が別人へ乗り移る。
こういうframeをそのまま3Dへ渡すと、後から修正コストが跳ねる。
そこで2D段階で、
- continuity
- confidence
- left/right
- tracked person
- shot boundary
を見て、怪しい区間へ警告を出す。
代表Poseを先に見る
全frameを人間が動画で確認するのは重い。
そこでshotごとに代表Poseを抽出し、keyposes.jpg のようなcontact sheetを作る。
これで、
「このshotは使えそう」 「ここはアップすぎる」 「ここは煙で壊れている」
をざっと選別できる。
後段へ送る動画を減らす。
3D化はまだやっていない
ここは明確に分けておく。
この実験で到達したのは、
- 動画
- shot detection
- 2D WholeBody 133 points
- tracking
- anomaly warning
- representative pose
- clip extraction
まで。
まだ未着手なのは、
- Cascadeur
- DeepMotion
- RTMW3D
- FBX
- Unity Humanoid
- VRChat AnimationClip
つまり、
「動画からVRChatモーションを作れた」段階ではない。
「3D化へ渡す前の入力品質を選別するところまで作った」が正確。
なぜ前処理を厚くするのか
3D生成側を強くすれば、多少壊れた2D Poseも直してくれるかもしれない。
でも、入力が壊れているのか、3D復元が壊したのか分からなくなる。
まず2Dで、
- 誰を追っているか
- どのframeが怪しいか
- どのshotが使えるか
を見えるようにする。
そのうえで3Dへ送る。
南大門のPhotogrammetryでも同じだった。
後段のModelを強くする前に、入力が何なのかを観測できるようにする。
PicoTowaでは、このMotion pipelineもその方向で進める。