最近在用ppyolo训练好的模型对新采集的数据进行标记,再人工微调,减少从头打标签的时间,但是推理保存的结果都是txt格式的,想要在labelimg中可视化,那就需要将txt转换成xml。

以下代码即可完成这一功能。

# -*- coding:UTF-8 -*-
import os
import cv2def txt_to_xml(classname_path, txt_path, img_path, xml_path):# 1.读取txt文件中的标签类别with open(classname_path, 'r') as f:classes = f.readlines()  # list, 每个类别末尾都有'\n'classes = [cls.strip('\n') for cls in classes]# 2.找到txt标签文件夹files = os.listdir(txt_path)# 用于存储 "老图"pre_img_name = ''# 3.遍历文件夹for i, name in enumerate(files):# mac系统中文件夹里有该文件,默认的也删不掉,那就直接passif name == '.DS_Store':continueprint(name)# 4.打开txttxtFile = open(txt_path + name)# 读取所有内容txtList = txtFile.readlines()# 读取图片名称img_name = name.split(".")[0]pic = cv2.imread(img_path + img_name + ".jpg")# 获取图像大小信息Pheight, Pwidth, Pdepth = pic.shape# 5.遍历txt文件中每行内容for row in txtList:# 按' '分割txt的一行的内容oneline = row.strip().split(" ")# 遇到的是一张新图片if img_name != pre_img_name:# 6.新建xml文件xml_file = open((xml_path + img_name + '.xml'), 'w')xml_file.write('<annotation>\n')xml_file.write('    <folder>billiards</folder>\n')xml_file.write('    <filename>' + img_name + '.jpg' + '</filename>\n')xml_file.write('    <path>E:/Images</path>\n')xml_file.write('    <source>\n')xml_file.write('        <database>orgaquant</database>\n')xml_file.write('    </source>\n')xml_file.write('    <size>\n')xml_file.write('        <width>' + str(Pwidth) + '</width>\n')xml_file.write('        <height>' + str(Pheight) + '</height>\n')xml_file.write('        <depth>' + str(Pdepth) + '</depth>\n')xml_file.write('    </size>\n')xml_file.write('    <object>\n')xml_file.write('        <name>' + classes[int(oneline[0])] + '</name>\n')xml_file.write('        <difficult>' + str(0) + '</difficult>\n')xml_file.write('        <bndbox>\n')xml_file.write('            <xmin>' + str(int(((float(oneline[1])) * Pwidth + 1) - (float(oneline[3])) * 0.5 * Pwidth)) + '</xmin>\n')xml_file.write('            <ymin>' + str(int(((float(oneline[2])) * Pheight + 1) - (float(oneline[4])) * 0.5 * Pheight)) + '</ymin>\n')xml_file.write('            <xmax>' + str(int(((float(oneline[1])) * Pwidth + 1) + (float(oneline[3])) * 0.5 * Pwidth)) + '</xmax>\n')xml_file.write('            <ymax>' + str(int(((float(oneline[2])) * Pheight + 1) + (float(oneline[4])) * 0.5 * Pheight)) + '</ymax>\n')xml_file.write('        </bndbox>\n')xml_file.write('    </object>\n')xml_file.close()pre_img_name = img_name  # 将其设为"老"图else:  # 不是新图而是"老图"# 7.同一张图片,只需要追加写入objectxml_file = open((xml_path + img_name + '.xml'), 'a')xml_file.write('    <object>\n')xml_file.write('        <name>' + classes[int(oneline[0])] + '</name>\n')xml_file.write('        <difficult>' + str(0) + '</difficult>\n')'''  按需添加这里和上面xml_file.write('        <pose>Unspecified</pose>\n')xml_file.write('        <truncated>0</truncated>\n')xml_file.write('        <difficult>0</difficult>\n')'''xml_file.write('        <bndbox>\n')xml_file.write('            <xmin>' + str(int(((float(oneline[1])) * Pwidth + 1) - (float(oneline[3])) * 0.5 * Pwidth)) + '</xmin>\n')xml_file.write('            <ymin>' + str(int(((float(oneline[2])) * Pheight + 1) - (float(oneline[4])) * 0.5 * Pheight)) + '</ymin>\n')xml_file.write('            <xmax>' + str(int(((float(oneline[1])) * Pwidth + 1) + (float(oneline[3])) * 0.5 * Pwidth)) + '</xmax>\n')xml_file.write('            <ymax>' + str(int(((float(oneline[2])) * Pheight + 1) + (float(oneline[4])) * 0.5 * Pheight)) + '</ymax>\n')xml_file.write('        </bndbox>\n')xml_file.write('    </object>\n')xml_file.close()# 8.读完txt文件最后写入</annotation>xml_file1 = open((xml_path + pre_img_name + '.xml'), 'a')xml_file1.write('</annotation>')xml_file1.close()print("Done !")if __name__== '__main__':classname_path = '/Users/h1y/Documents/mac2server/billiards/billiards_classes.txt'  # names文件的路径# 修改成自己的文件夹 注意文件夹最后要加上/txt_path = "/Users/h1y/Documents/mac2server/billiards/txt2xml/labels/"img_path = "/Users/h1y/Documents/mac2server/billiards/txt2xml/images/"xml_path = "/Users/h1y/Documents/mac2server/billiards/txt2xml/"txt_to_xml(classname_path, txt_path, img_path, xml_path)

其中,代码中第一步提到的类别标签txt文件内容格式如下,每一行为一个类别

转换后的xml文件和labelimg生成的格式一样,如下所示

目标检测标签文件txt转成xml相关推荐

  1. 基于语义分割Ground Truth(GT)转换yolov5目标检测标签(路面积水检测例子)

    基于语义分割Ground Truth(GT)转换yolov5目标检测标签(路面积水检测例子) 概述 许多目标检测的数据是通过直接标注或者公开平台获得,如果存在语义分割Ground Truth的标签文件 ...

  2. 夏侯南溪搭建目标检测模型——文件结构设计篇

    1 前言 此文章是夏侯南溪搭建目标检测模型--文件夹结构设计篇- 2 文件夹命名 使用小写字母命名,单词之间用短线"-"进行连接,例如: plane-detection 3 项目文 ...

  3. 目标检测: 数据集转换txt转为xml格式

    目录 1.txt数据集格式 2.xml数据集格式 3.转换代码 4.根据xml标签分割出图像中的目标物体 5.效果展示 1.txt数据集格式 第1元素代表类别,第2,3表示目标框的中心位置,第4,5表 ...

  4. 目标检测-VOC数据集txt文件制作方法

    个人微信公众号:AI研习图书馆,欢迎关注~ 深度学习知识及资源分享,学习交流,共同进步~ VOC数据集中txt文件的制作方法 1.引言 本文介绍两种VOC数据集txt文件生成方法,一种是Python实 ...

  5. Visdrone2019数据集.txt标签文件转换为voc格式.XML标签文件

    最近有同学问是否有Visdrone数据集的xml文件,由于本人之前训练数据的时候没有保存xml文件,所以无法共享. 为了解决这个问题,重新写了转换代码并贴出,供大家共同学习使用.(文末附上数据下载网盘 ...

  6. VPGNet数据集解析且将分割标签转化为目标检测标签

    VPGNet交通标志数据集 VPGNet是一个包含了四个场景(晴天,夜间,阴雨等)下的交通路况数据集,其主要是针对地面标志(箭头线,人行道)的任务,该数据集一共包括以下17类地面标注 {0:'back ...

  7. ECCV 2022 | RFLA:基于高斯感受野的微小目标检测标签分配

    前言 在本文中,作者提出了一种基于高斯感受野的标签分配(RFLA)策略用于微小目标检测.并提出了一种新的感受野距离(RFD)来直接测量高斯感受野和地面真值之间的相似性,而不是使用IoU或中心采样策略分 ...

  8. 目标检测——标注文件的格式设计

    1 致谢 感谢陈助教和钟老师的帮助! 2 标注文件的格式设计 标注的文件的格式我们选择CSV文件格式,因为CSV是数据科学中一种十分常用的数据格式,而且结合pandas包可以实现很多便利的数据操作,所 ...

  9. iCAN使用faster r-cnn得到目标检测结果文件为空

    问题在于图片文件夹后少了/,添加上/后解决 -/tf-faster-rcnn/tools/Object_Detector.py --img_dir /home/featurize/Data/exima ...

最新文章

  1. php中file_get_contents如何读取大容量文件
  2. 岳阳机器人餐厅在哪_从机器人咖啡看未来餐饮行业大方向,如何才能活下去?...
  3. VMware下Ubuntu联网操作
  4. svn中“clean up”死循环问题解决办法
  5. 基于LZ77算法的文件压缩铺垫
  6. 如何把一个PDF文件内的部分页码对应的内容导出成一个新的PDF文件
  7. Java中,为什么子类的构造方法中必须调父类的构造方法?
  8. LeetCode 329. 矩阵中的最长递增路径(记忆化递归)
  9. 为什么年轻人挣得很多还是穷?北上广深挑战指数报告~
  10. 静态内部类----Java
  11. nginx ngx_http_auth_basic_module(Basic Authentication)
  12. WebSphere 管理员界面 修改配置之后,没有反应的原因,需要按下[保存]link
  13. python怎么在运行中查看执行状态_python,_python程序运行时 查看对象状态,python - phpStudy...
  14. KB954430补丁重复安装失败的解决办法
  15. Java开发手册(嵩山版)
  16. 《从零开始做运营》1~2章 读书笔记
  17. 轻易解决VMware 虚拟机中被提示“请不要在虚拟机中运行此程序“
  18. mint-ui message box confirm弹框确认和取消按钮的回调
  19. c语言必背数据结构_C语言实现常用数据结构:简要一览(第1篇
  20. 企业培训视频如何防止被下载和盗用?

热门文章

  1. keep-alive的理解?
  2. 不在轻狂也就不再年少
  3. nginx php 缓存时间,nginx expires设置数据过期时间
  4. java游戏 勇者恶龙_西方十大“勇者恶龙”游戏排名公开_电视游戏_新浪游戏_新浪网...
  5. 基于Darknet的YOLOv4目标检测
  6. 【vue案例】vue实现tab选项卡
  7. Golang telnet 端口
  8. 基于java+springboot+mybatis+vue+elementui的社区医疗服务系统
  9. 虚拟网络设备 tap/tun 原理解析
  10. linux内核那些事之Sparse内存模型初始化