基于YOLOv8 + BotSORT实现球员和足球检测与跟踪 (步骤 + 源码)

news2024/11/15 1:48:22

导  读

    本文主要介绍基于YOLOv8和BotSORT实现球员和足球检测与跟踪 ,并给出步骤和代码。

背景介绍

    本文旨在了解 YOLO 架构并在自定义数据集上对其进行训练,然后微调模型以获得更好的结果,并运行推理以了解最有效的方法。

图片

    什么是YOLO?

    YOLO(You Only Look Once)是一种最先进的目标检测算法,因其革命性的单通道检测技术而闻名,该技术提高了其速度和准确性,超越了同行。

    YOLOv1最初于 2015 年提出,将对象检测视为回归问题,使用边界框计算类概率。此后它经历了很多改进,目前由 Ultralytics 维护,Ultralytics 发布了最新版本Yolov8。

    YOLO算法是如何工作的

    顾名思义,YOLO 算法在单次传递中对图像进行预测,这比在整个图像上卷积使用滑动窗口或在多个位置使用建议区域来定位对象的传统方法更好。

    YOLO 的方法是将图像划分为 S x S 网格(如下所示),其中每个网格单元负责生成边界框和置信度得分输出。

图片

    对于该图像中的每个网格单元,我们计算以下内容:

图片

    第一个单元格指的是置信度值,它只是一个标签,决定是否有任何对象位于网格单元格内(0 或 1)。如果答案是肯定的,那么我们继续以 xywh 格式预测边界框的值,其中 x 和 y 是边界框中心的坐标,w 和 h 指边界的宽度和高度盒子。最后,我们有类概率分布向量,其中包含每个对象标签的预测分数,范围在 0到1之间。

图片

    如果我们看一下上面的图像,我们可以清楚地看到蓝色边界框定义了狗对象的真实边界。当我们查看绿色网格单元的输出向量时,我们试图预测蓝色边界框的中心,这是我们的真实标签。

    首先我们确定该网格单元中是否有一个对象,因为答案是肯定的,我们可以继续进一步分配 xywh 值,您可能已经注意到宽度和高度值超出了 0 和 1 范围。这是因为整个边界框的真实标签跨度超过了绿色网格单元,并且高度和宽度略多于 3 个网格单元。最后,关于我们的类别概率分数,绿色网格单元仅包含 dog 对象,因此我们可以轻松地将分数 1 分配给狗对象,将 0 分配给汽车对象。

    另外,如果我们看一下黄色网格单元,我们知道它不包含任何对象,因此我们可以简单地将置信值 0 分配给其输出向量。“x”表示无关项,这意味着我们可以安全地忽略输出向量中的所有其他值。

      

实现步骤

    下面是具体步骤: 

  【1】在我们的自定义数据集上训练 Yolov8。

    现在,让我们使用 Roboflow的球员和球检测数据集并使用 Yolov8 对其进行训练,使用的数据集: 

https://universe.roboflow.com/nikhil-chapre-xgndf/detect-players-dgxz0

    首先我们需要安装 Ultralytics,它维护所有Yolo模型:

pip install ultralytics

    接下来我们需要设置一个yaml文件来配置一些训练参数:

path: absolute path to dataset (/path/to/dataset)train: relative path from dataset (/train)test: relative path from dataset (/test)val: relative path from dataset (/val)
# Define Classes and their Labels
names:  0: Ball  1: Player  2: Referee

    接下来我们需要选择 Yolov8 模型权重来开始训练:

图片

    对于我们的用例,我们将使用 Yolov8n (Nano),它是最轻、最快的模型,根据 mAP 分数,它不是最准确的模型,但经过足够的训练,它可以产生良好的结果,并具有更好的视频 fps追踪。​​​​​​​

from ultralytics import YOLOimport torchimport os
# Load the YOLOv8 modelmodel = YOLO('yolov8n.pt')
# TRAININGif __name__ == '__main__':          results = model.train(data="config.yaml", epochs=50, patience=5)

    如上所示,我们可以简单地从之前设置的 config.yaml 文件中加载数据。我们将开始训练 100个epoch,耐心参数跨越 10 epoch,这意味着如果连续10个 epoch 没有看到任何改进,模型将提前停止训练。

  【2】扩大网络维度以获得更好的结果。

    在训练期间面临的最大挑战是“球”类别的 mAP 分数很差,花了一段时间才意识到出了什么问题。Yolov8 通常期望输入图像为方形格式,对于非方形图像,它默认所有图像的宽度为 640px 以及相应的高度以保持纵横比,除非如下所示指定。

图片

图片

  【3】使用 GIMP 比较“Ball”类的大小。

图片

图片

    目标图像的质量和尺寸的下降在两个图像中都很明显,因此导致模型的检测效果较差。在训练时增加图像大小,不仅可以为“Ball”类别带来更好的 mAP 分数,还可以为所有其他类别带来更好的 mAP 分数。

    但这意味着我们应该始终使用最高分辨率的图像进行训练和推理以获得最佳结果,对吧?答案取决于,因为增加模型的网络维度将导致模型使用更多的训练资源并使其变慢。因此,我们需要找到一个最佳点来平衡模型的速度和准确性。

图片

    另外,请记住,根据YOLO文档,网络维度只能是32的倍数。因此,经过一些考量后,我决定使用1088作为图像尺寸,同时记住最小对象的最小图像尺寸应大于15x15像素。

【4】模型性能。

图片

    完成训练后,我们可以使用上面显示的指标查看训练/验证结果,Yolov8 为每个指标准备了一个完整的目录,其中包含详细的图表和可视化以及模型权重,上面显示的只是一个简短的摘要。

    我们现在可以使用这个训练结果目录并将权重上传回 Roboflow 以作为模型部署,这可以用于辅助图像标签,也可以简单地在线部署以供公众使用。

图片

    【5】使用我们的模型权重运行推理。

    现在,我们可以加载刚刚训练的最佳权重,并将其与 Ultralytics 提供的 BoTSORT跟踪器一起使用下面的脚本来跟踪视频剪辑,而不是使用默认权重。​​​​​​​

import cv2from ultralytics import YOLO
# Load the YOLOv8 model# model = YOLO('yolov8n.pt')          ### Pre-trained weights
model = YOLO('runs/detect/train2/weights/best.pt')          ### weights from trained model
# Open the video filevideo_path = r"path/to/video"cap = cv2.VideoCapture(video_path)
# Loop through the video frameswhile cap.isOpened():    # Read a frame from the video    success, frame = cap.read()
    if success:        # Run YOLOv8 tracking on the frame, persisting tracks between frames        results = model.track(frame, persist=True, show=True, tracker="botsort.yaml")
        # Visualize the results on the frame        annotated_frame = results[0].plot()
        # Display the annotated frame        cv2.imshow("YOLOv8 Tracking", annotated_frame)
        # Break the loop if 'q' is pressed        if cv2.waitKey(1) & 0xFF == ord("q"):            break    else:        # Break the loop if the end of the video is reached        break
# Release the video capture object and close the display windowcap.release()cv2.destroyAllWindows()

    在我们的检测模型中添加跟踪将有助于跟踪视频剪辑中连续帧中的对象,它通过为每个检测到的对象分配唯一的 ID 来实现这一点。因此,它还可以帮助绘制足球等物体随时间变化的轨迹,并根据其跨帧的运动绘制路径。

    最终运行结果:

图片

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1369725.html

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

相关文章

2024年1月10日 十二生肖 今日运势

小运播报:2024年1月10日,星期三,农历十一月廿九 (癸卯年乙丑月癸酉日),法定工作日。 红榜生肖:龙、牛、蛇 需要注意:鸡、狗、兔 喜神方位:东南方 财神方位&#xff1…

2023检索增强生成技术(RAG)研究进展

一、前言 在过去的一两年里,人工智能领域目睹了检索增强生成技术(RAG)的迅猛发展,这种技术结合了强大的语言模型与信息检索系统,以期在复杂的问题解决和信息处理任务中提供更加精确和深入的答案。正是这种对前沿科技的…

软件测试|SQL ORDER BY排序利器使用

简介 在SQL查询语言中,ORDER BY子句是一项重要的功能,它允许我们按照指定的列或表达式对查询结果进行排序。本文将详细介绍SQL ORDER BY子句的用法、常见排序方式以及在实际应用中的应用场景。 ORDER BY子句 SQL是一种用于管理和操作关系型数据库的强…

linux虚拟机网络不通,如何配置ip解决网络问题

续接前文 Hyper-V创建linux虚拟机,共享wifi网络-CSDN博客 创建虚拟机后,网络都正常,可以使用,今天的一次异常关机后(电源不小心拔掉了),再次打开这个虚拟机,网络都失效了。。。。 …

【GoLang入门教程】Go语言几种标准库介绍(五)

如何解决大模型的「幻觉」问题? 文章目录 如何解决大模型的「幻觉」问题?前言几种库image库 (常见图形格式的访问及生成)关键概念和类型:示例 IO库示例 math库(数学库)常用的函数和常量:示例 总结专栏集锦写在最后 前言 上一篇&a…

系列十四、while do...while switch模板代码

一、while & do...while & switch模板代码 1.1、while /*** 需求&#xff1a;使用while循环打印5遍Hello World!*/ Test public void print5() {int i 1;while (i < 5) {System.out.println("Hello World! " LocalDateTime.now());// 线程休眠&#x…

最新最简操作系统期末复习(考前速过)

操作系统复习 第一章&#xff08;操作系统引论&#xff09;计算机操作系统包括&#xff1a;操作系统的目标&#xff1a;操作系统的作用&#xff1a;未配置操作系统的计算机系统&#xff1a;单道批处理系统&#xff1a;缺点&#xff1a; 多道批处理系统&#xff1a;优点&#xf…

力扣——C语言:合并两个有序数组

88. 合并两个有序数组 - 力扣&#xff08;LeetCode&#xff09; 这道题有多种方法可以解决 一、暴力求解 这种方法最简单&#xff0c;我们只需要把两个数组合在一起然后在冒泡排序就可以了 代码如下&#xff1a; void merge(int* nums1, int nums1Size, int m, int* nums2…

word技巧

word这个东西有的时候令人又爱又恨&#xff0c;很多用上的时候都是因为自己贫瘠的技巧而令人抓狂&#xff0c;比如设置一个页脚和页眉&#xff0c;首页如何不同&#xff1f;目录页如何设置罗马数字&#xff1f;页眉前面几页不要横线&#xff0c;后面几页要横线&#xff0c;谨以…

Python+requests搭建接口自动化测试框架

一、接口自动化的意义&#xff08;为什么做这个框架&#xff09; 新版本上线时之前版本的功能需要进行回归测试&#xff0c;导致大量的重复性手工测试。引入自动化测试可以使用自动化技术代替部分手工的回归性测试&#xff0c;解放更多人力做其它更有必要的事情。但目前项目UI变…

antv/x6_2.0学习使用(五、路由)

X6 默认提供了以下几种路由: 路由名称说明normal默认路由&#xff0c;原样返回路径点orth正交路由&#xff0c;由水平或垂直的正交线段组成oneSide受限正交路由&#xff0c;由受限的三段水平或垂直的正交线段组成manhattan智能正交路由&#xff0c;由水平或垂直的正交线段组成…

机器学习-线性回归实践

目标&#xff1a;使用Sklearn、numpy模块实现展现数据预处理、线性拟合、得到拟合模型&#xff0c;展现预测值与目标值&#xff0c;展现梯度下降&#xff1b; 一、导入模块 import numpy as np np.set_printoptions(precision2) from sklearn.linear_model import LinearRegr…

使用Pipeline和ColumnTransformer提升机器学习代码质量

机器学习项目中最冗长的步骤通常是数据清洗和预处理&#xff0c;Scikit-learn库中的Pipeline和 and ColumnTransformer通过一次封装替代逐步运行transformation步骤&#xff0c;从而减少冗余代码量。 1. Pipeline vs. ColumnTransformer 训练模型前&#xff0c;需要将数据集分…

windows系统如何查看扇区?

windows系统如何查看扇区&#xff1f; 首先&#xff0c;我们按WindowsR 弹出"运行"对话框&#xff0c;打开文本框输入"MSINFO32.EXE"命令 展开左侧"组件"节点 接下来&#xff0c;我们选择"组件|存储|磁盘"文件夹 在其里面即可查看硬盘…

PostGIS学习教程二十:3-D

PostGIS学习教程二十&#xff1a;3-D 注意&#xff1a;本文介绍许多PostGIS2.0及更高版本才支持的功能。 文章目录 PostGIS学习教程二十&#xff1a;3-D一、3-D几何图形二、3-D函数三、N-D索引 一、3-D几何图形 到目前为止&#xff0c;我们一直在处理2-D几何图形&#xff08;…

【Redis】非关系型数据库之Redis的主从复制、哨兵和集群高可用

目录 一、主从复制、哨兵、集群的区别 二、主从复制 2.1主从复制的作用 2.2主从复制的原理 2.3主从复制的实操 步骤一&#xff1a;环境准备 步骤二&#xff1a;安装Redis以及配置文件修改 Redis的主从配置文件都一样 步骤四&#xff1a;验证主从复制 三、哨兵 3.1哨兵…

盘点:最适合布偶猫的三款主食冻干,K9、sc、希喂,你选对了吗?

喂养布偶猫的秘诀&#xff1a;如何满足其食肉天性同时呵护其肠胃&#xff1f;主食冻干来解答&#xff01;它不仅符合猫咪天然的饮食结构&#xff0c;还采用新鲜生肉为原料。搭配其他营养元素&#xff0c;既美味又营养&#xff0c;还能增强抵抗力。我们将为您测评市场上热门的k9…

【Docker】Docker基础

文章目录 安装使用帮助启动命令镜像命令容器命令 安装 # 卸载旧版本 sudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine # 设置存储库 sudo yum install -y yum-utils …

浅析内存一致性:内存屏障

文章目录 概述内存乱序访问Store Buffer和Invalidate QueueStore BufferStore ForwardingStore Buffer与内存屏障 Invalidate QueueInvalidate Queue与内存屏障 内存屏障分类编译器屏障CPU内存屏障 相关参考 概述 内存屏障&#xff0c;是一类同步屏障指令&#xff0c;是CPU或编…

《数据结构、算法与应用C++语言描述》-红黑树的C++实现-百万级数据量测试通过

红黑树 完整可编译运行代码见仓库&#xff1a;GitHub - Jasmine-up/Data-Structures-Algorithms-and-Applications/_3matrix。 如有问题请在评论区指出。另外&#xff0c;Github仓库会根据我的学习情况持续更新&#xff0c;欢迎大家点star&#xff0c;谢谢。 基本概念 红-黑…