本文目录导读:

分析球员跑动热点图(Heatmap)的开源项目主要涉及数据获取、计算机视觉(CV)或GPS/轨迹数据处理以及数据可视化三个层面,下面从技术栈、开源工具推荐和实现思路三个维度来拆解。
核心思路:数据的两个来源
- 基于视频的计算机视觉(CV):这是最主流且开源生态最丰富的方式,利用目标检测(如YOLO)和跟踪算法(如DeepSORT/ByteTrack)识别并追踪球员位置,然后映射到球场坐标系。
- 基于传感器/轨迹数据:如果拥有GPS、UWB(超宽带)或光学追踪系统输出的
(x, y, timestamp)坐标数据(如StatsBomb、Second Spectrum格式),则直接跳过CV,直接进行坐标插值、平滑和核密度估计(KDE)计算。
推荐的顶级开源项目(按功能划分)
视频分析类(最推荐,端到端)
-
Roboflow / Ultralytics (YOLOv8) + ByteTrack:
- 这是目前最流程化的组合,使用YOLOv8做球员/裁判检测,ByteTrack做多目标跟踪(MOT)。
- 优势:CPU/GPU均可运行,社区庞大,中文资料多。
- 实战路径:检测 -> 跟踪 -> 获取ID和BBox中心点 -> 透视变换到2D球场图。
-
Sportlight(开源,Python/Node):
- 由足球数据分析社区维护,特别针对足球广播视频优化。
- 核心功能:自动分割球场、单应性矩阵(Homography)矫正、球员检测与跟踪(基于深度学习的GPU版本)。
- 特点:它帮你解决了“把视频画面映射到平面图”这个最棘手的透视问题。
-
PySport / YOLO 足球追踪开源套件:
- 在GitHub搜
football-player-tracking能找到大量结合YOLOv8和OpenCV的项目,提供了交互相机视角切换功能。
- 在GitHub搜
纯数据处理与可视化类(不涉及视频,直接处理坐标)
- mplsoccer(Python):必选神器,它不只是画图库,内置了标准球场(FIFA国际标准)、以及完整的
pitch绘制对象。- 核心方法:
pitch.kdeplot(x, y, shade=True)一行代码即可生成平滑的热力图,它内部封装了Scipy的KDE或Statsmodels的KDEMultivariate。
- 核心方法:
- kloppy(Python):用于解析各种专业数据格式(如Opta、StatsBomb、Tracab)的SDK,帮你把原始
x,y轨迹数据标准化为统一的坐标系。
实战技术路线图(以视频分析为例)
如果你要从零开始,最简单的开源技术栈是:Python + YOLOv8 + ByteTrack + OpenCV + mplsoccer。
Step 1:球场检测与透视变换(将视频坐标转为球场坐标) 这是最复杂的一步,在视频中,跑道是倾斜的,需要将视频中的像素点映射到标准球场平面的比例尺。
- 方法:提取球场线(如禁区、底线),用OpenCV的
cv2.findHomography计算Homography矩阵H。 - 开源简化:你可以手动点击视频四个已知点(如球场的四个角),然后使用
mplsoccer提供的pitch.transform或者手动计算单应矩阵,将球员所有像素坐标点(u, v)转换为标准球场(x, y)。
Step 2:目标检测与追踪
- 使用
ultralytics库加载yolov8x.pt模型。 - 将所有检测到的中心点连接成轨迹线,注意:要过滤掉裁判和球,只保留“球员”类(Class ID 0)。
Step 3:生成热力图(KDE核密度估计)
- 将转换后的
x, y坐标列表传入mplsoccer的kdeplot。 - 参数调优:
shade=True填充颜色,levels=100控制平滑度,cmap='hot'定义色带,通常需要设置bw_method=0.15(带宽)来调整热点聚合程度(带宽越小,热点越尖锐,越大越平滑)。
推荐的开源“零代码”或轻代码工具
如果你不想写太多代码,但对开源有要求,可以试试:
- Tracab Clone (GitHub搜索):有一些项目专门复刻了Tracab、Signify等商业系统的可视化效果,它们把YOLO检测结果直接以半透明圆形覆盖在球场上,实现速度极快,但不做热力渲染,而是画“轨迹线”。
- Kloppy + DataFrames:如果你有StatsBomb数据,Kloppy负责解析,Pandas负责筛选某个球员,然后直接用Matplotlib画散点图,配合Seaborn的KDE即可。
进阶优化建议(针对开源改造)
- 关于速度:纯YOLO处理高清直播会很慢(约15 FPS),开源优化方案是“抽帧”(如每3帧检测一次,中间帧用KCF/Kalman滤波器插值),在精度损耗极小的前提下将速度提升3倍。
- 关于数据平滑:球员位置抖动会导致热力图出现“毛刺”,推荐在生成KDE前,使用Savitzky-Golay滤波器(
scipy.signal.savgol_filter)对轨迹坐标进行平滑。
示例代码片段(基于mplsoccer)
import pandas as pd
from mplsoccer.pitch import Pitch
# 假设你有球员的坐标数据 (x, y)
# df = pd.DataFrame({'x': [x_list], 'y': [y_list]})
pitch = Pitch(pitch_type='uefa', pitch_color='grass', line_color='white')
fig, ax = pitch.draw(figsize=(12, 8))
# 'viridis' 或 'hot' 是热力图的经典配色
pitch.kdeplot(
df.x, df.y,
ax=ax,
shade=True,
cmap='hot',
levels=100,
bw_method=0.15, # 带宽调整
alpha=0.8
)'Player Heat Map')
plt.show()
后续如果要做“跑动距离”而不是热点图,只需将轨迹点按时间顺序连接起来,计算相邻两点的欧氏距离累计即可(需注意坐标比例尺需转换为真实米数)。
推荐入门路径:如果你是本赛事的工程师,建议先从 YOLOv8官方Track模式 开始(因为它自带ID追踪),然后接上 Homography校正 和 mplsoccer,这个链路开源组件最多且踩坑最少。