Yolov5(一)VOC划分数据集、VOC转YOLO数据集

news2025/1/11 17:10:04

代码使用方法注意修改一下路径、验证集比例、类别名称,其他均不需要改动,自动划分训练集、验证集、建好全部文件夹、一键自动生成Yolo格式数据集在当前目录下,大家可以直接修改相应的配置文件进行训练。

目录

使用方法:

 全部代码:


使用方法:

 全部代码:

import os,random,shutil

import xml.etree.ElementTree as ET
import pickle
import os
from os import listdir,getcwd
from os.path import join


def convert(size,box):
    x_center=(box[0]+box[1])/2.0
    y_center=(box[2]+box[3])/2.0

    x=x_center/size[0]
    y=y_center/size[1]
    w=(box[1]-box[0])/size[0]
    h=(box[3]-box[2])/size[1]
    return (x,y,w,h)

def convert_annotation(xml_file_path,save_txt_file_path,classes):
    xml_file=os.listdir(xml_file_path)
    print(xml_file)
    for xml_name in xml_file:
        print(xml_file)
        xml_file=os.path.join(xml_file_path,xml_name)
        out_txt_path=os.path.join(save_txt_file_path,xml_name.split('.')[0]+".txt")
        out_txt_f=open(out_txt_path,'w')
        tree=ET.parse(xml_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))

            print(w,h,b)
            bb=convert((w,h),b)
            out_txt_f.write(str(cls_id)+" "+" ".join([str(a) for a in bb])+"\n")


def moving(fileDir,tarDir,rate=0.2):
    pathDir=os.listdir(fileDir)
    filenumber=len(pathDir)
                     #自定义抽取图片比例
    picknumber=int(filenumber*rate)#按照rate比例从文件夹中取一定数量的图片
    sample=random.sample(pathDir,picknumber)#随机选取picknumber数量的图片
    print(sample)

    for name in sample:
        shutil.move(fileDir+"/"+name,tarDir+"/"+name)
    return

def movelabel(file_list,file_label_train,file_label_val):
    for i in file_list:
        if i.endswith(".png") or i.endswith(".jpg"):
            #filename=file_label_train+"/"+i[:-4]       可以将.xml文件将.txt改成.xml文件
            filename=file_label_train+"/"+i[:-4]+".xml"       #可以改成xml文件将.txt改成.xml
            if os.path.exists(filename):
                shutil.move(filename,file_label_val)
                print("处理成功")

if __name__=="__main__":
    """
    设置图片路径、label路径、验证集比例、类别
    """
    fileDir=r"./JPEGImages"    #图片的路径
    file_label_train = r"./Annotations"    #标签文件的路径
    rate=0.2  #验证集的比例
    classes1 = ['fire']

    """
    以下均不需要改动
    """



    if not os.path.exists("./JPEGImages_val"):
        # Create the folder
        os.makedirs("./JPEGImages_val")

    tarDir=r"./JPEGImages_val"
    moving(fileDir,tarDir,rate)
    file_list=os.listdir(tarDir)

    if not os.path.exists("./Annotations_val"):
        # Create the folder
        os.makedirs("./Annotations_val")

    file_label_val=r"./Annotations_val"
    movelabel(file_list,file_label_train,file_label_val)

    #VOC转Yolo格式

    # 2 voc 格式的xml标签文件
    if not os.path.exists("./val"):
        # Create the folder
        os.makedirs("./val")

    if not os.path.exists("./train"):
        # Create the folder
        os.makedirs("./train")


    xml_files1 = r"./Annotations_val"
    save_txt_files1 = r"./val"

    convert_annotation(xml_files1, save_txt_files1, classes1)

    xml_files1 = r"./Annotations"
    save_txt_files1 = r"./train"

    convert_annotation(xml_files1, save_txt_files1, classes1)


    #创建所有文件夹
    if not os.path.exists("./images"):
        # Create the folder
        os.makedirs("./images")

    if not os.path.exists("./labels"):
        # Create the folder
        os.makedirs("./labels")


    #将所有文件移动到最终的文件夹中

    import shutil

    # Define the source and destination folders
    source_folder = "./train"
    destination_folder = "./labels"

    # Move the files from the source folder to the destination folder
    shutil.move(source_folder, destination_folder)


    source_folder = "./val"
    destination_folder = "./labels"

    # Move the files from the source folder to the destination folder
    shutil.move(source_folder, destination_folder)

    source_folder = "./JPEGImages"
    destination_folder = "./images"

    # Move the files from the source folder to the destination folder
    shutil.move(source_folder, destination_folder)
    os.rename("./images/JPEGImages", "./images/train")

    source_folder = "./JPEGImages_val"
    destination_folder = "./images"

    # Move the files from the source folder to the destination folder
    shutil.move(source_folder, destination_folder)
    os.rename("./images/JPEGImages_val", "./images/val")

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

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

相关文章

Window停止更新操作

在这里插入图片描述

Android平台RTMP推送或GB28181设备接入端如何实现采集audio音量放大?

我们在做Android平台RTMP推送和GB28181设备对接的时候,遇到这样的问题,有的设备,麦克风采集出来的audio,音量过高或过低,特别是有些设备,采集到的麦克风声音过低,导致播放端听不清前端采集的aud…

1216. 验证回文字符串 III;764. 最大加号标志;1135. 最低成本联通所有城市

1216. 验证回文字符串 III 核心思想:动态规划,这题需要一个思路的转换,删除最多k个字符判断是否为回文串,就相当于问你子序列中最长的回文串的长度是否比n-k长,就将这题转换为了最长回文子序列。 764. 最大加号标志 核心思想&am…

前后端分离------后端创建笔记(03)前后端对接(下)

本文章转载于【SpringBootVue】全网最简单但实用的前后端分离项目实战笔记 - 前端_大菜007的博客-CSDN博客 仅用于学习和讨论,如有侵权请联系 源码:https://gitee.com/green_vegetables/x-admin-project.git 素材:https://pan.baidu.com/s/…

Shader 编程:三角形、矩形等多边形绘制

该原创文章首发于微信公众号:字节流动 未经作者(微信ID:Byte-Flow)允许,禁止转载 SDF 有向距离场 上节其实牵扯到 SDF 算法,因为后面涉及高级特效的时候会经常用到,这里先提前对它做个简单的介…

注意:阿里云服务器随机分配可用区说明

阿里云服务器如有ICP备案需求请勿选择随机可用区,因为当前地域下的可用区可能不支持备案,阿里云百科分享提醒大家,如果你的购买的云服务器搭建网站应用,网站域名需要使用这台云服务器备案的话,不要随机分配可用区&…

从源码分析常见集合的区别之List接口

说到Java集合,共有两大类分别是Collection和Map。今天就详细聊聊大家耳熟能详的List吧。 List接口实现自Collection接口,是Java的集合框架中的一员,List接口下又有ArrayList、LinkedList和线程安全的Vector,今天就简单分析一下Ar…

力扣刷题(C++)知识点

一&#xff0c;找到数组的中间位置 这个是错的&#xff0c;不能分开来 C vector<int>& nums 用法 创建一维数组vector&#xff1a; vector<int> nums; //不指定长度vector<int> nums(n); //指定长度为n c &#xff1c;numeric&#xff1e; accumul…

VM327:38 Uncaught ReferenceError: boay is not defined

找了好久的错误&#xff0c;查找的时候都是路径错了&#xff0c;或者少符号了&#xff0c;&#xff0c;&#xff0c;&#xff0c;&#xff0c;但是就是不是&#xff0c;这个错误就很明显&#xff0c;但是人一般对自己的代码真的很自信的&#xff01;&#xff01;&#xff01; 最…

自动化安装系统—PXE(一)

系统安装过程 加载boot loader加载启动安装菜单加载内核和initrd文件加载根系统运行anaconda的安装向导 安装光盘中与安装相关的文件 安装autofs启动后会自动出现/misc目录。 在虚拟机设置中添加CD/DVD&#xff0c;使用系统ISO文件&#xff0c;登录系统后mount /dev/cdrom …

解决lldb调试时可能出现的personality set failed: Function not implemented

最近在尝试使用Visual Studio 2022远程连接Linux进行C/C的开发&#xff0c;由于CentOS风波不断&#xff0c;所以现在的开发基本上都是使用ubuntu了&#xff0c;但是目前VS2022有一些BUG&#xff0c;就是远程调试时&#xff0c;如果目标系统是ubuntu则会出现启动调试器很慢的问题…

【Linux】线程同步和死锁

目录 死锁 什么是死锁 构成死锁的四个必要条件 如何避免死锁 线程同步 同步的引入 同步的方式 条件变量 条件变量的使用 整体代码 死锁 什么是死锁 死锁是指在一组进程中的各个进程均占有不会释放的资源&#xff0c;但因互相申请被其他进程所占用不会释放 的资源而处…

【EI复现】一种建筑集成光储系统规划运行综合优化方法(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

大模型如何可信?字节跳动研究的最新《可信赖的大型语言模型》综述,提出评估 LLMs 可信度时需要考虑的七大维度

文章目录 一、前言二、主要内容三、总结 &#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 一、前言 论文地址&#xff1a;Trustworthy LLMs: a Survey and Guideline for Evaluating Large Language Models’ Alignment 在将大型语言模型&#xff08;…

Markdown编辑器的使用

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

电路综合原理与实践---T衰减与PI衰减的详细计算理论与设计仿真

电路综合原理与实践—T衰减与PI衰减的详细计算理论与设计仿真 最近要找工作在刷笔试题目&#xff0c;会刷到关于T衰减的理论计算问题&#xff0c;一直搞不明白怎么算的&#xff0c;搞明白之后给大家伙来分享一下。 基础理论可以参考&#xff1a;电阻衰减网络计算&#xff08;P…

点燃性能火箭!揭秘内联函数的魔法 ✨

目录 前言&#xff1a;探索函数调用的微观世界 —— 从调用到跳转 &#x1f680; 函数调用的微观世界 &#x1f31f; 深入理解栈、堆以及堆栈帧&#x1f511; 栈&#xff08;Stack&#xff09;&#xff1a; 堆&#xff08;Heap&#xff09;&#xff1a; 堆栈帧&#xff08…

4.0 Spring Boot入门

1. Spring Boot概述 Spring Boot介绍 Spring Boot是Pivotal团队在2014年推出的全新框架&#xff0c;主要用于简化Spring项目的开发过程&#xff0c;可以使用最少的配置快速创建Spring项目。 Spring Boot版本 2014年4月v1.0.0.RELEASE发布。 ​ 2.Spring Boot特性 约定优于配…

LED为何通过电流控制?

前段时间&#xff0c;散热部的同事咨询我关于手机的闪光灯输出电压值&#xff0c;说实话&#xff0c;一时间把我问住了。关于闪光灯&#xff0c;以往我们关注电流值&#xff0c;电压值很少关注。虽说手机的闪光灯驱动IC输出为BOOST电路&#xff0c;但是输出电压到多少&#xff…

SolidUI社区-元数据文档

背景 随着文本生成图像的语言模型兴起&#xff0c;SolidUI想帮人们快速构建可视化工具&#xff0c;可视化内容包括2D,3D,3D场景&#xff0c;从而快速构三维数据演示场景。SolidUI 是一个创新的项目&#xff0c;旨在将自然语言处理&#xff08;NLP&#xff09;与计算机图形学相…