调研 · 2026-09-03 · 业余对战 · 后方角落单手机位

回合与拍数怎么数

一段球场后方角落拍的业余对战视频,两个人都在画面里。现在靠击球声"一响一拍、一串响一回合"来数。这套办法靠不靠谱?别人是怎么做的?我们该怎么改?四路并行查证:学术论文、GitHub 开源、商业产品、声音法本身。

结论

  1. 你的怀疑是对的。纯靠击球声数拍,学术界测出来的成绩很差:只用"响度过线"这种阈值法,综合分只有 42~50 分(满分 100);训练过的声音分类器能到 80~92 分。但隔壁场的球声、掌声喊叫盖住击球、远端轻吊球声太小,这三种情况没有任何论文靠一个麦克风解决过。它们是结构性的,不是调参数能修好的。
  2. 市面产品几乎没有一家把击球声当主信号。查到的所有视频类产品、专利、论文,主流都是"看":球的飞行轨迹加上人的动作姿态。声音顶多是配角。
  3. 但"看球"这条路在我们这个机位上已经被我们自己实测判死(远端的球在画面里太小,真实跟踪率只有 26~44%)。而且没有任何一家产品公开支持"后方角落"机位,小球圈的用户就抱怨"不同机位分析结果天差地别",开发者承认了。
  4. 最现实的路:改成"看人"为主、"听声"为辅。每个球员各自的持拍手腕速度峰值来数各自的拍数,击球声只用来确认;再加上"两人必须交替击球、相邻两拍至少隔半秒"这类常识规则做修正。这条路在固定机位职业赛上做到了 95.9 分,不依赖球、天然分得清谁打的、隔壁场声音无关。在我们的角落机位上没有任何公开数字,要自己标金标测。

01先分清三个词

你说的"打了多少回合、挥了多少拍",其实牵扯三个不同的东西。它们各自对应不同的信号,这正是"一响一拍"不完全等于拍数的根本原因。

挥拍

人把拍子挥出去。挥空、假动作、试挥也算。

看人的动作能数

击球

拍子真的碰到了球。一次击球一定有一次挥拍,反过来不一定。

听声音、看球转向能数

回合

从发球到死球。中间有几次击球就是几拍。捡球、递球、走位不算。

要判"开始"和"结束",不是数响声

大家平时想要的"拍数"是每个人各自的击球次数,"回合数"是发球到死球的次数。声音数的是"响了几次",它既分不清是谁打的,也分不清这一串响是一个回合还是两个回合中间夹了个捡球。这就是你感觉"对也对,但不完全划等号"的来源。

02声音法的上限

羽毛球专门的击球声检测论文一篇也没查到,下面是乒乓球、网球、板网球的同类工作,原理相通。分数是论文原文报告的综合分(查全和查准的合并分,满分 100)。

工作方法成绩失效原因
乒乓球 · Zhang 2006只用能量峰(和我们现在一样)42查准只有 28%,大量误报
同上 · 加声音分类器能量峰提名,再用 MFCC+SVM 过一遍81查全掉到 73%,轻球漏掉
网球 · Huang & Cox 2011纯声音 MFCC+GMM,换场地测试41~50掌声、场馆噪声遮盖
同上 · 加球轨迹窗口和击球间隔常识声音提名,画面把关77~84提升约 30 分,全靠画面校验
网球 · IBM 美网 20198 层 CNN,四类(击球/掌声/播报/底噪),6568 个样本92原文明说击球声会被掌声盖住
板网球 · Decorte 2024CRNN 训练 2377 次击球,容差 ±250ms92漏检 13%:喊叫、球拍撞铁架、跺脚
手表 · 2018纯手表麦克风80加上手表动作传感器后 95.6

物理上为什么单靠声音必然出错

对我们现状的翻译:"一响一拍"在安静、单片场地、麦克风离球员近的情况下勉强能用;一旦多片场地同时打、有人喊叫、远端打轻球,就必然多数或漏数,而且没法靠调阈值修好。文献里唯一有效的解法,是让画面来当"门"。

03别人怎么做

学术界:三条技术路线

路线代表工作信号机位成绩能不能拿来用
看球MonoTrack / HitNet(CVPRW 2022)球轨迹 + 姿态 + 场地角点,再用"两人交替、相邻 ≥0.5s"规则优化转播94.6(无规则优化 86.3)非商用许可 规则思路可自写
看球Hsu 等,Sensors 2024TrackNet 轨迹 + YOLOv7 挥拍检测融合转播 + 大学赛72.3 → 90.5说明"球 + 挥拍"融合比单看球强 18 分
看球WASB(BMVC 2023)更强的球检测网络转播 720p93.1不解决我们的问题 输入照样缩到 512×288
看人Tanaka 等,2023两人位置 + 持拍手腕相对腰的位置,40 帧 LSTM,每人独立数单固定机位职业赛95.9(±20 帧≈0.7 秒)最贴近我们;作者自认做不到逐帧精度
看人Baek & Yun,2025ViT-Pose → ST-GCN → Transformer,每人独立判"击/没击"转播训练,双打测试单打 86.2 / 双打 66.9代码权重开源 可微调
看人Chien & Yu,2023不用球:姿态序列预测球飞行方向,方向翻转 = 击球转播±5 帧 64 / ±15 帧 80MIT 但权重下载链接失效
看人See 等(Monash),2025发球准备姿势判回合开始;连续无运动判结束未注明开始 ≈95 / 结束 95(187 回合)切回合不依赖球,思路可直接用
端到端E2E-Spot(ECCV 2022)纯画面帧序列,直接标出事件帧网球转播96.1(±1 帧)BSD-3 可商用 要自己标数据训练
端到端F3Set(CVPR 2025)同上,羽毛球 ShuttleSet 上转播70(±1 帧,苛刻口径)CC BY 4.0
声 + 画Decorte 板网球 2024 / Huang 网球 2011声音定时刻,画面(手腕距离、球窗口)定是谁、去误报固定机位92 / 提升 30 分就是我们该走的融合方式

GitHub 开源:没有一个在"业余手机后方机位"上报过准确率

项目星许可数拍 / 切回合的办法值得注意
SoloShuttlePose68MIT纯球轨迹规则:球的纵坐标峰值 + 转角 >130°;有球场画面 = 回合中用户 issue 反馈"球跟踪和击球检测不工作",不判谁打的
racquet-sports-analyzer(HF)—MIT球方向反转 或 手腕速度尖峰,双信号同意置信 0.9声称支持手机,零数字;融合逻辑可借鉴,球检测对羽毛球没用
RallyClip26无球场 + 姿态 → BiLSTM 逐帧判"在打/没打",有 iOS 端面向业余底线后手机视频;自评基准仅 14→31%
Automated-Hit-frame-Detection32MIT姿态 → 球方向 → 翻转 = 击球转播;权重网盘失效
MonoTrack56非商用球 + 姿态 GRU,再做约束优化缺 3 个权重;2023 停更
tennis_analysis885无球纵坐标变号且后续 30 帧中 24 帧保持 = 一拍场上超过 2 人即崩
E2E-Spot86BSD-3端到端事件帧定位,450 万参数,单卡几分钟一轮要自标击球帧
TTNet(乒乓)759无9 帧堆叠直接出"落台/过网"事件120fps 固定近机位,事件不含击拍;复现不到论文精度
Good-Badminton915Apache-2.0连续多帧是比赛视图 = 回合中README 明说击球点识别仍在迭代

音频这条线在 GitHub 上没有羽毛球项目,乒乓球只有一个 4 星的数据集加思路。

商业产品:都在"看",都要求正后方居中架高

产品信号机位要求用户怎么说
SwingVision(网球)专利中的单机 3D 球轨迹 + 球员 + 场地线,纯视觉底线后 1.8~3 米、离地 ≥1.4 米,两条底线都入画"它甚至跟错了球"、"把一片落叶当成球"、"打了两小时它以为我在跟发球机打"
剪球未公开,模型内置离线跑(推断纯视觉)官网称有拍摄建议,未展示App Store 4.7,"切分回合的精准度高"
小球圈未公开无官方指导"同一次打球,不同机位和角度拍出来,分析结果天差地别";开发者回复"机位和角度确实有影响……后面会开展固定机位录制"
好球哇视觉算法识别高光,多机位切换球馆固定安装,不是手机方案未查到用户原话
RallyVision(魔神智能)"发球到死球"逻辑,剔除喝水擦汗捡球未公开"功能还需要再完善"
好球 / 球迹 / 羽记(手表)手表动作传感器,不是视频手表戴持拍手"识别杀球和高远球数量太少,不准确"
Zepp Tennis(拍柄传感器)专利:回合 = 连续击球时间间隔阈值 + 发球动作开始—"把截击记成普通击球"
goSmash(羽毛球)17 关节姿态 + 球轨迹未公开未公开准确率

专利侧的印证:国内专利 CN114882591A 把"击球"定义为"执拍手臂挥动幅度的变化状态",不用声音;CN117953588A 用骨骼 + TrackNet,要求"从对向半场角度采集"。Zepp 的另一份专利用声音,但用的是欢呼声找高光,球拍撞击声被明确归为非高光。

没有一家产品公开支持后方角落机位。要么正后方居中架高(SwingVision 的标准),要么球馆固定安装(好球哇、PlaySight),要么干脆不给指导然后被用户骂(小球圈)。

04对我们机位的可行性

可用有条件 / 未验证不可用不需要

信号数拍分清谁打的切回合抗邻场噪音后方角落机位要训练吗依据
击球声(现状)42~50 分分不清只能靠间隔结构性失败听得到不用Zhang 2006 / Huang 2011 / 自家 8 月踩坑
球轨迹转向转播 94.6靠球在哪个半场球在飞 = 回合中无关自测 26~44%有权重MonoTrack / 自家 8 月 spike
人体姿态(手腕速度峰)固定机位 95.9天然按人发球姿势 95无关人能检出 99.8%,拍数未测规则版不用Tanaka 2023 / See 2025 / 自家 Task 9
端到端逐帧模型转播 96.1可输出可输出无关要自标数据必须,要 GPUE2E-Spot / F3Set
声音提名 + 姿态把关文献 +15~30 分按手腕距离归人 84~87配合发球姿势无动作对应的声音直接丢弃同上,未测不用Huang 2011 / Decorte 2024 / ICASSP 2021

看这张表,答案很清楚:在这个机位上,唯一稳定可得的强信号是"人"。球太小看不见,声音分不清谁的、挡不住邻场。人物检出率在我们自己的素材上是 99.8%,而且两个人各自的手腕动作天然就把"谁打的"分开了。

05建议路线

按代价从小到大排三步,每一步都能独立交付,用已有的 am01 三回合金标验收。前一步的收益不依赖后一步。

  1. 给声音加一道"画面的门",加常识规则

    零训练 · 零额外算力 · 几天 · 直接治邻场和码率两个坑

    • 声峰必须落在本场任一球员的手腕速度峰值前后 150 毫秒内(含 26 毫秒传播延迟),否则丢弃。隔壁场的球声、掌声、喊叫在画面里没有对应动作,自动被挡掉。
    • 阈值从"全片 99 分位"改成滑动均值的相对阈值,同一段视频不管什么码率结果一致。
    • 候选拍再过一遍常识规则:相邻两拍至少隔 0.5 秒、两人必须交替、拍数不超过回合秒数。MonoTrack 靠这一步从 86.3 提到 94.6,几十行代码。
    • 回合边界改用"发球准备姿势"判开始,替代现在的"提前 4 秒"问题(8 月实测发球前捡球递球把回合起点拉早了)。

    文献证据:画面校验让声音法提升 15~30 分。这一步做完,现在那套"一响一拍"就变成"一响、且画面里有人在挥拍、且轮到他打,才算一拍"。

  2. 主信号换成"看人",声音降为确认

    1~2 周 · 不需要训练(规则版)· 需要标 10~20 个回合的金标测精度

    • 每个球员各自的持拍手腕速度峰值 = 各自的挥拍;仓库里训练模式已经有单人版的这段逻辑,扩到两人,用近远端或 ByteTrack 分身份。
    • 回合 = 两人站定发球姿势开始,两人连续无大幅运动结束。不再依赖球,也不再依赖声音。
    • 声音只做两件事:确认这次挥拍碰到了球(区分挥空),和把击球时刻从 ±0.7 秒收紧到帧级。
    • 预期精度:固定机位职业赛 ±0.7 秒容差 95.9 分。我们这个角落机位没有任何公开数字,远端球员像素小、持拍手可能被身体挡住,要自己测。
  3. 中期:标几百个回合,训一个端到端模型

    要标注 · 要 GPU · 按你的规矩,逻辑闭环且前两步效果到位了再开

    • E2E-Spot(BSD-3,可商用,模型小)或微调 Baek 2025 的开源权重,直接从画面帧序列标出"谁在第几帧击了球"。
    • 天花板最高(网球转播 96.1,帧级),代价是自标数据。VideoBadminton 数据集(底线后 2 米、高 4.5 米自录)可当过渡训练数据,但许可是非商用。

明确不走的路

06数据与许可

数据集内容机位有没有逐拍击球帧许可
ShuttleSet / ShuttleSet2244 场 + 9 场,36,484 拍转播有MIT(视频版权另算)
BFMD 202619 场全程 1687 回合 16,751 次击球逐帧标注转播有未查到
VideoBadminton 2024校队 19 人自录,7822 段,含回合切分底线后 2 米、高 4.5 米、60fps有回合,击球帧待确认CC BY-NC-SA,下载入口未找到
F3SetShuttleSet 之上的逐帧事件标注转播有CC BY 4.0
Mendeley 2026884 段手机 / YouTube 视频混杂未见击球帧CC BY 4.0

结论:不存在"业余 + 非转播 + 逐拍击球帧"的公开数据集。任何方案在我们机位上的精度都得靠自己标金标来测。好消息是金标方法 8 月已经建立(音频提名加逐帧目检),am01 三回合可直接复用。

07没查到的和局限

08来源

2026-09-03 · 四路并行调研(学术 / GitHub / 商业产品 / 声音法),全部数字取自原文,未查到处如实标注。自家实测数据引自 8 月对战 spike 记录。