制作自己的YOLOv8数据集

news2024/10/7 4:22:00

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

预期效果

在这里插入图片描述

后记

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

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

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

相关文章

OCNet

object context pooling (OCP) 作者未提供代码

【黑马点评Redis——002商户查询缓存】

1. 商户查询缓存 2. 知识储备和课程内容 2.1 什么是缓存 缓存是数据交换的缓冲区,是存贮数据的临时地方,一般读写性能较高。 浏览器缓存应用层缓存数据库缓存CPU缓存磁盘缓存 缓存的作用: 降低后端负载提高读写效率,降低响应…

计网笔记:第1章 计算机网络概论

计网笔记:第1章 计算机网络概论 第1章 计算机网络概论1.1 计算机网络发展与分类1.2 OSI和TCP/IP参考模型OSI与TCP/IP参考模型图 1.3 数据封装与解封过程借助OSI模型理解数据传输过程(封装)借助OSI模型理解数据传输过程(解封) 1.4 本章例题 第1章 计算机网络概论 1.…

喜讯!和鲸科技入选 “算力中关村”—— 2024 算力技术创新与应用服务案例集

2024 年 4 月 27 日上午,以"技术重塑生态 算力驱动未来"为主题的"算力中关村"技术成果对接交流专场活动在北京成功举办。作为 2024 中关村论坛的重要组成部分,该专场活动旨在为各界人士打造一个专业化、高效化的技术成果展示与对接平…

SpringMVC 源码剖析

SpringMVC 源码剖析 0 从源码角度分析SpringMVC执行流程 // 前端控制器,SpringMVC最核心的类 public class DispatcherServlet extends FrameworkServlet {// 前端控制器最核心的方法,这个方法是负责处理请求的,一次请求,调用一次…

Redis入门到通关之数据结构解析-IntSet

文章目录 概述IntSet升级简易源码总结 欢迎来到 请回答1024 的博客 🍎🍎🍎欢迎来到 请回答1024的博客 关于博主: 我是 请回答1024,一个追求数学与计算的边界、时间与空间的平衡,0与1的延伸的后端开发者。 …

详细谈电脑ip、域名、内网、外网、localhost、127.0.0.1、网关等通讯基础知识(易懂)

1. ip地址与域名的定义以及其关系 ip地址的定义: IP地址(Internet Protocol Address)是指互联网协议地址,又译为网际协议地址。 IP地址是IP协议提供的一种统一的地址格式,它为互联网上的每一个网络和每一台主机分配一…

【ARM 裸机】BSP 工程管理

回顾一下上一节:【ARM 裸机】NXP 官方 SDK 使用,我们发现工程文件夹里面各种文件非常凌乱; 那么为了模块化整理代码,使得同一个属性的文件存放在同一个目录里面,所以学习 BSP 工程管理非常有必要。 1、准备工作 新建…

短视频账号矩阵系统===4年技术源头打磨

短视频矩阵系统技术源头打磨需要从多个方面入手,以下是一些建议: 1. 基础技术研发:不断投入资金和人力进行基础技术研发,包括但不限于视频处理、人工智能、大数据等技术,以提高短视频矩阵系统的性能和稳定性。 2. 优化…

多进程编程:原理、技术与应用

title: 多进程编程:原理、技术与应用 date: 2024/4/26 12:14:47 updated: 2024/4/26 12:14:47 categories: 后端开发 tags: 多进程并发编程网络服务分布式系统任务处理进程池线程对比 第一章:进程与线程 进程与线程的概念及区别: 进程&am…

四信智能化感知与控制方案,助推灌区续建配套与现代化改造建设

“十四五”明确提到推进大中型灌区节水改造和精细化管理,建设节水灌溉骨干工程,同步推进水价综合改革。 灌区是保障国家粮食安全的重要基础性设施,是实施乡村振兴战略的水利支撑。灌区续建配套与现代化改造是实施乡村振兴战略一项重要任务。为…

el-tab面板添加折叠按钮方法

折叠后 <template><div class"page-type-left-wrap"><div class"page-type-left-wrap-info nav-link" :class"{ leftCollapse }"><el-tabs v-model"activeName" class"page-tabs" tab-change"han…

Git系列:Refs与Reflog

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

【经典算法】LeetCode104二叉树的最大深度(Java/C/Python3实现含注释说明,Easy)

目录 题目描述思路及实现方式一&#xff1a;递归思路代码实现Java版本C语言版本Python3版本Go语言版本 复杂度分析 方式二&#xff1a;广度优先搜索(BFS)思路代码实现Java版本C语言版本Python3版本 复杂度分析 总结相似题目 标签(题目类型)&#xff1a;树、深度优先搜索(DFS)、…

B站无限评论暴力截留协议及教程

B站无限评论暴力截留协议及教程 B站无限评论暴力截留协议及教程&#xff0c;需要抓CK &#xff0c;教程里面有讲如何抓取 网盘自动获取 链接&#xff1a;https://pan.baidu.com/s/1lpzKPim76qettahxvxtjaQ?pwd0b8x 提取码&#xff1a;0b8x

PHP 错误 Unparenthesized `a ? b : c ? d : e` is not supported

最近在一个新的服务器上测试一些老代码的时候得到了类似上面的错误&#xff1a; [Thu Apr 25 07:37:34.139768 2024] [php:error] [pid 691410] [client 192.168.1.229:57183] PHP Fatal error: Unparenthesized a ? b : c ? d : e is not supported. Use either (a ? b : …

DeblurGAN-v2: Deblurring (Orders-of-Magnitude) Faster and Better

文章目录 摘要1、引言2、相关工作2.1、图像去模糊2.2、生成对抗网络 3、DeblurGAN-v2 架构3.1、特征金字塔去模糊3.2、骨干网络的选择&#xff1a;性能与效率之间的权衡3.3、双尺度RaGAN-LS判别器3.4、训练数据集 4、实验评估4.1、实现细节4.2、在GoPro数据集上的定量评估4.3、…

服务器数据恢复—存储硬盘坏道,指示灯亮黄色的数据恢复案例

服务器数据恢复环境&故障&#xff1a; 一台某品牌EqualLogic PS系列某型号存储&#xff0c;存储中有一组由16块SAS硬盘组建的RAID5磁盘阵列&#xff0c;RAID5上划分VMFS文件系统存放虚拟机文件。存储系统上层一共分了4个卷。 raid5阵列中磁盘出现故障&#xff0c;有2块硬盘…

5款文案生成器,帮你智能写作优秀文案

在当今数字化时代&#xff0c;文案写作是营销和传播领域中至关重要的一环。然而&#xff0c;对于许多人来说&#xff0c;撰写引人注目且有吸引力的文案可能是一项具有挑战性的任务。这就是为什么文案生成器变得如此受欢迎的原因。通过结合人工智能和自然语言处理技术&#xff0…

C++之STL-String

目录 一、STL简介 1.1 什么是STL 1.2 STL的版本 1.3 STL的六大组件 ​编辑 1.4 STL的重要性 二、String类 2.1 Sting类的简介 2.2 string之构造函数 2.3 string类对象的容量操作 2.3.1 size() 2.3.2 length() 2.3.3 capacity() 2.3.4 empty() 2.3.5 clear() 2.3.6…