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もその方向で進める。