YOLOv5 训练自己的数据集

news2024/10/7 16:20:47

🍨 本文为🔗365天深度学习训练营 中的学习记录博客
🍖 原作者:K同学啊|接辅导、项目定制
● 难度:夯实基础⭐⭐
● 语言:Python3、Pytorch3
● 时间:5月1日-5月6日
🍺要求:
1、yolov5训练数据集

目录

    • 1、 在yolov5文件夹下面添加paper_data文件夹
    • 2、 准备数据集
    • 3、 划分数据集
    • 4、 生成数据索引文件
    • 5、编辑.yaml文件
    • 6、运行train.py文件 开始训练

1、 在yolov5文件夹下面添加paper_data文件夹

在这里插入图片描述

2、 准备数据集

image文件夹下存放所有的图片文件
annotation文件夹下存放所有的label文件
两个文件夹内的图片文件名和label文件名一一对应
在这里插入图片描述

3、 划分数据集

在paper_data文件夹下 创建一个split_train_val.py

# coding:utf-8

import os
import random
import argparse

parser = argparse.ArgumentParser()
# xml文件的地址,根据自己的数据进行修改 xml一般存放在Annotations下
parser.add_argument('--xml_path', default='annotations', type=str, help='input xml label path')
# 数据集的划分,地址选择自己数据下的ImageSets/Main
parser.add_argument('--txt_path', default='ImageSets/Main', type=str, help='output txt label path')
opt = parser.parse_args()

trainval_percent = 1.0
train_percent = 1.0
xmlfilepath = opt.xml_path
txtsavepath = opt.txt_path
total_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()

该脚本文件的功能是划分训练集/测试集/验证集的数据比例。
通过调整参数trainval_percent和train_percent 的数值可以调整各数据集的比例。
脚本执行完毕后,会在当前目录下生产ImageSets/Main/子文件夹,内有包含划分好的数据集信息的四个txt文件。

4、 生成数据索引文件

在paper_data文件夹下创建voc_label.py

# -*- coding: utf-8 -*-
import xml.etree.ElementTree as ET
import os
from os import getcwd

sets = ['train', 'val', 'test']
classes = ["banana", "snake fruit", "dragon fruit", "pineapple"]
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('./annotations/%s.xml' % (image_id), encoding='UTF-8')
    out_file = open('./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
        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('./labels/'):
        os.makedirs('./labels/')
    image_ids = open('./ImageSets/Main/%s.txt' % (image_set)).read().strip().split()
    list_file = open('./%s.txt' % (image_set), 'w')
    for image_id in image_ids:
        list_file.write(abs_path + '/images/%s.png\n' % (image_id)) # 注意你的图片格式,如果是.jpg记得修改
        convert_annotation(image_id)
    list_file.close()

该脚本文件的主要功能是生成训练集/测试集/验证集的数据索引文件train.txt/test.txt/val.txt,并归一化标注信息(labels文件夹下)。
根据images文件夹下的图片的后缀格式调整脚本中的图片文件后缀。
脚本执行完毕后,还会在当前目录下生产labels子文件夹,内有归一化后的标注文件(txt文件)。
在这里插入图片描述

5、编辑.yaml文件

类别数和类别名要和数据集以及voc_label.py脚本内的参数一致。
在data文件夹下创建ab.yaml
在这里插入图片描述

6、运行train.py文件 开始训练

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

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

相关文章

基于C#开发 B/S架构的实验室管理系统 云LIS系统(MVC + SQLserver + Redis)

一、云LIS系统是将各种样本、免疫、临检、放免、及实验用的分析仪器,通过网络管理和传输实验分析过程中全部数据。对每一专业,实现检验申请、样本采集、样本核收、联机检验、质量控制、报告审核到报告发布的全环节的信息化管理平台。 二、基于B/S架构的云…

【SpringMVC】| SpringMVC注解式开发

目录 一:SpringMVC注解式开发 1. RequestMapping定义请求规则 2. 五种数据提交的方式 3. 请求参数中文乱码解决 4. action方法的返回值 5. SpringMVC的四种跳转方式 6. SpringMVC支持的默认参数类型 7. 日期处理 8. 标签的使用 9. 资源在WEB-INF目录下 一…

常见三种编码方式

常见三种编码方式 1. one-hot 编码2. 虚拟编码3. 效果编码 最近复习一些书,记录一下。在特征工程中,数据集经常会出现分类变量,这时候的分类变量可能是字符型,通常不能直接用于训练模型,这时需要对分类变量进行编码&am…

JavaWeb《CSS》

本笔记学习于Acwing平台 目录 1. 样式定义方式 2.1 行内样式表(inline style sheet) 2.2 内部样式表(internal style sheet) 2.3 外部样式表(external style sheet) 2. 选择器 2.1 标签选择器 2.2 …

ChatGPT服务器配置部署-chatGPT国内入口搭建

chatGPT国内入口 ChatGPT是由OpenAI公司开发的一种自然语言生成模型,国内入口一般是通过API接口或者SDK对接实现的。具体的对接方式可以参考以下步骤: 了解ChatGPT的API接口或者SDK: 首先需要了解ChatGPT提供的API接口或者SDK,包括使用方式、…

文件上传漏洞靶场

目录 第一关 源码 前端 后端 代码审计 前端 后端 绕过原理 抓包后未修改 抓包后修改且文件上传成功 第二关 源码 后端 代码审计 绕过原理 抓包后未修改 抓包后修改且文件上传成功 ​编辑 第三关 源码 后端 代码审计 绕过原理 第四关 源码 后端 代码审…

linux以太网(二)

内核版本:linux-3.14.16 基于imx6 一、文件fec_main.c分析 路径:drivers\net\ethernet\freescale\fec_main.c 1、platform总线 标准的平台总线使用方式 设备树匹配 设备树节点 2、平台总线probe 1)分配net_device相关结构 分配 与平…

单源最短路问题

全部代码 全部代码在github acwing 上 正在更新 https://github.com/stolendance/acwing 图论 欢迎大家star与fork 单源最短路问题 先用spfa算法 不行再换其他的 spfa-超级万能 说不定比dijsktra还快 dis[] 代表第k到某一点的最短距离 queue 代表刚被更新的点 它有可能更…

【Java校招面试】基础知识(三)——多线程与并发

目录 前言一、基础概念二、互斥锁三、Java内存模型(JMM)四、线程池后记 前言 本篇主要介绍Java多线程与并发相关内容。 “基础知识”是本专栏的第一个部分,本篇博文是第三篇博文,如有需要,可: 点击这里&a…

每日一题——反转字符串—II

每日一题 反转字符串——II 题目链接 思路 我们先来举几个例子来理解题目意思 字符串“ abcdefgh ”,k 2,那么依据题目意思,反转后的字符串应该是“ bacdfegh ”(即每2k个字符,就反转前k个字符,且无剩余…

基于 Python+Flask+SQLite 的网易云音乐评论情感分析系统

基于 PythonFlaskMySQL 的网易云音乐评论情感分析系统,采用Echart构建图表,支持一键切换颜色主题,通过连接数据库获取评论数据。对失效的爬虫代码进行了更新,可通过歌曲id_半_自动获取评论,具体可以看下方的过程展示。…

展望Flink各版本及新特性

展望Flink各版本及新特性 一 Flink 1.9 版本1.1 细粒度批作业恢复1.2 State Processor API1.3 Stop-with-Savepoint1.4 新 Blink SQL 查询处理器预览1.5 Table API / SQL 的其他改进 二 Flink 1.10 [重要版本 : Blink 整合完成]2.1 内存管理及配置优化2.2 统一的作业提交逻辑2.…

图像去噪简单介绍—并给出示例代码

文章目录 图像去噪简单介绍—并给出示例代码去噪的基本原理常见的噪声类型高斯噪声椒盐噪声马赛克噪声脉冲噪声 添加噪声的代码添加高斯噪声添加椒盐噪声 noise_pic常用的去噪方法均值滤波中值滤波高斯滤波双边滤波基于深度学习的图像去噪 总结图片来源 图像去噪简单介绍—并给…

Win11如何下载安装java?

一、问题描述 我在复现论文代码的时候,遇到了这样的问题: 我没有下载java,那么该如何解决呢? 下载 Java 的作用是为了能够在计算机上运行使用 Java 语言编写的应用程序。Java 是一种广泛使用的编程语言,可用于开发各…

【leetcode刷题总结】——代码随想录(数组总结)

代码随想录按照数组-> 链表-> 哈希表->字符串->栈与队列->树->回溯->贪心->动态规划->图论->高级数据结构,再从简单刷起,做了几个类型题目之后,再慢慢做中等题目、困难题目。 以下是个人刷题总结,…

多线程编程的安全问题和解决措施

线程不安全的概念 由于多线程并发执行,导致结果出错,我们称这种线程是不安全的。 多线程编程出错的原因 一:线程之间并发执行的随机性导致线程不安全 二:多个线程对同一个对象进行修改 三:线程的操作不是原子性的…

Vscode搭建ESP-IDF开发环境指南-Ubuntu ESP32-C3 合宙

文章目录 1.Ubuntu环境搭建2.vscode安装3.esp-idf插件如果到这里没出现问题的话,就能顺利安装了,如果出现问题会在输出那一栏里报错,根据错误去找原因就好,常见的错误就是网络原因以及之前的依赖包没有装好 ![](https://img-blog.…

优思学院|受控文件在质量管理体系中的作用?

在质量管理体系中,受控文件是指受到控制和管理的文件,包括政策、程序、指南、规程、说明书、作业指导书、记录等,它们记录了组织内各种活动的要求和实施方法,并规定了文件的创建、审批、发布、变更和废止等流程,以确保…

宝塔怎么安装青龙面板-跑京东豆脚本

一、搭建青龙面板 安装docker管理器 我们使用宝塔的Docker管理器来一键安装Docker 在软件商店内搜索Docker,直接安装第一个应用即可。 拉取镜像运行容器 在安装完docker之后我们就可以开始拉取docker镜像并运行容器了,ssh连接服务器命令行中输入下面的代码: docker run …

TOGAF架构内容—TOGAF 内容框架和企业元模型

一、概述 TOGAF ADM 提供了一个流程生命周期,用于在企业内创建和管理架构。在 ADM,对输入、输出和步骤的讨论,描述了许多架构工作产品或工件,例如过程和 应用。 此处提供的内容框架和企业元模型为这些术语定义了正式结构&#x…