这是「拳神AI视觉算法研究」系列的第三篇。系列顺序:难点(一)→ 有价值的数据与 AI 横向对比(二)→ 算法解决方案(本篇)→ 达到的水平 → 对拳击的意义。 先说清楚我们做的是什么:拳神不是给比赛打分,而是帮爱好者训练。在空击、打靶、沙袋这些以单人为主的场景里(打靶会有持靶教练,我们按"打拳者 / 持靶者"区分,不算两人对练),我们从视频里算出一份数据——出拳多少次、手多快、连击多少、节奏怎么样、体力、移动(移动指画面投影位移,不是真实步法距离)。这份数据能跨周比,也能根据缺口给建议。这篇只讲我们用了哪几个算法,工程部署那些事不展开。所有数字都是真机实测(2026-08 潘豪VS文达对练、空击评分链路、计数工具验证),能复现,弱点也不藏。

第一篇讲了六个难点,第二篇讲了数据底座和 AI 的边界。这篇回答最关键的问题:在零穿戴、单目、野外、不拍脸这四条限制下,我们到底用了哪几个方法把六个难点拆开,最后落到一份"用得上"的数据。

这篇的讲法先理一下:先把四个算法的名字列出来,再把名字解释清楚,然后讲每个算法是怎么实现的,最后讲它们分别解决了什么具体问题。

0. 这篇文章讲的四个算法

先把名字摆出来,心里有个谱:

1. 方法一:约束驱动的问题降级(问题重构)——一套把"难任务"换成"可解子任务"的方法论,落地的具体算法是局部 Z-score 突变检测(方法二)与 2D 相对运动学量化 2. 方法二:无参时序突变出拳检测(局部 Z-score 突变检测 / Local Z-score Spike Detection)——属于变点检测(Change Point Detection)家族,用统计突变数拳,不认拳种 3. 方法三:BoxLock 频率解耦的检测-追踪(Tracking-by-Detection 拳击变体)——贵的少跑、便宜的多跑,没把握就重来 4. 方法四:ReID 指纹 + 开局锚定的身份闭环(Re-identification)——人是特征,不是红蓝衣服,也不是站左边还是右边

1. 名词解释(先把名字弄懂)

这篇只用到四个关键名词,先列出来:Z-score、BoxLock、yolo11n、ReID

下面逐个解释:

Z-score(标准分):衡量一个数值偏离平均水平多少。比如平时出手速度有个均值,某一下的速度比均值高出好几倍"标准差",就认为这是一次出拳的突变。

BoxLock:是我们给"检测—追踪频率解耦"这套方案起的名字。Box 指目标框(检测出来的手套框),Lock 指锁定追踪。它本身不是某个新模型,而是一种架构思路:把"检测"和"追踪"两种操作按频率分开跑——检测贵就少跑,追踪便宜就多跑,追踪没把握就退回检测重来。

yolo11n / glove_detector_v3:我们用的目标检测模型,负责在画面里框出手套的位置。

ReID(重识别):给同一个人提取稳定的外观特征,让他转身、换位也能被认出来,而不是靠衣服颜色。

2. 四个算法的实现原理

名字懂了,下面讲每个算法到底是怎么做出来的。

方法一:把做不了的问题先改简单
方法一:把做不了的问题先改简单

2.1 方法一:约束驱动的问题降级(更接近"问题重构")

先说清它到底是什么算法:方法一不是一个神经网络,也不是某个现成模型,而是一套"把难任务换成可解子任务"的方法论,更接近"问题重构"(problem restructuring)——不是数学上严格的约束松弛。它自己不产出任何数字,而是决定后面用哪个算法、把哪个问题先放下。它落地成两个具体算法:把"认这一拳是什么"重写成"检测速度突变"(也就是方法二),把"单目 3D 重建"重写成"2D 相对运动学量化"。正是这套思路,决定了后面三个方法长什么样。

拳击场景里很多事,不是"做不出来",是"在这几条限制下做不出来":比如认"这一拳是刺拳还是勾拳",需要大量逐拳标注,业余视频里根本凑不齐;单目 3D 重建,误差大、算得慢,还违规。硬上更大的模型,只会撞在"没数据"和"不合规"两堵墙上。

方法一的做法是主动把问题改简单,改成限制内能做的版本:

这套思路是我们"不做评分、做数据快照"的底子:靠重新定义问题,把做不了变成做得了,并且老老实实标出哪些还做不到。改简单不是为了偷懒,是为了可靠。

方法二:只数速度突然飙起来的那一下
方法二:只数速度突然飙起来的那一下

2.2 方法二:无参时序突变出拳检测(局部 Z-score 突变检测)

先说清它到底是什么算法:方法二的核心算法是局部 Z-score 突变检测(local Z-score spike detection),属于变点检测(change point detection)家族——不训练任何分类器,只检测手套 / 手腕速度序列里的局部统计突变。方法一把"认拳种"降级成了"检测速度突变",方法二就是用这个具体算法把降级后的事做出来,而且一个标注都不用——因为长尾场景最缺的就是标注。

具体做法:盯着手套或者手腕关键点的速度,用滑动窗口算局部均值和标准差,连续几帧速度超出局部均值 2~3 倍标准差,就记一次候选出拳;再用最小间隔(比如 150 毫秒内只留一个峰)把一次出拳的"加速 + 减速"合并成"一次",避免一拳算两下。一个标注都不用。

打个比方:不要求你认出每只鸟是什么品种,只要求你发现鸟群突然起飞的那一下。起飞瞬间速度曲线一定有个尖峰,谁都能数。方法二干的就是"发现起飞",不是"识别品种"。

但得诚实:速度突变不是出拳的充分条件。快速收拳、摇闪、防守移动,速度同样会突然变快,纯速度阈值会把它们误计成出拳——这是现在计数假阳性的主要来源,也是为什么我们反复说"数拳可靠,但拳种认不了"。这部分得靠后面的学习模型去分,而不是再加阈值。

它守住我们一个原则:大模型不数拳,定量永远交给计算机视觉加规则。方法二是纯规则,不沾大模型;"这一下是刺拳还是交叉拳"那是语义层的事,留给多模态大模型去解读,绝不让它来数数。

方法三:贵的少跑、便宜的多跑
方法三:贵的少跑、便宜的多跑

2.3 方法三:贵的少跑、便宜的多跑,没把握就重来

拳击的动作对算法很不友好:手套尖速度 8 到 15 米每秒(职业选手峰值,业余者通常更低),单帧之间位移大、运动模糊普遍;一次出拳真正加速的那段只有 200 到 400 毫秒,边界很难切;两拳互相遮挡、贴身纠缠,检测器很容易漏。这几样叠在一起,"每帧都检测"在业余视频上既慢又容易累积误差——逐帧全检测的 baseline 只有 4.4 帧每秒。

方法三的核心,是把检测和追踪按频率分开跑:

这里有一个容易被忽视的真相:模型快,不等于系统快。yolo11n 纯推理能压到 26.6 毫秒一帧(约 37 帧每秒),但那只是检测、不含追踪和后处理。我们拿同批素材对比:逐帧全检测 baseline 仅 4.4 帧每秒,换成 BoxLock 间歇检测后 12.3 帧每秒——提速来自架构,不是单个模型。另一批真实对练素材实测约 12.8 帧每秒(已含 BoxLock + 后处理),瓶颈确实在追踪和后处理。很多"我们模型很快"的说法,把这一点藏起来了。

方法四:人是特征不是红蓝衣服
方法四:人是特征不是红蓝衣服

2.4 方法四:人是特征,不是红蓝衣服,也不是站左边还是右边

对练里两人会换位、转身。两个直觉上的笨方法会翻车:按位置认人——开局红方在左、蓝方在右,换位之后左边站的是蓝方,按"左边就是红方"去数就数错;按衣服颜色——多数时候拳套红蓝固定、颜色是稳特征,但当两人戴同色训练拳套、或贴身转身外观模糊时,颜色也会失效。贴身纠缠时外观短暂失效。

方法四把"认人"从单一代理(位置或颜色)换成"外观特征 + 运动轨迹"的融合,并且用开局锚定加人工兜底形成一个闭环:

这一条的价值不在于多准,在于口径对得上:算法数出来的选手A,和教练盯的那个穿黑裤子的是同一个人。贴身看不清时,靠架构上留好的人工兜底,而不是指望一个模型硬扛。

3. 它们分别解决了什么问题

四个算法的原理讲完了,回过头看:它们各自对应文章开头说的六个难点里的哪一个,又为什么难。

难点用的方法它怎么针对性解决
认拳种 / 单目 3D 在限制下做不了方法一 把问题改简单认"什么拳"改测"有没有拳"、单目 3D 改看相对运动,先把能算准的拿到手
无法逐拳标注 + 非出拳动作也提速方法二 测速度突变数拳绕开"没样本就识别率为 0"的死局,用统计规则把"有没有出拳"做成可复现基线(收拳 / 摇闪的假阳性留待学习模型解)
动作太快、实时跟不上方法三 检测和追踪分开跑贵的少跑、便宜的多跑,4.4→12.3 FPS;追踪没把握就退回检测,对应"看不清就不出数"
两人换位转身认错人方法四 按特征认人身份是特征不是位置,开局锚定加人工兜底,换位不换人,身份一模糊就不算

多说一句难点本身为什么难:

四个方法串起来看:方法一决定"什么问题值得做",方法二在没数据的情况下把数数做可靠,方法三在速度上把追踪做稳,方法四在一致性上把口径对齐。它们单独都是成熟技术,合在一起只为一个目标——一份可信、能复现、并且诚实标出边界的数据。

4. 下一步算法研究方向

下一步算法研究方向
下一步算法研究方向

前面四个方法是 1.0 阶段:用现成技术凑在一起,在四条限制下把系统从做不了拉到"能用"。下面 4.1–4.6 是往后想做的方向,顺带交代。先说清口径:出拳计数(数"有没有出拳")是可靠的、可复现的,前面说的节奏、连击都基于它;而精确动作分类(区分刺拳 / 直拳 / 勾拳)F1 只有 0.053,稀有拳种召回还是 0,真实素材实时性 12.8 帧每秒。0.053 是"这一拳到底是什么类型"的分类 F1,不是计数。分类近乎失败,不是部署问题,是规则方法本身的天花板——用规则、用阈值、用统计突变,能绕开没数据把数数做稳,但绕不开"这一拳到底是什么动作"这种需要理解的判断。要变好,得从规则换成学习,而且还是在数据依旧很少的前提下学。

4.1 从规则到学习:把数不清的交给模型

4.2 升维:从单帧平面到带时间的立体动作

现在的姿态底座是 YOLOv11-pose 的单帧平面,转身、下潜会有前后深度的歧义,动作理解停留在投影上。往后想引入带时间的姿态(MotionBERT)和三维姿态(4D-Humans、图到 SMPL),把单帧平面升到"三维运动",解决单人遮挡和尺度歧义——转身、闪避也能评,动作语义更准。更重要的是,三维运动能让我们"看不清就沉默"这条原则更聪明:系统能判断哪一段轨迹可信、哪一段该跳过,而不是只靠简单阈值。

4.3 让大模型做"翻译"(对应我们的原则)

这是最贴合我们定位的一块。计算机视觉加规则负责定量(数拳、算速度、连击、节奏),多模态大模型负责把数据翻译成人话——"你第三回合节奏塌了,因为连击占比从 40% 掉到 22%"。大模型只做语义,绝不数拳,正好落实"大模型不数拳"。这一层把冰冷的数据变成训练者听得懂的反馈,是"训练助手"真正的入口。

4.4 根据数据缺口给建议(对应我们的原则)

数据本身不是目的。我们想做的建议引擎遵循"建议必须有数据依据":规则从数据缺口触发——比如"连击占比低加节奏塌"就建议"练 1-2-3 组合衔接";"出拳频率逐周下滑"就建议"检查训练量或疲劳"。每条建议都能回链到具体指标,不空谈。

4.5 让数据自己滚起来

现在稀有类靠人工标注,长尾没解。想引入主动学习(自动挑最不确定的难例)加自监督预训练(用海量无标注视频先学通用表征)。要说明:2.0 的标注不是凭空来的——来自 1.0 系统产出 + 人工在环校准的逐年积累,主动学习只是加速这条路:模型自己标难例给人复核,形成闭环,长尾慢慢收窄、数据自我增殖。

4.6 边缘实时与量化(谨慎边界)

老实说投入产出:马上能做(不依赖硬件)的是出拳的时序模型二分类、追踪换 ByteTrack、把速度突变升级成学习,直接打在 F1=0.053 和召回=0 两个最痛的点上;中期是三维姿态、自监督预训练;谨慎或暂时不碰的是视频大模型(成本和延迟都不匹配业余场景,而且解释性差,违背"AI 点评必须挂靠真实数字")、不碰人脸(合规)、不盲目上单目 3D 重建(不在约束场景里误差太大)。

1.0 用规则把数据跑起来,2.0 用学习把数据做细,而学习的燃料是数据自己滚起来的飞轮。

5. 小结 + 下篇预告

这篇按"名字 → 解释 → 原理 → 解决问题"的顺序,把四个方法讲了一遍:

难点一到六的答案,一半在数据(第二篇),一半在算法(本篇)。但一份数据到底可靠到什么程度?哪些场景能给、哪些场景宁可沉默?和学术、和商业系统比,拳神在数据这条路上处在哪一格?

下一篇:达到的水平——用工程实测指标、与学术和商业系统的对比、一张行业差异矩阵,以及最关键的"诚实边界",把我们现在能提供的数据的真实可靠性钉死。

_数据不骗人。拳神也不该。_