yolov5足球运动分析-速度分析-足球跟踪

server/2024/9/23 6:23:23/

足球分析项目

在这里插入图片描述

引言

在现代体育分析领域,利用先进的计算机视觉技术和机器学习模型对比赛视频进行深入解析已成为一种趋势。本项目旨在通过YOLO(You Only Look Once)这一顶级的人工智能目标检测模型来识别并跟踪足球比赛中的球员、裁判以及足球。此外,我们还将训练该模型以提高其性能,并使用K-means聚类算法基于球员队服颜色将他们分配到各自的队伍中。这将使我们能够计算出每场比赛中各队的控球率。同时,我们将采用光流技术测量帧间相机移动,从而更准确地衡量球员的实际位移。另外,通过实现透视变换,我们可以将场景深度和视角表示出来,进而以米而非像素为单位量化球员的移动距离。最后,我们会计算每位球员的速度及跑动距离。该项目涵盖了多个概念,解决了一系列实际问题,既适合初学者也适用于有经验的机器学习工程师。

截图

在这里插入图片描述

使用模块
  • YOLO:人工智能目标检测模型。
  • K-means:用于像素分割与聚类,以便于检测队服颜色。
  • 光流:用于测量相机移动。
  • 透视变换:用于表现场景深度与视角。
  • 速度与距离计算:针对每个球员的速度和覆盖距离进行计算。
训练模型
  • YOLOv5:经过特定数据集训练后的YOLOv5模型。
    在这里插入图片描述
示例视频
  • 输入视频样本:提供一段足球比赛的视频作为示例输入。
系统需求

为了运行此项目,您需要安装以下软件包:

  • Python 3.x
  • ultralytics
  • supervision
  • OpenCV
  • NumPy
  • Matplotlib
  • Pandas

项目详细说明

YOLOv5_38">1. YOLOv5目标检测

YOLOv5是一种高效且精确的目标检测框架,它能够在单个前向传播过程中同时预测图像中的多个物体及其位置。在这个项目中,我们将首先使用预训练的YOLOv5模型来检测视频中的球员、裁判和足球。如果预训练模型对于我们的具体应用场景不够精准,还可以进一步对模型进行微调。

from ultralytics import YOLO# 加载预训练的YOLOv5模型
model = YOLO('yolov5s.pt')  # 选择一个合适的预训练权重文件# 对视频进行推理
results = model.predict(source='input_video.mp4', save=True, save_txt=True)
2. K-means聚类 - 队伍划分

为了区分不同队伍的球员,我们需要根据他们的队服颜色来进行分类。这里可以使用K-means聚类算法对每个球员区域内的像素点进行聚类,从而确定主要的颜色类别。这样就可以将球员归入不同的队伍。

import cv2
import numpy as np
from sklearn.cluster import KMeansdef get_dominant_color(image, k=2):image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)image = image.reshape((image.shape[0] * image.shape[1], 3))clt = KMeans(n_clusters=k)clt.fit(image)hist = centroid_histogram(clt)dominant_color = clt.cluster_centers_[np.argmax(hist)]return dominant_colordef centroid_histogram(clt):numLabels = np.arange(0, len(np.unique(clt.labels_)) + 1)(hist, _) = np.histogram(clt.labels_, bins=numLabels)hist = hist.astype("float")hist /= hist.sum()return hist
3. 光流 - 相机运动估计

光流是描述连续两帧之间像素运动的技术。通过对视频帧应用光流算法,我们可以估计相机自身的移动情况,这对于消除因摄像机抖动或平移造成的误差非常重要。

import cv2cap = cv2.VideoCapture('input_video.mp4')
ret, frame1 = cap.read()
prvs = cv2.cvtColor(frame1, cv2.COLOR_BGR2GRAY)while True:ret, frame2 = cap.read()if not ret: breaknext = cv2.cvtColor(frame2, cv2.COLOR_BGR2GRAY)flow = cv2.calcOpticalFlowFarneback(prvs, next, None, 0.5, 3, 15, 3, 5, 1.2, 0)# 显示结果hsv = np.zeros_like(frame1)hsv[..., 1] = 255mag, ang = cv2.cartToPolar(flow[..., 0], flow[..., 1])hsv[..., 0] = ang * 180 / np.pi / 2hsv[..., 2] = cv2.normalize(mag, None, 0, 255, cv2.NORM_MINMAX)rgb = cv2.cvtColor(hsv, cv2.COLOR_HSV2BGR)cv2.imshow('Optical Flow', rgb)if cv2.waitKey(1) & 0xFF == ord('q'):breakprvs = nextcap.release()
cv2.destroyAllWindows()
4. 透视变换 - 场景深度与视角

透视变换可以帮助我们从二维图像恢复三维信息。通过标定球场上的关键点,我们可以构建一个变换矩阵,将图像转换成俯视图形式,从而方便地测量球员的真实移动距离。

import cv2
import numpy as np# 假设已经知道了四个角点坐标
pts1 = np.float32([[x1, y1], [x2, y2], [x3, y3], [x4, y4]])
pts2 = np.float32([[0, 0], [width, 0], [0, height], [width, height]])M = cv2.getPerspectiveTransform(pts1, pts2)
dst = cv2.warpPerspective(img, M, (width, height))cv2.imshow('Perspective Transform', dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
5. 速度与距离计算

结合上述步骤得到的数据,我们可以计算出每位球员在场上的实际移动速度及总跑动距离。这些指标对于评估运动员的表现具有重要意义。

# 假设我们已经有了每帧中球员的位置列表positions
distances = []
for i in range(1, len(positions)):distance = np.linalg.norm(np.array(positions[i]) - np.array(positions[i-1]))distances.append(distance)total_distance = sum(distances)
average_speed = total_distance / (len(positions) * time_per_frame)
结论

这个项目不仅展示了如何利用先进的计算机视觉技术来解决实际问题,还提供了一个很好的平台供学习者实践各种算法和技术。无论是对于想要深入了解计算机视觉领域的初学者,还是希望提升自己技能的专业人士来说,这都是一个非常有价值的项目。通过参与这样的项目,不仅可以加深对相关理论知识的理解,还能锻炼解决复杂问题的能力。


http://www.ppmy.cn/server/120121.html

相关文章

“一屏显江山”,激光显示重构「屏中世界」

【潮汐商业评论/原创】 2024年国庆期间,曾感动过无数国人的舞蹈诗剧《只此青绿》改编的同名电影即将上映,而这一次观众们不必走进电影院,在家里打开官方合作的海信激光电视也能享受到同等的视听效果,这是激光电视在观影场景领域的…

docker之自定义镜像上传至阿里云

1.Alpine介绍 Alpine Linux 是一个轻量级的 Linux 发行版,它很适合用作 Docker 容器的基础镜像。Alpine Linux 的特点是非常小,镜像大小通常只有几十 MB,同时它采用 musl libc 和 BusyBox,这使得它的运行效率更高,且提…

python禁止位置传参函数

这种函数定义方式使用了 Python 3.x 中的关键字参数(keyword-only arguments)的特性,通过在参数列表中使用 * 符号作为分隔符,来明确指示该函数之后的参数必须使用关键字(即参数名)来传递,而不能…

Cisco Catalyst 9000 Series Switches, IOS XE Release 17.15.1 ED

Cisco Catalyst 9000 Series Switches, IOS XE Release 17.15.1 ED 思科 Catalyst 9000 交换产品系列 IOS XE 系统软件 请访问原文链接:https://sysin.org/blog/cisco-catalyst-9000/,查看最新版。原创作品,转载请保留出处。 作者主页&…

Linux1-ls,cd,pwd

1.Linux操作系统的根目录用/表示。 Windows操作系统的根目录有D:E: 2.Linux命令格式 命令 [选项] [参数] 例如:ls -l / ls表示显示文件夹内容 -l表示以列表的形式展示 /表示显示的是根目录文件夹的内容 其中,[]里面的内容可省略&#xff…

C++智能指针入门教程(C++11)

智能指针 1.定义 ​ C中的智能指针是一种用于自动管理动态分配的内存的模板类,它们通过封装原始指针来提供自动的内存管理功能,从而避免了内存泄漏和悬挂指针等问题。C标准库中提供了几种智能指针类型,其中最常用的是std::unique_ptr、std:…

C#往压缩包Zip文件的文件追加数据

C#往压缩包Zip文件的文件追加数据 往一个已经压缩好的压缩包里追加数据,一般就有两种方式,一种是前面已经学习过的,就是追加一个新的文件, 另外一种就是往已经存在的文件追加数据。 往已经存在的文件追加数据,需要先找到文件索引。 在压缩包里声明的名称,与外面的文件路…

CompletableFuture的allOf一定不要乱用!血泪史复盘

文章目录 1. 到底遇到了什么问题?2. CountDownLatch搞起?3. allOf里面的坑4. 优化建议: 1. 到底遇到了什么问题? 最近看到组里面的同学遇到了这样的业务场景: 主线程需要异步并发调用多个接口,并且主线程…