检测之VOC转YOLO

news2024/11/17 11:26:39

文章目录


检测所用数据有几种文件格式,我们对于检测,将使用VOC格式做为基础,与其它格式的的互转实现部分如下:
在这里插入图片描述

检测系列相关文章参考如下链接:

  1. VOC数据的结构介绍及自定义生成,用labelimg自已标注
  2. VOC标准数据的生成及分析,VOC易用labelimg生成,做为基础的检测数据类型
  3. VOC转YOLO,方便YOLO系列模型使用
  4. VOC转COCO,方便用于COCO map评估
  5. YOLO转VOC,方便使用我们的VOC相关分析和处理代码
  6. COCO转VOC,方便使用我们的VOC相关分析和处理代码
    以上数据格式互转,方便我们处理各种收集的开源数据和自己标记的数据的整合。当然也不是特别的全面,但是工作中常用的主流的格式是包含的。
    觉的有价值的小伙伴可以给点个赞。

在很多检测算法的官方实现,用的都是YOLO格式的数据,比如darknet YOLOV4,YOLOV5,YOLOV6,YOLOV7,YOLOV8这些不同人开发的算法,都是用的YOLO格式,所以我们在用labelimg标完数据,做完各种分析后,可以转换到YOLO格式,从而实现这些算法,本文实现一个完整的经过处理的VOC数据集转换成YOLO格式的代码。生成标准完整的VOC格式的数据集的方法请参见链接。对于基于Paddle的PaddleDetection和PaddleYOLO则是支持VOC和COCO两种的。

本文代码经过实测,如感觉对你有帮助,请点个小赞。

import os
import os.path as osp
import shutil
from glob import glob
from tqdm import tqdm
import xml.etree.ElementTree as ET
def convert(size, box):
    """_summary_

    Args:
        size (_type_): 图片宽高
        box (_type_): bounding box 左右上下

    Returns:
        _type_: 返回bounding box的中心点及宽高的相对值
    """
    dw = 1./size[0]
    dh = 1./size[1]
    x = (box[0] + box[1])/2.0
    y = (box[2] + box[3])/2.0
    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 convert2yolo(srcpath,savepath,background=False):
    """_summary_

    Args:
        srcpath (_type_): VOC数据集路径,在JPEGImages和Annotations上一级
        savepath (_type_): YOLO格式数据集保存位置,自动生成下一级images和labels
        background (bool, optional): 是否为背景数片,如果是背景那么生成空的txt文件.
    """
    #直接把原有结果全部清理并生成新的保存路径
    if osp.exists(savepath):
        shutil.rmtree(savepath)
        os.makedirs(savepath)
    saveimgs = osp.join(savepath,'images')
    savelbs = osp.join(savepath,'labels')
    os.makedirs(saveimgs)  #生成保存图片路径
    os.makedirs(savelbs)   #生成保存标签路径

    #重新生成新的数据集
    imgs = glob(osp.join(srcpath,"JPEGImages",'*.jpg'))
    lbs = glob(osp.join(srcpath,"Annotations",'*.xml'))
    for img in tqdm(imgs,desc="Start move images:"):
        shutil.copy(img,saveimgs)
    if not background:
        #对于有标记文件的数据可以进行转换
        #获取类别名称,从而按首字母顺序做类别的顺序排列并保存到classes.txt
        classes = [] #获取类别名称,从而按首字母顺序做类别的顺序排列
        for lb in lbs:
            tree=ET.parse(lb)
            root = tree.getroot()
            for obj in root.iter('object'):
                clsname = obj.find('name').text
                classes.append(clsname)
        classes = sorted(list(set(classes)))
        class_names = [j+'\n'  if i < len(classes)-1 else j for i,j in enumerate(classes)]
        with open(osp.join(savepath,'classes.txt'),'w') as f:
            f.writelines(class_names)
  
        for lb in tqdm(lbs,desc="Start generate labels:"):
            name = osp.splitext(osp.split(lb)[-1])[0]
            out_file = osp.join(savelbs,name+'.txt')
            fout = open(out_file,'w')
            tree=ET.parse(lb)
            root = tree.getroot()
            size = root.find('size')
            # print image_id
            w = int(size.find('width').text)
            h = int(size.find('height').text)

            for obj in root.iter('object'):
                difficult = obj.find('difficult').text
                clsname = obj.find('name').text
                if  int(difficult) == 1:
                    continue
                cls_id = classes.index(clsname)
                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))
                bb = convert((w,h),b)
                fout.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n')
            fout.close()
    else:#对没有标记的图片,称为背景图片,则产生的yolo标注文件是空的即可
        for img in tqdm(imgs,desc="Start generate labels:"):
            name = osp.splitext(osp.split(img)[-1])[0]
            out_file = osp.join(savelbs,name+'.txt')
            fout = open(out_file,'w')
            fout.close()
    print("all Done!")

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

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

相关文章

Notepad++作死,国产文本编辑器Notepad--发布

作死的Notepad Notepad 和 Notepad 都是基于 Windows 的文本编辑器&#xff0c;通常用于编写和编辑纯文本文件。 这两个应用程序都是简单的轻量级程序&#xff0c;提供基本的文本编辑功能。 Notepad是一口君经常使用的一款文本编辑软件&#xff0c;用了大概10年了。 然而Not…

配置并行(RH294)

当Ansible处理playbook的时候会顺序运行每个play确定play的主机列表之后Ansible将按顺序运行每个任务一般来说&#xff0c;所有主机必须在任何主机在play中启动下一个任务之前成功完成任务理论上&#xff0c;Ansible可以同时连接到play中的所有主机来执行每项任务Ansible所进行…

​力扣解法汇总1669. 合并两个链表

目录链接&#xff1a; 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目&#xff1a; https://github.com/September26/java-algorithms 原题链接&#xff1a;力扣 描述&#xff1a; 给你两个链表 list1 和 list2 &#xff0c;它们包含的元素分别为 n 个和 m 个。…

解决Vue启动失败报错:Module not found: Error: Can‘t resolve ‘less-loader‘

问题描述 今天想在网上找一个好看的登录页面&#xff0c;把别人的代码引入进来之后&#xff0c;发现项目编译不了&#xff0c;并且报错了&#xff1a; Module not found: Error: Can’t resolve ‘less-loader’ 分析问题 从错误的日志就可以看出来&#xff0c;是缺少了less-…

Linux: 关于 SIGCHLD 的更多细节

僵尸进程 何为僵尸进程&#xff1f; 一个进程使用fork创建子进程&#xff0c;如果子进程退出&#xff0c;而父进程并没有调用 wait 或 waitpid获取子进程的状态信息&#xff0c;那么子进程的进程描述符仍然保存在系统中。这种进程称之为僵尸进程成为僵尸进程的因素 子进程 先…

AOP的一点浅薄理解

AOP思想应该怎么去理解&#xff01; Aspect&#xff08;切面&#xff09;&#xff1a; Aspect 声明类似于 Java 中的类声明&#xff0c;在 Aspect 中会包含着一些 Pointcut 以及相应的 Advice。 Joint point&#xff08;连接点&#xff09;&#xff1a;表示在程序中明确定义的点…

C语言学习笔记-变量

我们知道每一个程序的运行都需要内存&#xff0c;那么C语言的变量的定义是什么含义呢&#xff1f; 假如我花了200元买了一块4G内存条&#xff0c;然后我定义了一个int a ;就意味着从这4G的内存上要拿走4个字节&#xff0c;又定义了一个int b&#xff1b;那么b同样也要从4G的内存…

【OpenGL学习】OpenGL实现 基于Phong模型的基础光照

基于Phong模型的基础光照 在本节中&#xff0c;我们将利用 Phong 光照模型来完成一个简单的光照场景的渲染。 一、Phong 光照模型 Phong光照模型是20世纪70年代被提出的一种渲染逼真图像的方法&#xff0c;模型的提出者是越南出生的计算机图形学研究员Bui Tuong Phong&#…

JavaScript中的String和自定义对象~

String对象&#xff1a; 它是 JavaScript 的一种基本的数据类型 String 对象的 length 属性声明了该字符串中的字符数&#xff0c;String 类定义了大量操作字符串的方法&#xff0c;例如从字符串中提取字符或子串&#xff0c;或者检索字符或子串 需要注意的是&#xff0c;Ja…

单行文本域,多行文本域隐藏问题

多行文本域隐藏问题 overflow: hidden; 首先是溢出隐藏&#xff0c;不可或缺 display: -webkit-box; 以弹性盒模型显示 -webkit-box-orient: vertical; 盒模型元素的排列方式 -webkit-line-clamp: 3; 显示行数 <style>.postnameStyle{font-size: 30rpx;font-weight: …

【科研】ET-BERT资料库梳理

作者原repo链接 https://github.com/linwhitehat/ET-BERT 0.资料总库 分为数据模型语料库 1.数据集 包含fine-tuning数据集&#xff08;cstnet-tls 1.3&#xff09;与公开数据集&#xff08;USTC-TFC、VPN-app、VPN-service的数据包级和流级&#xff09;目录链接 1.1 微调…

【博客602】net.ipv4.conf.eth0.route_localnet的作用

net.ipv4.conf.eth0.route_localnet的作用 背景&#xff1a;默认情况下不能将本机的请求跳转/转发到回环接口上 在某些场景下会用在一台主机内网络流量重定向&#xff0c;比如将在本机回环设备中的数据包强行转发到另一台主机上。结果发现原本在正常的NAT场景中生效的iptables…

windbg抓一个windows蓝屏分析

前言 设备一直以来挺稳定&#xff0c;但还是小概率事件意外出现某设备突然蓝屏了。查看windows事件查看器提示计算机已经从检测错误后重新启动。检测错误: 0x0000009f (0x0000000000000003, 0xffffad0f4edc7570, 0xfffff8046a09ec20, 0xffffad0f4ef318a0)。已将转储的数据保存…

搭建不同网络训练MNIST

问题在之前的学习过程中&#xff0c;我们学习了如何搭建全连接神经网络训练Mnist数据集。初始时&#xff0c;全连接神经网络训练结果验证集和训练集的精确度不高&#xff0c;在对数据进行归一化&#xff0c;调参等操作提高了精确度。我们这次使用Le-Net5和VGG对MNIST进行训练&a…

STM32—串口

串口介绍 串行接口简称串口&#xff0c;也称串行通信接口或串行通讯接口&#xff08;通常指COM接口&#xff09;&#xff0c;是采用串行通信方式的扩展接口。串行接口&#xff08;Serial Interface&#xff09;是指数据一位一位地顺序传送。其特点是通信线路简单&#xff0c;只…

.NET MAUI 安卓 UI 资源设置

本文主要介绍使用 MAUI 开发安卓应用时&#xff0c;如何更换和处理 UI 资源&#xff1a;应用名称&#xff0c;图标&#xff0c;主题配色&#xff0c;状态栏&#xff0c;闪屏。 文章目录1. 背景2. 资源设置2.1 项目创建2.2 应用名称2.3 应用图标2.4 应用闪屏2.5 沉浸式状态栏1. …

通用智能如何拥有生命的简单设计

如第一个图所示 是和环境交互的时候 行为交互时间和环境反馈时间T0 T1 还有行为消耗能量E0 环境反馈能量E1 如图有四种情况 其中反馈时间T1小于交互时间T0的任务是积极反馈 和打游戏一样要及时反馈才能提起兴趣 这个是整个行为交互过程中最小的记录单元 图二的每个元素都代表多…

STM32项目-STM32智能小车-电子设计大赛-STM32cubemx-STM32f103c8t6STM32串口通信-

记录项目的详细制作过程&#xff0c;所以笔记很长&#xff0c;图很多、很多图不好CSDN搬运&#xff0c; 我把笔记放网盘或者自己根据资料下载 笔记网盘下载: 链接&#xff1a;https://pan.baidu.com/s/1Mk2EVIha7Fpj4Xductg3Uw?pwdVCC1 提取码&#xff1a;VCC1 笔记CSDN下载:…

C++11 入门

作者&#xff1a;小萌新 专栏&#xff1a;C进阶 作者简介&#xff1a;大二学生 希望能和大家一起进步&#xff01; 本篇博客简介&#xff1a;介绍C11的一些背景知识 本篇博客主要是讲解一些关键字 C11前言C11诞生简介列表初始化{}初始化关键字autodecltypenullptr范围forSTL的更…

技术开发117

技术开发117 业务内容&#xff1a; 半导体制造设备零件&#xff08;阀门零件、管件&#xff09;、汽车的各种功能部件&#xff08;发动机、动力转向器、空调、刹车和传动系统&#xff09;、 建筑和工业设备部件、电信设备的零件、气动特殊气缸、供热和制冷系统的零件、其他一…