TT Lab
Blog

한국어 English 日本語 中文

Get started
Blog

Blog

From Phone Video to Scores: The Four Tiers and Time Budget of TT Score

Status: Draft (2026-10-13), reflecting measured data. The accuracy and timing metrics in this post are measured values, with measurement dates and conditions noted in each table. Academic figures are explicitly marked as "Paper," and unmeasured items are marked as "Unmeasured." As research is ongoing, these numbers are subject to change. Rule of thumb: Measured data is the default; unmeasured items are marked as "Unmeasured."

Table of Contents

1. What TT Score Aims to Do

If you place a smartphone on a tripod beside a ping-pong table, the scoreboard on the screen advances automatically with every rally. When a call is ambiguous, it displays "Review Needed," allowing a human to tap and correct it once. These corrections become the training data for the next iteration.

While simple in concept, updating a single point requires the machine to determine all of the following:

  1. Where is the ball on the screen? Tracking a 4cm-wide ball traveling at speeds exceeding 100 km/h in every single frame.
  2. Where is the table on the screen? To know if the ball has hit the table and which half it landed on, the four corners of the table are required.
  3. What happened? Extracting events from the ball's trajectory, such as "bounce," "net," "out," and "rally end."
  4. So, who won? Applying the sequence of events to table tennis rules to determine the winner and the reason.

This series explores the models and rules that answer these four questions one by one. This post serves as the overall roadmap.

2. Map of the Four Tiers

휴대폰 카메라 옆면 삼각대 · 512×288 JPEG 로 줄여 보냄 1층 인식 — 프레임마다 서버 GPU, 창 하나 약 10ms 공 — BlurBall (x, y, 신뢰도, 번짐 길이·각도) 탁구대 — 탭 · SAM 2.1 네 모서리 → 평면 변환(한 번) 자세·라켓 (보조) RTMPose · MediaPipe · 라켓 5점 소리 (실험) onset · 테이블/라켓 분류 공 궤적 + 테이블 기하 2층 이벤트 — 규칙 CPU, 표본당 0.1–0.4ms 공백 메우기 → 바운드 · 네트 · 아웃 · 끝 최근 2.5초를 표본마다 다시 돌려 새 이벤트만 낸다 (시각, 종류, 쪽, 신뢰도, 가로 속도) 3층 심판 — 탁구 규칙 랠리 끝 → 판정 목표 1.5초 바운드 순서로 「누가 쳤나」를 추론 → 승자 · 이유 신뢰도 0.6 아래면 「확인 필요」 표시 4층 느린 확인 — 비동기 초 단위, 점수를 막지 않음 확인 필요 랠리만: 사람이 한 번 눌러 고침 (계획) 클립을 영상-언어 모델로 교차 확인 — 표시만 점수판
Figure: The Four Tiers of TT Score and Data Flow Between Them
Tier Task Components Used Where and How Much
Tier 1: Perception Finds ball coordinates and table corners from frames Ball: BlurBall. Table: Human tap, SAM 2.1. Auxiliary: Pose (RTMPose, MediaPipe), Audio (Experimental) Server GPU, 10.5ms per ball-finding window
Tier 2: Event Extracts bounces, nets, outs, and ends from ball trajectories Handwritten rules(events.py) CPU, 0.1–0.4ms per sample
Tier 3: Referee Determines rally winner and reason from event sequence Table tennis rules(referee.py, rules.py) Same CPU process
Tier 4: Slow Review Ambiguous rallies are re-evaluated by humans (and eventually vision-language models) Single human tap Asynchronous, does not block scoring

Why Split into Tiers?

The primary reason is that the adjudication rules must be correct before the modelsNo matter how accurate the ball coordinates are, misinterpreting rules like "the serve must bounce once on your side and once on the opponent's side" leads to incorrect scores. Therefore, Tiers 2 and 3 are decoupled from the models as pure Python functionsAll rules can be tested using synthetic trajectories and events without any video, and swapping out the ball model leaves the referee untouched.

The second reason is to isolate failure pointsIf a single monolithic model processes video end-to-end to output scores, it is impossible to tell whether an error stems from failing to detect the ball or misapplying the rules. By dividing into tiers, the same evaluation can be run with three different inputs: "model-detected ball," "ground truth ball," and "ground truth bounce," allowing us to measure which tier generates the error. Part 5 demonstrates using this method that "most remaining errors stem from event extraction, not ball detection."

The third reason is licensing and costEach tier can use the smallest possible tool. Ball detection only requires a 1.49-million parameter model, and the referee requires no GPU.

What Was Chosen and Excluded in Each Tier

Role Chosen Reason for Choice Excluded and Reason
Ball BlurBall (MIT license, 1.49M parameters) Labels the centerof blurred balls, matching the long motion blur at 60fps, and showed the best standalone performance among five compared models (Part 2) TrackNetV2, MonoTrack, WASB standalone: Low recall of 0.71–0.96. Combining them helps in dark videos but doubles GPU time
Table Four human taps, and SAM 2.1 tiny in experiments (Apache-2.0, 38.9M parameters) Because the camera is fixed, it only needs to be done once at the start of the match. Human taps serve directly as prompts (Part 3) YOLO-family segmentation models: AGPL license. SAM 3: Separate license, access to weights requires approval, 848M parameters
Pose & Racket RTMPose (Apache-2.0), MediaPipe Pose (Apache-2.0 code) Already used in coaching UI. Used only as a "Review Needed" signal for scoring (Part 4) Filtering bounces using pose degraded winner accuracy by 1.1–5.5 percentage points
Audio Not included in engine While clean recordings isolate table sounds 99% of the time, no efficacy was confirmed in actual training hall recordings (Part 6) —
Slow Review Currently human Authority to change scores remains with humans Using vision-language models for refereeing: Processes 1 frame per second by default, so the bounce moment is missing from the input (Part 8)

3. Time Budget: 16.7ms and 1.5 Seconds

Real-time scoreboards face two time constraints.

60fps — 프레임 하나에 16.7ms BlurBall 창 하나 10.5ms (fp32) 남는 6ms fp16 이면 8.0ms · 엔진(이벤트+심판) 0.12ms · 같은 카드를 나누면 40ms 넘음 30fps — 프레임 하나에 33.3ms 10.5ms 여유는 크지만 공은 두 배 멀리 날아간다 랠리 끝 → 점수: 가장 늦는 길은 1.5초 마지막 바운드 공이 계속 보이는데 새 바운드가 1.5초 없으면 「끝」 판정
Figure: Frame Budget and Decision Budget

Actual Time Spent per Frame

Component Time (Median after Warm-up) Condition
Ball Detection, Real-time (3 recent frames per window per new frame) 10.5ms(fp32), 8.0ms (fp16) 2026-10-12, Server GPU (24GB class) idle with no other tasks, median of 200 runs × 3 after 30 warm-up runs
Ball Detection, Recorded (non-overlapping 3-frame windows, batch of 8 windows) 3.42ms per frame (1 window), 2.81ms (batch of 8) 2026-10-11, Same GPU. Each window processes 3 frames simultaneously, so per-frame cost is about 1/3 of the window time
Ball Detection, Sharing the same card with other tasks 40–46ms per window 2026-10-11, When 1 text-to-speech task and 2–3 segmentation experiments were running concurrently
Event + Referee (re-running the last 2.5 seconds per sample) 0.118ms per sample (median), 0.422ms (95th percentile) 2026-10-13, Laptop CPU, 320,000 samples

The threefold difference in ball detection time between the two rows is core to the real-time design. BlurBall takes 3 frames and outputs 3 heatmaps. For recordings, windows can be shifted by 3 non-overlapping frames, but real-time processing requires running a fresh window on "the latest 3 frames including the newly arrived frame" every time a new frame arrives, using only the final heatmap. This choice triples the GPU workload in exchange for keeping latency within a single frame interval. Using the middle heatmap would look at both preceding and succeeding frames but would require waiting one extra frame; the empirical performance difference between the two approaches was under 1 percentage point (approx. 300 sample frames).

In summary, on an empty card, a single session consumes about 63% (10.5 / 16.7ms) of the 60fps budget. Sharing the same card with other tasks pushes a single window past 40ms, failing to maintain 30fps let alone 60fps. Therefore, the system drops lagging windows without queuing them. Only one slot is kept for the next window to process, and if the GPU falls behind, new windows overwrite that slot. Queuing would cause latency to grow indefinitely. In the 2026-10-11 measurements, the proportion of frames dropped due to processing speeds falling below 30fps (22–28% of submitted frames) did not result in increased latency.

The current real-time demo has the browser send JPEGs downsized to 512×288 (quality 0.7, measured 12–18KB) at 30fps intervals. Sending raw video would increase bandwidth requirements tenfold and merely increase the server's downscaling burden. In the development environment, the round-trip time from browser submission to response was a median of 65ms, with the 90th percentile at 84ms. Operational performance over the public internet remains unmeasured due to varying network hops.

Time to Decision

The event tier uses the rule: "A rally ends if no new bounce occurs for 1.5 seconds after the last bounce." 1.5 seconds covers 98% (1,066 out of 1,087) of bounce intervals within rallies across 12 real matches. However, this is the worst-case path. An "out" call triggers when the ball lands off the table, and an "out of play" end triggers immediately if the ball disappears from the screen.

Decision latency measured on October 13, 2026, using the actual deployment path (Section 4 below) is as follows. Decision latency is calculated as the timestamp of the event generating the decision minus the timestamp of the human-labeled rally end.

Scope Median Decision Latency 90% Within 1.5 Seconds
12 Real Matches, 275 Rallies 0.16s 1.23s 98.9%
Among them, 7 Test Matches, 57 Rallies 0.39s 1.32s 100%

This represents only the algorithmic waiting time, excluding computation and network transit times.

4. Data Flow Between Tiers

Splitting into tiers makes the "contracts" between tiers critical. The actual values exchanged are as follows:

Boundary Schema Notes
Browser → Tier 1 512×288 JPEG, sequence number, capture timestamp (ms) Dropped if exceeding 120KB
Tier 1 → Tier 2 Per frame: (t, x, y, conf) x and y are empty if no ball is present. Blur length and angle are also output but not currently used by the engine
Table → Tiers 2 & 3 Four corners → Transformation from screen to table plane Once at the start of the match
Tier 2 → Tier 3 Event(t, kind, side, conf, vx, vx_in) kind is bounce, net, out, or end. vx is velocity along the table length immediately after the bounce (table lengths/second)
Tier 3 → Scoreboard PointCall(winner_side, reason, confidence, t) Let if winner_side is empty. Review needed if confidence is below 0.6

Two aspects stand out. First, Tier 2 receives ball coordinates only Video pixels do not cross past Tier 1. Second, bounce events carry "horizontal velocity." The referee uses this value to distinguish between "balls heading toward the net like a serve" and "balls returning to the opponent." This single numerical value significantly reduced false scoring in real matches (Part 5).

5. Current Standing: The October 13, 2026 Baseline

Evaluated using 12 actual matches from the public dataset OpenTTGames (5 for training and 7 for testing) along with the Extended OpenTTGames labels, which add rally end causes on top of them. The targets are 275 rallies with known servers, and the primary metric is rally winner accuracy.

Pipeline Winner Correct Incorrect without Review Review Required No Decision
Recorded Scoring (decided after watching the full rally) 91.3% (251/275) 13 108 3
Deployed Live Pipeline(re-runs the last 2.5 seconds per sample) 90.2% (248/275) 15 129 2
Test 7 matches only, deployed pipeline 87.7% (50/57) 6 26 1

Conditions: Ball coordinates use BlurBall pre-trained weights as-is (no fine-tuning), table corners are obtained from the dataset's segmentation masks, engine version 2026-10-13. Only the engine was re-run on a laptop CPU.

There are four caveats to keep in mind when reading these numbers.

  1. Even the same engine behaves differently depending on the pipeline. Recorded scoring and the live pipeline differed by 3 rallies on clean footage, but their rankings flipped under dark or blurry conditions. Therefore, all subsequent experiments report both pipelines.
  2. Scores are within-sample. The rule engine was tuned while observing these 12 matches. The same applies to the 7 test matches, making this accuracy more optimistic than performance on unseen footage.
  3. One gym, one angle. OpenTTGames was filmed in a single venue with a fixed side camera at 120fps (downsampled to 60fps). Performance with mobile phones, local table tennis club lighting, and different angles has not been measured. Since the list of 26 BlurBall training videos is not public, it is unknown whether they overlap with OpenTTGames.
  4. Changing the corners changes the numbers. Recorded scoring using corners obtained with SAM 2.1 on 2026-10-12 was 93.1% (256/275). Since that corner file was lost, the baseline was re-established using the dataset mask corners. How much corner quality affects the score is covered in Parts 3 and 5.

6. Future Directions

Most of the remaining errors stem from event extractionrather than ball detection (Part 5). Therefore, the next phase of focus is less on "models that find the ball better" and more on "signals that distinguish bounces and hits and filter out rule-violating sequences." The model investigation from 2026-10-13 has a three-line authority structure. Below is the investigation and design; effectiveness has not been measured yet (in progress).

  1. Perception. Output probabilities and "health" (0–1, indicating whether this signal is currently reliable) separately for each signal. Ball detection uses BlurBall constantly, turning on a secondary ball model only during occlusions or darkness. Add racket/pose, audio (onset + surface classification, with synchronization and health assessment taking priority), and table plane.
  2. Events → Umpire. Replace the current rule-based decision logic with Constrained Viterbi decodingincorporating table tennis rally sequences as allowed transitions. If the score difference between the best and second-best paths is small, trigger "Review Required" (Part 5, Section 5).
  3. Slow Review. Send clips of rallies requiring review to a vision-language model for cross-verification, and flag them only if it disagrees with the umpire (Part 8).

The five candidates selected by the same investigation are Constrained Viterbi with rule grammar, precise event localization models (such as AdaSpot), audio surface classification and audio-video synchronization, RacketVision (5-point racket tracking), and occlusion-resilient ball tracking (TOTNet). We will evaluate them one by one using the same baseline (Section 5) and the same two pipelines, and add them to this series.

7. Series Map

Part Coverage
Part 2 Ball Detection TrackNet → WASB → BlurBall. Heatmap regression, multi-frame input, motion blur labeling, HRNet
Part 3 Table Detection SAM 2.1, EfficientTAM, SAM 3. Prompt-based segmentation, memory attention, deriving four corners and homography from masks
Part 4 Pose and Racket RTMPose (SimCC), MediaPipe, RacketVision 5-point racket tracking
Part 5 Events and Umpire Trajectory-based bounce/hit extraction rules, umpire engine, path of accuracy improvements from 66.9%, 3D extrema rules, and constrained Viterbi
Part 6 Sound Onset detection and surface classification. Negative results showing no effectiveness in actual recordings
Part 7 Datasets Empirical counts and pitfalls for OpenTTGames, Extended, T3Set, TT Sounds, RacketVision, and LATTE-MV
Part 8 Vision-Language Models Why we do not delegate judgment to them

A Word from TT. Finding the ball well and scoring accurately are two different problems. This series traces the gap between them with numbers.

References

Sign in to like

Comments

No comments yet.

Sign in to leave a comment