YOLOv5训练自己的数据集(超详细)

news2024/11/23 11:35:35

YOLOv5训练自己的数据集整个过程主要包括:环境安装----制作数据集----模型训练----模型测试----模型推理

一、准备深度学习环境

本人的笔记本电脑系统是:Windows10

首先进入YOLOv5开源网址 ,手动下载zip或是git clone 远程仓库,本人下载的是YOLOv5的5.0版本代码,代码文件夹中会有requirements.txt文件,里面描述了所需要的安装包。

本文最终安装的pytorch版本是1.8.1,torchvision版本是0.9.1,python是3.7.10,其他的依赖库按照requirements.txt文件安装即可。

图片

二、 准备自己的数据集

本人在训练YOLOv5时,选择的数据格式是VOC,因此下面将介绍如何将自己的数据集转换成可以直接让YOLOv5进行使用。

1、创建数据集

在YOLOv5文件夹中的data目录下创建mydata文件夹(名字可以自定义),目录结构如下,将之前labelImg标注好的xml文件和图片放到对应目录下

mydata

…images # 存放图片

…xml # 存放图片对应的xml文件

…dataSet #之后会在Main文件夹内自动生成train.txt,val.txt,test.txt和trainval.txt四个文件,存放训练集、验证集、测试集图片的名字(无后缀.jpg)

示例如下:

mydata文件夹下内容如下:

图片

image为VOC数据集格式中的JPEGImages,内容如下:

xml文件夹下面为.xml文件(标注工具采用labelImage),内容如下: 

图片

dataSet 文件夹下面存放训练集、验证集、测试集的划分,通过脚本生成,可以创建一个split_train_val.py文件,代码内容如下:

# coding:utf-8 import osimport randomimport argparse parser = argparse.ArgumentParser()# xml文件的地址,根据自己的数据进行修改 xml一般存放在Annotations下parser.add_argument('--xml_path', default='xml', type=str, help='input xml label path')# 数据集的划分,地址选择自己数据下的ImageSets/Mainparser.add_argument('--txt_path', default='dataSet', type=str, help='output txt label path')opt = parser.parse_args() trainval_percent = 1.0train_percent = 0.9xmlfilepath = opt.xml_pathtxtsavepath = opt.txt_pathtotal_xml = os.listdir(xmlfilepath)if not os.path.exists(txtsavepath):    os.makedirs(txtsavepath) num = len(total_xml)list_index = range(num)tv = int(num * trainval_percent)tr = int(tv * train_percent)trainval = random.sample(list_index, tv)train = random.sample(trainval, tr) file_trainval = open(txtsavepath + '/trainval.txt', 'w')file_test = open(txtsavepath + '/test.txt', 'w')file_train = open(txtsavepath + '/train.txt', 'w')file_val = open(txtsavepath + '/val.txt', 'w') for i in list_index:    name = total_xml[i][:-4] + '\n'    if i in trainval:        file_trainval.write(name)        if i in train:            file_train.write(name)        else:            file_val.write(name)    else:        file_test.write(name) file_trainval.close()file_train.close()file_val.close()file_test.close()

运行代码后,在dataSet 文件夹下生成下面四个txt文档:

图片

三个txt文件里面的内容如下: 

图片

 2、转换数据格式

接下来准备labels,把数据集格式转换成yolo_txt格式,即将每个xml标注提取bbox信息为txt格式,每个图像对应一个txt文件,文件每一行为一个目标的信息,包括class, x_center, y_center, width, height格式。

格式如下:

图片

创建voc_label.py文件,将训练集、验证集、测试集生成label标签(训练中要用到),同时将数据集路径导入txt文件中,代码内容如下:

# -*- coding: utf-8 -*-import xml.etree.ElementTree as ETimport osfrom os import getcwd sets = ['train', 'val', 'test']classes = ["a", "b"]   # 改成自己的类别abs_path = os.getcwd()print(abs_path) def convert(size, box):    dw = 1. / (size[0])    dh = 1. / (size[1])    x = (box[0] + box[1]) / 2.0 - 1    y = (box[2] + box[3]) / 2.0 - 1    w = box[1] - box[0]    h = box[3] - box[2]    x = x * dw    w = w * dw    y = y * dh    h = h * dh    return x, y, w, h def convert_annotation(image_id):    in_file = open('data/mydata/xml/%s.xml' % (image_id), encoding='UTF-8')    out_file = open('data/mydata/labels/%s.txt' % (image_id), 'w')    tree = ET.parse(in_file)    root = tree.getroot()    size = root.find('size')    w = int(size.find('width').text)    h = int(size.find('height').text)    for obj in root.iter('object'):        # difficult = obj.find('difficult').text        difficult = obj.find('Difficult').text        cls = obj.find('name').text        if cls not in classes or int(difficult) == 1:            continue        cls_id = classes.index(cls)        xmlbox = obj.find('bndbox')        b = (float(xmlbox.find('xmin').text), float(xmlbox.find('xmax').text), float(xmlbox.find('ymin').text),             float(xmlbox.find('ymax').text))        b1, b2, b3, b4 = b        # 标注越界修正        if b2 > w:            b2 = w        if b4 > h:            b4 = h        b = (b1, b2, b3, b4)        bb = convert((w, h), b)        out_file.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n') wd = getcwd()for image_set in sets:    if not os.path.exists('data/mydata/labels/'):        os.makedirs('data/mydata/labels/')    image_ids = open('data/mydata/dataSet/%s.txt' % (image_set)).read().strip().split()    list_file = open('paper_data/%s.txt' % (image_set), 'w')    for image_id in image_ids:        list_file.write(abs_path + '/mydata/images/%s.jpg\n' % (image_id))        convert_annotation(image_id)    list_file.close()

3、配置文件

1)数据集的配置

在yolov5目录下的data文件夹下新建一个mydata.yaml文件(可以自定义命名),用来存放训练集和验证集的划分文件(train.txt和val.txt),这两个文件是通过运行voc_label.py代码生成的,然后是目标的类别数目和具体类别列表,mydata.yaml内容如下:

图片

2) 选择一个你需要的模型


在yolov5目录下的model文件夹下是模型的配置文件,这边提供s、m、l、x版本,逐渐增大(随着架构的增大,训练时间也是逐渐增大),假设采用yolov5x.yaml,只用修改一个参数,把nc改成自己的类别数,需要取整(可选) 如下:

图片

 至此,自定义数据集已创建完毕,接下来就是训练模型了。

三、模型训练

1、下载预训练模型

在YOLOv5的GitHub开源网址上下载对应版本的模型

2、训练

在正式开始训练之前,需要对train.py进行以下修改:

图片

以上参数解释如下:

  • epochs:指的就是训练过程中整个数据集将被迭代多少次,显卡不行你就调小点。

  • batch-size:一次看完多少张图片才进行权重更新,梯度下降的mini-batch,显卡不行你就调小点。

  • cfg:存储模型结构的配置文件

  • data:存储训练、测试数据的文件

  • img-size:输入图片宽高,显卡不行你就调小点。

之后运行训练命令如下:

python train.py --img 640 --batch 32 --epoch 300 --data data/mydata.yaml --cfg models/yolov5x.yaml --weights weights/yolov5x.pt --device '0,1' 

四、模型测试

评估模型好坏就是在有标注的测试集或者验证集上进行模型效果的评估,在目标检测中最常使用的评估指标为mAP。

在test.py文件中指定数据集配置文件和训练结果模型,如下:

图片

通过下面的命令进行模型测试:

python test.py  --data data/mydata.yaml --weights runs/exp1/weights/best.pt --augment

模型测试效果如下:

图片

五、模型推理

最后,模型在没有标注的数据集上进行推理,在detect.py文件中指定测试图片和测试模型的路径,其他参数(img_size、置信度object confidence threshold、IOU threshold for NMS)可自行修改,如下:

使用下面的命令,其中,weights使用最满意的训练模型即可,source则提供一个包含所有测试图片的文件夹路径即可。

 python detect.py --weights runs/exp1/weights/best.pt --source inference/images/ --device 0,1

测试完毕后,每个测试图片会在指定的inference/output输出文件夹中生成结果图片文件,如下:

图片

本人训练的数据集是口罩数据集,检测后的效果如下图所示:

图片

图片

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

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

相关文章

【C++心愿便利店】No.8---C++之重识类和对象

文章目录 前言一、再谈构造函数二、static成员三、友元四、内部类五、匿名对象六、再次理解类和对象 前言 👧个人主页:小沈YO. 😚小编介绍:欢迎来到我的乱七八糟小星球🌝 📋专栏:C 心愿便利店 &…

6、docker下mysql修改配置文件

1、查看mysql镜像 如果没有mysql镜像则下载 docker images |grep mysql 2、查看mysql容器 docker ps |grep mysql 如果没有显示mysql容器信息,则创建 3、创建容器 docker run -it --name mysql-test -e MYSQL_ROOT_PASSWORDroot -p 3306:3306 -d f9653 4、在…

AB实验--科学增长

涉及的内容: AB实验的前置知识 AB实验的架构 AB实验的创建 AB实验的分析 AB实验的展示 AB实验的监控 AB扩展---指标监控 AB扩展---指标异动 AB扩展---异动分析 AB实验参考书籍 1.什么是AB AB 测试(也称为拆分测试)是一种统计方法&a…

SiC外延片测试方案

外延材料是实现器件制造的关键,主要技术指标有外延层厚度、晶格布局,材料结构,形貌以及物理性质,表面粗糙度和掺杂浓度等。下面阐述SiC外延表面常见的测试手段: 1. 外延层厚度(傅里叶变换红外FT-IR&#xf…

xray安装与bp组合使用-被动扫描

xray安装与bp组合使用-被动扫描 文章目录 xray安装与bp组合使用-被动扫描1 工具官方文档:2 xray官网3 工具使用4 使用指令说明5 此为设置被动扫描6 被动扫描-启动成功7 启动bp7.1 设置bp的上层代理7.2 添加上层代理7777 --》指向的是xray7.3 上层代理设置好后&#…

实施运维03

一.制作启动盘(老毛桃,大白菜,傲梅) 1.网上下载启动盘工具 https://msdn.itellyou.cn/ 二.重装系统 1.1.插上启动盘 2.电脑关机 3.电脑开机,开机的时候按住F12键 4.选择启动盘进去,选择一个要重装的系统…

关于mybatis中collection出现的问题(ofType 和 javaType )

关于mybatis中collection出现的问题 我在代码中的collection标签中使用了javaType导致映射是失败的,我使用了ofType就可以了,下面介绍这两个标签之间的区别。 ofType 和 javaType 属性都用于指定集合或关联对象的类型,但它们的使用方式和含义…

蓝牙资讯|2024年智能家居新趋势,蓝牙助力智能家居发展

2024年将迎来变革,智能家居趋势不仅会影响我们的生活空间,还会提高我们的生活质量,让我们有更多时间享受属于自己的时光。 2024年智能家居新趋势 趋势一:多功能科技 2024年预示着多功能技术的趋势,创新将成为焦点。混…

主机jvisualvm连接到tomcat服务器查看jvm状态

​使用JMX方式连接到tomcat,连接后能够查看前边的部分内容,但是不能查看Visual GC,显示不受此JVM支持, 对了,要显示Visual GC,首先要安装visualvm工具,具体安装方式就是根据自己的jdk版本下载…

【PWN · 栈迁移】[CISCN 2019东南]PWN2

一道非常典型、适合用作学习栈迁移的题目。 前言 当存在栈溢出但是溢出字符数并不多的情况下,可以尝试在别处构造rop链,通过栈迁移到目标内存区域,执行rop链。这里不讲栈迁移原理,仅是对题目的分析,适合对栈迁移有初步…

Java 操作 Excel:生成数据、设置单元格样式、设置数据有效性(hutool)

必读信息 该篇文章,主要通过 Java 代码对 Excel 文件的常用操作,包括:生成表格、修改单元格样式、设置数据有效性。 该篇文章,在官网文献下增加个人的看法和理解,如文中有出现不符、错误或需要补充的地方&#xff0c…

CVE-2017-12615 Tomcat远程命令执行漏洞

漏洞简介 2017年9月19日,Apache Tomcat官方确认并修复了两个高危漏洞,漏洞CVE编号:CVE-2017-12615和CVE-2017-12616,其中 远程代码执行漏洞(CVE-2017-12615) 当 Tomcat 运行在 Windows 主机上,…

AutoDL平台transformers环境搭建

AutoDL平台transformers环境搭建 租借GPU可以参考 AutoDL平台租借GPU详解 一、激活base环境 1.进入终端 vim ~/.bashrc2、然后按英文模式的 i 进入编辑,按键盘下键到最后输入 source root/miniconda3/etc/profile.d/conda.sh3、然后先按键盘Esc键&#xff0c…

Linux系统编程01

C语言程序编译过程 多个源文件生成一个可执行文件的过程 预处理阶段主要是将带 # 号的类似于 #include #define #ifdef等进行处理替换 gcc -S 下面讲解C语言源代码编译成汇编语言之后,之间的对应情况 源代码 使用gcc -S test15.c -o test15.s指令让源代码进行编译…

Adaptive AUTOSAR CM模块介绍(五)

Proxy Class API’s proxy class类提供类(静态)方法来FindService() 实例,服务是动态的,因此,AUTOSAR提供了两个方法来提供发现服务。 StartFindService():是一个类方法,它在后台启动一个周期性的“FindS…

联想电脑的Microsoft Edge启动总是百度页面的修改方法

前言 拿到联想电脑,打开浏览器的搜索引擎默认是百度,在浏览器中的设置总是更改不了。这是因为联想管家启动浏览器保护,我们是无法更改的,除非在联想管家中更改启动页的打开网址。操作流程往下看。 操作 🎈打开联想管…

苹果放出快捷指令专题介绍页面,大大提高了 Mac 使用效率

近日,苹果发布 macOS Sonoma 更新的同时,还上线了“《快捷指令》助你效率倍增”专题页面,其目标是在 Mac 上让好用的 App 更强大。 快捷指令功能可以让设备自动完成常用或繁琐的操作,大大提升 Mac 的效率。 快捷指令能帮你在《邮…

4.Python-用Python,Ajax实现MySQL数据库的新增数据

题记 用python,ajax实现mysql数据库的新增数据。以下是一个简单的实例和操作过程。 安装flask模块 pip install flask 安装mysql.connector模块 pip install mysql-connector-python 编写app.py文件 app.py文件如下: 块引用可能显示不完整&#x…

为什么Excel插入图片不显示,点击能够显示

今天在做Excel表格时,发现上传图片后不能显示,但是点击还是能够出现图片的 点击如下 点击能看到,但是不显示?那么只需鼠标右键点击浮动即可显示

fastjson 1.2.24 反序列化导致任意命令执行漏洞

fastjson 1.2.24 反序列化导致任意命令执行漏洞 文章目录 fastjson 1.2.24 反序列化导致任意命令执行漏洞1 在线漏洞解读:2 环境搭建2.1 启动:2.2 已启动:访问端口8090 3 影响版本:4 漏洞复现4.1 访问页面4.2 bp抓包,修改参数4.2.…