ステータス: 下書き(2026-10-13)、一部実測値あり。 論文の数値は原典を開き条件とともに確認しました(AdaSpotの学会は公式リポジトリの表記で確認)。自分で実際に試したのはノートPCのCPUによるnumpyのサンプル(
code/10_map_delta.py)です。TT Scoreのイベント実測値は『TT Scoreモデル解剖』第5部と2026-10-13の研究ノートに「採用」として記録された値です(進行中の研究、リポジトリ外)。この回のPESモデルを卓球映像で動かしたことはありません(未実測)。 2026-10-15追記: AdaSpot(テニスsmall)とE2E-Spot(テニス、RegNet-Y 200MF)の公開ウェイトの速度を8GBクラスのGPUで測定し、第6節に追加しました。卓球の精度は再学習が必要なため、依然として未実測です。 シリーズ「ビジョンモデルを読む2」第10部。前回の記事: 小さくて速いボール追跡。映像モデルの基礎は 第6部にあります。
目次
1. 直感: 「何」ではなく「いつ」
第6部の映像モデルでは、クリップに1つのラベルを付与しました。「この2秒間は卓球のプレイ」。しかし、スコアを算出するには別の疑問が必要です。 ボールがレシーバー側のテーブルに当たったのは正確に何番目のフレームか。
このように「一瞬の出来事の正確なフレーム」を見つけ出すタスクを 精密イベント検出(Precise Event Spotting, PES) と呼びます。サッカーの「ゴール」や「コーナーキック」のように1〜5秒の誤差を許容するアクション検出(action spotting)とは異なり、PESでは 1〜2フレーム 以内であることが要求されます。テニスのバウンド・打球、フィギュアスケートのジャンプ着氷、ダイビングの入水が代表的なタスクです。
2つの難しさがあります。
- 極端な不均衡。 イベントフレームは全体の3%未満しかありません(E2E-Spot論文)。第9部におけるボールの画素数の問題を時間軸上で再び経験することになります。
- 隣接フレームがほぼ同じ。 バウンドフレームとその前後のフレームは画面がほとんど変わりません。「まさにこのフレーム」を選ぶには、非常に小さな違いに注目する必要があります。
2. 学習方法
E2E-Spot(ECCV 2022): フレームごとの分類を最後まで
E2E-Spotの構造は意図的にシンプルに設計されています。
- 軽量な2D画像ネットワーク(RegNet-Y 200MF、ImageNetで初期化)に第6部の Temporal Shift Module(GSM) を組み込み、フレームごとに特徴量を抽出しながら隣接フレームの情報を混合します。
- その上に 双方向GRU の層を1つ重ね、クリップ全体のコンテキストを把握します。
- フレームごとに (K+1)種類の分類を行います。Kはイベントの種類(例:手前のバウンド、奥の打球など)、+1は「何もなし」を意味します。損失関数にはソフトマックスクロスエントロピーを用います。
学習方式の核心は、その名の通り エンドツーエンド(end-to-end) である点です。事前に抽出された固定の特徴量の上にヘッド部分だけを学習させるのではなく、100フレームのクリップ(224×224)を丸ごと入力して画像ネットワークまで一緒に学習させます。不均衡に対処するため、イベントクラスの損失に5倍の重みを与えています。切り抜き、色味の調整、mixupのデータ拡張を使用し、推論時にはクリップを半分ずつ重ねて処理して平均を取ります(論文)。
固定された特徴量の上でヘッドだけを学習させた方式よりも、δ=1において4〜11 mAP高い性能を記録しました(論文)。事前学習済みの特徴量は「何」かということに特化しており、1フレームの微細な違いを捉えられないためだと解釈できます。
T-DEED(CVPRW 2024): 「何フレーム離れているか」を別途予測する
フレームごとに分類を行うだけでは、イベントの直前のフレームも「イベントに近い」ように見えて確率が分散してしまいます。T-DEEDでは2つの分岐を設けています。
- 分類ブランチ: E2E-Spotのようにフレームごとに(C+1)種類の分類を行う(正例に重みを付けたクロスエントロピー)。
- 変位ブランチ: イベント周辺の半径内のフレームごとに「実際のイベントまであと何フレーム離れているか」を回帰する(二乗誤差)。
推論時は、分類ブランチでおおよその位置を特定し、変位ブランチで正確なフレームを補正します。イベント周辺のフレームを単に「正例」として広げるラベル拡張(label dilation)よりも、この変位ブランチの方が優れていると報告されています(論文)。ネットワークはエンコーダ・デコーダ構造になっており、時間解像度を縮小してから再び拡大することで、複数の時間スケールのコンテキストを混合します。
AdaSpot(CVPR 2026): 必要な場所だけに解像度を割り当てる
テニスや卓球においてイベントの主役は小さなボールです。224pxに縮小された画面では、ボールがほとんど見えなくなってしまいます。かといって、すべてのフレームを高解像度で処理するとコストがかかります。AdaSpotでは2つの分岐を設けています。
- 低解像度ブランチ: 画面全体を低い解像度で処理します。
- 関心領域の選択: 低解像度特徴量のチャネル平均から「目立つ場所」のマップを作成し、時空間的にスムージングをかけた後、重要度を十分に網羅する最小の矩形を切り出して、元画像から112×112のサイズで切り抜きます。 この切り出し処理は学習されません。 関心領域のラベルは別途必要ありません。
- 高解像度ブランチ: 切り抜かれた小さな領域のみを元の解像度で処理します。
損失関数は重み付きクロスエントロピー(イベントの重みは5)であり、それぞれの分岐にも補助的なGRUヘッドを取り付けて損失を加算します(それぞれ1/3)。この補助損失がないと学習が不安定になると論文に記載されています。
3. 評価: mAP@δ
PES の採点方式は以下のとおりです。
- 予測(フレーム、種類、確信度)を確信度が高い順に並べます。
- 同じ種類の正解とフレームの差が δ 以下であれば正解となります。正解1つにつき予測1つのみをペアにします。
- 適合率-再現率曲線の下の面積が AP、種類ごとの平均が mAP です。
δ=1 は「正解フレームまたはその隣のフレーム」です。60fps なら ±17ms、25fps なら ±40ms であるため、 同じ δ でもフレームレートによって実際の時間の許容範囲が異なります。
実際に試してみる
code/10_map_delta.py にこの採点を実装し、400件のイベント(見逃し 5%、誤検出のノイズ 5%)に対して時間誤差が異なる3つの「モデル」を作成して採点しました(code/10_map_delta.out.txt)。行ごとに見逃し・ノイズを個別にランダム抽出ししているため、 同じ行内でのみ 比較してください。
| 時間誤差(標準偏差) | δ=0 | δ=1 | δ=2 | δ=4 |
|---|---|---|---|---|
| 0.3フレーム | 0.759 | 0.914 | 0.914 | 0.914 |
| 0.7フレーム | 0.317 | 0.905 | 0.944 | 0.948 |
| 2.0フレーム | 0.039 | 0.339 | 0.667 | 0.928 |
同じモデル(2.0フレーム)でも、δ によって 0.04 から 0.93 までスコアが変わります。 mAP の数値は δ なしでは読み取れません。 また、δ=0(正確にそのフレーム)は、時間誤差がわずか 0.7フレームであっても 0.3台まで低下します。論文が δ=0 を個別に報告し始めた理由はここにあります(下記の AdaSpot の表を参照)。
重複予測についても実験しました。イベントごとに ±1〜2フレームの範囲で確信度の低い予測を2つずつ追加しました。
중복 그대로 δ=0: 0.294 δ=1: 0.654 δ=2: 0.739
NMS(±2) 뒤 δ=0: 0.208 δ=1: 0.690 δ=2: 0.875
重複は「正解のない予測」としてカウントされ、適合率を下げます。±2フレーム以内の重複を削除する NMS により、δ=2 のスコアは 0.739 から 0.875 に回復しました。逆に δ=0 はむしろ低下しました。NMS が残した「最も確信度の高い」予測が必ずしも正確にそのフレームではない場合があるためです。後処理の効果も δ によって明暗が分かれます。
4. 論文の数値
| モデル | データ | δ=0 | δ=1 | δ=2 | 条件(論文) |
|---|---|---|---|---|---|
| E2E-Spot | テニス | — | 96.1 | 97.7 | 200MF。テニス 3,345クリップ・イベント 33,791件、6種(手前/奥 × サーブ・打球・バウンド) |
| E2E-Spot | フィギュア(FS-Comp)・飛び込み・体操 | — | 81.0 · 68.4 · 47.9 | 93.5 · 85.3 · 65.2 | 同一モデル |
| T-DEED | フィギュア(FS-Comp)・飛び込み | — | 85.15 · 71.48 | 91.70 · 87.62 | 200MF。800MF 飛び込み 73.23・88.88 |
| AdaSpot | テニス | 74.02 | 97.36 | 97.79 | RegNetY-400MF、1,063万パラメータ、56.78 GFLOPs、3シードの平均 |
| AdaSpot | F3Set(テニスの詳細イベント) | 55.38 | 69.37 | 69.94 | 同上 |
| E2E-Spot + MFS | 卓球(TTA) | 36.43 | 69.50 | 78.12 | スマホ撮影 39試合、30fps 720p、イベント 4,878件 8種 |
いくつか注意すべき点があります。
- AdaSpot 論文の比較表は、他の手法も同一の後処理(SNMS)で再実行した値であるため、E2E-Spot のテニス δ=1 は 97.01 となり、元の論文(96.1)とは異なります。表を組み合わせて比較する際は、出典を合わせる必要があります。
- テニスの δ=1 はすでに 97% 付近で頭打ちになっています。 差が出るのは δ=0 の場合です(AdaSpot は 74.02)。
- 卓球ははるかに困難です。 スマホで撮影された卓球(TTA)では δ=1 が 69.50 であり、同系統モデルのテニスの数値よりも 25ポイント以上低くなっています。ボールが小さく、イベントが密集しており(100フレームあたり 7.73件)、カメラが揺れるためです。F3Set の卓球部分はラリーが42本しかなく、学習データも少なくなっています(論文より)。
5. 制限事項
- クリップ単位 = 遅延。 双方向 GRU とオーバーラップさせたクリップの平均化は、未来のフレームを参照します。リアルタイムで使用するにはクリップの終端まで待つ必要があるため、1〜2秒の遅延が発生します(推定)。ラリー終了後の再確認により適しています。
- スポーツ種目間の距離。 公開されている重みはテニスやフィギュアなどのものであり、卓球の重みはありません。卓球用に再学習させる必要があり、公開されている卓球データの大部分は非商用条件です。
- 動画言語モデルでは代替できない。 F3Set の論文には、GPT-4V は競技やスコアボードを認識できたものの、打球の方向とフレーム間の時間的関係を把握できなかったため比較から除外したと記載されています(12篇)。
6. 我々のプロジェクトとの関連性
- 我々のエンジンはピクセルではなく軌跡を見る。 TT Score は、ボール検出(9篇)によって得られた軌跡からルールベースでバウンドを算出します(TT Score モデル解析 5篇)。残存するエラーの大半は、見落とされたバウンドではなく 誤検出のバウンド(打球をバウンドとして誤認したものなど)です。
- 学習ベースのバウンド判定器は、本記事の縮小版である。 軌跡特徴9個の過去16フレームを見る1D畳み込み(パラメータ約1.8万)により、バウンド・打球・ネット確率をフレームごとに算出します。学習にはこのアプローチの考え方をそのまま使用します。バウンドフレームを1、すぐ隣のフレームを0.5とする滑らかなラベル、ラベルが付与された区間内でのみカウントする重み付きBCE、そして30fpsのコピーを混ぜた学習です。このモデルでルールベースのバウンドをフィルタリングする仕組みを実際の配信用ストリーミング経路に組み込んだところ、OpenTTGamesのテスト7試合のクリアな映像において、バウンドF1(±2フレーム)が0.801から0.830に向上し、劣化11条件・627ラリーのラリー勝者正解率が+4.9%p(95%区間+2.9〜+7.2)向上しました。この仕組みは採用され、2026-10-14からリアルタイム・録画版の双方の作業者で有効化されています(研究ノート基準、進行中の研究 — ノートはまだリポジトリ外)。
- 先読み0の罠。 初期の実験で、先読みが0のモデルにバウンドのピークを直接選ばせたところ、破綻しました。ピークを選ぶには次のフレームの確率が必要ですが、先読みができないモデルの確率はバウンドの1〜2フレーム 前に分散してしまったためです。そのため、学習済みモデルはルールが検出したバウンドをフィルタリング(veto)する役割にのみ使用します。上記mAP実験の「δ=0は視覚誤差に極めて敏感である」という話と同じです。
- 録画版の教師候補。 AdaSpotはコードとテニスの重みがMITライセンスで公開されており、卓球で再学習させれば4本の「録画版教師」の候補となります。速度は2026-10-15に測定しました(8GBクラスGPU、ランダム入力、ウォームアップ後の中央値)。テニスsmall版(RegNet-Y 200MFの2分岐、推論用758万パラメータ)は100フレームのクリップ(高解像度分岐448×796)をbf16で85.9ms、 1フレームあたり0.86ms で処理し、GPUメモリは最大1.4GBでした。同じカードにおいて、E2E-Spot(RegNet-Y 200MF + GRU、445万パラメータ、224×224)はfp16で29.2ms、1フレームあたり0.29msでした。録画版を振り返る教師として使うには、どちらも十分に高速です。卓球で再学習させた場合の精度は未測定です(卓球の正解データによる学習が先決)。
TTの一言。 「バウンド検出97点!」という言葉を聞いたら、まず「δはいくつですか?」と聞いてみてください。同じモデルでも、δ=0では4点、δ=4では93点を獲得することもあり得ます。私が実際に採点してみました。
参考文献
- Hong et al., Spotting Temporally Precise, Fine-Grained Events in Video(E2E-Spot), ECCV 2022. https://arxiv.org/abs/2207.10213
- Xarles et al., T-DEED: Temporal-Discriminability Enhancer Encoder-Decoder for Precise Event Spotting in Sports Videos, CVPR 2024 Workshops. https://arxiv.org/abs/2404.05392
- Xarles et al., AdaSpot: Spend Resolution Where It Matters for Precise Event Spotting, CVPR 2026(リポジトリ表記). https://arxiv.org/abs/2602.22073
- Xu et al., Multi-Focus Temporal Shifting for Precise Event Spotting in Sports Videos(TTA卓球データ), arXiv 2025. https://arxiv.org/abs/2507.07381
- Liu et al., F³Set: Towards Analyzing Fast, Frequent, and Fine-grained Events from Videos, ICLR 2025. https://arxiv.org/abs/2504.08222
- Sudhakaran et al., Gate-Shift Networks for Video Action Recognition, CVPR 2020. https://arxiv.org/abs/1912.00381
- 自社測定:2026-10-13の研究ノートの採用記録(進行中の研究、リポジトリ外)。サンプルコードと出力:
code/10_map_delta.py,code/10_map_delta.out.txt