football_analysis
基于 YOLO 的足球视频 AI 分析工具,实时检测球员/裁判/足球,输出跑动速度、控球占比和战术热
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
基于 YOLO 的足球视频 AI 分析工具,实时检测球员/裁判/足球,输出跑动速度、控球占比和战术热
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
想象一下,当你打开一场足球比赛录像,不再只是观看进球瞬间,而是能实时看到每名球员的跑动热区、冲刺速度、控球占比,甚至教练可以据此分析对手的战术习惯。这就是 football_analysis 项目正在做的事情——用计算机视觉把足球比赛变成可量化、可视化的数据报告。
足球是全球最具商业价值的体育运动之一,但传统的比赛分析依赖人工剪辑和统计,效率低且主观性强。随着 YOLO(You Only Look Once)等实时目标检测模型的成熟,研究者开始尝试将 AI 引入足球视频分析领域。abdullahtarek/football_analysis 正是这一趋势下的开源实践项目,由独立开发者 Abdullah Tarek 创建,旨在用 Python 实现一套端到端的足球视频分析流水线,涵盖球员检测、跟踪、球队分类、球权统计和速度测量等多个维度。
项目采用模块化架构,将整个分析流程拆分为独立的处理阶段:目标检测 → 轨迹跟踪 → 相机运动补偿 → 视角变换 → 速度/距离估算 → 球队归属 → 球权分配。每个模块职责清晰,既可独立调用,也串联成完整流水线。这种设计让项目具有较好的可扩展性——开发者可以替换底层的 YOLO 模型,也可以在任意阶段插入新的分析逻辑。
项目使用预训练的 YOLO 模型(基于 YOLOv5 微调)作为检测核心,支持在视频每一帧中实时定位球员、裁判和足球三类目标。YOLO 以其「单次前向传播即完成检测」的特点著称,在 COCO 数据集上 mAP 表现出色,适合视频这类需要高帧率处理的场景。Tracker 类封装了 ultralytics 库和 supervision 中的 ByteTrack 多目标跟踪算法,将检测框(bounding box)按帧序连成目标轨迹(track),为后续分析奠定基础。
检测到球员后,下一步是区分两支球队。项目使用 K-Means 聚类算法对球员球衣颜色进行像素级分割:将球员 bounding box 的上半部分图像展开为二维像素矩阵,用 K=2 的 K-Means 聚成两类,对应两支球队的球衣主色。由于 K-Means 的聚类结果是无序的(无法预先知道哪个 cluster 对应哪支球队),项目通过帧内球员间距和位置关系来推断初始颜色归属,再用贝叶斯方式跨帧传播,确保整个视频中同一球队的颜色标签一致。
足球比赛录像中,摄像机会跟随球的方向缓慢平移和俯仰。如果直接用像素坐标计算球员位移,会将相机运动误判为球员运动。CameraMovementEstimator 使用 OpenCV 的 Lucas-Kanade 光流法(Optical Flow)提取帧间的像素运动向量,通过在画面边缘选取特征点并追踪其位移,分离出相机自身的运动矩阵,从而对所有目标轨迹进行「去相机运动」补偿,得到相对真实的球员地面位移。
球场的二维画面本质上是三维场景的透视投影——靠近摄像机的区域像素密度高,远端则稀疏。ViewTransformer 定义了从画面坐标到真实球场坐标(米)的单应性变换矩阵(Homography Matrix),通过手动标定四个控制点(球门线两端、中圈线等),将球员 bounding box 底边中心(脚部位置)从像素坐标投影到真实世界坐标(68m × 23.32m 标准场地),从而实现以「米」为单位而非像素的精确测量。
在完成坐标变换后,SpeedAndDistance_Estimator 以 5 帧(约 0.2 秒)为滑动窗口,计算球员脚部位置在真实世界坐标中的欧氏距离变化率,得到瞬时速度;累加各窗口距离得到球员总跑动距离。考虑到 24fps 的帧率和相机补偿误差,速度估算精度约 ±0.5 m/s,但对于战术分析而言已足够。
最后一步是判断「谁在控球」——当足球 bounding box 与某球员 bounding box 的距离小于阈值(70 像素)时,将球权归入该球员。同时,系统统计整场比赛中两队的累计控球时间和控球率,这一指标是足球战术分析中最核心的数据之一。

图1:分析效果示例,图中标注了球员轨迹、球队颜色、球权归属及跑动距离
项目代码结构如下:
main.py:主流程编排,按序调用各模块trackers/tracker.py:YOLO 检测 + ByteTrack 多目标跟踪team_assigner/team_assigner.py:K-Means 球衣颜色聚类 + 球队归属camera_movement_estimator/:Lucas-Kanade 光流相机运动补偿view_transformer/view_transformer.py:透视变换矩阵,映射真实坐标speed_and_distance_estimator/:滑动窗口速度/距离估算player_ball_assigner/:球权归属判定utils/bbox_utils.py:边界框辅助函数(中心点、脚部位置、距离计算)training/:YOLOv5 微调训练 Jupyter Notebook整体使用 Python + OpenCV + NumPy + scikit-learn,无重型 ML 框架依赖,模型推理侧依赖 ultralytics(封装了 YOLOv5/v8),部署相对轻量。代码风格偏向教学型,注释详细,适合作为计算机视觉项目的学习素材。
由于项目无 Dockerfile 和 Web UI,当前上手方式为本地 Python 脚本运行。依赖包括 ultralytics、supervision、OpenCV、NumPy、Matplotlib、Pandas,通过 pip install 即可安装。运行时需提供:
input_videos/ 目录models/best.pt(项目提供了 Google Drive 分享链接,可下载预训练权重)python main.py输出为带标注的 AVI 视频文件(output_videos/output_video.avi),标注内容覆盖球员 bounding box(按球队着色)、球权归属(黄框标记持球者)、跑动距离标签和相机运动向量。GPU 不是强制的——YOLO 支持 CPU 推理,但分析一段 90 秒视频在 CPU 上可能耗时数分钟,GPU 可将速度提升 10-20 倍。
项目也存在若干局限:
models/best.pt 权重存放在 Google Drive,GitHub 仓库本身无法离线复现完整功能;ViewTransformer 中的透视变换控制点是写死的,切换到不同球场或摄像机角度后需要重新标定,缺乏自适应能力;sys.path.append('../') 这种相对路径操作,违反了 Python 3 的包导入规范,在某些目录结构下会报错;football_analysis 代表了计算机视觉在体育分析领域的民主化趋势。随着 YOLO 等模型的易用性不断提升,越来越多的独立开发者和小型球队可以构建自己的分析工具,而不必依赖昂贵的数据分析平台。项目涵盖的六大核心模块——目标检测、多目标跟踪、相机补偿、坐标变换、速度测量、球权分析——实际上也是自动驾驶、视频监控等领域的基础算法,具备较强的可迁移性。
从技术演进角度看,下一步的提升方向包括:引入 Transformer-based 检测器(如 RT-DETR)提升检测精度;使用深度学习模型替代 K-Means 做球衣颜色识别(当前方案对光照变化鲁棒性较差);加入战术板重构(将球员轨迹还原为阵型热力图)等。这些方向的探索,可参考 sports analytics 领域的 STTM、Synergy Sports 等商业方案的开源复现项目。