制作自己的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 tqdm


def 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_dir
    save_dir = args.save_dir
    classes = args.classes

    convert_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_count

    indices = 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_dir
    txt_dir = args.txt_dir
    save_dir = args.save_dir
    train_ratio = args.train_ratio
    val_ratio = args.val_ratio
    test_ratio = args.test_ratio

    split_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:测试集占总数据集的比例(可选)

预期效果

在这里插入图片描述

后记

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

提升工作效率必备,桌面待办事项提醒软件

在快节奏的现代社会,提升工作效率成为众多上班族的共同追求。有效的时间管理、合理的工作计划和正确的工具选择,是实现高效工作的三大关键。尤其是选择一款优秀的待办事项管理软件,能够极大地助力我们提升工作效率。 而我在网上找到了一款提…

11 - 在k8s官方文档上,经常搜索不到内容的问题

使用k8s官方文档时,会出现首页可以正常打开,但是输入搜索关键字之后,搜索不到内容的情况,如下图: 这是由于相关搜索组件被墙的原因,处理方法如下: 谷歌浏览器: 火狐浏览器&#x…

AI大模型重塑新媒体变现格局:智能写作技术助力腾飞!

文章目录 一、AI大模型:新媒体变革的引擎二、智能写作:内容生产的新范式三、精准推送:增强用户粘性的关键四、新媒体变现:插上AI翅膀的飞跃五、挑战与机遇并存:AI与新媒体的未来展望AI智能写作: 巧用AI大模型让新媒体变…

智慧园区引领未来产业趋势:科技创新驱动园区发展,构建智慧化产业新体系

目录 一、引言 二、智慧园区引领未来产业趋势 1、产业集聚与协同发展 2、智能化生产与服务 3、绿色可持续发展 三、科技创新驱动园区发展 1、创新资源的集聚与整合 2、创新成果的转化与应用 3、创新文化的培育与弘扬 四、构建智慧化产业新体系 1、优化产业布局与结构…

鸿蒙OpenHarmony【集成三方SDK】 (基于Hi3861开发板)

OpenHarmony致力于打造一套更加开放完善的IoT生态系统,为此OpenHarmony规划了一组目录,用于将各厂商的SDK集成到OpenHarmony中。本文档基于Hi3861开发板,向平台开发者介绍将SDK集成到OpenHarmony的方法。 规划目录结构 三方SDK通常由静态库…

C语言联合体详解

下午好诶,今天小眼神给大家带来一篇C语言联合体详解的文章~ 目录 联合体 1. 联合体类型的声明 2. 联合体的特点 代码一: 代码二: 3. 相同成员的结构体和联合体对比 ​编辑4. 联合体大小的计算 5. 联合体的优点 联合体 1. 联合体…

干货:html中的标签属性大全25个,收藏起来吧。

<meta> 元素是 HTML 中的一个标签&#xff0c;用于提供关于文档的元数据信息。它通常位于 <head> 标中&#xff0c;不会直接在页面上显示内容&#xff0c;而是用于告诉浏览器和搜索引擎一些关于页面的信息。 <meta charset"字符编码">&#xff1a;…

【算法入门-Python】02_递归

一、递归 递归的两个特点&#xff1a;调用自身&#xff1b;结束条件。 def func1(x):print(x)func1(x-1)没有结束条件&#xff0c;si递归。不是递归。 def func2(x)&#xff1a;if x > 0:print(x)func2(x1)递归调用的x1&#xff0c;没有结束条件。不是递归 def func3(x)…

【保姆级教程】Windows 远程登陆 Linux 服务器的两种方式:SSH + VS Code,开发必备

0. 前言 很多情况下代码开发需要依赖 Linux 系统&#xff0c;远程连接 Linux 服务器进行开发和维护已成为一种常态。对于使用Windows系统的开发者来说&#xff0c;掌握如何通过 SSH 安全地连接到 Linux 服务器&#xff0c;并利用 VS Code 编辑器进行开发&#xff0c;是一项必备…

Unix 进程基本信息

目录 一、程序执行流程二、进程的执行状态三、进程信息记录3.1 proc结构体3.2 user结构体 四、内存分配4.1 代码段代码段如何管理&#xff1f;4.2 数据段4.3 虚拟地址空间4.4 交换地址APR构成APR数量APR切换 内容来源&#xff1a;《Unix内核源码剖析》 一、程序执行流程 为程序…

python学习笔记(集合)

知识点思维导图 # 直接使用{}进行创建 s{10,20,30,40} print(s)# 使用内置函数set()创建 sset() print(s)# 创建一个空的{}默认是字典类型 s{} print(s,type(s))sset(helloworld) print(s) sset([10,20,30]) print(s) s1set(range(1,10)) print(s1)print(max:,max(s1)) print(m…

Java web第四次作业

要求&#xff1a;读取xml文件并在页面中显示出来。 采用三种方式实现&#xff0c;并体会其中的原理&#xff1a; 1.常规方式&#xff0c;controlller控制器不分层 代码&#xff1a;RestController public class PoetController { RequestMapping("/listPoet") pu…

STL::string简单介绍

目录 1、什么是STL STL6大组件:仿函数、算法、容器、空间配置器、迭代器、配接器 推荐文档&#xff08;必须学会看文档&#xff09; 2、string常用接口 a、初始化 1、什么是STL 标准模板库 STL&#xff08;Standard Template Library&#xff09;&#xff0c;主要是数据结构…

如何带好一个开发小团队?

俗话说&#xff1a;授人以鱼不如授人以渔&#xff0c;这句话强调的是教会别人解决问题的方法比单纯给予一次性帮助更有价值。提倡教育和培养团队成员&#xff0c;使其具备自我解决问题的能力。带领一个开发小团队需要综合考虑管理、沟通和技术能力等方面。以下是一些建议&#…

2024年电子商务与大数据经济国际会议 (EBDE 2024)

2024年电子商务与大数据经济国际会议 (EBDE 2024) 2024 International Conference on E-commerce and Big Data Economy 【会议简介】 2024年电子商务与大数据经济国际会议即将在厦门召开。本次会议旨在汇聚全球电子商务与大数据经济领域的专家学者&#xff0c;共同探讨电子商务…

实验五 Spark SQL编程初级实践

Spark SQL编程初级实践 Spark SQL基本操作 将下列JSON格式数据复制到Linux系统中&#xff0c;并保存命名为employee.json。 { "id":1 , "name":" Ella" , "age":36 } { "id":2, "name":"Bob","a…

STM32学习和实践笔记(21):定时器中断实验

通用定时器配置步骤如下&#xff1a; 第一步&#xff1a;使能定时器时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);//使能TIM4时钟 第二步&#xff1a;初始化定时器参数,包含自动重装值&#xff0c;分频系数&#xff0c;计数方式等 voidTIM_TimeBaseInit(TIM_T…

C++编译器如何实现 const(常量)?

C编译器如何实现 const&#xff08;常量&#xff09;&#xff1f; 表面上看&#xff0c;我们在讨论 “编译器怎么保证一个常量不会被程序员强行改变呢&#xff1f;”&#xff1b;其实&#xff0c;我们说的是&#xff1a;如果你表明自己就是要强行修改一个常量&#xff0c;那么…

每日一题:托普利茨矩阵

给你一个 m x n 的矩阵 matrix 。如果这个矩阵是托普利茨矩阵&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 如果矩阵上每一条由左上到右下的对角线上的元素都相同&#xff0c;那么这个矩阵是 托普利茨矩阵 。 示例 1&#xff1a; 输入&#xff1a;matrix…

【原创教程】EPLAN如何制作专属的封面

想要给EPLAN制作专属封面吗?没问题,我来给你支个招。在EPLAN设计电气图纸时,封面就是第一印象,得好好弄。咱们以口罩机项目为例,来看看怎么做吧! 首先,得新建个封面。在项目属性里找到表格名称,点那个数值下拉菜单,选择“查找”。在弹出的表格里挑个你喜欢的模版,点击…