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

news2024/9/22 3:37:39

足球分析项目

在这里插入图片描述

引言

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

截图

在这里插入图片描述

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

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

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

项目详细说明

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 KMeans

def 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_color

def 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 cv2

cap = 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: break
    
    next = 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] = 255
    mag, ang = cv2.cartToPolar(flow[..., 0], flow[..., 1])
    hsv[..., 0] = ang * 180 / np.pi / 2
    hsv[..., 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'):
        break
    
    prvs = next

cap.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.coloradmin.cn/o/2154003.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【每日一题】LeetCode 2374.边积分最高节点(图、哈希表)

【每日一题】LeetCode 2374.边积分最高节点(图、哈希表) 题目描述 给定一个有向图,图中包含 n 个节点,节点编号从 0 到 n - 1。每个节点都有一个出边,指向图中的另一个节点。图由一个长度为 n 的整数数组 edges 表示…

江协科技STM32学习- P15 TIM输出比较

🚀write in front🚀 🔎大家好,我是黄桃罐头,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流 🎁欢迎各位→点赞👍 收藏⭐️ 留言📝​…

6张图掌握提示词工程师工作范围与工作技巧(提示词原理篇)

在人工智能的疆域中,提示词工程师扮演着至关重要的角色。他们精心设计的话语,是引导AI模型理解人类需求、激发创造力的关键。如同指挥官的号令,提示词工程师的每一个提问,都让AI的潜力得到释放,让技术与智慧的对话更加…

如何有效检测住宅IP真伪?

在当今的互联网时代,住宅IP(即家庭用户通过宽带服务提供商获得的IP地址)在跨境电商、广告投放、网络安全等多个领域扮演着重要角色。然而,随着网络环境的复杂化和欺诈行为的增多,如何有效检测和辨别住宅IP的真伪成为了…

2024年csp-j 初赛 真题+答案解析

恭喜CSP-J组考生完成第一轮认证! 今天是CSP-J/S初赛的考试日,首先要祝贺所有参加CSP-J组考试的同学顺利完成第一轮认证!

C++中的new与delete

目录 1.简介 2.底层 1.简介 new是升级版的malloc,它会先开空间再去调用构造函数。 delete是升级版的free,它会先调用析构函数再free掉空间。 class A { public:A(int a10, int b10){a a1;b b1;}private:int a;int b; };int main() {//new会先开空间…

大数据Flink(一百二十三):五分钟上手Flink MySQL连接器

文章目录 五分钟上手Flink MySQL连接器 一、创建数据库表 二、​​​​​​创建session集群 三、源表查询 四、​​​​​窗口计算 五、​​​​​​结果数据写回数据库 五分钟上手Flink MySQL连接器 MySQL Connector可以将本地或远程的MySQL数据库连接到Flink中&#x…

以太网接口MII 和 RMII

媒体独立接口 (MII) 是连接以太网MAC (媒体访问控制) 设备和PHY (物理层) 设备的标准化方法。其主要目的是促进以太网系统这两个基本组件之间的通信。 媒体独立接口 (MII) 介质独立接口 (MII) 是由 IEEE 802.3 标准定义的并行接口。MII 的管理接口允许配置和控制多个 PHY 设备…

安装Win11 24H2如何跳过BitLocker加密

今天来给大家分享一下在安装 Windows11 24H2 时,如何跳过BitLocker加密的小方法,Windows11 24H2版本默认自动为用户开启Bitlocker 加密,很多用户不知道自己设备已被偷偷加密,这样也可能会导致磁盘性能严重损失,特别是4…

计算机毕业设计 数字化农家乐管理平台的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍:✌从事软件开发10年之余,专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ 🍅文末获取源码联系🍅 👇🏻 精…

使用Diskgenius系统迁移

使用Diskgenius系统迁移 1、使用系统迁移2、注意点3、新备份的系统盘装在电脑上可能出现盘符错乱导致开机不进入桌面情况 1、使用系统迁移 参考视频: DiskGenius无损系统迁移,换硬盘无需重装系统和软件 2、注意点 1)新的硬盘里面的所有资料…

linux安装Anaconda3

先将Anaconda3安装包下载好,然后在主文件夹里新建一个文件夹,将Anaconda3安装包拖进去。 打开终端未来不出现缺东西的异常情况,我们先安装 yum install -bzip2然后进入根目录下,在进入Anaconda3文件夹下 sh包安装方式 sh Anac…

为什么用迭代器调用不了对象中的函数

没加const可以 加了const就不行 我懂了 加了const v的值就不能修改,我的那些函数都可以修改值 应该是 好像不对 有大佬会吗

vue 实现tab菜单切换

1、目标&#xff1a; 实现切换tab菜单&#xff0c;激活状态&#xff0c;按钮高亮&#xff0c;显示对应的菜单内容 2、实现 <template><div class"tan_menu"><ul class"container"><liclass"item"v-for"item in tab…

常用工具推荐!分享7款AI论文修改软件工具网站

在当今学术研究和写作领域&#xff0c;AI论文修改软件工具已经成为了不可或缺的助手。这些工具不仅能够帮助研究人员提高写作效率&#xff0c;还能确保论文的质量和原创性。以下是七款值得推荐的AI论文修改软件工具网站&#xff0c;其中特别推荐千笔-AIPassPaper。 1. 千笔-AI…

C++编程语言:基础设施:命名空间(Bjarne Stroustrup)

第 14 章 命名空间(Namespaces) 目录 14.1 组成问题(Composition Problems) 14.2 命名空间(Namespaces) 14.2.1 显式修饰(Explicit Qualification) 14.2.2 使用using 声明 14.2.3 using 指令 14.2.4 参数依赖查询 14.2.5 命名空间的开放性 14.3 模块化和接口 …

智能BI项目第五期

本期主要内容 系统问题分析异步化业务流程分析线程池讲解&#xff08;入门 原理 实战&#xff09;系统异步化改造开发 1.系统问题分析 当系统面临大量用户请求时&#xff0c;我们后端的 AI 处理能力有限&#xff0c;例如服务器的内存、CPU、网络带宽等资源有限&#xff0c…

git 本地分支误删,怎么恢复?误删本地已提交未推送的分支!

误删本地已提交未推送的分支&#xff01; 前提&#xff1a; 已提交&#xff01; 重点&#xff1a;未推送&#xff01; 要是推送了&#xff0c;再拉一下代码就行了。你也不会来搜这个帖子了。 如果你删除的分支里有你未提交的代码&#xff0c;不用往下看了&#xff0c;帮不到你…

港湾周评|2万元的三折叠手机可能与普通人无关

《港湾商业观察》李镭 三折叠手机时代正式开启&#xff0c;你准备好了吗&#xff1f; 9月20日上午&#xff0c;华为Mate XT非凡大师正式开售&#xff0c;据悉各大平台迅速售罄&#xff0c;华为商城显示&#xff0c;9月21日将再次放货。 该款手机被称为全球首款商用三折叠手机…

OpenWrt 定时重启

问题 想设置 OpenWrt 定时重启&#xff0c;避免因长期不重启导致的问题。 方法 参考 Scheduling tasks with cronopenwrt设置定时重启&#xff08;天/周/月&#xff09;定时重启openwrt (istoreos) 软路由系统 设置 cron 自启动 System - Start up - 找到 cron - 设置成自…