【Yolov8足球追踪】YOLO格式足球检测数据集制作及目标追踪

news2024/12/19 10:12:55

请添加图片描述
可以只是已经制作好的数据集,也可以进行制作:
数据集制作:1,2,3步
数据集下载: https://pan.baidu.com/s/1upT_aD06lzjuz-Xjze0dcw 提取码: 6eax
windows下分卷解压文件:https://blog.csdn.net/qq_41941900/article/details/142366183

1.sn-tracking数据集足球赛事追踪数据集下载:

https://github.com/SoccerNet/sn-tracking
代码下载:
pip install SoccerNet

from SoccerNet.Downloader import SoccerNetDownloader
mySoccerNetDownloader = SoccerNetDownloader(LocalDirectory="path/to/SoccerNet")
mySoccerNetDownloader.downloadDataTask(task="tracking", split=["train","test","challenge"])
mySoccerNetDownloader.downloadDataTask(task="tracking-2023", split=["train", "test", "challenge"])

2.提取sn-tracking数据集中只有足球的图片,生成YOLO格式的数据

import os
import shutil
import cv2

"从snmot数据集中挑选含有足球的数据"
base_path = r"D:\mywork\dataset\IKCEST\images\train"
dataset_image_path = "IKCEST/images/train"
dataset_labels_path = "IKCEST/labels/train"
os.makedirs(dataset_image_path, exist_ok=True)
os.makedirs(dataset_labels_path, exist_ok=True)
snmot_list = os.listdir(base_path)
print(snmot_list)
for path in snmot_list:
    new_path = os.path.join(base_path,path)
    gt = os.path.join(new_path,"gt/gt.txt")
    gameinfo = os.path.join(new_path, "gameinfo.ini")
    with open(gameinfo) as f:
        trackletID_ball = [i.split("=")[0].split("_")[-1] for i in  f.readlines() if "ball" in i]
    print(trackletID_ball)
    with open(gt) as f:
        label = f.readlines()
    for trackletID in trackletID_ball:
        label_list = []
        for i in label:
            seq = i.split(",")
            if seq[1] == trackletID:
                image_path = os.path.join(new_path, 'img1/{:06d}.jpg'.format(eval(seq[0]))).replace("\\","/")
                new_image_path = os.path.join(dataset_image_path,path+"_"+os.path.basename(image_path))
                label_path = os.path.join(dataset_labels_path,path+"_"+os.path.basename(image_path).replace(".jpg",".txt"))
                shutil.copy(image_path,new_image_path)
                x, y, w, h = [eval(mt) for mt in seq[2:6]]
                x_center = x + w / 2
                y_center = y + h / 2
                height, width, channels = cv2.imread(image_path).shape
                normalized_x_center = x_center / width
                normalized_y_center = y_center / height
                normalized_width = w / width
                normalized_height = h / height
                with open(label_path,"a") as wf:
                    wf.write(f"{0} {normalized_x_center} {normalized_y_center} {normalized_width} {normalized_height}\n")

3.将提取的只含有足球的数据集划分训练集和测试集

from glob import iglob
import os
import shutil
import random
dataset_image_path = "IKCEST/images/train"
dataset_labels_path = "IKCEST/labels/train"

dev_dataset_image_path = "IKCEST/images/dev"
dev_dataset_labels_path = "IKCEST/labels/dev"
os.makedirs(dev_dataset_image_path, exist_ok=True)
os.makedirs(dev_dataset_labels_path, exist_ok=True)

imageset = list(iglob(os.path.join(dataset_image_path,"*.jpg"),recursive=True))
print(len(imageset))
test_index = random.sample(list(range(len(imageset))),int(0.2*len(imageset)))
print(len(test_index))
for index in test_index:
    new_image = os.path.join(dev_dataset_image_path,os.path.basename(imageset[index]))
    new_label = os.path.join(dev_dataset_labels_path, os.path.basename(imageset[index]).replace(".jpg",".txt"))
    shutil.move(imageset[index],new_image)
    shutil.move(imageset[index].replace(".jpg",".txt").replace("images","labels"), new_label)


from glob import iglob
import os
base = "IKCEST"

train = ["train","dev"]
for i in train:
    base_path = os.path.join(base,"images",i)
    image_list = list(iglob(os.path.join(base_path,"*.jpg"),recursive=True))
    with open(base + "/" + i + ".txt", "w") as fm:
        for file_ in image_list:
            fm.write("./"+file_.replace("IKCEST","").replace("\\","/")+"\n")

4.制作Yolov8的配置文件及训练配置yaml

SNMOT.yaml

path: D:/mywork/IKCEST_Football  # dataset root dir
train: train.txt  # train images (relative to 'path') 118287 images
val: dev.txt  # val images (relative to 'path') 5000 images
test: dev.txt  # 20288 of 40670 images, submit to https://competitions.codalab.org/competitions/20794

names:
    0: ball

# Download script/URL (optional)
download: |
  from utils.general import download, Path

  # Download labels
  #segments = True  # segment or box labels
  #dir = Path(yaml['path'])  # dataset root dir
  #url = 'https://github.com/WongKinYiu/yolov7/releases/download/v0.1/'
  #urls = [url + ('coco2017labels-segments.zip' if segments else 'coco2017labels.zip')]  # labels
  #download(urls, dir=dir.parent)

  # Download data
  #urls = ['http://images.cocodataset.org/zips/train2017.zip',  # 19G, 118k images
  #        'http://images.cocodataset.org/zips/val2017.zip',  # 1G, 5k images
  #        'http://images.cocodataset.org/zips/test2017.zip']  # 7G, 41k images (optional)
  #download(urls, dir=dir / 'images', threads=3)

yolov8-p2.yaml

# Ultralytics YOLO 🚀, AGPL-3.0 license
# YOLOv8 object detection model with P2-P5 outputs. For Usage examples see https://docs.ultralytics.com/tasks/detect

# Parameters
nc: 80 # number of classes
scales: # model compound scaling constants, i.e. 'model=yolov8n.yaml' will call yolov8.yaml with scale 'n'
  # [depth, width, max_channels]
  #n: [0.33, 0.25, 1024]
  #s: [0.33, 0.50, 1024]
  #m: [0.67, 0.75, 768]
  #l: [1.00, 1.00, 512]
  x: [1.00, 1.25, 512]

# YOLOv8.0 backbone
backbone:
  # [from, repeats, module, args]
  - [-1, 1, Conv, [64, 3, 2]] # 0-P1/2
  - [-1, 1, Conv, [128, 3, 2]] # 1-P2/4
  - [-1, 3, C2f, [128, True]]
  - [-1, 1, Conv, [256, 3, 2]] # 3-P3/8
  - [-1, 6, C2f, [256, True]]
  - [-1, 1, Conv, [512, 3, 2]] # 5-P4/16
  - [-1, 6, C2f, [512, True]]
  - [-1, 1, Conv, [1024, 3, 2]] # 7-P5/32
  - [-1, 3, C2f, [1024, True]]
  - [-1, 1, SPPF, [1024, 5]] # 9

# YOLOv8.0-p2 head
head:
  - [-1, 1, nn.Upsample, [None, 2, "nearest"]]
  - [[-1, 6], 1, Concat, [1]] # cat backbone P4
  - [-1, 3, C2f, [512]] # 12

  - [-1, 1, nn.Upsample, [None, 2, "nearest"]]
  - [[-1, 4], 1, Concat, [1]] # cat backbone P3
  - [-1, 3, C2f, [256]] # 15 (P3/8-small)

  - [-1, 1, nn.Upsample, [None, 2, "nearest"]]
  - [[-1, 2], 1, Concat, [1]] # cat backbone P2
  - [-1, 3, C2f, [128]] # 18 (P2/4-xsmall)

  - [-1, 1, Conv, [128, 3, 2]]
  - [[-1, 15], 1, Concat, [1]] # cat head P3
  - [-1, 3, C2f, [256]] # 21 (P3/8-small)

  - [-1, 1, Conv, [256, 3, 2]]
  - [[-1, 12], 1, Concat, [1]] # cat head P4
  - [-1, 3, C2f, [512]] # 24 (P4/16-medium)

  - [-1, 1, Conv, [512, 3, 2]]
  - [[-1, 9], 1, Concat, [1]] # cat head P5
  - [-1, 3, C2f, [1024]] # 27 (P5/32-large)

  - [[18, 21, 24, 27], 1, Detect, [nc]] # Detect(P2, P3, P4, P5)

5.训练足球检测模型

import sys
sys.path.append("ultralytics")
from ultralytics import YOLO
import os
os.system("wandb offline")
os.environ["KMP_DUPLICATE_LIB_OK"]="TRUE"
#https://blog.csdn.net/darkredrock/article/details/131046149
#model = YOLO('yolov8_config/yolov8-p2.yaml').load("yolov8x.pt")
model = YOLO('yolov8_config/yolov8-p2.yaml').load("runs/detect/train13/weights/last.pt")
#model = YOLO('yolov8_config/yolov8.yaml').load("runs/detect/train9/weights/last.pt")
results = model.train(data="yolov8_config/SNMOT.yaml", epochs=40, device='0',
                      batch=4,save=True, resume=True,amp=False,workers=0)  # 断点恢复训练模型

6.足球目标追踪

# #https://blog.csdn.net/qq_42452134/article/details/135241059
import cv2
from ultralytics import YOLO
import os
import torch
os.environ["KMP_DUPLICATE_LIB_OK"]="TRUE"
# # 加载YOLOv8模型
model = YOLO(r'runs\detect\train14\weights\best.pt').to("cuda:0")
# 打开视频文件
video_path = "a3.mp4"
cap = cv2.VideoCapture(video_path)


sz = (int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)),
        int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)))
fps = 30
fourcc = cv2.VideoWriter_fourcc('m', 'p', '4', 'v')

vout_1 = cv2.VideoWriter()
vout_1.open('a3_output_v8_p2_noaug.mp4',fourcc,fps,sz,True)


# 循环遍历视频帧
kk = 0
with open("result.txt","w") as f:
    while cap.isOpened():
        # 从视频读取一帧
        success, frame = cap.read()

        if success:
            # 在帧上运行YOLOv8追踪,持续追踪帧间的物体
            results = model.track(frame, persist=True)
            # 输出每次追踪推理结果的boxes,这些参数实际上是和模型直接predict类似的。
            if len(results[0].boxes.data) !=0:
                result_track = torch.cat((torch.zeros(results[0].boxes.cls.shape).unsqueeze(1).to("cpu"), results[0].boxes.xywh.to("cpu"), results[0].boxes.conf.unsqueeze(1).to("cpu")), dim=1)
                for i in range(result_track.shape[0]):
                    line = f"{kk+1},{int(result_track[i][0].item())}, {result_track[i][1].item()}, {result_track[i][2].item()}, {result_track[i][3].item()}, {result_track[i][4].item()}, {result_track[i][5].item()}, 1, -1, -1"
                    f.write(line+"\n")

                # 在帧上展示结果
                annotated_frame = results[0].plot()
                vout_1.write(annotated_frame)
                # 展示带注释的帧
                #cv2.imshow("YOLOv8 Tracking", annotated_frame)
                os.makedirs("runs/detect/track2",exist_ok=True)
                cv2.imwrite(f"runs/detect/track2/{kk}.png",annotated_frame)
            else:
                vout_1.write(frame)
        else:
            # 如果视频结束则退出循环
            break
        kk +=1

7.模型性能

请添加图片描述

在这里插入图片描述

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

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

相关文章

4.9 TCP 拥塞控制算法

欢迎大家订阅【计算机网络】学习专栏,开启你的计算机网络学习之旅! 文章目录 1 TCP 拥塞控制算法1.1 慢开始(Slow Start)1.2 拥塞避免(Congestion Avoidance)1.3 快重传(Fast Retransmit&#x…

计算机毕业设计Django+Tensorflow音乐推荐系统 音乐可视化 卷积神经网络CNN LSTM音乐情感分析 机器学习 深度学习 Flask

温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…

【HarmonyOS】HarmonyOS 和 Flutter混合开发 (一)之鸿蒙Flutter环境安装

【HarmonyOS】HarmonyOS 和 Flutter混合开发 (一)之鸿蒙Flutter环境安装 一、前言 flutter作为开源适配框架方案,已经在Android,IOS,Web,Window四大平台进行了适配,一套代码,可以同…

机器人变换关系

rigid 刚性变换(平移、旋转): 只改变位置和方向,拥有6个自由度,保持变换物体的形状。 affine 仿射变换(平移、旋转、缩放、倾斜等): 改变物体形状、位置、方向,拥有12…

RTU 通信模块赋能智慧路灯远程开关管理,点亮智慧城市节能增效

RTU(Remote Terminal Unit)远端测控单元在智慧路灯远程开关管理系统中主要负责数据通信和开关控制。能够实现对路灯设备的远程监测和控制,将路灯的状态信息(如开关状态、故障信息、亮度参数等)上传到管理平台&#xff…

Macbookpro M1 IDEA中安装mysql

一:安装与连接数据库 1. 首先在mysql中创建一个初始数据库:idea_db,如示: 2.打开IDEA,如果最右侧没有database窗口,则在插件那里下载“Database navigator”,稍后重启一下即可; 点击最右侧Database---->…

ISCTF复现-misc

File_Format 下载附件后用010打开查看文件头会发现是个exe文件 格式:文件描述(后缀名),文件头(hex):文件头标识(十六进制)PNG (png),文件头(hex):89504E47 PNGImageFile…

如何有效的开展接口自动化测试?

🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 一、简介 接口自动化测试是指使用自动化测试工具和脚本对软件系统中的接口进行测试的过程。其目的是在软件开发过程中,通过对接口的自动化测试来提高测…

FFmpeg第一话:FFmpeg 简介与环境搭建

FFmpeg 探索之旅 一、FFmpeg 简介与环境搭建 二、FFmpeg 解码详解 第一话:FFmpeg 简介与环境搭建 FFmpeg 探索之旅一、前言二、FFmpeg 是什么?三、简单介绍其历史背景四、为什么用 C学习 FFmpeg?(一)高性能优势&#…

git branch -r(--remotes )显示你本地仓库知道的所有 远程分支 的列表

好的,git branch -r 这个命令用于列出远程分支。让我详细解释一下: 命令: git branch -rdgqdgqdeMac-mini ProductAuthentication % git branch -rorigin/main作用: 这个命令会显示你本地仓库知道的所有 远程分支 的列表。它不…

解锁 draw.io 流程图制作工具的强大功能与应用(1/2)

一、draw.io 简介 (一)基本概述 draw.io 是一款由 JGraph 公司开发的基于网页的在线图表绘制工具。它最大的优势之一就是无需进行繁琐的下载和安装步骤,只要打开浏览器,访问其官网,就能立即开始使用。无论是在 Window…

数据结构与算法:稀疏数组

前言 此文以整型元素的二维数组为例,阐述稀疏数组的思想。其他类型或许有更适合压缩算法或者其他结构的稀疏数组,此文暂不扩展。 稀疏数组的定义 在一个二维数据数组里,由于大量的元素的值为同一个值,比如 0或者其他已知的默认值…

【物联网技术与应用】实验4:继电器实验

实验4 继电器实验 【实验介绍】 继电器是一种用于响应施加的输入信号而在两个或多个点或设备之间提供连接的设备。换句话说,继电器提供了控制器和设备之间的隔离,因为设备可以在AC和DC上工作。但是,他们从微控制器接收信号,因此…

RV1126平台下的MobileSeg量化指南:高效部署低算力硬件

1 引言 MobileSeg系列模型采用编解码架构,并以轻量级模型作为骨干网络,专为低算力硬件(如BPU、NPU、ARM CPU等)设计。这使得MobileSeg在边缘设备和移动端应用中表现出色,具备高效能和灵活性。本文将以MobileSeg分割模…

随手记:小程序兼容后台的wangEditor富文本配置链接

场景&#xff1a; 在后台配置wangEditor富文本&#xff0c;可以文字配置链接&#xff0c;图片配置链接&#xff0c;产生的json格式为&#xff1a; 例子&#xff1a; <h1><a href"https://uniapp.dcloud.net.cn/" target"_blank"><span sty…

RabbitMQ的核心组件有哪些?

大家好&#xff0c;我是锋哥。今天分享关于【RabbitMQ的核心组件有哪些&#xff1f;】面试题。希望对大家有帮助&#xff1b; RabbitMQ的核心组件有哪些&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 RabbitMQ是一个开源的消息代理&#xff08;Messag…

html基础-认识html

1.什么是html html是浏览器可以识别的的标记语言&#xff0c;我们在浏览器浏览的网页就是一个个的html文档 <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>认识html</title> </head> <body><h1…

电子应用设计方案-59:智能电动床系统方案设计

智能电动床系统方案设计 一、引言 智能电动床作为一种高端家居产品&#xff0c;旨在为用户提供更加舒适、便捷和个性化的睡眠体验。本方案将详细介绍智能电动床系统的设计架构、功能特点和技术实现。 二、系统概述 1. 系统目标 - 实现床体的多部位电动调节&#xff0c;满足不…

【半导体二极管】

半导体二极管 半导体二极管是由两种不同类型的半导体材料&#xff08;N型和P型&#xff09;通过特定工艺结合而成的电子元器件。其基本结构为PN结。二极管的主要功能是控制电流的单向流动&#xff0c;即允许电流仅在一个方向流动&#xff0c;在反向电压作用下几乎不导电。 1.…

SpringBoot 新特性

优质博文&#xff1a;IT-BLOG-CN 2.1.0新特性最低支持jdk8,支持tomcat9 对响应式编程的支持&#xff0c;spring-boot-starter-webflux starter POM可以快速开始使用Spring WebFlux&#xff0c;它由嵌入式Netty服务器支持 1.5.8 2.1.0/2.7.0/3.0.0 Configuration propertie…