制作自己的YOLOv8数据集

制作自己的YOLO8数据集

前言

该数据集的格式参照于coco数据集结构✨

步骤一:收集图像数据

从互联网上下载公开的数据集,也可以使用摄像头或其他设备自行采集图像,确保你的图像数据覆盖了你感兴趣的目标和场景
在这里插入图片描述

步骤二:安装Labelme并使用

Labelme是开源的图像标注工具,常用做检测,分割和分类任务的图像标注

在电脑中安装Anaconda,然后打开Anaconda Powershell Prompt

# 安装
pip install labelme
# 运行labelme

打开图像文件夹,进行标注,添加标签(记得在文件界面,打开自动保存)
在这里插入图片描述

Labelme将标注结果保存为JSON格式的文件,其中包含了图像路径、标注框的位置和类别信息

在这里插入图片描述

步骤三:对数据进行处理

yolov8要求的的标注文件是txt格式,要先从json转成txt
新建两个文件夹,json_dirtxt_dir,把脚本放在同一目录

import os
import json
import argparse
from tqdm import tqdmdef convert_label_json(json_dir, save_dir, classes):# 确保保存目录存在,如果不存在则创建if not os.path.exists(save_dir):os.makedirs(save_dir)# 将传入的类名字符串转换为列表classes_list = classes.split(',')# 列出json_dir中的所有JSON文件json_paths = [f for f in os.listdir(json_dir) if f.endswith('.json')]# 使用tqdm显示进度条for json_path in tqdm(json_paths, desc='Converting JSON to TXT', unit='file'):# 构建完整的文件路径path = os.path.join(json_dir, json_path)with open(path, 'r', encoding='utf-8') as load_f:json_dict = json.load(load_f)# 获取图像的宽度和高度h, w = json_dict['imageHeight'], json_dict['imageWidth']# 构建TXT文件的保存路径txt_path = os.path.join(save_dir, json_path.replace('.json', '.txt'))# 打开TXT文件准备写入with open(txt_path, 'w', encoding='utf-8') as txt_file:for shape_dict in json_dict['shapes']:label = shape_dict['label']# 确保标签在类名列表中if label in classes_list:label_index = classes_list.index(label)points = shape_dict['points']# 归一化点坐标并转换为字符串points_nor_list = [str(p[0] / w) + ' ' + str(p[1] / h) for p in points]# 将归一化坐标和标签写入TXT文件txt_file.write(f'{label_index} {" ".join(points_nor_list)}\n')if __name__ == "__main__":parser = argparse.ArgumentParser(description='Convert JSON label files to TXT format')parser.add_argument('--json-dir', type=str, required=True, help='Directory containing JSON files')parser.add_argument('--save-dir', type=str, required=True, help='Directory to save TXT files')parser.add_argument('--classes', type=str, required=True, help='Comma-separated list of class names')args = parser.parse_args()json_dir = args.json_dirsave_dir = args.save_dirclasses = args.classesconvert_label_json(json_dir, save_dir, classes)

运行,person是标注的信息,可多选("person,dog")(请确保你的文件地址填写正确,下面是我的文件地址)

python totxt.py --json-dir "D:\Desktop\person\json_dir" --save-dir "D:\Desktop\person\txt_dir" --classes "person"

在这里插入图片描述

处理结果

在这里插入图片描述

步骤三:对数据集的划分

对数据集的划分:训练集,验证集和测试集,把脚本放在文件目录里

import os
import shutil
import argparse
import random# 检查文件夹是否存在,如果不存在则创建
def mkdir_if_not_exist(path):if not os.path.exists(path):os.makedirs(path)def split_dataset(image_dir, txt_dir, save_dir, train_ratio, val_ratio, test_ratio):# 创建保存目录mkdir_if_not_exist(save_dir)images_dir = os.path.join(save_dir, 'images')labels_dir = os.path.join(save_dir, 'labels')# 创建子目录for subdir in ['train', 'val', 'test']:mkdir_if_not_exist(os.path.join(images_dir, subdir))mkdir_if_not_exist(os.path.join(labels_dir, subdir))# 获取所有txt文件并分配到不同的数据集txt_files = [f for f in os.listdir(txt_dir) if f.endswith('.txt')]total_count = len(txt_files)train_count = int(total_count * train_ratio)val_count = int(total_count * val_ratio)test_count = total_count - train_count - val_countindices = list(range(total_count))random.shuffle(indices)  # 随机打乱索引train_indices = indices[:train_count]val_indices = indices[train_count:train_count + val_count]test_indices = indices[train_count + val_count:]for i, txt_file in enumerate(txt_files):base_name = os.path.splitext(txt_file)[0]src_img_path = os.path.join(image_dir, base_name + '.jpg')src_txt_path = os.path.join(txt_dir, txt_file)if i in train_indices:dst_img_path = os.path.join(images_dir, 'train', base_name + '.jpg')dst_txt_path = os.path.join(labels_dir, 'train', base_name + '.txt')elif i in val_indices:dst_img_path = os.path.join(images_dir, 'val', base_name + '.jpg')dst_txt_path = os.path.join(labels_dir, 'val', base_name + '.txt')else:dst_img_path = os.path.join(images_dir, 'test', base_name + '.jpg')dst_txt_path = os.path.join(labels_dir, 'test', base_name + '.txt')shutil.copy(src_img_path, dst_img_path)shutil.copy(src_txt_path, dst_txt_path)if __name__ == '__main__':parser = argparse.ArgumentParser(description='Split dataset into train, validation and test sets')parser.add_argument('--image-dir', type=str, required=True, help='Directory containing images')parser.add_argument('--txt-dir', type=str, required=True, help='Directory containing txt files')parser.add_argument('--save-dir', type=str, required=True, help='Directory to save the split dataset')parser.add_argument('--train-ratio', type=float, default=0.7, help='Ratio for training set')parser.add_argument('--val-ratio', type=float, default=0.15, help='Ratio for validation set')parser.add_argument('--test-ratio', type=float, default=0.15, help='Ratio for test set')args = parser.parse_args()image_dir = args.image_dirtxt_dir = args.txt_dirsave_dir = args.save_dirtrain_ratio = args.train_ratioval_ratio = args.val_ratiotest_ratio = args.test_ratiosplit_dataset(image_dir, txt_dir, save_dir, train_ratio, val_ratio, test_ratio)

运行(请确保你的文件地址填写正确,下面是我的文件地址)

python totrack.py --image-dir "D:\Desktop\person\image_dir" --txt-dir "D:\Desktop\person\txt_dir" --save-dir "D:\Desktop\person\split_dir" --train-ratio 0.7 --val-ratio 0.15 --test-ratio 0.15
  • –image-dir:存放图片的目录
  • –txt-dir:存放标注文本的目录
  • –save-dir:划分后数据集的保存目录
  • –train-ratio:训练集占总数据集的比例(可选)
  • –val-ratio:验证集占总数据集的比例(可选)
  • –test-ratio:测试集占总数据集的比例(可选)

预期效果

在这里插入图片描述

后记

此为本人学习成果的呈现,若文中有任何不妥或错误,恳请各位读者予以谅解(。_。)

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

正点原子[第二期]ARM(I.MX6U)裸机篇学习笔记-1.2

前言: 本文是来自哔哩哔哩网站上视频“正点原子[第二期]Linux之ARM(MX6U)裸机篇”的学习笔记,在这里会记录下正点原子Linux ARM MX6ULL 开发板根据配套的哔哩哔哩学习视频所作的实验和笔记内容。本文大量的引用了正点原子哔哔哩网…

[论文笔记] EcomGPT:COT扩充数据的电商大模型

社区供稿 | EcomGPT:基于任务链数据的电商大模型(附魔搭推理实践) - 知乎 https://arxiv.org/pdf/2312.15696.pdf EcomInstruct指令数据集构建 数据集组成 COT方式构造垂域训练数据:把原本的垂域任务分解成了原子任务,构造了基于解决原子任务的数据。这样能用类似…

网页模版如何用

现在的网页模版已经得到了许多人的喜爱和使用。随着人们对互联网的需求不断增加,更多的公司和组织需要拥有自己的网站,以推广他们的品牌和服务。而网页模版为他们提供了一个简单而高效的方法来创建自己的网站。 网页模版是预先设计好的网站模板&#xff…

人工智能技术在教育中的潜力有多大

原文:人工智能技术在教育中的潜力有多大? - 知乎 作者:大全Prompt 链接:https://www.zhihu.com/question/637034129/answer/3346272227 来源:知乎 谢邀:在技术快速发展的今天,人工智能&#x…

炒股自动化:券商官方,散户可用,查询订单状态API如何用?

券商官方的接口,个人账户可申请,入金门槛低,接入文档完善,技术支持好的,经过我们筛选后,只有一家符合 会编程,有基础,只是需要API接口的朋友不用看这些,不会写程序的朋友…

【vue2】实现微信截图(复制图片)在项目内可粘贴

需求 后台管理在上传图片地方需要将复制的图片粘贴上传 一、添加事件 在原有上传组件的基础上添加 paste事件 二、方法 onPaste(e) {const items (e.clipboardData || window.clipboardData).items;let blob null;for (let i 0; i < items.length; i) {if (items[i].ty…

设计模式:单例、原型和生成器

在这篇文章中&#xff0c;我们将重点介绍其余的创建模式&#xff1a;Singleton&#xff0c;Builder和Prototype。 在我看来&#xff0c;这些模式不如工厂重要。然而&#xff0c;了解它们仍然很有用。我将提供UML描述&#xff0c;简单的java示例&#xff08;这样即使你不了解jav…

[linux网络编程]UDP协议和TCP协议的使用

目录 看以下内容前&#xff0c;你要先了解main函数带参数有什么用、 了解socket的相关函数接口 如果不了解socket的相关函数接口请先看我这篇文章 main函数带参数有什么用 UDP udp_server 1.生成socket文件描述符 2.填充sockaddr_in信息 3.bind 4.发&#xff08;收&…

渗透之sql注入练气篇

sql注入产生的原因&#xff1a; 由于程序过滤不严谨&#xff0c;导致用户有一些异常输入&#xff0c;最终触发数据库的查询。所以会出现sql注入这个问题。有些恶意的人就会利用这些信息导致数据库泄露。 注意&#xff1a;一般我们存在注入点我们会查询管理员的账号和密码&#…

如何30天快速掌握键盘盲打

失业后在家备考公务员&#xff0c;发现了自己不正确的打字方式&#xff0c;决定每天抽出一点时间练习打字。在抖音上看到一些高手的飞速盲打键盘后&#xff0c;觉得使用正确的指法打字是很必要的。 练习打字&#xff0c;掌握正确的键盘指法十分关键。 练习打字的第一步是找到…

ElasticSearch批处理

在刚才的新增当中&#xff0c;我们是一次新增一条数据。那么如果你将来的数据库里有数千上万的数据&#xff0c;你一次新增一个&#xff0c;那得多麻烦。所以我们还要学习一下批量导入功能。 也就是说批量的把数据库的数据写入索引库。那这里的需求是&#xff0c;首先利用mybat…

C++中布隆过滤器

&#x1f436;博主主页&#xff1a;ᰔᩚ. 一怀明月ꦿ ❤️‍&#x1f525;专栏系列&#xff1a;线性代数&#xff0c;C初学者入门训练&#xff0c;题解C&#xff0c;C的使用文章&#xff0c;「初学」C&#xff0c;linux &#x1f525;座右铭&#xff1a;“不要等到什么都没有了…

【单链表专题】

单链表专题 1.引入2.链表2.1链表的关系2.2链表的结构 3.代码实现链表 1.引入 对于顺序表而言 中间/头部的插⼊删除&#xff0c;时间复杂度为O(N)增容需要申请新空间&#xff0c;拷⻉数据&#xff0c;释放旧空间。会有不小的消耗。增容⼀般是呈2倍的增⻓&#xff0c;势必会有⼀…

Github进行fork后如何与原仓库同步[解决git clone 太慢的问题]

前言 fork了一个仓库以后怎么同步源仓库的代码&#xff1f; 先说一下git clone太慢的问题&#xff0c;可以通过代理拉取代码&#xff0c;具体请看&#xff1a; https://gitclone.com/ 步骤 1、执行命令 git remote -v 查看你的远程仓库的路径。 以一个实际例子说明&#x…

[Spring Cloud] (4)搭建Vue2与网关、微服务通信并配置跨域

文章目录 前言gatway网关跨域配置取消微服务跨域配置 创建vue2项目准备一个原始vue2项目安装vue-router创建路由vue.config.js配置修改App.vue修改 添加接口访问安装axios创建request.js创建index.js创建InfoApi.js main.jssecurityUtils.js 前端登录界面登录消息提示框 最终效…

微信小程序使用echarts组件实现饼状统计图功能

微信小程序使用echarts组件实现饼状统计图功能 使用echarts实现在微信小程序中统计图的功能&#xff0c;具体的实现步骤思路可进我主页查看我的另一篇博文https://blog.csdn.net/weixin_45465881/article/details/138171153进行查看&#xff0c;本篇文章主要使用echarts组件实…

SpringBoot的自动装配原理

SpringBoot自动装配原理 SpringBoot的启动类上有一个注解&#xff1a;SpringBootApplication 。该注解是三个注解的复合注解。 1.SpringBootConfiguration 注解 点进SpringBootConfiguration 注解&#xff0c;可以发现其核心注解为Configuration注解&#xff1a; Configuration…

python文件 成绩分析

‘’文件score.txt中存储了学生的考试信息,内容如下 小明,98 小刚,90 小红,91 小王,98 小刘,80 请写代码,读取文件数据,并进行如下分析 最高分和最低分分别是多少&#xff1f;得最高分的学生有几个&#xff1f; 得最低分的学生有几个平均分是多少&#xff1f; ‘’’ def rea…

Web3技术解析:区块链在去中心化应用中的角色

引言 在过去几年中&#xff0c;Web3技术已经成为了互联网领域的一个热门话题。作为区块链技术的延伸&#xff0c;Web3不仅仅是数字货币的代名词&#xff0c;更是一个能够为各种应用提供去中心化解决方案的强大工具。本文将深入探讨区块链在Web3去中心化应用中的关键角色&#…

Python_AI库 Matplotlib的应用简例:绘制与保存折线图

本文默认读者已具备以下技能&#xff1a; 熟悉Python基础语法&#xff0c;以自行阅读python代码块熟悉Vscode或其它编辑工具的应用 在数据可视化领域&#xff0c;Matplotlib无疑是一个强大的工具。它允许我们创建各种静态、动态、交互式的可视化图形&#xff0c;帮助我们更好…