数据集生成 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 = 0val_num = 0for 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 +=1shutil.copy(i,'./datasets/images/val')shutil.copy(label_path,'./datasets/labels/val')else:                   # 训练集train_num +=1shutil.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 randomdef 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 = 0for 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 += 1shutil.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 = 0for 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 += 1shutil.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.mzph.cn/news/739042.shtml

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

相关文章

SpringMVC04、Controller 及 RestFul

4、Controller 及 RestFul 4.1、控制器Controller 控制器复杂提供访问应用程序的行为,通常通过接口定义或注解定义两种方法实现。控制器负责解析用户的请求并将其转换为一个模型。在Spring MVC中一个控制器类可以包含多个方法在Spring MVC中,对于Contr…

http协议中的强缓存与协商缓存,带图详解

此篇抽自本人之前的文章:http面试题整理 。 别急着跳转,先把缓存知识学会了~ http中的缓存分为两种:强缓存、协商缓存。 强缓存 响应头中的 status 是 200,相关字段有expires(http1.0),cache-control&…

C++ :内存管理 newdelete

目录 内存区域划分 C的动态内存的管理方式 new new的基本使用方法 【注意事项】 delete 【注意】 new和delete操作自定义类型 operator new 和 operator delete 【关于自定义类型new申请内存】 【原理】 【调用顺序】 【连续开辟空间问题】 malloc/free和…

基于UC3842的开关电源设计

基于UC3842的开关电源设计 摘要 在现代经济和科技的飞速发展的时代,电源的运用已经变得非常常见。目前,各种科技手段正在推动着电力电子技术和电源设备研发技术的快速发展,同时也促使电源设备向着高频化集成化方向发展。电源供电设备的开发和…

动态规划课堂5-----子序列问题(动态规划 + 哈希表)

目录 引言: 例题1:最长递增子序列 例题2:最长定差子序列 例题3:最长的斐波那契子序列的长度 例题4:最长等差数列 例题5:等差数列划分II-子序列 结语: 引言: 要想解决子序列问…

亚信安慧AntDB的超融合之路

在面对较大用户规模的系统建设需求时,传统数据库往往面临诸多挑战。为了满足多样化的技术要求,项目通常需要倚赖多套技术体系,例如,一套关系型数据库用于元数据管理和标签化管理,另一套则专注于非结构化文件的处理。这…

OWASP Top 10 网络安全10大漏洞——A03:2021-注入

10大Web应用程序安全风险 2021年top10中有三个新类别、四个类别的命名和范围变化,以及一些合并。 A03:2021-注入 Injection从第一的位置滑落至第三位置。94% 的应用程序针对某种形式的注入进行了测试,最大发生率为 19%,平均发生率为 3%&a…

STM32CubeMX学习笔记19——SD卡(SDIO接口)

1、简介 1.1 SD卡简介 很多单片机系统都需要大容量存储设备,以存储数据(常用的有U盘、FLASH芯片、SD卡等),比较而言SD卡是单片机大容量外部存储的首选,只需要少数几个IO口即可外扩一个容量从几十M到几十G的&#xff…

力扣--动态规划/深度优先算法/回溯算法93.复原IP地址

这题主要用了动态规划和回溯算法。 动态规划数组初始化(DP数组): 首先,创建一个二维数组dp,用于记录字符串中哪些部分是合法的IP地址。对字符串进行遍历,同时考虑每个可能的IP地址部分(每部分由1到3个字符组…

共同聚焦空气污染治理,打造可持续发展未来|中联环保圈

在2024年全国生态环境保护工作会议上,我国生态环境部明确提出,“加强重点区域空气质量改善的监督帮扶和统筹强化监督”将成为未来生态环境保护工作的重中之重。这一战略方向的转变,清晰地展现了我国在空气污染治理政策上的优化和深化。 回顾2…

antd vue Tabs控件的使用

Ant Design Vue-------Tabs标签页 今天就讲讲Ant Design Vue下的控件----tabs 标签页 结合项目中的需求,讲一下该控件如何使用,需求: (1)竖排样式 (2)如何使用v-for绑定数据源 (3…

当HR问你为什么申请这个职业,你该怎么回答?【文章底部添加进大学生就业交流群】

目录 强调对公司的了解: 突出你的技能和经验: 表达对行业的热情: 谈论个人发展: 对公司的价值观的契合: 当HR问你为什么申请这个职业时,你可以通过以下方式回答: 强调对公司的了解&#xf…

物联网导论

物联网起源 物联网:是一个基于互联网、传统电信网等信息承载体,让所有能够被独立寻址的普通物理对象实现互联互通的网络。它具有普通对象设备化、自治终端互联化和普适服务智能化三个重要特征。 按照规定的协议,将具有感知、通信、计算等功…

Linux入门基本指令(1)

✨前言✨ 📘 博客主页:to Keep博客主页 🙆欢迎关注,👍点赞,📝留言评论 ⏳首发时间:2024年3月12日 📨 博主码云地址:渣渣C 📕参考书籍:…

【Python】新手入门学习:什么是工作目录?

【Python】新手入门学习:什么是工作目录? 🌈 个人主页:高斯小哥 🔥 高质量专栏:Matplotlib之旅:零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程👈 希望得…

L2-006 树的遍历(Java)

给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。这里假设键值都是互不相等的正整数。 输入格式: 输入第一行给出一个正整数N(≤30),是二叉树中结点的个数。第二行给出其后序遍历序列。第三行给出其中…

使用OCC进行阵列操作

OCC中实现阵列操作,本质上计算出物体的位置,然后进行位置变换,复制出一个新的物体的过程,下列用直线的阵列和环形的阵列作为例子: 直线阵列:以一个在z轴正方向的直线向y轴方向阵列2个距离为5的对象 #inclu…

hcia datacom课程学习(2):telnet与ssh

telnetssh所属层应用层应用层所应用的传输层协议tcptcp功能远程连接远程连接默认端口2322安全性很低较高功能组件分布客户端、服务器端客户端、服务器端linux环境不自带自带windows环境 win7有客户端和服务器端,但需要手动打开。 win10只有客户端,也需要…

基于STM32G031LORA开发板的时间同步项目

一、前言 本项目采用淘宝购买的STM32G031开发板,板上预留了oled和LORA模块的IO,一次性买了四套,资料虽然质量不高,但是覆盖面挺广,有一定的学习价值。 实验目的是需要三个从机实现时间轴的一致,考虑到现有环…

鸿蒙原生应用元服务开发-WebGL网页图形库开发接口说明

一、场景介绍 WebGL主要帮助开发者在前端开发中完成图形图像的相关处理,比如绘制彩色图形等。目前该功能仅支持使用兼容JS的类Web开发范式开发。 二、接口说明 表1 WebGL主要接口列表 本文参考引用HarmonyOS官方开发文档,基于API9。