txt2xml

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


# 支持多种格式图片,可以自己添加
def search_file_name(file_path, img_root):
    file_format = ['.jpg', '.JPG', '.png', '.PNG', '.JPEG', '.jpeg']
    file_path = pathlib.Path(file_path)
    file_name = file_path.stem
    for endsw in file_format:
        file_judge = file_name + endsw
        if os.path.isfile(os.path.join(img_root, file_judge)):
            return file_name, endsw
    return 'stop', 0


def yolo2voc(src_img_root, src_label_root, dst_label_root, class_map):
    not_have_img = []
    if not os.path.exists(dst_label_root):
        os.makedirs(dst_label_root)
    # 遍历所有txt文件
    for i, src_label_name in enumerate(os.listdir(src_label_root)):
        xmlBuilder = Document()
        annotation = xmlBuilder.createElement("annotation")  # 创建annotation标签
        xmlBuilder.appendChild(annotation)
        src_label_path = os.path.join(src_label_root, src_label_name)
        file_name, endsw = search_file_name(src_label_path, src_img_root)
        if file_name == 'stop':
            not_have_img.append(os.path.basename(src_label_path))
            continue
        with open(src_label_path, 'r') as fr:
            txtlines = fr.readlines()
        src_img_name = file_name + endsw
        src_img_path = os.path.join(src_img_root, src_img_name)
        image_np = cv2.imread(src_img_path)
        Pheight, Pwidth, Pdepth = image_np.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(src_img_name)
        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 line in txtlines:
            oneline = line.strip().split(" ")
            object = xmlBuilder.createElement("object")  # object 标签
            picname = xmlBuilder.createElement("name")  # name标签
            namecontent = xmlBuilder.createTextNode(class_map[oneline[0]])
            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标签结束
        dst_label_path = os.path.join(dst_label_root, file_name + '.xml')
        with open(dst_label_path, 'w') as f:
            xmlBuilder.writexml(f, indent='\t', newl='\n', addindent='\t', encoding='utf-8')
        print(src_img_path)
    print('not have img:', not_have_img, '\n', not_have_img.__len__())
    
if __name__ == "__main__":
    # 注意: opencv 不支持中文路径,路径及文件名需要是英文数字符号等
    src_img_root = "/home/liu_hui/YM-factory02/YM-factory02/data_door_white/images/test"
    src_label_root = "/home/liu_hui/YM-factory02/YM-factory02/runs/detect/exp3/labels"
    dst_label_root = "/home/liu_hui/YM-factory02/YM-factory02/runs/detect/exp3/labels/voc"
    # txt文件中每列第一个为类别序号,分别对应label名
    class_map = {'0': "door_open",'1':"door_close"}  #, '1': "person", '2': 'ce'
    #class_map = {'0': "badminton, '1': "person", '2': 'ce'"} 
    yolo2voc(src_img_root, src_label_root, dst_label_root, class_map)
 

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

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

相关文章

数字化企业各业务模块模型

1.计划 1.1采购计划执行情况 序号 采购计划号 采购订单号 业务员 供应商 物料 数量 金额 计划入库日期 实际入库日期 状态 针对企业执行中或者未关闭的采购计划进行统计与分析,主要目的在于引领企业员工与领导关注长期在途的采购…

Android修行手册 - 可变参数中星号什么作用(冷知识)

点击跳转>Unity3D特效百例点击跳转>案例项目实战源码点击跳转>游戏脚本-辅助自动化点击跳转>Android控件全解手册点击跳转>Scratch编程案例点击跳转>软考全系列 👉关于作者 专注于Android/Unity和各种游戏开发技巧,以及各种资源分享&…

如何选择工业以太网交换机?

现在市面上有许多品牌的工业以太网交换机,并且类型也相当复杂。在选择交换机的时候,需要考虑多个因素,比如工作环境、是否需要冗余配置、是否需要网管功能、是否需要非网管功能、以及未来的维护和扩展性等。通常情况下,当选择工业…

Istio学习笔记- 服务网格

Istio 服务网格 参考:Istio / Istio 服务网格 Istio 使用功能强大的 Envoy 服务代理扩展了 Kubernetes,以建立一个可编程的、可感知的应用程序网络。Istio 与 Kubernetes 和传统工作负载一起使用,为复杂的部署带来了标准的通用流量管理、遥…

别试错了,是该关注一下软件内在质量了

太多这种例子了,老板们早上出的新想法,恨不得第二天就能上线。。每个互联网公司都试图突破固定领地,不断地尝试新的业务,一旦发现不行,就立刻砍掉,名曰“试错”。 研发部门,为了应对压力&#…

技术总结大杂烩

mysql引擎 MySQL常用存储引擎:MyISAM、InnoDB、MEMORY、MERGE,其中InnoDB提供事务安全表,其他存储引擎都是非事务安全表。 MyISAM:mysql默认存储引擎。MyISAM不支持事务,也不支持外键,但其访问速度快&…

py 打开多个页面

要在Python中打开多个网页,可以使用Python的网络爬虫库(如BeautifulSoup或Scrapy)或第三方库(如Selenium)来模拟浏览器操作。 使用BeautifulSoup或Scrapy等库,可以通过编写代码来抓取网页上的内容&#xf…

[每周一更]-(第71期):DevOps 是什么?

Wiki的解释: DevOps(Development和Operations的混成词)是一种重视“软件开发人员(Dev)”和“IT运维技术人员(Ops)”之间沟通合作的文化、运动或惯例。 通过自动化“软件交付”和“架构变更”的…

day14-文件系统工作流程分析

1.内核启动文件系统后,文件系统的工作流程 1.参数的接收 2.参数的解析 3.参数的应用 问题: 1. UBOOT 传给 KERNEL 的参数是以tagglist进行的 KERNEL 传给 文件系统(busybox)的参数是以什么进行的? 2. 在整个文件系统中都需…

马尔可夫过程

马尔可夫决策过程 马尔可夫含义 马尔可夫性质 在给定历史状态 s 0 , … , s t s_0,\dots,s_t s0​,…,st​的情况下,某个状态的未来只与当前状态 s t s_t st​有关,与历史的状态无关。 ​ p ( s t 1 ∣ s t ) p ( s t 1 ∣ s 0 , s 1 , … , s t…

【python】单词接龙

题目: 这是一个关于“单词接龙”的算法题目。在这个游戏中,我们需要从给定的一组单词中,以特定的开头字母构造出一条最长的“龙”。每个单词在这条“龙”中最多出现两次。当两个单词相连时,它们的重合部分被合并成一个。例如&…

spring boot中使用Bean Validation做优雅的参数校验

一、Bean Validation简介 Bean Validation是Java定义的一套基于注解的数据校验规范,目前已经从JSR 303的1.0版本升级到JSR 349的1.1版本,再到JSR 380的2.0版本(2.0完成于2017.08),目前最新稳定版2.0.2(201…

LMI相机配置步骤,使用Gocator2550相机

在此之前可以先浏览我编写的相机SDK通用类和LMISDK,进行配套观看 https://blog.csdn.net/m0_51559565/article/details/134404394 //LMI相机SDK https://blog.csdn.net/m0_51559565/article/details/134403745 //相机通用类1.启动LMI加速器 LMI加速器用于将相机…

什么是智能井盖?万宾科技的智能井盖传感器的效果

近年来为打造智慧城市政府一直在不懈努力。加速城市基础建设是一项重要的举措,它有助于推动城市综合治理城市生命线的建设工程。在改善市民生活质量的过程中,市政部门正积极进行井盖的改进和升级工作,特别是那些看似微不足道的井盖却蕴含着重…

Java基于itextPDF实现pdf动态导出

Java基于itextPDF实现pdf动态导出 1、制作PDF导出模板2 、集成itextpdf3 、编写实体4 、编写主要代码5、编写controller并测试补充:踩坑记录 现在的业务越来越复杂了,有些业务场景已经不能满足与EXCEL导出和WORD导出了,例如准考证打印&#x…

深度学习 植物识别算法系统 计算机竞赛

文章目录 0 前言2 相关技术2.1 VGG-Net模型2.2 VGG-Net在植物识别的优势(1) 卷积核,池化核大小固定(2) 特征提取更全面(3) 网络训练误差收敛速度较快 3 VGG-Net的搭建3.1 Tornado简介(1) 优势(2) 关键代码 4 Inception V3 神经网络4.1 网络结构 5 开始训练5.1 数据集…

深入理解JMeter中的JSON Extractor

Apache JMeter是一款出色的开源性能和功能测试工具,这款工具提供了丰富的功能和强大的扩展性,可以应对各种复杂的测试需求。当我们在进行接口测试时,经常会遇到需要从接口响应中提取信息并在后续请求中使用的情况。这时候,JMeter中…

arf_1解题

arf_1解题 镜像环境 version: 3.2services:web:image: registry.cn-hangzhou.aliyuncs.com/n1book/web-file-read-1:latestports:- 80:80新建yml文件将代码保存在当前位置 使用docker-compost up -d 拉取镜像 解题 访问该镜像映射端口为1520 可以看到页面只有一个holle但…

java Concurrent 线程安全的集合类

ConcurrentHashMap:是一个线程安全的哈希表实现,它支持高并发的读写操作。它采用了分段锁的机制,将整个哈希表分成多个段,每个段都有一个独立的锁,不同的线程可以同时访问不同的段,从而提高并发性能。 Con…

【Python】一文带你掌握数据容器之集合,字典

目录: 一、集合 思考:我们目前接触到了列表、元组、字符串三个数据容器了。基本满足大多数的使用场景为何又需要学习新的集合类型呢? 通过特性来分析: (1)列表可修改、支持重复元素且有序 (2)元组、字符…