Status: Draft (2026-10-13), incorporating actual measurements. The numbers in the table were directly measured from dataset copies downloaded on 2026-10-13, using ffprobe and Python standard libraries within a read-only temporary pod (no CPU, GPU). Archive files were not extracted; only the internal file lists and label files were read. Numbers from papers or official pages are noted separately as "Official." Scripts and raw outputs are available in the repository
docs/experiments/2026-10-13-tt-dataset-stats/. Authoring Rules: Measured data is the default; unmeasured items are marked as "Unmeasured."
Table of Contents
- 1. Why Count Firsthand
- 2. At a Glance
- 3. OpenTTGames: The Foundation of Evaluation
- 4. Extended OpenTTGames: How Rallies Ended
- 5. T3Set: Training Videos with Audio and Sensors
- 6. TT Sounds: Clean Impact Sounds
- 7. RacketVision: Five Racket Points (Table Tennis Portion)
- 8. LATTE-MV: International Broadcasts and Automatic Tracking
- 9. Bonus: BlurBall Training Data (Public Release)
- 10. Licenses and Our Policy
- 11. How to Recount
- References
1. Why Count Firsthand
Dataset tables in papers are rarely re-verified once published. However, model metrics directly inherit the properties of the data. If frames marked as "no ball" actually contain visible balls, precision artificially drops; if frame rates are mixed, criteria like "displacement per frame" take on different meanings across clips. Therefore, we count firsthand before use. Doing so exposes the hidden traps within the labels.
2. At a Glance
| Dataset | Content | Scale (Firsthand Count) | Resolution & fps | Ball Labels | Audio | License |
|---|---|---|---|---|---|---|
| OpenTTGames | Single gym, matches filmed with a fixed side camera | 12 videos, 644,199 frames, 89.5 mins | 1920×1080 · 120 | Only frames near events | None | CC BY-NC-SA 4.0 |
| Extended OpenTTGames | The 12 videos above with stroke and rally-end causes | 281 rally ends, 1,456 strokes | (Same videos) | Original format | None | CC BY-NC-SA 4.0 |
| T3Set | Amateur multi-ball training, videos + racket sensors + coach audio | 32 players, 387 round folders, 734 videos (26.9GB) | 1080p · 60 (Official) | None (sensor stroke timestamps) | Present | CC BY-NC-SA 4.0 |
| TT Sounds | Impact sounds for racket, table, and floor | 6,037 wav samples (15ms), 5,702 labels, 149 original recordings | Audio only | — | Audio only | CC BY-NC 4.0 |
| RacketVision (Table Tennis Only) | International broadcasts with 5-point ball/racket annotations | 780 clips, 50 matches, 170,027 frames | 1920×1080 · Mixed 25/30/50/59.94/60 | Present (sparse) | — | Code MIT, original broadcast rights unknown |
| LATTE-MV | International broadcast rally clips + automated tracking results | 812 matches, 23,781 clips | 640×360 · 30 or 29 | Automated tracking (not human-labeled) | None | Code Apache-2.0, original broadcast rights unknown |
| BlurBall Training Data (Public Release) | Online match videos with blur labels | 463 videos, 66,595 marker rows | Mostly 1280×720 · Mostly 25 | Blur center + angle & length | Partial | Not specified |
3. OpenTTGames: The Foundation of Evaluation
Released alongside the TTNet paper (arXiv 2004.09927), this dataset forms the basis for nearly all accuracy metrics in TT Score.
Video
| Split | Count | Frames | Duration |
|---|---|---|---|
| Training (game_1–5) | 5 | 542,079 | 4,517 secs (75.3 mins) |
| Test (test_1–7) | 7 | 102,120 | 851 secs (14.2 mins) |
All videos are H.264, 1920×1080, 120fps, and lack an audio track(verified via ffprobe across all 12 videos). Each training video is 3.9–10.8GB. Since real-time mobile processing caps out at 60fps, we evaluate by taking only even-numbered frames to downsample to 60fps.
Labels
Each match zip file contains three components.
ball_markup.json:{"프레임": {"x": …, "y": …}}. If x and y are −1, it means "no ball."events_markup.json:{"프레임": "bounce" | "net" | "empty_event"}.segmentation_masks/*.png: Masks coloring humans, tables, and scoreboards as channels. Contains the exact same countas the frames with ball markers.
| Match | Ball Marker Frames | Ball Visible | No Ball | bounce | net | empty_event |
|---|---|---|---|---|---|---|
| game_1 | 6,799 | 6,721 | 78 | 227 | 182 | 195 |
| game_2 | 17,444 | 17,275 | 169 | 591 | 430 | 536 |
| game_3 | 7,275 | 7,161 | 114 | 240 | 187 | 173 |
| game_4 | 7,073 | 6,971 | 102 | 231 | 187 | 176 |
| game_5 | 7,406 | 7,056 | 350 | 248 | 184 | 19 |
| test_1 | 887 | 880 | 7 | 31 | 24 | 1 |
| test_2 | 779 | 773 | 6 | 28 | 21 | 1 |
| test_3 | 805 | 798 | 7 | 31 | 18 | 6 |
| test_4 | 1,319 | 1,305 | 14 | 46 | 29 | 29 |
| test_5 | 1,018 | 1,008 | 10 | 34 | 26 | 5 |
| test_6 | 1,308 | 1,300 | 8 | 41 | 38 | 1 |
| test_7 | 874 | 770 | 104 | 29 | 24 | 2 |
| Total | 52,987 | 52,018 | 969 | 1,777 | 1,350 | 1,144 |
The event sum of 4,271 matches the official page's "4,271 events" exactly, confirming our counting method is correct.
Pitfalls
- Frames without markers indicate "Unknown," not necessarily "No Ball." Ball markers exist only from 4 frames before to 12 frames after an event (officially). Out of all 644,199 frames, 52,987 frames, or 8.2% have markers. If frames without markers are treated as "no ball," any genuine balls found by the model will be counted as false positives, drastically dropping precision. Our loader (
ttscore/data/openttgames.py) separates the two. - The "No Ball" labels in test_7 are unreliable. While other test matches have 6–14 "no ball" instances, test_7 alone has 104. Among them, 41 actually show a visible ball (verified visually across 6 chapters). Because of this, BlurBall's precision on test_7 was reported as 0.882, but rises to 0.9937 when those 41 instances are excluded (Chapter 2).
- Most "net" events do not actually hit the net. Contrary to the name, these markers are mostly attached the moment the ball passes over the net. The horizontal velocity ratio before and after is 0.75–1.01, showing almost no deceleration (Chapter 5). To find balls actually "caught" by the net, you must use Extended's net end label.
- The distribution of empty_event varies wildly across matches. game_2 has 536 while game_5 has 19. Because these labels require meaning verification before use, we exclude them.
4. Extended OpenTTGames: How Rallies Ended
An extension of the same 12 videos annotating strokes and the causes of rally endings (arXiv 2512.19327, github moamal01/table_tennis_data). This serves as the ground truth for our referee engine.
Labels consist of one JSON file per match, {"120fps 프레임": "값"} . Three types of values are mixed within each file.
| Type | Example | Firsthand Count |
|---|---|---|
| Original Event | bounce, net, empty_event |
3,206 (Fewer than original — see Pitfall 1 below) |
| Strokes | left_forehand_serve neutral left_foot_lifted |
1,456. loop 583 · serve 290 · push 279 · block 187 · flick 65 · chop 30 · smash 12 · lob 10 |
| Rally Ends | right_out |
281. out 140 · net 83 · winner 34 · not_hitting_ball 10 · miss_on_own_side 10 · double_bounce 4 |
| Unknown | point, xright_… |
2 |
The paper reported 282 rally ends, but the sum by cause is 281. Our firsthand count also yielded 281. Among these, 275 rallies where "who served" can be identified are used for evaluation.
Pitfalls
- Attaching two labels to the same frame causes one to disappear. Since JSON keys are frame numbers, assigning an ending label to a frame that already had a bounce overwrites the bounce (e.g., test_4 frame 4530's bounce becomes right_net). test_2 lacks original events entirely. Therefore, bounce and net ground truth are read from the original OpenTTGames
events_markup.jsonrather than this file. - The prefix subject differs depending on the cause. The README states the prefix represents the "player who created the end." For winner and double_bounce, the prefixed player winsthe point, while for others, the prefixed player loses it. Cross-referencing with the preceding stroke side confirmed this (matching 30 out of 34 winners, and 129 out of 140 outs), and for not_hitting_ball, 8 out of 10 corresponded to the player who failed to return.
- The README lists six techniques, but the data contains eight. smash and chop are additionally present.
- Left-handed players. test_3 and test_7 each have one, and test_5 has two (per README). Inferring forehand and backhand based on screen direction will lead to errors.
5. T3Set: Training Videos with Audio and Sensors
A dataset recording amateur multi-ball training using two cameras, a racket sensor (9-axis IMU, 100Hz), and coach voice prompts (KDD 2025, Zenodo). The 28GB dataset is provided as split zips (.zip + .z01–.z38); we counted the contents by reading only the central directory of the final piece without merging or extracting them .
| Item | Firsthand Count | Official |
|---|---|---|
| Players | 32 | 32 |
| Rounds | 387 folders | 380 |
| Techniques (Round Folder Count) | topspin 90 · push 89 · pendulum 43 · short 42 · block 41 · attack 41 · flick 41 | 7 types |
| Videos | 734 files (699 mkv, 35 mp4), 26.9GB | Two 1080p 60fps cameras |
| Coach voice mp3 | 1,014 | — |
| JSON (pose, sensor alignment, coach advice) | 2,689 | — |
Video files (mkv) have audio (AAC 44.1kHz) multiplexed in the same container (verified 2026-10-11). Because it is a rare dataset combining video, audio, and sensors, we used it for the audio experiments in Chapter 6.
Pitfalls
- There is a typo in a camera folder name. Most are
remote(376) andright(354), butromote1,rIGHT2,rIghtincludes a 1. Selecting cameras by folder name will quietly omit 4 instances. - The round count differs from the official figure. 387 vs. 380. Empty rounds or duplicates may exist, requiring verification prior to use (cause unverified).
- Sensor clock and video synchronization drift varies by round. The offset between video filenames (in seconds) and sensor timestamps ranged from −1.5 seconds to +3 seconds. Assumptions like "sensor stroke timestamp ±30ms" cannot be taken at face value.
- There are no ball coordinate labels. Ball detection precision could only be assessed visually; due to multi-ball training, resting balls on the floor and in baskets accounted for 29% of detections (35 out of 120 frames). Counting only "balls in play" yielded a precision of 0.54.
6. TT Sounds: Clean Impact Sounds
A racket and ball impact sound dataset published by the University of Tübingen (arXiv 2409.11760). A single zip file (845MB) contains original recordings and 15ms segments.
| Item | Firsthand Count |
|---|---|
| Original wav / 15ms segment wav | 149 / 6,037 |
Label table (full.csv) rows |
5,702 (train/test 80/20 split table also exists) |
| Surface | Racket 3,396 · Table 777 · Floor 290 · Other 1,239 |
| Racket types | 10 types (offensive/defensive blades, sponge thickness, smooth/long pimples rubber). Sample size 207–892 |
| Spin of racket samples | No spin 1,879 · Backspin 991 · Topspin 526 (same as README table) |
| Original recordings pointed to by label table | 115 |
Pitfalls
- The number of clips and the number of labels do not match. Out of 6,037 wav files, 5,702 are in the label table, and out of 149 original recordings, 115 are pointed to by the label table. Using all files in the folder mixes in unlabeled sounds.
- The provided split divides the same recording into both sides. Neighboring 15ms segments are included in both training and testing, inflating the score. Dividing by original recording units lowered it by 0.1–0.8%p (Part 6).
- There are spin labels even for 311 non-racket samples. This is why the total sum of the spin column differs from the README table. You should not assume "has spin = racket sound".
- It is close-mic recording in a quiet place. It differs from cell phone microphones and table tennis hall reverberation. As seen in Part 6, the effect was not confirmed in actual recordings.
7. RacketVision: Five-Point Racket (Table Tennis Part)
A dataset containing ball positions, racket bounding boxes, and five points in international table tennis, tennis, and badminton broadcasts (arXiv 2511.17045, AAAI 2026). The total for the three sports is 1,672 clips, 435,179 frames (dataset meta). We only downloaded the table tennis portion. Detailed shapes of racket annotations are in Part 4.
| Item | Manual count |
|---|---|
| Clips / Matches / Splits | 780 / 50 / Train 625 · Val 69 · Test 86 |
| Frames / Length | 170,027 / 3,878 sec, median clip length 5.0 sec (1.7–5.16) |
| Resolution | All 1920×1080 |
| fps | 25(209) · 60(201) · 50(191) · 30(112) · 59.94(67) |
| Ball CSV rows / Visible | 19,495 / 16,961 |
| Annotated frames with rackets / Number of rackets | 6,648 / 8,060 |
Pitfalls
- Five different fps values are mixed. The same "displacement per frame" means different speeds for each clip. When we downloaded it, we wrote "60fps" in our notes, but counting it this time revealed it was wrong. To use time-based rules (like 0.12 sec bounce intervals), you must read the fps for each clip.
- The annotation count field in metadata is empty.
dataset_info.jsonTheball_annotated_frames·racket_annotated_framesof is 0 for all 780 table tennis clips. Actual annotations are in clip-specific annotation files. - Annotations are sparse. The median interval between annotated frames is 10 frames. Ground truth is not available for every frame.
- Video rights. Annotations are marked as MIT, but the videos are clipped from professional match broadcasts on YouTube. We use them only for internal research and do not publish the frames.
8. LATTE-MV: International Broadcasts and Automatic Tracking
A dataset that automatically tracks 3D poses of balls, rackets, tables, and players by clipping rallies from international match broadcasts (arXiv 2503.20936, CVPR 2025). Officially, it features 73,222 rally exchanges filtered from about 800 hours of broadcasts, totaling about 26.7 hours.
| Item | Manual count |
|---|---|
| Matches / Clips (mp4) | 812 / 23,781 (video only 3.75GB) |
| Per clip | Video, Ball CSV (Frame, Visibility, X, Y), Racket CSV, Table corners, Player 2D/3D keypoints, Scene reconstruction array (frame × 91 × 3), Meta JSON |
| Resolution · fps (random 30 clips, ffprobe) | 640×360 all 30 clips · 30fps 21, 29fps 9 |
| Reconstruction array fps · length (random 300 clips) | 30fps 229, 29fps 71 · Median frames 109, Median "usable frames" 70 |
| Audio track (30 clips) | None |
Pitfalls
- Ball coordinates are not human labels. They are tracking results from that data pipeline. Even when the ball is occluded, Visibility is 1 and coordinates are filled in (out of 20 frames "missed" by BlurBall, 14 had the ball invisible).
- It points to the end of the blur mark. Out of 40 frames graded as different from BlurBall, 25 were the other end of the same mark (Part 2). If you evaluate a model with data having different labeling rules, that difference appears as an error.
- Duplicated frames. Frames nearly identical to the previous frame made up 27% of clip centers (measured on 2026-10-11). Actual fps may be lower than 30.
- Unknown video rights. The data card is Apache-2.0, but the rights to the original broadcast footage are not specified. Used only for internal testing.
9. Bonus: BlurBall Training Data (Public Portion)
We counted the public portion to see what BlurBall from Part 2 learned from.
| Item | Manual count | Official (Paper) |
|---|---|---|
| Recordings / Videos | Folders 26 / Videos 463 | Recordings 26, clips 443 (train 363 + test 80) |
| Frames (annotation rows) | 66,595 (ball visible 58,547) | 64,119 |
| Resolution | 1280×720 363 · 1266×720 60 · 1920×1080 40 | — |
| fps | 25 222 · 30/29.97 139 · 60/59.94 67 · 23.98 10 · Other 25 | — |
| Annotation columns | Frame, Visibility, X, Y, theta, l | Blur center + direction + half-length |
Nearly half of the training videos are 25fps. This means it learned from videos with long shutter speeds and heavy ball motion blur, which connects to why the "blur center" label was needed. We were unable to confirm why the video and frame counts differ slightly from the paper. We also do not know if this video list matches the public split or overlaps with OpenTTGames. Therefore, we do not read BlurBall numbers on OpenTTGames as generalization performance.
10. Licenses and Our Policy
| Condition | Data |
|---|---|
| CC BY-NC-SA 4.0 (NonCommercial, Attribution, ShareAlike) | OpenTTGames, Extended OpenTTGames, T3Set |
| CC BY-NC 4.0 (NonCommercial, Attribution) | TT Sounds |
| Permissive annotations, but unknown original video rights | RacketVision (MIT), LATTE-MV (Apache-2.0) |
| Not specified | BlurBall training data |
TT Lab is a non-commercial service. Therefore, we can also use models trained on non-commercial condition data. Instead, we record which non-commercial data each model was trained on, and retrain with our own data if policies change. When modified data under the same condition (SA) is released, we release it under the same license. Data with unknown original video rights is used only for internal testing, and those frames are not included on screens or in articles. This is also why there are no dataset frame images in this article.
11. How to Recount
# 저장소 docs/experiments/2026-10-13-tt-dataset-stats/
python3 dataset_stats.py <데이터셋 뿌리> > results/dataset_stats_YYYY-MM-DD.txt # ffprobe, numpy 필요
python3 label_stats.py <라벨 뿌리> > results/label_stats_YYYY-MM-DD.json # 표준 라이브러리만
Since we read only the lists and label files without extracting compressed files, it finished within 1GB of memory. For split zip (T3Set), standard zipfile cannot read zip files spanning multiple parts, so we use a small tool that directly parses only the central directory of the last part (experiments/sound/splitzip.py).
TT Note: If a ball is visible where it says "No ball", even if the model gets it right, it is graded as wrong. Counting data manually is tedious, but before trusting a model, you must check whether you can trust the ground truth.
References
- OpenTTGames: https://lab.osai.ai/, TTNet https://arxiv.org/abs/2004.09927
- Extended OpenTTGames: https://arxiv.org/abs/2512.19327, https://github.com/moamal01/table_tennis_data
- T3Set: https://zenodo.org/records/15516144, https://github.com/jima-cs/t3set
- TT Sounds: https://github.com/cogsys-tuebingen/tt_sounds
- RacketVision: https://arxiv.org/abs/2511.17045, https://huggingface.co/datasets/linfeng302/RacketVision
- LATTE-MV: https://arxiv.org/abs/2503.20936, https://huggingface.co/datasets/ember-lab-berkeley/LATTE-MV
- BlurBall: https://arxiv.org/abs/2509.18387