TT Lab
ブログ

한국어 English 日本語 中文

はじめる
ブログ

ブログ

1台のカメラで3D軌跡と回転を読み取る: TT3D、Uplifting Table Tennis、TT4D — 物理モデル対学習モデル

ステータス: ドラフト (2026-10-13)。 論文の数値は原文を開き、条件とともに確認しました(Upliftingの学会はCVFのオープンアクセスプロシーディングスで確認: WACV 2026, 7440–7449ページ — 2026-10-15)。実際に試したのはノートPCのCPUによるnumpyのサンプル(code/11_spin_physics.py、30秒前後)です。この簡易的な方法を自前の映像で動かしたことはありません(未実測)。 シリーズ「ビジョンモデルを読む 2」第11回。卓球台の角とホモグラフィはTT Scoreモデル解剖の第3回、3D極値のルールベース計画は第5回にあります。

目次

1. 直感: 2Dで失われた1つの次元

カメラは3Dの世界を2Dの画面に押し込みます。その過程で 奥行きが失われます。画面上の1点は、カメラから伸びる直線(視線)上のどこにでもある可能性があります。ボール1個の2D位置だけでは、そのボールがカメラから2m離れているのか4m離れているのか分かりません。

しかし、卓球には多くの手がかりがあります。

最後の手がかりは回転まで教えてくれます。トップスピンがかかったボールはより早く落ち、バックスピンはより浮いて進みます。 軌道の曲がり方を見れば、回転を逆算できます。

2D 점들 → 3D 궤적과 회전: 두 길 입력: 공의 2D 위치 열 + 탁구대 모서리 ① 물리 모델로 맞추기 TT3D 모서리 → 카메라 자세·초점 바운드 = 시선 ∩ 탁구대 면 속도·회전 최적화 비행: 중력 + 공기 저항 + 마그누스 학습할 것이 거의 없다 식이 틀리면 결과도 틀린다 ② 합성 데이터로 학습 Uplifting · TT4D 시뮬레이터 궤적 수만 개 3D·회전 정답이 공짜 트랜스포머 2D 점 열 → 3D 점 열 + 회전 증강: 점 빼기, fps 20–60 실제 영상 3D 정답 없이 학습 틀리는 곳 = 합성과 실제의 차이 TT4D: 먼저 3D 로 올린 뒤 사건을 나눈다 바운드 = 높이 z 의 극소 타구 = 길이 방향 x 의 극값 2D 의 「V 자」 보다 3D 의 「바닥에 닿음」 이 정의에 가깝다
図: 物理モデルによるフィッティングと合成データで学習したコンバーター

2. 物理モデルでフィッティングする: TT3D

TT3D(CVPR 2025ワークショップ)は学習を最小限に抑え、物理法則に頼ります。

  1. カメラ補正: 卓球台セグメンテーションモデル(小さなU-Net++、アノテーション1,200枚、ダイスロス)が卓球台の領域を見つけ、その4つの角からカメラの位置・方向と焦点距離を同時に求めます(PnPと焦点距離探索を交互に実行)。カルマンフィルタで時間的に滑らかにします。コーナーの誤差は2.39 ± 1.47ピクセルでした(40枚の画像、論文)。
  2. バウンドの3D位置: バウンド瞬間の視線と卓球台の平面の交点です。バウンドの時刻は、2D軌道に区分的2次曲線をあてはめ、BlurBall(第9回)が算出したブレ角度を加えて求めます。
  3. 速度と回転: バウンド直前の速度(3成分)と回転(3成分)を変数とし、その値で飛行方程式を積分して画面上に再投影した位置が、観測された2D位置に最も近くなるように最適化します(再投影誤差の最小化)。

飛行方程式は次のようになります(論文、記号のみ変更)。

m · dv/dt = −k_D · |v| · v  +  k_M · (ω × v)  +  m · g
m = 2.7g,  k_D = 3.8 × 10⁻⁴,  k_M = 4.86 × 10⁻⁶,  공 반지름 2cm

第1項が空気抵抗、第2項がマグナス力、第3項が重力です。バウンドは反発係数0.85、摩擦係数0.3の方程式により、ボールが卓球台で滑るのか転がるのかを分けて計算します。(論文ではk_Dが正の符号で書かれていますが、空気抵抗が運動に逆らう方向になるためには符号の規約を合わせる必要があります。TT4Dの付録では同じk_Dを負で記述し、k_Mは3 × 10⁻⁶とTT3Dとは異なって記述されています。サンプルではTT3Dの値を負の符号で用いました。)

3. 合成データで学習したコンバーター: Uplifting Table Tennis

物理フィッティングは正確ですが遅く、観測が欠損したりノイズが大きいと最適化が迷走することがあります。Kienzleらによる2つの論文は別のアプローチを取ります。 2Dの点列を入力として受け取り、3Dの点列と回転を直接出力するトランスフォーマーを学習させます。

問題は正解データです。実際の映像には、ボールの3D位置も回転も正解データはありません。そのため、 正解データをシミュレータで作成します。

シミュレーションから現実へのギャップを埋めるブリッジとなるのが データ拡張です。実際の検出器はボールを見逃すことがあり、フレームレートもまちまちであるため、学習時に5%の点をランダムにドロップし、フレームレートを20〜60fpsの間でサンプリングしました。突然軌道が途切れるケースや、ブレ、ぼやけも模倣しました。さらに、トランスフォーマーの位置エンコーディングに トークンの順番ではなく実際の時刻(2ms単位で丸めたもの)を使用することで、フレームが欠損したり間隔が異なったりしても時間的関係を把握できるようにしました(論文)。

前半の2D検出器は実映像で学習します。ボールは連続3フレーム、卓球台は13個の基準点をヒートマップ(二乗誤差、σ=6ピクセル)で検出し、ボール検出器はBlurBallデータの5万フレームで事前学習した後、1080pの卓球映像(TTHQ)でファインチューニングしました。異なる構造の補助検出器と結果が食い違う場合、その検出結果は破棄します(論文)。

4. まず3Dに持ち上げ、それからイベントを分割する: TT4D

TT4D(ACM MM 2026)はその順序を逆転させます。これまでは2D軌道からバウンドや打球を先に見つけてその間を3Dに持ち上げていましたが、TT4Dは ラリー全体をまず3Dに持ち上げてから イベントを分割します。

2D画面上では、バウンドも打球もどちらも「V字型の折れ曲がり」であるため見分けがつきにくいですが、3D空間では「地面への接触」と「方向転換」として定義そのものが異なります。学習は約300万点の合成軌道で行い、オクルージョンされたフレームは学習時にマスクし、補間トークンで埋めました。モデルは160万パラメータと軽量です(論文)。

5. 実際にやってみる: 回転はどれほど軌道を曲げ、逆算できるのか

code/11_spin_physics.py は上記のエピソード式を1ms間隔で積分します(code/11_spin_physics.out.txt).

回転が変える落下点。 自分側の端の高さ30cmから初速7.05m/s(わずかに上向き6.5°)で打たれたボールです。

아랫회전 50rps: x = 2.68m, 비행 463ms
회전 없음    : x = 2.09m, 비행 348ms
윗회전 50rps : x = 1.74m, 비행 284ms
참고: 공기가 없다면 x = 2.39m. 탁구대 길이는 2.74m

秒速50回転の回転の違いにより、最初に落ちる場所が1.74mから2.68mへと、ほぼ1m変化します。飛行時間も284msと463msで大きく異なります。回転のないボールであっても、空気抵抗のために真空中より30cm手前に落下します。ボールが軽いため(2.7g)、空気の影響が大きくなります。

逆算する。 トップスピン50rpsのボールの第1バウンド前の飛行区間を60fpsおよび30fpsで観測し、3D位置にノイズを混ぜた後、初速の3成分と回転の1成分をガウス・ニュートン法による最小二乗法でフィッティングしました(30回繰り返す)。TT3Dの手法を非常にシンプルに縮小したバージョンです。回転軸は横軸の1つに固定しました。

観測 3D位置ノイズ 推定の中央値 誤差の絶対値の中央値 上/下回転の正解率
60fps(17点) 1cm 50.5rps 6.2rps 100%
60fps(17点) 3cm 49.1rps 26.3rps 97%
30fps(9点) 1cm 50.9rps 6.0rps 100%
30fps(9点) 3cm 41.7rps 22.2rps 87%

位置ノイズが1cmであれば、回転の方向は常に正しく、大きさの誤差も±6rps程度です。3cmになると、大きさはほとんど信用できないレベルになり、30fpsでは方向まで13%間違えます。 回転は軌道のわずかな曲がりに隠されているため、数センチの位置誤差がそのシグナルをかき消してしまいます。 実際には3D位置ではなく2D位置しか観測できないため、さらに困難になります。そのため各論文では、回転を「何rps」という数値として回帰するのではなく、 トップスピン/バックスピンの分類として評価します(下表)。

6. 論文の数値

手法 数値(論文) 条件
TT3D 3D平均誤差: サイド 8.9cm(ノイズ時 12.4)・斜め 14.5(17.1)・後方 22.3(29.8)。成功率 サイド 97.3% 正解データは200Hzのマルチカメラ3Dトラッキング(クラブの試合、オレンジのボール)。2D入力は25fpsとしてシミュレート、軌道130個、位置ノイズ2px・ブレ角度6°。回転の正解データはないため回転精度は評価せず
Kienzleら 2025 実軌道50個の回転分類精度 92.0%, F1 0.917 国際大会6試合 2560×1440 50Hz。5万個の合成軌道のみで学習
Uplifting Table Tennis TTST(完全な入力)精度 97.1%、再投影 3.43px。フレームレート半減+検出10%脱落でも 97.1%・5.75px(前バージョンは67.7%に低下)。全体パイプライン TTHQ 57軌道の回転精度 89.5% 14万個の合成軌道のみで学習したバックエンド + 実映像で学習したフロントエンド
TT4D バウンド F1 0.92、打球 F1 0.83(±2フレーム)。TTST回転マクロF1 1.000(クリーン)、0.941(フレーム半減+脱落) イベントF1のデータセットは本文からは不明確。146時間・約4万6千試合分のデータセットを提案。2026-10-15時点では未公開(arXiv v2には「公開予定」とだけ記載。原文の単位はgamesだが5ゲーム3勝制のため実質1試合)
TT4D vs TT3D サイド区間の3D誤差 TT4D 15.04cm、TT3D 29.86cm TT4Dが作成した別のベンチマーク(フィルタリングが緩いデータ、ノイズを含む)。上記のTT3Dの8.9cmと同じ並びにしてはならない

最後の行は引用する際に特に注意する必要があります。TT3D自身のベンチマークでは8.9cmですが、TT4Dのベンチマークでは同じTT3Dが29.86cmになっています。 ベンチマークが異なれば、同じ手法であっても3倍以上異なる数値になります。

7. 物理モデル対学習モデル

物理モデルによるフィッティング(TT3D) 合成データによる学習(Uplifting · TT4D)
学習データ ほぼなし(卓球台のセグメンテーションのみ) 数万〜数百万個の合成軌跡
正解の出所 数式そのもの シミュレーター(物理は同じ、使い方は異なる)
欠損した観測・変更されたfps 最適化が不安定になることがある 拡張によって事前に学習(fps半減+10%の欠損でも耐える)
速度 ラリーごとに最適化 1回の順伝播(TT4Dは秒間500点以上、デスクトップ向けGPU)
説明可能性 数式の各項を検証できる ブラックボックスに近い
エラーが発生する箇所 数式が現実と異なる箇所(ボールの状態、床の摩擦) シミュレーターが現実と異なる箇所(Sim-to-Realのギャップ)

2つのアプローチは思っているよりも近いものです。学習モデルの「正解」も結局は物理シミュレーターから得られるためです。違いは 物理をテストのたびに解くのか(最適化)、学習時に一度体に覚え込ませるのか(拡張された合成データ) という点です。

8. 限界

9. 当プロジェクトとの関連

TTの一言。 秒間50回転するボールは、同じ力で打っても1m近く違う場所に落ちます。しかし逆に、軌跡から回転を読み取るにはボールの位置を1cm以内の精度で把握する必要がありました。曲げるのは簡単、読み取るのは困難。回転とはそういうものです。

参考文献

ログインするといいねできます

コメント

まだコメントはありません。

ログインするとコメントできます