学习经验分享之五:YOLOv5数据集划分以及YOLO格式转换

2023-11-05

 问    题:有不少学YOLOv5算法的朋友咨询我,发现部分朋友犯了一个很大的错误,就是只是划分了训练集和验证集,没有测试集,并且没有意识到自己的实验设置是错误的、不科学的,这是非常可怕的,意味着可能前期的工作都白做了,浪费了宝贵的时间和精力,部分没有服务器的朋友,还浪费了大量的金钱。所以有必要更新一下YOLOv5算法数据集的随机划分。一般训练集:验证集:测试集=6:2:2(参考一本人工智能的书籍划分的比例,也根据个人数据集的大小灵活把握)。

方   法:

  首先对数据集的文件进行划分,trainval_percent = 0.8,train_percent = 3/4,这个参数设置就是按照6:2:2的比例进行了划分。然后再根据前面写的博客进行索引。学习经验分享之三:YOLOv5训练数据集路径索引_人工智能算法研究院的博客-CSDN博客

import os
import random
import argparse

parser = argparse.ArgumentParser()
parser.add_argument('--xml_path', default=r'D:\AI\NWPU-10\yolo-format', type=str, help='input txt label path')
parser.add_argument('--txt_path', default=r'D:\AI\NWPU-10\ImageSets\Main', type=str, help='output txt label path')
opt = parser.parse_args()

trainval_percent = 0.8
train_percent = 3/4
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()

很多朋友都是自己标注的,格式基本为XML格式,故附上yolo格式的转换代码。需要的自取。

# -*- codeing = utf-8 -*-
# @Time : 2021/9/30 10:21
# @Auther : zqk
# @File : voc_labelhrsc.py
# @Software: PyCharm

import xml.etree.ElementTree as ET
import os
from os import getcwd

sets = ['train', 'val', 'test']
classes = ["airplane","airport","baseballfield","basketballcourt","bridge","chimney","dam","expresswayservicearea",
"expresswaytollstation","golfcourse","groundtrackfield","harbor","overpass","ship","stadium","storagetank",
        "tenniscourt","trainstation","vehicle","windmill"]   # 改成自己的类别
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('ZQK_data/Annotations/%s.xml' % (image_id), encoding='UTF-8')
    out_file = open('ZQK_data/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('ZQK_data/labels/'):
    #     os.makedirs('ZQK_data/labels/')
    image_ids = open('RSOD/ImageSets/Main/%s.txt' % (image_set)).read().strip().split()
    list_file = open('RSOD/ImageSets/%s.txt' % (image_set), 'w')
    for image_id in image_ids:
        list_file.write(abs_path + '/RSOD/JPEGImages/%s.jpg\n' % (image_id))
        # convert_annotation(image_id)
    list_file.close()

最后,希望有兴趣的可以关注一下,后续会出更多相关内容,感谢支持。另外有问题可以进行留言或者私信,我将抽时间进行更新博客统一回答!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

学习经验分享之五:YOLOv5数据集划分以及YOLO格式转换 的相关文章

  • 书写高质量SQL的30条建议

    1 查询SQL尽量不要使用select 而是select具体字段 反例子 select from employee 复制代码 正例子 select id name from employee 复制代码 理由 只取需要的字段 节省资源 减少网
  • Filco键盘问题

    垃圾中的垃圾 垃圾中的战斗机 先按键盘的最左边重置 红蓝灯交替 直到蓝灯长时间闪烁 第一种 如果从 蓝牙和其他设备 添加时 提示需要输入PIN码 果断换方式 第二种 从 控制面板 添加设备 开始 可以会自动出现一串数字 迅速在filco设备

随机推荐

  • 【Java文件流】你的“转换流、对象流、打印流、Properites”学习资料

    在我学习Java的IO流过程中 有很多的类 每个类又有很多方法 经过我的几天经历 在看懂 听懂了别人的讲解后 一定要自己去敲出来 在IDE中运行出来 在一定程度上才算了解了这个东西 尝试 牢牢把握 心中有数 类与接口之间的继承 实现关系 只
  • malloc的底层实现原理

    目录 基于Linux操作系统malloc申请内存的实现原理 1 malloc分配内存前的初始化 2 下为malloc init 代码 3 内存块的获取 1 内存块的大致结构 2 寻找合适的block 3 扩容 4 内存分配 下为内存分配代码
  • make: execvp Permission denied\\ make Error 127解决办法

    出现错误make make execvp coff2noff coff2noff Permission denied Makefile 36 recipe for target add noff failed make add noff E
  • vue3,vue2导出表格中的数据,导出excel格式

    vue3 vue2导出表格中的数据 导出excel格式 引入npm包 xlsx 0 18 5 import as XLSX from xlsx async function exportExcel if itemsquan value it
  • 基于小程序的理发店预约系统

    一 项目背景及简介 现在很多的地方都在使用计算机开发的各种管理系统来提高工作的效率 给人们带来很多的方便 计算机技术从很大的程度上解放了人们的双手 并扩大了人们的活动范围 是人们足不出户就可以通过电脑进行各种事情的管理 信息系统的出现是人类
  • c语言土壤墒情监测系统,土壤墒情监测系统是什么,它的作用都是什么

    随着现代农业的不断发展 土壤墒情监测系统的使用越来越广泛 不仅如此 其它的农用仪器也越来越受欢迎 例如杀虫灯等植保器械 大家基本上都能够接受 因为它所带来的效果是实实在在能够看到的 而对于监测土壤墒情等仪器来说 目前人们还处在徘徊的阶段 正
  • Python数据可视化——折线图

    第1关 折线图的绘制与优化 本关任务 利用世界银行发布的 1960 2009 年间的世界人口数据 来学习折线图的绘制 coding utf 8 import pandas as pd 用于生成满足绘图要求的数据格式 import numpy
  • golang-面试题(选择题)

    1 初级 下面属于关键字的是 A func B def C struct D class 参考答案 AC 2 初级 定义一个包内全局字符串变量 下面语法正确的是 A var str string B str C str D var str
  • 4.2.8 Kafka 延时队列, 重试队列(结合redis实现)

    目录 2 7 延时队列 2 8 重试队列 代码实现 Kafka 高级特性 延时 重试队列 2 7 延时队列 两个follower副本都已经拉取到了leader副本的最新位置 此时又向leader副本发送拉取请求 而leader副本并没有新的
  • 第十七课,帧缓存(创建和使用方法)

    OpenGL允许我们定义我们自己的帧缓冲 也就是说我们能够定义我们自己的颜色缓冲 甚至是深度缓冲和模板缓冲 创建一个帧缓冲 1 创建一个帧缓冲对象 Framebuffer Object FBO 创建语法同VAO VBO unsigned i
  • C#实现DLT直接线性变换(Direct Linear Transform)算法

    C 实现DLT直接线性变换 Direct Linear Transform 算法 参考资料 1 武大版 工业测量技术与数据处理 P100 P106 2 转载博文 MATLAB实现DLT Direct Linear Transform 算法
  • 蓝桥杯每日一题(15):莱布尼茨计算圆周率(python)

    Topic 历史上有许多计算圆周率pai的公式 其中 格雷戈里和莱布尼茨发现了下面的公式 pai 4 1 1 3 1 5 1 7 参见图 这个公式简单而优美 但美中不足 它收敛的太慢了 如果我们四舍五入保留它的两位小数 那么 累积1项是 4
  • android Q支持的EAP方法配置

    1 supplicant external wpa supplicant 8 wpa supplicant android config CONFIG EAP MD5 y CONFIG EAP MSCHAPV2 y CONFIG EAP T
  • HTML <thead> 标签

    实例 带有 thead tbody 以及 tfoot 元素的 HTML 表格 table border 1 thead tr th Month th th Savings th tr thead tfoot tr td Sum td td
  • Tomcat多实例和负载均衡动静分离

    目录 一 Tomcat多实例部署 二 负载均衡动静分离 2 1 动静分离 2 11 nginx负载均衡 192 168 30 203 2 22 Tomcat服务器 192 168 30 200 2 23 Tomcat服务器 192 168
  • java g1垃圾收集器_深入理解G1垃圾收集器

    G1 GC是Jdk7的新特性之一 Jdk7 版本都可以自主配置G1作为JVM GC选项 作为JVM GC算法的一次重大升级 DK7u后G1已相对稳定 且未来计划替代CMS 所以有必要深入了解下 不同于其他的分代回收算法 G1将堆空间划分成了
  • Ubuntu22.10 安装微信方法

    Ubuntu22 10 安装微信方法 Ubuntu操作系统中 我尝试过用wine方式安装数次都没有能够启动成功 方法如下 在Ubuntu上安装微信需要使用Wine Wine是一款可以在Linux系统上运行Windows应用程序的兼容层 以下
  • 修改redis配置文件重新启动redis服务启动不了

    一 迁移一个新的配置文件 cat redis conf grep v grep v gt redis test conf 二 修改redis test conf配置 三 启动 redis server etc redis test conf
  • Springboot结合前端上传图片保存到数据库读取

    前言 最近在做一个前后端分离系统 也是闲的无聊做个好玩的练练手 就突然想着之前想了一天的问题 前端怎么去发送图片到后端保存 不是专业前端 轻点喷 图片到底是保存在本地还是存在oss上 保存图片的方式又是什么 这些问题想到我头皮发麻 最后 还
  • 学习经验分享之五:YOLOv5数据集划分以及YOLO格式转换

    问 题 有不少学YOLOv5算法的朋友咨询我 发现部分朋友犯了一个很大的错误 就是只是划分了训练集和验证集 没有测试集 并且没有意识到自己的实验设置是错误的 不科学的 这是非常可怕的 意味着可能前期的工作都白做了 浪费了宝贵的时间和精力 部