检测之VOC转YOLO

2023-05-16

文章目录


检测所用数据有几种文件格式,我们对于检测,将使用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!")
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

检测之VOC转YOLO 的相关文章

随机推荐

  • Hadoop 知识点总结——HDFS读流程和写流程

    HDFS读流程和写流程 前言HDFS的读数据流程HDFS的写数据流程 大家好 xff0c 我是风云 xff0c 欢迎大家关注我的博客 笑看风云路 xff0c 在未来的日子里我们一起来学习大数据相关的技术 xff0c 一起努力奋斗 xff0c
  • Mapreduce实例(五):二次排序

    MR 实现 二次排序 实现思路代码实现自定义key的代码 xff1a 分区函数类代码分组函数类代码Map代码 xff1a Reduce代码 xff1a 完整代码 xff1a 大家好 xff0c 我是风云 xff0c 欢迎大家关注我的博客 或
  • SpringSecurityOAuth2 登录 Miss grant type问题

    SpringSecurityOAuth2 登录传值的时候会出现 Miss grant type问题 解决方式为 xff1a 在header 加上 39 Content Type 39 39 application x www form ur
  • 【思维导图】消息中间件

  • su: 警告:无法切换到目录/home/oracle: 权限不够-bash: /home/oracle/.bash_profile: 权限不够

    在使用linux服务器时 xff0c 通过root用户切换到oracle时报错 报错如下图 xff1a 原因 xff1a 权限不足 xff01 解决 xff1a 查看oracle用户情况 xff1a id oracle 查看目录权限 xff
  • 学生时代的书单

    大话系列的书 xff0c 用独特的行文风格 xff0c 以风趣 幽默的语言向读者讲述 概念原理知识 xff0c 用漫画式的插图帮助读者理解晦涩 枯燥的技术 xff0c 让我们在快乐中掌握知识 xff01 1 大话通信 通信基础知识读本 作者
  • tensorflow配置只使用CPU

    文章目录 1 方法一2 方法二 有些场景下 xff0c 比如GPU版本运行失败或其它原因 xff0c 需要强制tensorflow使用CPU xff0c 这里提供两种方法 xff0c 仅针对tensorflow2 1 方法一 span cl
  • 不同框架实现LSTM代码及转Onnx方法

    文章目录 1 Paddle 生成LSTM1 1 time major 61 False1 2 time major 61 True1 3 sequence lens1 4 无初始状态1 5 查看生成的onnx模型 2 pytorch 生成L
  • 从目标检测数据集中扣出所需类别进行分类

    文章目录 1 获取VOC数据集中两轮车2 接着做COCO数据集的分类数据获取3 YOLO 格式数据4 openimage数据获取获取标签根据displayname 获取 labelname 并指定我们想要的类别根据标签名找到对应的图片名称测
  • keras_cv进行数据增强

    使用keras cv来做分类数据增强 以下直接上流程 xff0c 具体的原理和代码上github查看源码及配合tensorflow官网及keras官网来做处理 当前 xff08 2022 10 8 这些文档还不是很全 span class
  • paddle的安装

    安装 1 安装paddle2 安装nccl3 验证 这次安装主要使用conda xff0c 可以有更好的安装体验 关于框架 xff0c 常用的tensorflow pytorch 但是国产的paddle也做的越来越好 xff0c 而且学习资
  • 去掉文件名中的特殊符号及中文

    文章目录 做深度学习算法收集数据时 xff0c 来源各种各样 xff0c 导至文件名混有各种特殊符号 xff0c 所在这里有一段代码 xff0c 可以把文件名进行处理 xff0c 只保留数字 字母和下划线 xff0c 然后对文件进行重命名
  • pip常用命令

    文章目录 看了一篇介绍pip的 xff0c 记录在这里 https mp weixin qq com s BejnKBp1OGTyW2SzHiCwcw 有安装 卸载 下载 xff0c 升级等使用方法 再贴个图 xff1a
  • 如何搭建高质量、高效率的前端工程体系--页面结构继承

    推荐理由 xff1a 推荐理由 xff1a 程序员在我们的印象中 xff0c 就是不停的敲代码 xff1b 而写的程序如何确保不出现bug 而且还能及时发现问题 xff0c 下面我推荐的这篇文章 xff0c 围绕整个前端的开发流程出发解决这
  • onnx删除无用属性

    这里写自定义目录标题 在推理onnx模型时 xff0c 报了一个错 xff0c 如下 xff1a InvalidGraph ONNXRuntimeError 10 INVALID GRAPH This is an invalid model
  • onnx模型显示输出形状

    在用netron查看模型时 xff0c 希望看到各个节点的shape xff0c 可以执行以下代码 1 依赖包 pip install onnx pip install onnx graphsurgeon index url https p
  • 使用opencv截取旋转框目标

    使用opencv截取旋转框目标 1 第一种方法2 第二种方法3 两种方法的简单对比4 opencv 最小面积矩形返回角度的理解4 1 version4 2之前4 2 version4 2之后 本文列举了两种方法 xff0c 使用的数据如图
  • Tensorflow pytorch及paddle交叉熵损失函数类标签及label smooth配置方法

    交叉熵损失函数类标签及label smooth配置方法 1 无class weight 无label smooth1 1 pytorch 输出1 2 paddle 输出1 3 tensorflow 输出 2 有label smooth 没有
  • 检测之YOLO转VOC

    文章目录 1 整理Yolo图像和标签文件2 实现yolo到voc的转换 检测系列相关文章参考如下链接 xff1a VOC数据的结构介绍及自定义生成 xff0c 用labelimg自已标注VOC标准数据的生成及分析 VOC易用labelimg
  • 检测之VOC转YOLO

    文章目录 检测所用数据有几种文件格式 xff0c 我们对于检测 xff0c 将使用VOC格式做为基础 xff0c 与其它格式的的互转实现部分如下 xff1a 检测系列相关文章参考如下链接 xff1a VOC数据的结构介绍及自定义生成 xff