状态:草稿(2026-10-13),已反映实测结果。 表格中的数字是 2026-10-13 下载的数据集副本,在只读临时 Pod(无 CPU、GPU)中使用 ffprobe 和 Python 标准库直接测量得到的值。未解压压缩包,仅读取了内部的文件列表和标签文件。论文或官方页面的数字作为“官方”单独记录。脚本和原始输出位于仓库
docs/experiments/2026-10-13-tt-dataset-stats/中。 编写规则:以实测数据为准,未能测量的标注为“未实测”。
目录
- 1. 为什么要亲自数
- 2. 一目了然
- 3. OpenTTGames:评估的基础
- 4. Extended OpenTTGames:Rally 是如何结束的
- 5. T3Set:带声音和传感器的训练视频
- 6. TT Sounds:清晰的击球声
- 7. RacketVision:球拍五点(乒乓球部分)
- 8. LATTE-MV:国际转播与自动追踪
- 9. 附赠:BlurBall 训练数据(公开部分)
- 10. 许可证与我们的方针
- 11. 重新统计的方法
- 参考
1. 为什么要亲自数
论文中的数据集表格一旦使用过,往往就不会再被核对。然而,模型的数字会直接继承数据的性质。如果在标记为“无球”的帧中能看到球,准确率就会虚假下降;如果 fps 混杂,“每帧位移量”之类的标准在不同剪辑中就会变成不同的含义。因此,在使用前我们必须亲自去数。数着数着,标签里的陷阱便浮出水面。
2. 一目了然
| 数据集 | 内容 | 规模(实测) | 分辨率 · fps | 球标签 | 声音 | 许可证 |
|---|---|---|---|---|---|---|
| OpenTTGames | 同一体育馆,侧面固定摄像机比赛 | 12 个视频,644,199 帧,89.5 分钟 | 1920×1080 · 120 | 仅事件附近帧 | 无 | CC BY-NC-SA 4.0 |
| Extended OpenTTGames | 上述 12 篇视频加上击球及回合结束原因 | 回合结束 281,击球 1,456 | (同上视频) | 保持原样 | 无 | CC BY-NC-SA 4.0 |
| T3Set | 业余多球训练,视频 + 球拍传感器 + 教练语音 | 选手 32,轮次文件夹 387,视频 734 个(26.9GB) | 1080p · 60(官方) | 无(传感器的击球时间) | 有 | CC BY-NC-SA 4.0 |
| TT Sounds | 球拍·球台·地面撞击声 | 15ms 样本 wav 6,037,标签 5,702,原始录音 149 | 仅声音 | — | 仅声音 | CC BY-NC 4.0 |
| RacketVision(仅乒乓球) | 国际转播中的球与球拍 5 点 | 剪辑 780,50 场比赛,170,027 帧 | 1920×1080 · 混杂 25/30/50/59.94/60 | 有(稀疏) | — | 代码 MIT,原始转播版权不明 |
| LATTE-MV | 国际转播回合剪辑 + 自动追踪结果 | 812 场比赛,剪辑 23,781 | 640×360 · 30 或 29 | 自动追踪(非人工标签) | 无 | 代码 Apache-2.0,原始转播版权不明 |
| BlurBall 训练数据(公开部分) | 在线比赛视频中的模糊标签 | 视频 463,标记 66,595 行 | 大多为 1280×720 · 大多为 25 | 模糊中心 + 角度·长度 | 部分 | 无标注 |
3. OpenTTGames:评估的基础
该数据集与 TTNet 论文(arXiv 2004.09927)一同公开,TT Score 的准确率数字几乎全部基于此。
视频
| 分类 | 个 | 帧 | 时长 |
|---|---|---|---|
| 训练(game_1–5) | 5 | 542,079 | 4,517 秒(75.3 分钟) |
| 测试(test_1–7) | 7 | 102,120 | 851 秒(14.2 分钟) |
全部为 H.264、1920×1080、120fps,且 没有音轨(经 ffprobe 确认 12 个视频均只有一个视频流)。单个训练视频大小为 3.9–10.8GB。由于手机实时处理上限为 60fps,我们仅使用偶数帧将其降采样至 60fps 后进行评估。
标签
每场比赛的 zip 包中包含三种内容。
ball_markup.json:{"프레임": {"x": …, "y": …}}. 若 x·y 为 −1,则表示“无球”。events_markup.json:{"프레임": "bounce" | "net" | "empty_event"}.segmentation_masks/*.png: 将人·球台·记分牌涂成不同通道的掩码。 其数量与带有球标记的帧数完全一致。
| 比赛 | 球标记帧数 | 可见球 | 无球 | 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 |
| 总计 | 52,987 | 52,018 | 969 | 1,777 | 1,350 | 1,144 |
事件总数 4,271 与官方页面的“4,271 个事件”完全吻合。这证明我们的统计方法是正确的。
陷阱
- 没有标记的帧并不代表“无球”,而是“未知”。 球标记仅存在于事件前 4 帧至后 12 帧(官方说明)。在总共 644,199 帧中,这部分占 52,987 帧, 8.2% 。如果把没有标记的帧当作“无球”,模型检测到的所有真实球都会变成错误答案,从而导致准确率大幅虚假下降。我们的加载器(
ttscore/data/openttgames.py)会将两者区分开来。 - test_7 中的“无球”不可信。 其他测试比赛的“无球”有 6–14 个,唯独 test_7 高达 104 个。其中 41 处实际上能看到球(经目视确认 6 处)。正因如此,BlurBall 在 test_7 上的准确率仅为 0.882,而剔除这 41 处后可达 0.9937(见第 2 篇)。
- “net”大多并非指球触网。 与名称相反,它大多是球越过球网瞬间所打上的标记。其前后水平速度比为 0.75–1.01,球几乎没有减速(见第 5 篇)。若要查找“卡在”网上的球,必须使用 Extended 的 net 结束标签。
- empty_event 的分布在不同比赛间差异巨大。 game_2 中有 536 个,而 game_5 中只有 19 个。由于这是一个在使用前必须先确认其含义的标签,我们选择不使用它。
4. Extended OpenTTGames:Rally 是如何结束的
这是在相同的 12 个视频基础上,附加了击球与回合结束原因的扩展数据集(arXiv 2512.19327, github moamal01/table_tennis_data)。它是我们裁判引擎的标准答案。
每场比赛的标签是一个 JSON, {"120fps 프레임": "값"} 。文件中混杂了三种类型的值。
| 类型 | 示例 | 实测数量 |
|---|---|---|
| 原始事件 | bounce, net, empty_event |
3,206(比原版少 — 见下方陷阱 1) |
| 击球 | left_forehand_serve neutral left_foot_lifted |
loop 583 · serve 290 · push 279 · block 187 · flick 65 · chop 30 · smash 12 · lob 10 |
| 回合结束 | right_out |
281. out 140 · net 83 · winner 34 · not_hitting_ball 10 · miss_on_own_side 10 · double_bounce 4 |
| 未知 | point, xright_… |
2 |
论文报告了 282 个回合结束,但按原因分类相加的和为 281。我们实测的值也是 281。其中,可得知“是谁发球”的 275 个回合被用于评估。
陷阱
- 如果在同一帧添加两个标签,其中一个会消失。 由于 JSON 的键是帧号,如果在有弹地(bounce)的帧上附加结束标签,弹地标签会被覆盖(例如:test_4 第 4530 帧的 bounce 被替换成了 right_net)。test_2 中则根本没有原始事件。因此,弹地与球网的标准答案不是从该文件中读取,而是从原本的 OpenTTGames 的
events_markup.json中读取。 - 前缀所指代的人因原因而异。 README 说明前缀表示“制造结局的选手”。对于 winner 和 double_bounce,带有前缀的选手会 得分,而其余情况下,带有前缀的选手会 失分 。 我们通过对比前一拍的方向进行了确认(winner 的 34 个中有 30 个一致,out 的 140 个中有 129 个一致),not_hitting_ball 的 10 个中有 8 个是未能击球的一方。
- README 中列出的技术有六种,但数据中却有八种。 还多出了 smash 和 chop。
- 左撇子。 test_3 和 test_7 各有一名,test_5 有两名(根据 README)。如果根据屏幕方向来推断正手和反手就会出错。
5. T3Set:带声音和传感器的训练视频
这是一个由两台摄像机、球拍传感器(9轴 IMU,100Hz)以及教练语音记录的业余多球训练数据集(KDD 2025, Zenodo)。下载的是分卷 zip(.zip + .z01–.z38)格式的 28GB 文件,我们 既没有合并也没有解压 ,仅读取了最后一个分卷的中心目录来统计文件列表。
| 项目 | 实测 | 官方 |
|---|---|---|
| 选手 | 32 | 32 |
| 轮次 | 387 个文件夹 | 380 |
| 技术(轮次文件夹数) | topspin 90 · push 89 · pendulum 43 · short 42 · block 41 · attack 41 · flick 41 | 7 种 |
| 视频 | 734 个(mkv 699, mp4 35),26.9GB | 1080p 60fps 两台 |
| 教练语音 mp3 | 1,014 | — |
| JSON(姿态·传感器对齐·教练指导) | 2,689 | — |
视频文件(mkv)中通过同一容器附加了声音(AAC 44.1kHz)(2026-10-11 确认)。由于它是罕见的集视频、声音和传感器于一体的数据集,因此被用于第 6 篇的声音实验。
陷阱
- 摄像机文件夹名称中存在拼写错误。 大多数是
remote(376)和right(354),但混入了romote1,rIGHT2,rIght1。如果仅通过文件夹名称来挑选摄像机,会有 4 个被悄悄漏掉。 - 轮次数与官方不符。 387 对 380。可能存在空轮次或重复,使用前需要核对(原因未查明)。
- 传感器时钟与视频存在偏差,且每轮各不相同。 视频文件名(以秒为单位)与传感器时间的偏差在 −1.5 秒到 +3 秒之间。诸如“传感器击球时间 ±30ms”之类的对齐方式不可盲目相信。
- 缺少球坐标标签。 球检测的准确率只能靠肉眼观察,且由于是多球训练, 落在地面和球筐里的静止球占了检测结果的 29% (120 张中有 35 张)。如果只统计“比赛中的球”,准确率为 0.54。
6. TT Sounds:清晰的击球声
这是图宾根大学公开的球拍与球撞击声数据集(arXiv 2409.11760)。一个 zip 包(845MB)中包含原始录音和 15ms 的音频片段。
| 项目 | 实测 |
|---|---|
| 原始录音 wav / 15ms 片段 wav | 149 / 6,037 |
标签表(full.csv)行 |
5,702(也有 train/test 80/20 的划分表格) |
| 表面 | 球拍 3,396 · 球台 777 · 地面 290 · 其他 1,239 |
| 球拍类型 | 10种(进攻型·防守型底板,海绵厚度,平面·长胶皮)。样本 207–892 个 |
| 球拍样本的旋转 | 无旋转 1,879 · 下旋 991 · 上旋 526(与 README 表格相同) |
| 标签表所指的原始录音 | 115个 |
陷阱
- 片段数量与标签数量不同。 在 6,037 个 wav 中,标签表中有 5,702 个;在 149 个原始录音中,标签表所指的是 115 个。如果使用文件夹中的所有文件,会混入没有标签的声音。
- 提供的划分将相同的录音拆分到了两边。 相邻的 15ms 片段同时进入了训练集和测试集,导致分数虚高。以原始录音为单位划分时,分数降低了 0.1–0.8%p(第 6 篇)。
- 311 个非球拍样本也有旋转标签。 这就是旋转列的总和与 README 表格不同的原因。不能假设「有旋转 = 球拍声音」。
- 这是在安静环境下的近距离录音。 这与手机麦克风和乒乓球馆的回声不同。正如第 6 篇中看到的那样,在实际录音中并未确认到这种效果。
7. RacketVision:球拍的五个点(乒乓球部分)
这是一个在乒乓球、网球、羽毛球国际转播中自动标注球的位置、球拍框以及五个点的数据集(arXiv 2511.17045, AAAI 2026)。三项运动合计 1,672 个剪辑,435,179 帧(数据集元数据)。我们只下载了乒乓球部分。球拍标注的详细形状在第 4 篇中。
| 项目 | 直接统计 |
|---|---|
| 剪辑 / 比赛 / 划分 | 780 / 50 / 训练 625 · 验证 69 · 测试 86 |
| 帧数 / 时长 | 170,027 / 3,878 秒,剪辑时长中位数 5.0 秒(1.7–5.16) |
| 分辨率 | 全部 1920×1080 |
| fps | 25(209) · 60(201) · 50(191) · 30(112) · 59.94(67) |
| 球的 CSV 行数 / 可见 | 19,495 / 16,961 |
| 带有球拍的标注帧数 / 球拍数量 | 6,648 / 8,060 |
陷阱
- 混合了五种不同的 fps。 相同的「每帧移动量」意味着每个剪辑的速度不同。我们在下载时留下的笔记中也写了「60fps」,但这次统计后才发现错了。若要使用基于时间的规则(如弹跳间隔 0.12 秒),必须读取每个剪辑的 fps。
- 元数据的标注数字段为空。
dataset_info.json的ball_annotated_frames·racket_annotated_frames在乒乓球的 780 个剪辑中全部为 0。实际的标注在每个剪辑的标注文件中。 - 标注较为稀疏。 标注帧的间隔中位数为 10 帧。并非每一帧都有标准答案。
- 视频版权。 标注标为 MIT,但视频是从 YouTube 的职业比赛转播中剪辑出来的。我们仅将其用于内部研究,不公开帧画面。
8. LATTE-MV:国际转播与自动追踪
这是一个从国际比赛转播中截取多回合,自动追踪球、球拍、乒乓球台以及运动员 3D 姿态的数据集(arXiv 2503.20936, CVPR 2025)。官方数据是从约 800 小时的转播中筛选出的 73,222 个多回合交换,时长约 26.7 小时。
| 项目 | 直接统计 |
|---|---|
| 比赛 / 剪辑 (mp4) | 812 / 23,781(仅视频 3.75GB) |
| 每个剪辑 | 视频、球的 CSV(Frame, Visibility, X, Y)、球拍 CSV、球台边缘、运动员 2D·3D 关键点、场景重建数组(帧 × 91 × 3)、元数据 JSON |
| 分辨率 · fps(随机 30 个剪辑,ffprobe) | 640×360 共 30 个剪辑 · 30fps 21个,29fps 9个 |
| 重建数组的 fps · 时长(随机 300 个剪辑) | 30fps 229个,29fps 71个 · 帧数中位数 109,「可用帧」中位数 70 |
| 音轨(30 个剪辑) | 无 |
陷阱
- 球坐标不是人工标注。 这是该数据管道的追踪结果。即使球被遮挡,Visibility 也为 1 且坐标已填充(BlurBall「漏掉」的 20 张图中,有 14 张是看不见球的)。
- 指向模糊痕迹的末端。 在被判定为与 BlurBall 不同的 40 张图中,有 25 张是同一拖影的另一端(第 2 篇)。用标注规则不同的数据来评估模型,这种差异就会表现为误差。
- 重复的帧。 剪辑中间有 27% 的帧与前一帧几乎完全相同(2026-10-11 实测)。实际 fps 可能低于 30。
- 视频版权不明。 数据卡片显示为 Apache-2.0,但未说明原始转播视频的版权。仅用于内部测试。
9. 附录:BlurBall 训练数据(公开部分)
出于好奇第 2 篇中的 BlurBall 是通过观察什么来学习的,我们统计了其公开部分。
| 项目 | 直接统计 | 官方(论文) |
|---|---|---|
| 录制 / 视频 | 文件夹 26 / 视频 463 | 录制 26 部,剪辑 443(训练 363 + 测试 80) |
| 帧数(标记行) | 66,595(球可见 58,547) | 64,119 |
| 分辨率 | 1280×720 363 · 1266×720 60 · 1920×1080 40 | — |
| fps | 25 222 · 30/29.97 139 · 60/59.94 67 · 23.98 10 · 其他 25 | — |
| 标记列 | Frame, Visibility, X, Y, theta, l | 模糊中心 + 方向 + 半长 |
将近一半的训练视频是 25fps。 这意味着模型是从快门较长、球的拖影很多的视频中学习的,这也解释了为什么需要「模糊中心」标签。我们没有核实为什么视频数量和帧数与论文略有不同。我们也不知道这个视频列表是否与公开划分相同,或者是否与 OpenTTGames 重叠。因此,我们不会将 OpenTTGames 上的 BlurBall 数据看作泛化性能。
10. 许可证与我们的方针
| 条件 | 数据 |
|---|---|
| CC BY-NC-SA 4.0(非商业性使用、署名、相同方式共享) | OpenTTGames, Extended OpenTTGames, T3Set |
| CC BY-NC 4.0(非商业性使用、署名) | TT Sounds |
| 标注较为宽松,但原始视频版权不明 | RacketVision (MIT), LATTE-MV (Apache-2.0) |
| 未标明 | BlurBall 训练数据 |
TT Lab 是一个非商业服务。因此,我们也可以使用通过非商业条件数据训练出来的模型。不过,我们会记录每个模型是通过哪种非商业数据训练的,如果方针发生变化,我们将使用我们自己的数据重新训练。当修改并公开具有相同条件(SA)的数据时,我们会以相同的许可证发布。对于原始视频版权不明的数据,我们仅将其用于内部测试,不会将这些帧发布到屏幕或文章中。这也是本文中没有数据集帧画面的原因。
11. 重新统计的方法
# 저장소 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 # 표준 라이브러리만
由于不需要解压压缩包,只需读取列表和标签文件,因此内存控制在 1GB 以内就完成了。分卷 zip(T3Set)的标准 zipfile 无法读取跨越多个分卷的 zip,因此我们使用了一个小工具(experiments/sound/splitzip.py)来直接解析最后一个分卷的中心目录。
乒乓球小贴士。 如果标有「无球」的地方却能看到球,那么即使模型猜对了,也会被判定为错误。亲自去统计数据虽然麻烦,但在相信模型之前,必须先确认标准答案是否值得信赖。
参考
- 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