YOLOv5入门实践(3)— 手把手教你如何去划分数据集

前言:Hello大家好,我是小哥谈。数据集标注完成之后,下一步就是对这些数据集进行划分了。面对繁杂的数据集,如果手动划分的话,不仅麻烦而且不能保持随机性。本节课就给大家介绍一种方法,即使用代码去划分数据集。那现在就让我们开始今天的学习吧!🌈 

 前期回顾:

            YOLOv5入门实践(1)— 手把手教你使用labelimg标注数据集(附安装包+使用教程)

            YOLOv5入门实践(2)— 手把手教你使用make sense标注数据集(附工具地址+使用教程)

            目录

🚀1.训练集、验证集和测试集

🚀2.数据集划分原则

🚀3.准备数据集

步骤1:创建数据集文件夹

步骤2:标注数据集

步骤3:创建划分后数据集的文件夹

🚀4.划分代码

步骤1:在YOLOv5项目目录下创建split.py文件

步骤2:将代码复制到split.py文件中

步骤3:设置路径并设置划分比例

🚀1.训练集、验证集和测试集

数据集标注完成之后,我们通常需要把数据集划分为三类:训练集、验证集和测试集。🌺

举个例子:模型的训练与学习,类似于老师教学生知识的过程。

训练集(train set):用于训练模型(拟合参数),即模型拟合的数据样本集合。相当于老师上课教学生知识的过程

验证集(validation set):用于确定网络结构或者控制模型复杂程度的超参数(拟合超参数),是模型训练过程中单独留出的样本集,它可以用于调整模型的超参数和用于对模型的能力进行初步评估。 通常用来在模型迭代训练时,用以验证当前模型泛化能力(准确率,召回率等),防止过拟合的现象出现,以决定如何调整超参数。相当于上完课后的课后练习题,用于帮助学生查漏补缺

测试集(test set):用来评估最终模型的性能如何(评价模型好坏),测试集没有参于训练,主要是测试训练好的模型的准确能力等,但不能作为调参、选择特征等算法相关的选择的依据,说白了就只是用于评价模型好坏的一个数据集。相当于期末考试,真正地去检验学生的学习效果

说明:♨️♨️♨️

参数:指由模型通过学习得到的变量,如权重和偏置。

超参数:指根据经验设定的参数,如迭代次数、隐藏层数、每层神经元的个数、学习率等。


🚀2.数据集划分原则

数据集划分的方法并没有明确的规定,不过可以参考3个原则

1.对于小规模样本集(几万量级),常用的分配比例是 70% 训练集、20% 验证集、10% 测试集。
2.对于大规模样本集(百万级以上),只要验证集和测试集的数量足够即可,例如有 100w 条数据,那么留 1w 验证集,1w 测试集即可。1000w 的数据,同样留 1w 验证集和 1w 测试集。
3.超参数越少,或者超参数很容易调整,那么可以减少验证集的比例,更多的分配给训练集。


🚀3.准备数据集

步骤1:创建数据集文件夹

在与项目文件同级目录的datasets文件夹中,创建SafetyHelmetWearingDataset文件夹接着在该文件夹下创建imageslabels文件夹。

  • images:存放需要打标签的图片文件
  • labels:存放标注的标签文件

说明:♨️♨️♨️

1.也可以在YOLOv5项目目录下创建数据集文件夹并命名,其性质是一样的。

2.datasets 和 SafetyHelmetWearingDataset是我自己命名的,是为后期训练安全帽佩戴检测模型做准备,此处名字可以自定义

步骤2:标注数据集

说明:

关于数据集的标注,可以参考我的另外两篇标注数据集的文章。♨️♨️♨️

YOLOv5入门实践(1)— 手把手教你使用labelimg标注数据集(附安装包+使用教程)

YOLOv5入门实践(2)— 手把手教你使用make sense标注数据集(附工具地址+使用教程)

步骤3:创建划分后数据集的文件夹

创建一个名为imageSets的文件夹,用来保存稍后划分好的训练集、验证集和测试集。🌱

说明:♨️♨️♨️

1.所有训练所需的图片存于一个文件夹中(指images),所有训练所需的标签存于一个文件夹中(指labels)。

2.图片名与标签名要一一对应。


🚀4.划分代码

步骤1:在YOLOv5项目目录下创建split.py文件

步骤2:将代码复制到split.py文件中

import os
import shutil
import randomrandom.seed(0)def split_data(file_path,xml_path, new_file_path, train_rate, val_rate, test_rate):each_class_image = []each_class_label = []for image in os.listdir(file_path):each_class_image.append(image)for label in os.listdir(xml_path):each_class_label.append(label)data=list(zip(each_class_image,each_class_label))total = len(each_class_image)random.shuffle(data)each_class_image,each_class_label=zip(*data)train_images = each_class_image[0:int(train_rate * total)]val_images = each_class_image[int(train_rate * total):int((train_rate + val_rate) * total)]test_images = each_class_image[int((train_rate + val_rate) * total):]train_labels = each_class_label[0:int(train_rate * total)]val_labels = each_class_label[int(train_rate * total):int((train_rate + val_rate) * total)]test_labels = each_class_label[int((train_rate + val_rate) * total):]for image in train_images:print(image)old_path = file_path + '/' + imagenew_path1 = new_file_path + '/' + 'train' + '/' + 'images'if not os.path.exists(new_path1):os.makedirs(new_path1)new_path = new_path1 + '/' + imageshutil.copy(old_path, new_path)for label in train_labels:print(label)old_path = xml_path + '/' + labelnew_path1 = new_file_path + '/' + 'train' + '/' + 'labels'if not os.path.exists(new_path1):os.makedirs(new_path1)new_path = new_path1 + '/' + labelshutil.copy(old_path, new_path)for image in val_images:old_path = file_path + '/' + imagenew_path1 = new_file_path + '/' + 'val' + '/' + 'images'if not os.path.exists(new_path1):os.makedirs(new_path1)new_path = new_path1 + '/' + imageshutil.copy(old_path, new_path)for label in val_labels:old_path = xml_path + '/' + labelnew_path1 = new_file_path + '/' + 'val' + '/' + 'labels'if not os.path.exists(new_path1):os.makedirs(new_path1)new_path = new_path1 + '/' + labelshutil.copy(old_path, new_path)for image in test_images:old_path = file_path + '/' + imagenew_path1 = new_file_path + '/' + 'test' + '/' + 'images'if not os.path.exists(new_path1):os.makedirs(new_path1)new_path = new_path1 + '/' + imageshutil.copy(old_path, new_path)for label in test_labels:old_path = xml_path + '/' + labelnew_path1 = new_file_path + '/' + 'test' + '/' + 'labels'if not os.path.exists(new_path1):os.makedirs(new_path1)new_path = new_path1 + '/' + labelshutil.copy(old_path, new_path)if __name__ == '__main__':file_path = "C:\Users\Lenovo\PycharmProjects\datasets\SafetyHelmetWearingDataset\images"xml_path = "C:\Users\Lenovo\PycharmProjects\datasets\SafetyHelmetWearingDataset\labels"new_file_path = "C:\Users\Lenovo\PycharmProjects\datasets\SafetyHelmetWearingDataset\imageSets"split_data(file_path,xml_path, new_file_path, train_rate=0.7, val_rate=0.2, test_rate=0.1)

步骤3:设置路径并设置划分比例

file_path:图片所在位置的绝对路径,即 images

xml_path:标签所在位置的绝对路径,即 labels

new_file_path:划分后三个文件的保存位置,即 imageSets

最后一行是划分比例,大家可以根据实际情况来划分,这里我划分的是7:2:1

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

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

相关文章

Xcode升级导致关联库报错

想办法找到对应的库 然后到 Build Phases -- LinkBinary With Libraries中点击,选择对应的framework即可,就像我工程的报错 Undefined symbol: _OBJC_CLASS_$_ADClient _OBJC_CLASS_$_ASIdentifierManager 缺失的库是AdSupport.framework 添加后再次编…

【C语言】操作符详解

目录 一、算数操作符 二、移位操作符 1.左移操作符 2.右移操作符 (1) 逻辑右移 (2) 算术右移 (3)小总结 三、位操作符 四、赋值操作符 五、单目操作符 六、关系操作符 七、逻辑操作符 八、 条件操作符 九、逗号表达式 十、下标引用、函数调用和结构成员 1. [ ]下…

GO学习之 微框架(Gin)

GO系列 1、GO学习之Hello World 2、GO学习之入门语法 3、GO学习之切片操作 4、GO学习之 Map 操作 5、GO学习之 结构体 操作 6、GO学习之 通道(Channel) 7、GO学习之 多线程(goroutine) 8、GO学习之 函数(Function) 9、GO学习之 接口(Interface) 10、GO学习之 网络通信(Net/Htt…

UDS的DID(Data identification)

引言 DID是UDS中的一个重要概念,它代表着特定的数据标识符。DID用于标识和获取ECU中的特定参数数据,如传感器数据、状态信息等。通过使用DID,诊断工具可以准确地获取所需的数据,从而帮助诊断人员更好地了解车辆的状态和性能。 D…

开发者必知:.gitignore 文件的魔法,助你管理项目文件如虎添翼!

前言: 在软件开发的世界中,版本控制是一个至关重要的环节。而 Git 作为目前最流行的分布式版本控制系统之一,已经成为开发者不可或缺的工具。然而,在日常的开发过程中,有些文件是不适合被纳入版本控制的,比…

基于Java+SpringBoot+Vue的数码论坛系统设计与实现(源码+LW+部署文档等)

博主介绍: 大家好,我是一名在Java圈混迹十余年的程序员,精通Java编程语言,同时也熟练掌握微信小程序、Python和Android等技术,能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架…

【C语言】深度剖析数据在内存中的存储

一、数据类型详细介绍 1、数据类型介绍 (1)基本的内置类型 //内置类型就是C语言自带的类型char //字符数据类型 short //短整型 int //整形 long //长整型 long long //更长的整形 float //单精度浮点数 double …

安防监控视频汇聚平台EasyCVR分发的FLV视频流在VLC中无法播放是什么原因?

众所周知,TSINGSEE青犀视频汇聚平台EasyCVR可支持多协议方式接入,包括主流标准协议国标GB28181、RTSP/Onvif、RTMP等,以及厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等。在视频流的处理与分发上,视频监控…

ORACLE行转列、列转行实现方式及案例

ORACLE行转列、列转行实现方式及案例 行转列案例方式1.PIVOT方式2.MAX和DECODE方式3.CASE WHEN和GROUP BY 列转行案例方式1.UNPIVOT方式2.UNION ALL 行转列 案例 假设我们有一个名为sales的表,其中包含了产品销售数据。表中有三列:product(…

FPGA实践 ——Verilog基本实验步骤演示

0x00 回顾:AND/OR/NOT 逻辑的特性 AND:与门可以具有两个或更多的输入,并返回一个输出。当所有输入值都为 1 时,输出值为 1。如果输入值中有任何一个为 0,则输出值为 0。 OR:或门可以具有两个或更多的输入…

【python】-【】

文章目录 转义字符和原字符二进制与字符编码标识符和保留字变量的定义和使用变量字符串列表for 一、print会输出①数字②字符串(必须加引号)③含有运算符的表达式(例如 31 其中3,1是操作数,是运算符)&#…

vector的模拟实现

什么是vector vector是一个封装了动态大小数组的顺序容器跟任意其它类型容器一样,它能够存放各种类型的对象。 模拟实现 实现前的准备 在实现vector之前,为了和库里的区分开需要将实现的vector放在一个自定义的命名空间里。而且vector需要实现成模版…

论文阅读 - Neutral bots probe political bias on social media

论文链接:Neutral bots probe political bias on social media | EndNote Click 试图遏制滥用行为和错误信息的社交媒体平台被指责存在政治偏见。我们部署中立的社交机器人,它们开始关注 Twitter 上的不同新闻源,并跟踪它们以探究平台机制与用…

超导热催生meme,换汤不换药的投机轮回

文/章鱼哥 出品/陀螺财经 币圈对炒作meme概念的热情从未消亡过。 随着一种名为LK-99的物质被发现,围绕超导的兴奋不仅激发了科学界,加密货币相关概念也与之沸腾。不出所料,与此前围绕元宇宙、AI大肆炒作一样,许多meme代币已经出现…

关于MySQL中的binlog

介绍 undo log 和 redo log是由Inno DB存储引擎生成的。 在MySQL服务器架构中,分为三层:连接层、服务层(server层)、执行层(存储引擎层) bin log 是 binary log的缩写,即二进制日志。 MySQL…

android开发之Android 自定义滑动解锁View

自定义滑动解锁View 需求如下: 近期需要做一个类似屏幕滑动解锁的功能,右划开始,左划暂停。 需求效果图如下 实现效果展示 自定义view如下 /** Desc 自定义滑动解锁View Author ZY Mail sunnyfor98gmail.com Date 2021/5/17 11:52 *…

数据结构——线性表

文章目录 线性表的定义和基本操作顺序表线性表的链式表示 线性表的定义和基本操作 线性表是具有相同数据类型的(n≥0)个数据元素的有限序列,其中n为表长,当n0时线性表是一个空表。若用L命名线性表,则其中一般表示为:L(a1,a2,a3, …

CCLINK转MODBUS-TCP网关cclink通讯接线图 终端电阻

大家好,今天我们要聊的是生产管理系统中的CCLINK和MODBUS-TCP协议,它们的不同使得数据互通比较困难,但捷米JM-CCLK-TCP网关的出现改变了这一切。 1捷米JM-CCLK-TCP是一款自主研发的CCLINK从站功能的通讯网关,它的主要功能是将各种…

D455+VINS-Fusion+surfelmapping 稠密建图(三)

继续,由surfelmapping建立的点云生成octomap八叉树栅格地图 一、安装OctomapServer 建图包 安装插件 sudo apt-get install ros-melodic-octomap-ros sudo apt-get install ros-melodic-octomap-msgs sudo apt-get install ros-melodic-octomap-server sudo apt-…

cubemx hal stm32 舵机 可减速 任意位置停止 驱动代码

CubeMX配置 对于 STM32 F407VE 这里的84是来自APB1那路2倍频得到: 代码部分 两个舵机都是180度的 servo.c #include "servo.h" #include "tim.h" #include "stdio.h"__IO uint32_t g_SteerUWT[2] {0}; uint16_t g_SteerDeg[…