TT Lab
博客

한국어 English 日本語 中文

开始
博客

博客

亲自数数乒乓球数据集:OpenTTGames, Extended, T3Set, TT Sounds, RacketVision, LATTE-MV

状态:草稿(2026-10-13),已反映实测结果。 表格中的数字是 2026-10-13 下载的数据集副本,在只读临时 Pod(无 CPU、GPU)中使用 ffprobe 和 Python 标准库直接测量得到的值。未解压压缩包,仅读取了内部的文件列表和标签文件。论文或官方页面的数字作为“官方”单独记录。脚本和原始输出位于仓库 docs/experiments/2026-10-13-tt-dataset-stats/ 中。 编写规则:以实测数据为准,未能测量的标注为“未实测”。

目录

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 包中包含三种内容。

比赛 球标记帧数 可见球 无球 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 个事件”完全吻合。这证明我们的统计方法是正确的。

陷阱

  1. 没有标记的帧并不代表“无球”,而是“未知”。 球标记仅存在于事件前 4 帧至后 12 帧(官方说明)。在总共 644,199 帧中,这部分占 52,987 帧, 8.2% 。如果把没有标记的帧当作“无球”,模型检测到的所有真实球都会变成错误答案,从而导致准确率大幅虚假下降。我们的加载器(ttscore/data/openttgames.py)会将两者区分开来。
  2. test_7 中的“无球”不可信。 其他测试比赛的“无球”有 6–14 个,唯独 test_7 高达 104 个。其中 41 处实际上能看到球(经目视确认 6 处)。正因如此,BlurBall 在 test_7 上的准确率仅为 0.882,而剔除这 41 处后可达 0.9937(见第 2 篇)。
  3. “net”大多并非指球触网。 与名称相反,它大多是球越过球网瞬间所打上的标记。其前后水平速度比为 0.75–1.01,球几乎没有减速(见第 5 篇)。若要查找“卡在”网上的球,必须使用 Extended 的 net 结束标签。
  4. 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 个回合被用于评估。

陷阱

  1. 如果在同一帧添加两个标签,其中一个会消失。 由于 JSON 的键是帧号,如果在有弹地(bounce)的帧上附加结束标签,弹地标签会被覆盖(例如:test_4 第 4530 帧的 bounce 被替换成了 right_net)。test_2 中则根本没有原始事件。因此,弹地与球网的标准答案不是从该文件中读取,而是从原本的 OpenTTGames 的 events_markup.json 中读取。
  2. 前缀所指代的人因原因而异。 README 说明前缀表示“制造结局的选手”。对于 winner 和 double_bounce,带有前缀的选手会 得分,而其余情况下,带有前缀的选手会 失分 。 我们通过对比前一拍的方向进行了确认(winner 的 34 个中有 30 个一致,out 的 140 个中有 129 个一致),not_hitting_ball 的 10 个中有 8 个是未能击球的一方。
  3. README 中列出的技术有六种,但数据中却有八种。 还多出了 smash 和 chop。
  4. 左撇子。 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 篇的声音实验。

陷阱

  1. 摄像机文件夹名称中存在拼写错误。 大多数是 remote(376)和 right(354),但混入了 romote 1, rIGHT 2, rIght 1。如果仅通过文件夹名称来挑选摄像机,会有 4 个被悄悄漏掉。
  2. 轮次数与官方不符。 387 对 380。可能存在空轮次或重复,使用前需要核对(原因未查明)。
  3. 传感器时钟与视频存在偏差,且每轮各不相同。 视频文件名(以秒为单位)与传感器时间的偏差在 −1.5 秒到 +3 秒之间。诸如“传感器击球时间 ±30ms”之类的对齐方式不可盲目相信。
  4. 缺少球坐标标签。 球检测的准确率只能靠肉眼观察,且由于是多球训练, 落在地面和球筐里的静止球占了检测结果的 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个

陷阱

  1. 片段数量与标签数量不同。 在 6,037 个 wav 中,标签表中有 5,702 个;在 149 个原始录音中,标签表所指的是 115 个。如果使用文件夹中的所有文件,会混入没有标签的声音。
  2. 提供的划分将相同的录音拆分到了两边。 相邻的 15ms 片段同时进入了训练集和测试集,导致分数虚高。以原始录音为单位划分时,分数降低了 0.1–0.8%p(第 6 篇)。
  3. 311 个非球拍样本也有旋转标签。 这就是旋转列的总和与 README 表格不同的原因。不能假设「有旋转 = 球拍声音」。
  4. 这是在安静环境下的近距离录音。 这与手机麦克风和乒乓球馆的回声不同。正如第 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

陷阱

  1. 混合了五种不同的 fps。 相同的「每帧移动量」意味着每个剪辑的速度不同。我们在下载时留下的笔记中也写了「60fps」,但这次统计后才发现错了。若要使用基于时间的规则(如弹跳间隔 0.12 秒),必须读取每个剪辑的 fps。
  2. 元数据的标注数字段为空。 dataset_info.json 的 ball_annotated_frames·racket_annotated_frames 在乒乓球的 780 个剪辑中全部为 0。实际的标注在每个剪辑的标注文件中。
  3. 标注较为稀疏。 标注帧的间隔中位数为 10 帧。并非每一帧都有标准答案。
  4. 视频版权。 标注标为 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 个剪辑) 无

陷阱

  1. 球坐标不是人工标注。 这是该数据管道的追踪结果。即使球被遮挡,Visibility 也为 1 且坐标已填充(BlurBall「漏掉」的 20 张图中,有 14 张是看不见球的)。
  2. 指向模糊痕迹的末端。 在被判定为与 BlurBall 不同的 40 张图中,有 25 张是同一拖影的另一端(第 2 篇)。用标注规则不同的数据来评估模型,这种差异就会表现为误差。
  3. 重复的帧。 剪辑中间有 27% 的帧与前一帧几乎完全相同(2026-10-11 实测)。实际 fps 可能低于 30。
  4. 视频版权不明。 数据卡片显示为 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)来直接解析最后一个分卷的中心目录。

乒乓球小贴士。 如果标有「无球」的地方却能看到球,那么即使模型猜对了,也会被判定为错误。亲自去统计数据虽然麻烦,但在相信模型之前,必须先确认标准答案是否值得信赖。

参考

登录后即可点赞

评论

还没有评论。

登录后即可发表评论