数据集生成 YOLOV5 可训练的数据目录、并且可视化

1、前言

YOLOV5 训练数据的目录结构如下:

如果有测试集的话,也按照下面目录摆放即可
 

注意:这里的图片和标签文件名要严格对应!!后缀除外

关于YOLOv5介绍或者yolo格式的介绍参考之前专栏,

2、划分数据+生成YOLOV5的训练目录+可视化

测试的数据目录结构如下:

2.1 划分数据保存成yolov5的目录

代码如下:

import os
import shutil
import random
from tqdm import tqdm


'''
--datasets--images--train       # 训练集图片
          --images--val         # 验证集图片

--datasets--labels--train       # 训练集标签
          --labels--val         # 验证集标签
'''


def mkdir():
    os.mkdir('datasets')
    os.mkdir('datasets/images')
    os.mkdir('datasets/labels')
    os.mkdir('datasets/images/train')
    os.mkdir('datasets/images/val')
    os.mkdir('datasets/labels/train')
    os.mkdir('datasets/labels/val')


def split_yolov5(floder,rate,img_f):
    mkdir()         # 创建 yolov5的目录,已有datasets文件夹,需要删除

    floder = os.path.join(floder,'images')
    image_path = [os.path.join(floder,i) for i in os.listdir(floder)]
    val_path = random.sample(image_path,k=int(len(image_path)*rate))        # 划分的 val数据

    train_num = 0
    val_num = 0
    for i in tqdm(image_path):
        label_path = i.replace(('.'+img_f),'.txt')      # 标签路径
        label_path = label_path.replace('images','labels')

        if i in val_path:       # 验证集
            val_num +=1
            shutil.copy(i,'./datasets/images/val')
            shutil.copy(label_path,'./datasets/labels/val')

        else:                   # 训练集
            train_num +=1
            shutil.copy(i,'./datasets/images/train')
            shutil.copy(label_path,'./datasets/labels/train')

    print('split over!!')
    print('data set number is: ',len(image_path))
    print('train set number is: ',train_num)
    print('val set number is: ',val_num)


if __name__ == '__main__':
    root = 'data'       # 待划分的数据目录
    split_rate = 0.2    # 划分验证集的比例
    image_format = 'jpg'        # 数据图片的格式

    split_yolov5(floder=root,rate=split_rate,img_f=image_format)

参数按照注释填即可

控制台输出:

 生成的数据:

2.2 可视化

根据之前的yolo可视化参考代码内容:关于目标检测任务中,YOLO(txt格式)标注文件的可视化_yolo格式的标签-CSDN博客

这里只是将目录更改:

需要提供txt的classes类别文本!!

import cv2
import os
import random


def txtShow(img, txt, save=True):
    image = cv2.imread(img)
    height, width = image.shape[:2]  # 获取原始图像的高和宽

    # 读取classes类别信息
    with open('datasets/classes.txt', 'r') as f:
        classes = f.read().splitlines()
    # ['Leconte', 'Boerner', 'linnaeus', 'armandi', 'coleoptera', 'acuminatus', 'Linnaeus']

    # 读取yolo格式标注的txt信息
    with open(txt, 'r') as f:
        labels = f.read().splitlines()
    # ['0 0.403646 0.485491 0.103423 0.110863', '1 0.658482 0.425595 0.09375 0.099702', '2 0.482515 0.603795 0.061756 0.045387', '3 0.594122 0.610863 0.063244 0.052083', '4 0.496652 0.387649 0.064732 0.049107']

    ob = []  # 存放目标信息
    for i in labels:
        cl, x_centre, y_centre, w, h = i.split(' ')

        # 需要将数据类型转换成数字型
        cl, x_centre, y_centre, w, h = int(cl), float(x_centre), float(y_centre), float(w), float(h)
        name = classes[cl]  # 根据classes文件获取真实目标
        xmin = int(x_centre * width - w * width / 2)  # 坐标转换
        ymin = int(y_centre * height - h * height / 2)
        xmax = int(x_centre * width + w * width / 2)
        ymax = int(y_centre * height + h * height / 2)

        tmp = [name, xmin, ymin, xmax, ymax]  # 单个检测框
        ob.append(tmp)

    # 绘制检测框
    for name, x1, y1, x2, y2 in ob:
        cv2.rectangle(image, (x1, y1), (x2, y2), color=(255, 0, 0), thickness=2)  # 绘制矩形框
        cv2.putText(image, name, (x1, y1 - 10), fontFace=cv2.FONT_HERSHEY_SIMPLEX,
                    fontScale=0.5, thickness=1, color=(0, 0, 255))

        # 保存图像
    if save:
        cv2.imwrite('result.png', image)

        # 展示图像
    cv2.imshow('test', image)
    cv2.waitKey()
    cv2.destroyAllWindows()


if __name__ == '__main__':
    img_path = './datasets/images/train/'  # 传入图片
    image = [os.path.join(img_path, i) for i in os.listdir(img_path)]
    r = random.randint(0, len(image) - 1)  # 生成随机索引

    image_path = image[r]
    labels_path = image_path.replace('images', 'labels')  # 自动获取对应的 txt 标注文件
    labels_path = labels_path.replace('.jpg', '.txt')

    txtShow(img=image_path, txt=labels_path, save=True)

需要更改的就是图片后缀:

展示:

3、生成YOLOV5的训练目录

对于已经划分好的数据集,直接copy即可

待拷贝的目录:因为之前本人习惯用下面的目录结构,所以这里也是一样

完整代码:

import os
import shutil
import random
from tqdm import tqdm

'''
--datasets--images--train       # 训练集图片
          --images--val         # 验证集图片
--datasets--labels--train       # 训练集标签
          --labels--val         # 验证集标签
'''


def mkdir():
    os.mkdir('datasets')
    os.mkdir('datasets/images')
    os.mkdir('datasets/labels')
    os.mkdir('datasets/images/train')
    os.mkdir('datasets/images/val')
    os.mkdir('datasets/labels/train')
    os.mkdir('datasets/labels/val')


def split_yolov5(floder,img_f):
    mkdir()  # 创建 yolov5的目录,已有datasets文件夹,需要删除

    train_floder = os.path.join(floder, 'train/images')
    image_path = [os.path.join(train_floder, i) for i in os.listdir(train_floder)]

    train_num = 0
    for i in tqdm(image_path,desc='train set copy'):
        label_path = i.replace(('.' + img_f), '.txt')  # 标签路径
        label_path = label_path.replace('images', 'labels')

        train_num += 1
        shutil.copy(i, './datasets/images/train')
        shutil.copy(label_path, './datasets/labels/train')

    val_floder = os.path.join(floder, 'val/images')
    val_path = [os.path.join(val_floder, i) for i in os.listdir(val_floder)]

    val_num = 0
    for i in tqdm(val_path,desc='val set copy'):
        label_path = i.replace(('.' + img_f), '.txt')  # 标签路径
        label_path = label_path.replace('images', 'labels')

        val_num += 1
        shutil.copy(i, './datasets/images/val')
        shutil.copy(label_path, './datasets/labels/val')

    print('copy over!!')
    print('train set number is: ', train_num)
    print('val set number is: ', val_num)


if __name__ == '__main__':
    root = 'data'  # 划分好的数据目录
    image_format = 'jpg'  # 数据图片的格式

    split_yolov5(floder=root,img_f=image_format)

控制台输出:

4、其他

关于yolov5的可以参考专栏:目标检测_听风吹等浪起的博客-CSDN博客

关于其他目标检测的介绍:关于 object detection_听风吹等浪起的博客-CSDN博客

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

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

相关文章

WPF 消息提示 类似toast方式

WPF里面的消息提示一般都是MessageBox.Show(),这种样式不是很好看,所以就想办法重新搞了一个类似弹出消息的功能。原理很简单,就是弹出一个新窗体,然后等几秒窗体自动关闭。 先上效果图: 新建一个MsgHelper.cs类&…

神经网络 梯度与神经元参数w、b关系;梯度与导数关系

参考:https://blog.csdn.net/weixin_44259490/article/details/90295146 概念 梯度与w的关系可以用梯度下降公式来表示:ww−α ∂ c o s t ∂ w \frac{\partial cost}{\partial w} ∂w∂cost​,其中w表示网络的权重, ∂ c o s t…

AI 辅助研发趋势 - 动动嘴完成代码?

目录 2024 年 AI 辅助研发趋势 方向一:AI辅助研发的技术进展 方向二:行业应用案例 方向三: 面临的挑战与机遇 方向四:未来趋势预测 方向五:与法规的影响 方向六:人才培养与教育 2024 年 AI 辅助研发…

141 Linux 系统编程18 ,线程,线程实现原理,ps –Lf 进程 查看

一 线程概念 什么是线程 LWP:light weight process 轻量级的进程,本质仍是进程(在Linux环境下) 进程:独立地址空间,拥有PCB 线程:有独立的PCB,但没有独立的地址空间(共享) 区别:在于是否共…

CorelDRAW Essentials2024使用简单易学的图形软件,让设计充满乐趣

CorelDRAW Essentials 2024使用简单易学的图形软件,让设计充满乐趣 创作引人注目的海报、卡片、社交媒体图片等。 增强功能!支持文件导入/导出新增功能!支持 WebP 文件,提高网页兼容性并优化图像交付增强功能!显著的…

服务器租用和托管的区别

目前对于服务器要求相对高的企业会希望使用独立服务器来运行自己的网站,而在选择独立服务器业务事,是使用服务器托管还是服务器租用这两种方法时,许多刚进入网络或者传统行业的从业者,都不太了解什么是服务器,现在我来…

RabbitMQ 安装使用

文章目录 RabbitMQ 安装使用安装下载 Erlang下载 RabbitMQ 的服务安装好后看是否有 RabbitMQ 的服务开启管理 UIRabbitMQ 端口使用一览图 使用输出最简单的 Hello World!生产者定义消费者消费消息小拓展 RabbitMQ 安装使用 安装 下载 Erlang RabbitMQ 是用这个语…

ai写作一键生成文章速度快

ai写作是一种基于人工智能技术的自动写作工具,它可以根据用户提供的主题或关键词,快速一键生成文章。与传统的手动写作相比,ai写作的速度更快,效率更高。下面小编就带大家一起来见识下ai写作一键生成文章的速度是如何之快&#xf…

string 底层模拟实现常用接口

目录 前言 什么是string? 为什么要学习使用string?string的优势? 因此,string类的成员变量也如图顺序表一样,如下图所示: 构造函数 拷贝构造 析构函数 size() 、capacity() operato…

【C++】什么是类与对象?

🦄个人主页:修修修也 🎏所属专栏:C ⚙️操作环境:Visual Studio 2022 目录 面向对象概述 封装 继承 多态 类 类是什么? C中类的引入 C中类的定义 类的两种定义方式: 1.声明和定义全部放在类体中 2.类声明与成员函数定义分别放在不同的工程文件中…

C语言数据结构之二叉堆

愿你千山暮雪 海棠依旧 不为岁月惊扰平添忧愁 🎥前期回顾-二叉树 🔥数据结构专栏 期待小伙伴们的支持与关注!!! 目录 前期回顾 二叉堆的概念及结构 二叉堆的创建 顺序表的结构声明 顺序表的创建与销毁 二叉堆的插入 …

CUDA安装及环境配置——最新详细版

确定安装版本 在安装之前呢,我们需要确定三件事 第一:查看显卡支持的最高CUDA的版本,以便下载对应的CUDA安装包 第二:查看对应CUDA对应的VS版本,以便下载并安装对应的VS版本(vs需要先安装) 第三…

基于Jupyter快速入门Python,Numpy,Scipy,Matplotlib

文章目录 Jupyter 和 Colab 笔记本PythonPython 版本基础数据类型数字Numbers布尔值Booleans字符串Strings 容器列表List字典Dictionaries集合Sets元组Tuples 函数类 Numpy数组Array数组索引Array indexing数据类型DatatypesArray math广播Broadcasting Scipy图像操作MATLAB文件…

IOS覆盖率报告info文件解读

一,IOS覆盖率报告的生成 在做前端精准测试的时候,对于iOS端,通常会做如下操作: (1)合并覆盖率数据 如下操作: xcrun llvm-profdata merge coverage_file1657885040728.profraw coverage_fil…

Java 可变长参数

可变长参数定义 从 Java5 开始,Java 支持定义可变长参数,所谓可变长参数就是允许在调用方法时传入不定长度的参数。可变长参数允许方法接受任意多个相同类型的参数,在方法内部可以将这些参数视为数组来处理。可变长参数通过省略号&#xff0…

【洛谷 P8668】[蓝桥杯 2018 省 B] 螺旋折线 题解(数学+平面几何)

[蓝桥杯 2018 省 B] 螺旋折线 题目描述 如图所示的螺旋折线经过平面上所有整点恰好一次。 对于整点 ( X , Y ) (X, Y) (X,Y),我们定义它到原点的距离 dis ( X , Y ) \text{dis}(X, Y) dis(X,Y) 是从原点到 ( X , Y ) (X, Y) (X,Y) 的螺旋折线段的长度。 例如 …

java SSM汽车租赁管理系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 java SSM汽车租赁管理系统是一套完善的web设计系统(系统采用SSM框架进行设计开发,springspringMVCmybatis),对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用…

【Docker】了解Docker Desktop桌面应用程序,TA是如何管理和运行Docker容器(3)

欢迎来到《小5讲堂》,大家好,我是全栈小5。 这是《Docker容器》系列文章,每篇文章将以博主理解的角度展开讲解, 特别是针对知识点的概念进行叙说,大部分文章将会对这些概念进行实际例子验证,以此达到加深对…

MySQL实战:SQL优化及问题排查

有更合适的索引不走,怎么办? MySQL在选取索引时,会参考索引的基数,基数是MySQL估算的,反映这个字段有多少种取值,估算的策略为选取几个页算出取值的平均值,再乘以页数,即为基数 查…

Springboot+vue的项目申报管理系统(有报告)。Javaee项目,springboot vue前后端分离项目。

演示视频: Springbootvue的项目申报管理系统(有报告)。Javaee项目,springboot vue前后端分离项目。 项目介绍: 采用M(model)V(view)C(controller&#xff09…