用AI构建篮球投篮评估器:本地运行的计算机视觉投篮分析系统

摘要

该项目构建了一个本地篮球投篮追踪器,记录投篮命中、失手、投篮速度、投篮弧度、身体姿势和姿势。我们使用Roboflow训练的RF-DESTR物体检测模型定位球和篮筐,配合RF-DESTR关键点估计模型追踪射手姿势。

整个系统运行在笔记本电脑上。

我从初中开始打篮球。然而,仍有一些下午我在公园里打针,感觉自己没有任何进步。我想用计算机视觉来解决这个问题。目标是创建一个分析工具,自动记录击球、失误、释放速度、入场角度和形态。

所有程序都会在你自己的电脑上用自定义程序运行射频-DETR检测模型以及零点关键点跟踪.我也会教你怎么做。跟着我走GitHub仓库.

如何利用计算机视觉分析击球力学

为了将视频帧转化为漂亮的射击统计数据,流程包含四个部分。

  1. 眼睛是RF-DETR对象检测器,能在每一帧中定位球和边缘,而RF-DETR 关键点模型会追踪射手的手腕、肘部、肩膀、臀部和膝盖位置。
  2. 该内存涉及一个有状态引擎,该引擎在连续帧中保持位置、速度和关键点置信度分数的历史。
  3. 该判决涉及基于规则的物理模型,评估投篮释放时间、计算弹道弧度、测量物理距离,并判断球是否越过或未击中篮筐。
  4. 最后,系统会将事件 JSON 行记录到文件中,并渲染带有注释的视频,包含关节角度信息和实时速度追踪。
How to Build an AI Basketball Shot Evaluator

训练检测和姿态模型

该流水线支持两种模型:一种定制探测器和一种零样本关键点估计器。

对于球和篮筐跟踪,我们在Roboflow界面中使用亚利桑那大学公共“篮球投篮机器人”数据集的分支训练了一个RF-DETR-small模型。Roboflow 宇宙(~9.8k图片)。

原始数据集包含多个类别的标签,比如人和投篮动作,但我们只需要球和篮筐。训练后的模型实现了mAP50精度为88.84,精度为75.7,召回率为84.9。

在我们的测试录像中,它在98.1%的飞行帧中检测到球(774帧中的759帧)。

机械追踪方面,我们用RF-DETR 关键点(RFDETRKeypointPreview,摘自rfdetr软件包1.9.2版本)。就是这样可可17关键点模型运行,无需自定义训练、数据集创建或手动标记。

在可见关节上,关键点置信度持续为0.98到1.00。在我们的测试中,姿势模型在99%的帧中检测到了关键点,并在23次射击中有23次记录了肘部和膝盖的指标。

我们选择的原因RF-DETR 关键点相比其他型号,使用便利性更为突出。如果零次跟踪因任何原因失效,我们可以在同一个Roboflow工作区内微调它。

因为预先训练的检查点已经很不错了,所以没必要再训练。

型号标识符和包版本存储于models/registry.py这使得随着数据集扩展,替换重新训练的模型ID变得非常简单。

建立仓库

要在本地设置追踪器,可以克隆仓库,然后用以下方式搭建虚拟环境紫外线,并安装所需的依赖。

git clone https://github.com/aarnavshah12/shot-tracker.git
cd shot-tracker
uv venv --python 3.12 .venv
uv pip install -p .venv -e ".[dev,video,models]"
echo 'ROBOFLOW_API_KEY=your_key_here' > .env
.venv/bin/python -m app.server

该engine/软件包处理跟踪、状态转移、空间校准和度规计算。该models/目录隔离模型、API调用和注册表键。视频文件和摄像头接口存在于sources/渲染和事件记录由render/以及stats/.

真实法庭影像中的边缘案件

利用边缘校准物理空间

测量射击速度(公里/小时)和释放高度(米)需要将像素距离转换为物理测量值。标准相机校准通常会在场地上放置校准网格或棋盘格,但我们采取了不同的方法。

标准标准篮球篮筐内径为18英寸(0.4572米)。由于边缘在整个射击过程中保持在同一位置,系统计算检测到的边缘在多个帧中的中位边界宽度。

这个中位数像素宽度可以让我们计算整个视频剪辑的像素每米转换比,作为所有其他测量的比值。

利用姿态估计检测投篮释放

在单摄像机视频中,准确定位球何时离开射手手中很棘手。

初始攻球法在连续三帧超过设定速度阈值时,记录为击球释放。测试时,当玩家尝试假动作或蓄力动作时,该规则多次触发假释放。

修复方法是,释放事件只有在球在向上移动时物理上从射手手腕区域(按物理单位缩放0.35米)分离时才能触发。

这条规则也防止运球被当作射门。当运球从手中分离时,球会停留在射手手腕以下。但如果球员运球过于激进,球可能会升得足够快以符合速度测试,从而欺骗传球线,以为射门刚刚开始。

为此,状态机还计算球在连续帧和投影中抛物线轨迹的路径。如果投影弧线没有指向篮框边界盒的路径,那么投篮尝试就不会被记录。

How to Build an AI Basketball Shot Evaluator

网遮挡与物理

篮球一越过篮筐,网就到了遮蔽球。这带来了重大的追踪难题。

在我们的测试数据集中,两个真正进球的投篮被记录为未中,因为摄像机在篮筐处失去了对球的视线。球穿过篮筐时,球门被网挡住了两局。

一个基本的追踪器需要全程看到球,所以这个短距离让系统误以为投篮未中。

How to Build an AI Basketball Shot Evaluator

此外,在一个二维视频中,球从篮筐后方经过,看起来几乎和穿过球门的球一模一样。如果你自动假设篮筐附近任何漏判是命中,那么飞过篮筐后方的空中球将算作进球。

这个问题通过检查球重新进入视野时落地速度来解决。根据牛顿第一定律和第二运动定律,我们知道一个未被触碰的球应该加速多快。但当球穿过网时,摩擦力会使其减速到正常自由落体速度的10%到90%之间。

这种阻力证明球确实穿过了篮筐。

该管道将球的落点速度与三种检定进行比较:

  • 网球成功:球速度减慢至自由落体速度的10%到90%,确认射门已入网。
  • 在篮筐后方的空中球:球保持正常自由落体速度的100%,证明它从未触及球网。
  • 随机场球:速度降至0%,拒绝检测器在短暂遮挡瞬间检测到的多余球。
How to Build an AI Basketball Shot Evaluator

边缘反弹与单摄像机限制

弹在篮筐上也带来了另一个麻烦。

比赛初期,一记击中篮筐的投篮被分为两个独立事件:第一次弹跳未中,接着球穿过网内完成得分。

我们通过在球在篮筐附近弹跳时暂停呼叫来解决这个问题。如果弹跳球保持在网圈宽度以内并进网,发动机会记录一个震动球。如果球弹得很高且偏离,就会被击中。

单机位角度仍有2D限制。某些前轮圈弹出看起来和摇篮一样,从一个视角看。发动机不会猜测,而是将可疑的呼叫标记为“震动”或“阻塞”状态shots.jsonl.

为解决这个问题,下一步是训练一个自定义的边缘关键点模型,覆盖大约150张图像。追踪前、后、侧边缘可以让引擎将环形框建模为椭圆,而不是包围框。

本文并未构建该模型,但对于任何想要更敏锐决策的人来说,这是一个明确的下一步。

本地网页应用

对于偏好图形界面而非CLI命令的用户,仓库包含一个FastAPI服务器。

导航至http://127.0.0.1:7878运行后,代码会打开一个黑暗的仪表盘。你可以拖拽视频片段,逐帧查看处理条,并查看总出手次数、命中数、命中率和当前连胜数的总结图块。

运行成本

本地运行该系统不会产生持续费用。数据集托管和模型训练使用 Roboflow 的免费套餐。模型权重下载一次,缓存在你的机器本地。没有外部云API调用,没有按视频付费,视频素材也不会离开设备。

打造属于你的投篮追踪器

你可以在五个步骤内构建和定制自己的计算机视觉投篮追踪器:

  1. 在 上分叉篮球数据集Roboflow 宇宙(例如篮球投篮机器人数据集)并在Roboflow界面中训练RF-DETR-小型模型。
  2. 克隆镜头追踪仓库安装依赖 UV,并添加你的 Roboflow API 密钥.env.
  3. 在models/registry.py.
  4. 把手机架在球场边缘的三脚架上,保持边缘在画面的上三分之一范围内,录制投篮过程。
  5. 通过本地网页上传你的视频,获取你的分析。

延伸阅读

想了解更多体育分析和物体检测项目,请查看以下指南:

添加评论
点赞收藏
点踩分享查看原文
评论
?
参与讨论