labelimg voc与yolo数据标签互转脚本

2023-05-16

xml2txt

import os.path
import xml.etree.ElementTree as ET

class_names = ['0', '1', '2', '3', '4', '5']

xmlpath = '/media/bvision/My Book/boatDetail/new_xml/'  # 原xml路径
txtpath = '/media/bvision/My Book/boatDetail/new_txt/'  # 转换后txt文件存放路径
if not os.path.exists(txtpath):
    os.mkdir(txtpath)

files = []

for root, dirs, files in os.walk(xmlpath):
    None

number = len(files)
print(number)
i = 0
while i < number:

    name = files[i][0:-4]
    print(name)
    xml_name = name + ".xml"
    txt_name = name + ".txt"
    xml_file_name = xmlpath + xml_name
    txt_file_name = txtpath + txt_name

    xml_file = open(xml_file_name)
    tree = ET.parse(xml_file)
    root = tree.getroot()
    filename = root.find('filename').text

    image_name = root.find('filename').text
    w = int(root.find('size').find('width').text)
    h = int(root.find('size').find('height').text)

    f_txt = open(txt_file_name, 'w+')
    content = ""

    first = True

    for obj in root.iter('object'):

        name = obj.find('name').text
        class_num = class_names.index(name)

        xmlbox = obj.find('bndbox')

        x1 = int(xmlbox.find('xmin').text)
        x2 = int(xmlbox.find('xmax').text)
        y1 = int(xmlbox.find('ymin').text)
        y2 = int(xmlbox.find('ymax').text)

        if first:
            content += str(class_num) + " " + \
                       str((x1 + x2) / 2 / w) + " " + str((y1 + y2) / 2 / h) + " " + \
                       str((x2 - x1) / w) + " " + str((y2 - y1) / h)
            first = False
        else:
            content += "\n" + \
                       str(class_num) + " " + \
                       str((x1 + x2) / 2 / w) + " " + str((y1 + y2) / 2 / h) + " " + \
                       str((x2 - x1) / w) + " " + str((y2 - y1) / h)

    # print(str(i / (number - 1) * 100) + "%\n")
    #     print(xml_name)
    f_txt.write(content)
    f_txt.close()
    xml_file.close()
    i += 1

print("done!")

txt2xml

from xml.dom.minidom import Document
import os
import cv2


# def makexml(txtPath, xmlPath, picPath):  # txt所在文件夹路径,xml文件保存路径,图片所在文件夹路径
def makexml(picPath, txtPath, xmlPath):  # txt所在文件夹路径,xml文件保存路径,图片所在文件夹路径
    """此函数用于将yolo格式txt标注文件转换为voc格式xml标注文件
    """
    dic = {'0': "boat", '1': 'text'}
    files = os.listdir(txtPath)
    for i, name in enumerate(files):
        xmlBuilder = Document()
        annotation = xmlBuilder.createElement("annotation")  # 创建annotation标签
        xmlBuilder.appendChild(annotation)
        txtFile = open(txtPath + name)
        txtList = txtFile.readlines()
        x = os.path.exists(picPath + name[0:-4] + ".jpg")
        print(picPath + name)
        if x:
            img = cv2.imread(picPath + name[0:-4] + ".jpg")
        else:
            try:
                img = cv2.imread(picPath + name[0:-4] + ".JPG")
            except:

                img = cv2.imread(picPath + name[0:-4] + ".png")
        try:

            Pheight, Pwidth, Pdepth = img.shape

            folder = xmlBuilder.createElement("folder")  # folder标签
            foldercontent = xmlBuilder.createTextNode("driving_annotation_dataset")
            folder.appendChild(foldercontent)
            annotation.appendChild(folder)  # folder标签结束

            filename = xmlBuilder.createElement("filename")  # filename标签
            filenamecontent = xmlBuilder.createTextNode(name[0:-4] + ".jpg")
            filename.appendChild(filenamecontent)
            annotation.appendChild(filename)  # filename标签结束

            size = xmlBuilder.createElement("size")  # size标签
            width = xmlBuilder.createElement("width")  # size子标签width
            widthcontent = xmlBuilder.createTextNode(str(Pwidth))
            width.appendChild(widthcontent)
            size.appendChild(width)  # size子标签width结束

            height = xmlBuilder.createElement("height")  # size子标签height
            heightcontent = xmlBuilder.createTextNode(str(Pheight))
            height.appendChild(heightcontent)
            size.appendChild(height)  # size子标签height结束

            depth = xmlBuilder.createElement("depth")  # size子标签depth
            depthcontent = xmlBuilder.createTextNode(str(Pdepth))
            depth.appendChild(depthcontent)
            size.appendChild(depth)  # size子标签depth结束

            annotation.appendChild(size)  # size标签结束

            for j in txtList:
                oneline = j.strip().split(" ")
                object = xmlBuilder.createElement("object")  # object 标签
                picname = xmlBuilder.createElement("name")  # name标签
                try:
                    namecontent = xmlBuilder.createTextNode(dic[oneline[0]])
                except:
                    continue
                picname.appendChild(namecontent)
                object.appendChild(picname)  # name标签结束

                pose = xmlBuilder.createElement("pose")  # pose标签
                posecontent = xmlBuilder.createTextNode("Unspecified")
                pose.appendChild(posecontent)
                object.appendChild(pose)  # pose标签结束

                truncated = xmlBuilder.createElement("truncated")  # truncated标签
                truncatedContent = xmlBuilder.createTextNode("0")
                truncated.appendChild(truncatedContent)
                object.appendChild(truncated)  # truncated标签结束

                difficult = xmlBuilder.createElement("difficult")  # difficult标签
                difficultcontent = xmlBuilder.createTextNode("0")
                difficult.appendChild(difficultcontent)
                object.appendChild(difficult)  # difficult标签结束

                bndbox = xmlBuilder.createElement("bndbox")  # bndbox标签
                xmin = xmlBuilder.createElement("xmin")  # xmin标签
                mathData = int(((float(oneline[1])) * Pwidth + 1) - (float(oneline[3])) * 0.5 * Pwidth)
                xminContent = xmlBuilder.createTextNode(str(mathData))
                xmin.appendChild(xminContent)
                bndbox.appendChild(xmin)  # xmin标签结束

                ymin = xmlBuilder.createElement("ymin")  # ymin标签
                mathData = int(((float(oneline[2])) * Pheight + 1) - (float(oneline[4])) * 0.5 * Pheight)
                yminContent = xmlBuilder.createTextNode(str(mathData))
                ymin.appendChild(yminContent)
                bndbox.appendChild(ymin)  # ymin标签结束

                xmax = xmlBuilder.createElement("xmax")  # xmax标签
                mathData = int(((float(oneline[1])) * Pwidth + 1) + (float(oneline[3])) * 0.5 * Pwidth)
                xmaxContent = xmlBuilder.createTextNode(str(mathData))
                xmax.appendChild(xmaxContent)
                bndbox.appendChild(xmax)  # xmax标签结束

                ymax = xmlBuilder.createElement("ymax")  # ymax标签
                mathData = int(((float(oneline[2])) * Pheight + 1) + (float(oneline[4])) * 0.5 * Pheight)
                ymaxContent = xmlBuilder.createTextNode(str(mathData))
                ymax.appendChild(ymaxContent)
                bndbox.appendChild(ymax)  # ymax标签结束

                object.appendChild(bndbox)  # bndbox标签结束

                annotation.appendChild(object)  # object标签结束

            f = open(xmlPath + name[0:-4] + ".xml", 'w')
            xmlBuilder.writexml(f, indent='\t', newl='\n', addindent='\t', encoding='utf-8')
            f.close()
        except:
            pass


if __name__ == "__main__":
    picPath = "/data_sda/wjw/zj_data/near_images/"  # 图片所在文件夹路径,后面的/一定要带上
    txtPath = "/data_sda/wjw/yolov5/runs/detect/zj_near/labels/"  # txt所在文件夹路径,后面的/一定要带上
    xmlPath = "/data_sda/wjw/yolov5/runs/detect/zj_near/xml/"  # xml文件保存路径,后面的/一定要带上
    makexml(picPath, txtPath, xmlPath)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

labelimg voc与yolo数据标签互转脚本 的相关文章

  • Python 序列之切片(slice)

    本文为Python列表切片功能的学习笔记 xff0c 供您参考 基本用法 Python中支持切片操作的序列类型有列表 xff08 list xff09 元组 xff08 tuple xff09 以及字符串 xff08 str xff09 以

随机推荐

  • Debian 查看与修改IP,设置多ip,network与networkManager配置

    目录 Debian网络配置network Debian网络配置NetworkManager 当前用的是Debian桌面版 xff0c 网络配置network与NetworkManager xff0c 默认网络采用networkManager
  • 树莓派入门(2)树莓派的远程控制

    目录 前言SSHPuTTY远程登录树莓派远程桌面连接VNC与树莓派进行文件传输 前言 在计算机网络中 xff0c 我们可以通过使用C S xff08 客户端 服务器 xff09 模式来实现远程控制 我们如果想用其他电脑来远程控制树莓派 xf
  • “我们“App功能介绍

    系统及开发配置 系统 xff1a Android系统 开发工具 xff1a Android Studio4 0 运行要求 xff1a Android系统5 1及以上 软件介绍 一款娱乐的 xff0c 记录您和爱人纪念日的软件 其中包含经典的
  • Linux/Debian下 root 用户没有声音的解决

    Linux Debian下 root 用户没有声音的解决 问题 xff1a 新装的Debian11 5 下root用户一直没有声音 背景 xff1a Debian11 5 为U盘dvd iso 版本 xff0c root用户下pulse a
  • dmpython win7安装遇到的问题

    系统环境 xff1a win7 python3 6 dm8 20230106 x86 win 64 安装过程及问题 xff1a 打开cmd进入达梦数据库安装目录D soft dm dm8 drivers python dmPython xf
  • python实现队列

    文章目录 队列实现操作实现 队列实现 队列是一种先进先出的数据结构 xff0c 本文用顺序表实现队列 操作 Queue 创建一个空的队列enqueue item 往队列中添加一个item元素dequeue 从队列头部删除一个元素is emp
  • vscode当前工作区不受信任,因此已禁用此扩展

    openGL系列文章目录 文章目录 openGL系列文章目录前言一 解决步骤首先点击左边的 扩展 xff0c 或者使用快捷键 xff1a ctrl 43 shift 43 x2 添加插件信任选择扩展工作区信任 前言 在vscode中安装插件
  • python实现二叉树的创建

    文章目录 二叉树的基本概念二叉树的性质 特性 二叉树的节点表示以及二叉树的创建1 二叉树的节点表示2 二叉树的创建 二叉树的基本概念 二叉树是每个节点最多有两个子树的树结构 通常子树被称作 左子树 xff08 left subtree xf
  • 目标跟踪——SORT算法原理浅析

    目标跟踪文章目录 目标跟踪 SORT算法原理浅析 目标跟踪 Deep Sort算法原理浅析 基于yolov5与Deep Sort的流量统计与轨迹跟踪 文章目录 目标跟踪文章目录SORT算法卡尔曼滤波匈牙利算法 SORT核心算法流程总结 SO
  • 目标跟踪——Deep Sort算法原理浅析

    目标跟踪文章目录 目标跟踪 SORT算法原理浅析 目标跟踪 Deep Sort算法原理浅析 基于yolov5与Deep Sort的流量统计与轨迹跟踪 文章目录 目标跟踪文章目录前言多目标跟踪主要流程Deep Sort总结 前言 背景 xff
  • 基于yolov5与Deep Sort的流量统计与轨迹跟踪

    系列文章目录 目标跟踪 SORT算法原理浅析 目标跟踪 Deep Sort算法原理浅析 基于yolov5与Deep Sort的流量统计与轨迹跟踪 文章目录 系列文章目录前言一 整体目录结构二 Deep Sort代码参数解释三 代码展示总结
  • Ubuntu中docker部署gpu版pytorch

    文章目录 docker简介安装docker与NVIDIA docker安装docke安装NVIDIA docker 安装显卡驱动拉取pytorch GPU版镜像文件运行pytoch容器总结 docker简介 Docker 是一个开源的应用容
  • Ubuntu安装cuda与cudnn,亲测可用

    文章目录 前言一 安装显卡驱动二 安装cuda三 安装cudnn总结 前言 前段时间被派到现场去部署算法 xff0c 之前同事搭好cuda的环境不好用了 xff0c 具体表现为 xff1a 1 屏幕的分辨率显示很奇怪且不可调节 2 输入nv
  • 实现对python源码加密的方法

    文章目录 前言一 将py文件编译成pyc二 将py转化成so文件2 1准备工作2 2新建py2so py文件2 3编译项目文件夹 总结 前言 由于项目的保密性需求 xff0c 对已开发完成的项目需要进行加密处理 xff0c 本文给出两种方法
  • python配置文件的两种方式

    文章目录 前言py文件作为配置文件yaml文件作为配置文件总结 前言 在运行项目程序时通常会有一个配置文件 xff0c 配置文件是用于配置程序的参数和初始化设置的文件 比如现在要做一个项目 xff0c 在部署程序时 xff0c 需要摄像头I
  • Ubuntu18.04安装OpenPCDet:spconv一键安装

    文章目录 前言本机安装环境安装Spconv安装pcdetclone 项目创建并配置虚拟环境安装pcdet 总结 前言 最近在摸索点云数据的处理 xff0c 希望实现对点云数据的目标检测 但是在复现PointPillars算法时遇到很多坑 x
  • OpenPCDet 训练自己的数据集详细教程!

    文章目录 前言一 pcd转bin二 labelCloud 工具安装与使用三 训练仿写代码对pcdet datasets custom custom dataset py进行改写新建tools cfgs dataset configs cus
  • Ubuntu16.04 用Nomachine进行远程控制的配置

    本文介绍如何在Ubuntu16 04环境下运用Nomachine进行远程控制 一 NoMachine介绍 NoMachine是一款基于NX技术进行远程控制的软件 xff0c 最大的优势是跨平台 xff0c 简单 xff0c 可以实现Linu
  • ROS一键安装

    文章目录 前言ROS一键安装总结 前言 这段时间接触到了雷达点云数据 xff0c 用到了ROS系统 xff0c 在安装过程中完成了手动安装 xff0c 也尝试了一键安装 xff0c 特此记录下一键安装方法 ROS一键安装 wget http
  • labelimg voc与yolo数据标签互转脚本

    xml2txt span class token keyword import span os span class token punctuation span path span class token keyword import s