检测之YOLO转VOC

2023-05-16

文章目录

  • 1、整理Yolo图像和标签文件
  • 2、实现yolo到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转VOC格式的代码。

1、整理Yolo图像和标签文件

有时候yolo的标注文件比较乱,特别是图片和标注文件并非完全对应,这时需要先做一个处理。我们利用交集的方法,来保证图片和标签的一一对应。

代码如下:

imgs=sorted(os.listdir('/yourpath/images'))
lbs=sorted(os.listdir('/yourpath/labels'))
l = [os.path.splitext(i)[0] for i in lbs]  #去掉图片的后缀
b = [os.path.splitext(i)[0] for i in imgs]  # 去掉标注文件的后缀
a=list(set(b) & set(l)) # 这就得到图片和标注文件的一一对应

接着,把一一对应的图片和标签文件取出来,从而得到一个标准的正确的yolo目标检测数据集,代码如下:

for i in tqdm(a):
    img = os.path.join('/yourpath/images/',i+'.jpg')
    lb = os.path.join('/yourpath/labels/',i+'.txt')
    shutil.copy(img,'/yournewpath/images')
    shutil.copy(lb,'/yournewpath/labels')

2、实现yolo到voc的转换

直接上代码,相关说明看代码的注释


import  os, cv2, shutil
from lxml import etree, objectify
from tqdm import tqdm
from PIL import Image
import numpy as np
import time
import os.path as osp
import json

def cover_copy(src,dst):
    '''
    src和dst都必须是文件,该函数是执行覆盖操作
    '''
    if os.path.exists(dst):
        os.remove(dst)
        shutil.copy(src,dst)
    else:
        shutil.copy(src,dst)

def yolo2voc(sourcedir,savedir,class_names):
    """_summary_

    Args:
        sourcedir (_type_): /yournewpath 写到images 和labels上一级
        savedir (_type_): 写到JPEGImages和Annotations上一级
        class_names(list): yolo数据中所有的类别,顺序要与索引对应上
    """

    img_savepath= osp.join(savedir,'JPEGImages')
    ann_savepath=osp.join(savedir,'Annotations')
    for p in [img_savepath,ann_savepath]:
        if osp.exists(p):
            shutil.rmtree(p)
            os.makedirs(p)
        else:
            os.makedirs(p)
    filenames = os.listdir(osp.join(sourcedir,'images'))
    for filename in tqdm(filenames):
        filepath = osp.join(sourcedir,'images',filename)
        annfilepath=osp.join(sourcedir,'labels',osp.splitext(filename)[0]+'.txt')
        annopath = osp.join(ann_savepath,osp.splitext(filename)[0] + ".xml") #生成的xml文件保存路径
        dst_path = osp.join(img_savepath,filename)   
        im = Image.open(filepath)
        image = np.array(im).astype(np.uint8)
        w=image.shape[1]
        h=image.shape[0]
        cover_copy(filepath, dst_path)#把原始图像复制到目标文件夹
        anns=[i.strip().split() for i in open(annfilepath).readlines()]
        objs = []
        for ann in anns:
            name = class_names[int(ann[0])]   
            xcenter = float(ann[1])*w
            ycenter = float(ann[2])*h
            bw=float(ann[3])*w
            bh=float(ann[4])*h
            xmin = (int)(xcenter-bw/2)
            ymin = (int)(ycenter-bh/2)
            xmax = (int)(xcenter+bw/2)
            ymax = (int)(ycenter+bh/2)
            obj = [name, 1.0, xmin, ymin, xmax, ymax]
            #标错框在这里
            if not(xmin-xmax==0 or ymin-ymax==0):
                objs.append(obj)

        E = objectify.ElementMaker(annotate=False)
        anno_tree = E.annotation(
            E.folder('VOC'),
            E.filename(filename),
            E.source(
                E.database('YOLO'),
                E.annotation('VOC'),
                E.image('YOLO')
            ),
            E.size(
                E.width(image.shape[1]),
                E.height(image.shape[0]),
                E.depth(image.shape[2])
            ),
            E.segmented(0)
        )

        for obj in objs:
            E2 = objectify.ElementMaker(annotate=False)
            anno_tree2 = E2.object(
                E.name(obj[0]),
                E.pose(),
                E.truncated("0"),
                E.difficult(0),
                E.bndbox(
                    E.xmin(obj[2]),
                    E.ymin(obj[3]),
                    E.xmax(obj[4]),
                    E.ymax(obj[5])
                )
            )
            anno_tree.append(anno_tree2)
        etree.ElementTree(anno_tree).write(annopath, pretty_print=True)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

检测之YOLO转VOC 的相关文章

  • 免费获取论文全文的方法,SCI-HUB的使用教程

    很多人不在学校期间需要看文献全文 xff0c 很多人获取文章的方式或是在网上求助或是给原作者索要 在SCI HUB出现后 xff0c 这些麻烦都不需要 SCI PUB上保存了超过了4700万篇科研文献 SCI PUB的网址 使用方法 xff

随机推荐

  • Leetcode: Palindrome Partitioning I & II

    Problem I Palindrome Partitioning I Given a string s partition s such that every substring of the partition is a palindr
  • 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