python解析xml+得到pascal voc xml格式用于目标检测+美化xml
1.python解析xml
img_path='./data/001.tif'xml_path='./xml/001.xml'img=cv2.imread(img_path)# cv2.imshow('img', img)# cv2.waitKey(0)print(img.shape)try:xmlp = ET.XMLParser(encoding="utf-8")tree = ET.parse(xml_path, parser=xmlp)root = tree.getroot()print(tree)print(root)except Exception as e:print(e, xml_path)content_info={}for i in tree.iterfind('.//正文组/正文'):print("i.attrib['篇目号']", i.attrib['篇目号'])for j in i.findall('篇目坐标'):print(j.text)print(type(j.text))content_info[i.attrib['篇目号']] =j.textprint('content_info=',content_info)
若要更改xml内容,可以
new_point='1,2,3,4'
j.text = new_point
tree.write('output_test.xml', encoding='utf-8')
2. 得到pascal voc xml格式用于目标检测
img_dir = "./images/train"
csv_dir = "./train_xml.csv"
xml_dir = "./Annotations"
if not os.path.exists(xml_dir):os.mkdir(xml_dir)imgs_path_Lists = [os.path.join(img_dir,i) for i in os.listdir(img_dir)]df=pd.read_csv(csv_dir).copy()
df_value=df.values
print(df_value.shape)
coord_h,coord_w=df_value.shape
print(df_value[:2])
for img_path_List in imgs_path_Lists:im = Image.open(img_path_List)width, height = im.sizeimg_name=img_path_List.split('/')[-1]# write in xml filexml_file = open((xml_dir + '/' + img_name.split('.jpg')[0] + '.xml'), 'w')xml_file.write('<annotation>\n')xml_file.write(' <folder>steel</folder>\n')xml_file.write(' <filename>' + img_name + '</filename>\n')xml_file.write(' <size>\n')xml_file.write(' <width>' + str(width) + '</width>\n')xml_file.write(' <height>' + str(height) + '</height>\n')xml_file.write(' <depth>3</depth>\n')xml_file.write(' </size>\n')for i in df_value:if i[0].split('/')[-1]==img_name:xmin=i[1]ymin=i[2]xmax=i[3]ymax=i[4]class_name=i[-1]# write the region of image on xml filexml_file.write(' <object>\n')xml_file.write(' <name>' + class_name + '</name>\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(xmin) + '</xmin>\n')xml_file.write(' <ymin>' + str(ymin) + '</ymin>\n')xml_file.write(' <xmax>' + str(xmax) + '</xmax>\n')xml_file.write(' <ymax>' + str(ymax) + '</ymax>\n')xml_file.write(' </bndbox>\n')xml_file.write(' </object>\n')xml_file.write('</annotation>')
3.美化xml
原始xml如下
<?xml version='1.0' encoding='utf-8'?>
<lab><person name='Blue'><age>22</age><gender>male</gender></person><person name='Yellow'><age>22</age><gender>female</gender></person></lab>
代码:
def prettyXml(element, indent, newline, level = 0): # elemnt为传进来的Elment类,参数indent用于缩进,newline用于换行if element: # 判断element是否有子元素if element.text == None or element.text.isspace(): # 如果element的text没有内容element.text = newline + indent * (level + 1)else:element.text = newline + indent * (level + 1) + element.text.strip() + newline + indent * (level + 1)#else: # 此处两行如果把注释去掉,Element的text也会另起一行#element.text = newline + indent * (level + 1) + element.text.strip() + newline + indent * leveltemp = list(element) # 将elemnt转成listfor subelement in temp:if temp.index(subelement) < (len(temp) - 1): # 如果不是list的最后一个元素,说明下一个行是同级别元素的起始,缩进应一致subelement.tail = newline + indent * (level + 1)else: # 如果是list的最后一个元素, 说明下一行是母元素的结束,缩进应该少一个subelement.tail = newline + indent * levelprettyXml(subelement, indent, newline, level = level + 1) # 对子元素进行递归操作
def testXML():from xml.etree import ElementTree as ETtree = ET.parse('test.xml')root = tree.getroot()print(root)# #查看tag和attrib# for person in root:# print(person.tag, person.attrib)ZF_COORD = ET.Element('字符坐标')ZWZ = ET.SubElement(ZF_COORD, '正文组')#这里需要把001变成需要的篇目号ZW = ET.SubElement(ZWZ , '正文',{'篇目号':"001"})#栏目LM=ET.SubElement(ZW, '栏目')LM.text = '12,12,334,123;12,34,45,56'#引题YT=ET.SubElement(ZW,'引题')YT.text='12,12,334,123;12,34,45,56'# 标题BT = ET.SubElement(ZW, '标题')BT.text = '12,12,334,123;12,34,45,56'# 副题FT = ET.SubElement(ZW, '副题')FT.text = '12,12,334,123;12,34,45,56'# 小标题XBT = ET.SubElement(ZW, '小标题')XBT.text = '12,12,334,123;12,34,45,56'# 作者author = ET.SubElement(ZW, '作者')author.text = '12,12,334,123;12,34,45,56'# # 向根节点添加新的子节点 root.append(ZF_COORD)# 写入 tree.write('./sample.xml', encoding="utf-8",xml_declaration=True)#美化作用tree = ET.parse('./sample.xml') # 解析test.xml这个文件,该文件内容如上文root = tree.getroot() # 得到根元素,Element类prettyXml(root, '\t', '\n') # 执行美化方法# ET.dump(root)tree.write('./sample.xml', encoding="utf-8",xml_declaration=True)
新生成xml如下
<?xml version='1.0' encoding='utf-8'?>
<lab><person name="Blue"><age>22</age><gender>male</gender></person><person name="Yellow"><age>22</age><gender>female</gender></person><字符坐标><正文组><正文 篇目号="001"><栏目>12,12,334,123;12,34,45,56</栏目><引题>12,12,334,123;12,34,45,56</引题><标题>12,12,334,123;12,34,45,56</标题><副题>12,12,334,123;12,34,45,56</副题><小标题>12,12,334,123;12,34,45,56</小标题><作者>12,12,334,123;12,34,45,56</作者></正文></正文组></字符坐标>
</lab>
python解析xml+得到pascal voc xml格式用于目标检测+美化xml相关推荐
- COCO和 PASCAL VOC标注格式的学习笔记
1 致谢 感谢网友"嘿芝麻"的帮助, 原文链接如下: https://blog.csdn.net/zw__chen/article/details/82856231 2 前言 感觉 ...
- [数据集][VOC]高质量的目标检测数据集合集(持续更新)
[1][数据集名称]数据集VOC正版消防灭火器数据集VOC格式-5156张 [数据集信息]数据集格式:Pascal VOC格式(仅包含jpg图片和对应的xml) 图数量(jpg文件个数 xml文件个数 ...
- 9.2.2 Python图像处理之图像数学形态学-二值形态学应用-目标检测
9.2.2 Python图像处理之图像数学形态学-二值形态学应用-目标检测(击中与击不中) 文章目录 9.2.2 Python图像处理之图像数学形态学-二值形态学应用-目标检测(击中与击不中) 1 算 ...
- RCNN系列实验的PASCAL VOC数据集格式设置
我们在做RCNN系列的实验时,往往需要把数据集的格式设置为和PASCAL VOC数据集一样的格式,其实当然也可以修改读取数据的代码,只是这样更为麻烦,自己的数据格式变了又得修改. 首先以VOC200 ...
- 将PASCAL VOC数据集格式转换为YOLOV5 所需的格式
1. VOC数据集 VOC数据集格式如下(以2007为例): 其中JPEGImages文件夹存放图片,Anootations下放的是标注框的信息,格式为xml:但YOLOv5所需要的格式为txt,且t ...
- 目标检测(四)——xml快速上手(可完整实现)
文章目录 什么是xml xml解析讲解 一.标签介绍 filename标签 size标签 object标签 二.xml解析的API xml单个文件的解析 构建类别索引(category_id) 构建x ...
- 实战解析:真实AI场景下,极小目标检测与精度提升 | 百度AI公开课
主讲人 | 哈利 百度高级研发工程师 量子位整理编辑 | 公众号 QbitAI 目前,各个企业行业在AI落地应用中,常常会遇到极小目标检测问题.在这些AI应用中,都需要在一个大图中精准识别出极小目标, ...
- 目标检测:XML文件矩形框在图片上的简单可视化
代码如下: 需要改的就是开头的四行 可视化结果只有框,没有类别 用于验证 自己写的,亲测可用 import xml.etree.ElementTree as ET import os import c ...
- 目标检测--将xml文件中标签(矩形框)在其原图片上显示并另存
""" 目的:将原图片(img)与其xml(xml),合成为打标记的图片(labelled),矩形框标记用红色即可 已有:(1)原图片文件夹(imgs_path),(2) ...
最新文章
- 手机移动防卫盾安全需求分析文档
- BZOJ4860 Beijing2017树的难题(点分治+单调队列)
- 数据格式转换(一)PDF转换技术
- MyBatis的初始化方式
- leetcode74. 搜索二维矩阵 ,你见过吗
- 搜狐视频怎么设置自动连播
- 实践中整理出tomcat集群和负载均衡
- linux计划任务crond服务
- Memcache安全性
- React.memo 是个啥么鬼?有什么用???
- 计算机标准差平方差怎么按,数学标准差公式
- java将明文变为密文,使用java编程实现明文和密文之间的互转
- matlab 绘图与动画制作
- 去除取消WPS的广告推送、WPS热点以及推荐软件等骚扰功能
- 过拟合与欠拟合及解决方法
- 风场可视化:绘制粒子
- 商业智能助力 银行业数据“挖金”
- javascript教程系列-1.JavaScript基础
- oracle mysql limit用法_mysql以及oracle数据分页的sql示例(limit和Rownum的用法) | Soo Smart!...
- R----stringr包介绍学习
热门文章
- 新手福利:百度官方中文教程,过年也要深度学习!
- python 两个字典的合并 update
- 注意力机制-深度学习中的注意力机制+注意力机制在自然语言处理中的应用
- RNN循环神经网络(吴恩达《序列模型》笔记一)
- MongoDB:SpringBoot有关@Document(collection = )与@Document(collation= )注解的区别
- 15 操作系统第四章 文件管理 文件的物理结构 文件存储空间管理
- LeetCode算法
- you *might* want to use the less safe log_bin_trust_function_creators variable
- USACO 1.2 Milking Cows (枚举)
- 数据结构-王道2017-第5章 图