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

2024-01-09 23:36

本文主要是介绍基于YOLOv8 + BotSORT实现球员和足球检测与跟踪 (步骤 + 源码),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

导  读

    本文主要介绍基于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 来实现这一点。因此,它还可以帮助绘制足球等物体随时间变化的轨迹,并根据其跨帧的运动绘制路径。

    最终运行结果:

图片

这篇关于基于YOLOv8 + BotSORT实现球员和足球检测与跟踪 (步骤 + 源码)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/588807

相关文章

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟&nbsp;开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚&nbsp;第一站:海量资源,应有尽有 走进“智听

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

让树莓派智能语音助手实现定时提醒功能

最初的时候是想直接在rasa 的chatbot上实现,因为rasa本身是带有remindschedule模块的。不过经过一番折腾后,忽然发现,chatbot上实现的定时,语音助手不一定会有响应。因为,我目前语音助手的代码设置了长时间无应答会结束对话,这样一来,chatbot定时提醒的触发就不会被语音助手获悉。那怎么让语音助手也具有定时提醒功能呢? 我最后选择的方法是用threading.Time

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

C#实战|大乐透选号器[6]:实现实时显示已选择的红蓝球数量

哈喽,你好啊,我是雷工。 关于大乐透选号器在前面已经记录了5篇笔记,这是第6篇; 接下来实现实时显示当前选中红球数量,蓝球数量; 以下为练习笔记。 01 效果演示 当选择和取消选择红球或蓝球时,在对应的位置显示实时已选择的红球、蓝球的数量; 02 标签名称 分别设置Label标签名称为:lblRedCount、lblBlueCount

烟火目标检测数据集 7800张 烟火检测 带标注 voc yolo

一个包含7800张带标注图像的数据集,专门用于烟火目标检测,是一个非常有价值的资源,尤其对于那些致力于公共安全、事件管理和烟花表演监控等领域的人士而言。下面是对此数据集的一个详细介绍: 数据集名称:烟火目标检测数据集 数据集规模: 图片数量:7800张类别:主要包含烟火类目标,可能还包括其他相关类别,如烟火发射装置、背景等。格式:图像文件通常为JPEG或PNG格式;标注文件可能为X

Kubernetes PodSecurityPolicy:PSP能实现的5种主要安全策略

Kubernetes PodSecurityPolicy:PSP能实现的5种主要安全策略 1. 特权模式限制2. 宿主机资源隔离3. 用户和组管理4. 权限提升控制5. SELinux配置 💖The Begin💖点点关注,收藏不迷路💖 Kubernetes的PodSecurityPolicy(PSP)是一个关键的安全特性,它在Pod创建之前实施安全策略,确保P