ステータス: ドラフト (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つの次元
- 2. 物理モデルでフィッティングする: TT3D
- 3. 合成データで学習したコンバーター: Uplifting Table Tennis
- 4. まず3Dに持ち上げ、それからイベントを分割する: TT4D
- 5. 実際にやってみる: 回転はどれほど軌道を曲げ、逆算できるのか
- 6. 論文の数値
- 7. 物理モデル対学習モデル
- 8. 限界
- 9. 自社プロジェクトとのつながり
- 参考文献
1. 直感: 2Dで失われた1つの次元
カメラは3Dの世界を2Dの画面に押し込みます。その過程で 奥行きが失われます。画面上の1点は、カメラから伸びる直線(視線)上のどこにでもある可能性があります。ボール1個の2D位置だけでは、そのボールがカメラから2m離れているのか4m離れているのか分かりません。
しかし、卓球には多くの手がかりがあります。
- 卓球台のサイズが決まっている(2.74m × 1.525m)。4つの角が見えれば、カメラがどこからどのような角度で撮影しているかを計算できます。
- バウンドする瞬間、ボールは卓球台の上にあります。 その瞬間の視線と卓球台の平面が交わる点が、ボールの3D位置です。
- ボールは物理法則に従います。 バウンドとバウンドの間の軌道は、重力、空気抵抗、回転によって生じる力(マグナス力)によってほぼ決まります。
最後の手がかりは回転まで教えてくれます。トップスピンがかかったボールはより早く落ち、バックスピンはより浮いて進みます。 軌道の曲がり方を見れば、回転を逆算できます。
2. 物理モデルでフィッティングする: TT3D
TT3D(CVPR 2025ワークショップ)は学習を最小限に抑え、物理法則に頼ります。
- カメラ補正: 卓球台セグメンテーションモデル(小さなU-Net++、アノテーション1,200枚、ダイスロス)が卓球台の領域を見つけ、その4つの角からカメラの位置・方向と焦点距離を同時に求めます(PnPと焦点距離探索を交互に実行)。カルマンフィルタで時間的に滑らかにします。コーナーの誤差は2.39 ± 1.47ピクセルでした(40枚の画像、論文)。
- バウンドの3D位置: バウンド瞬間の視線と卓球台の平面の交点です。バウンドの時刻は、2D軌道に区分的2次曲線をあてはめ、BlurBall(第9回)が算出したブレ角度を加えて求めます。
- 速度と回転: バウンド直前の速度(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位置も回転も正解データはありません。そのため、 正解データをシミュレータで作成します。
- 物理シミュレータ(MuJoCo)を用いて卓球の軌道を大量に生成します。2025年版は5万個、2026年版(Uplifting)は14万個(2Dの点が約470万個)です。3D位置と回転がすべて判明している「タダの正解データ」です。
- この3D軌道を仮想カメラで2Dに投影し、入力データを作成します。
- 学習は、3D軌道の二乗誤差 + 初期回転の二乗誤差で行います(2025年版、論文)。
シミュレーションから現実へのギャップを埋めるブリッジとなるのが データ拡張です。実際の検出器はボールを見逃すことがあり、フレームレートもまちまちであるため、学習時に5%の点をランダムにドロップし、フレームレートを20〜60fpsの間でサンプリングしました。突然軌道が途切れるケースや、ブレ、ぼやけも模倣しました。さらに、トランスフォーマーの位置エンコーディングに トークンの順番ではなく実際の時刻(2ms単位で丸めたもの)を使用することで、フレームが欠損したり間隔が異なったりしても時間的関係を把握できるようにしました(論文)。
前半の2D検出器は実映像で学習します。ボールは連続3フレーム、卓球台は13個の基準点をヒートマップ(二乗誤差、σ=6ピクセル)で検出し、ボール検出器はBlurBallデータの5万フレームで事前学習した後、1080pの卓球映像(TTHQ)でファインチューニングしました。異なる構造の補助検出器と結果が食い違う場合、その検出結果は破棄します(論文)。
4. まず3Dに持ち上げ、それからイベントを分割する: TT4D
TT4D(ACM MM 2026)はその順序を逆転させます。これまでは2D軌道からバウンドや打球を先に見つけてその間を3Dに持ち上げていましたが、TT4Dは ラリー全体をまず3Dに持ち上げてから イベントを分割します。
- バウンド = 高さzの極小点。
- 打球 = 卓球台の長さ方向xの極値(ボールが進行方向を変えた場所)。打球の間隔が0.2秒以上、卓球台の端から0.3m以上離れていることといった簡単な条件を追加します。
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. 限界
- 固定カメラの仮定。 3つの方法すべて、ラリー中にカメラが動かないことを前提としています。手持ちのスマートフォンは揺れます(TT3Dはカルマンフィルターで補正をスムーズにしますが、大きな動きは別問題です)。
- 実際の3D正解データが少ない。 TT3Dの複数カメラによる正解は例外であり、残りは再投影誤差や回転分類によって間接的に評価されます。
- ライセンス。 UpliftingのコードはGPL-3.0、TT3Dのリポジトリにはライセンスファイルがなく、TT4Dはまだ公開前です(調査レポート時点)。私たちはGPLのコードを持ち込まず、手法のみを実装するという原則をとっています。
9. 当プロジェクトとの関連
- 現在のエンジンは2Dと卓球台の平面まで。 TT Scoreは卓球台の4つの角からホモグラフィを求めてボールの2D位置を卓球台の平面座標に変換し、2D軌跡の折れ曲がりからバウンドを検出します(TT Scoreモデル解説の第3回・第5回)。残っているエラーの大部分は「打球をバウンドと誤読した偽のデータ」ですが、これは2Dでは両者が同じV字に見えるためです。
- TT4Dの数式ベースの3D極値ルールを検討中。 3Dに拡張すると、バウンド(zの極小値)と打球(xの極値)の定義が分かれます。第5回に記載した計画であり、まだ実験はしていません(未計測)。
- サイドからの撮影が最も有利。 TT3Dの結果ではサイドが8.9cmで最も正確であり、エンド側は22.3cmでした。私たちが推奨する撮影位置(卓球台の横、三脚の使用)と一致しています。
- 回転は「おまけ」として。 例が示すように、回転の大きさは位置のノイズに対して非常に脆弱です。スコア判定には不要であり、コーチングにおいて「上回転だったのか」程度を分類する用途で使うのが現実的です(推測)。
TTの一言。 秒間50回転するボールは、同じ力で打っても1m近く違う場所に落ちます。しかし逆に、軌跡から回転を読み取るにはボールの位置を1cm以内の精度で把握する必要がありました。曲げるのは簡単、読み取るのは困難。回転とはそういうものです。
参考文献
- Gossard et al., TT3D: Table Tennis 3D Reconstruction, CVPR 2025 Workshops(CVSports). https://arxiv.org/abs/2504.10035
- Kienzle et al., Towards Ball Spin and Trajectory Analysis in Table Tennis Broadcast Videos via Physically Grounded Synthetic-to-Real Transfer, CVPR 2025 Workshops. https://arxiv.org/abs/2504.19863
- Kienzle et al., Uplifting Table Tennis: A Robust, Real-World Application for 3D Trajectory and Spin Estimation, WACV 2026, pp. 7440–7449(CVFオープンアクセス). https://arxiv.org/abs/2511.20250
- Rahmanian et al., TT4D: A Pipeline and Dataset for Table Tennis 4D Reconstruction From Monocular Videos, ACM MM 2026. https://arxiv.org/abs/2605.01234
- サンプルコードと出力:
code/11_spin_physics.py,code/11_spin_physics.out.txt