批量修改 labelImg 生成的xml文件
使用tensorflow对目标检测图像进行数据训练时,需要标注大量的图像。这个工作量实在是不少。为了更加简便的标注图像,或者说增加训练集:
- 做如下操作:
-
先对每类图像各标注100-200张进行训练。
训练准确度提升完成后,将未标注的图像(测试集)进行预测。
人工分出预测对的图像,根据检测对的图像的检测框数据生成新的xml用来增加训练集。
由于之前有相应的xml文件模板,所以我们只需要修改之前的xml文件即可。
修改代码:
import os
from xml.etree.ElementTree import ElementTree,Elementdef read_xml(in_path):'''''读取并解析xml文件in_path: xml路径return: ElementTree'''tree = ElementTree()tree.parse(in_path)return treedef write_xml(tree, out_path):'''''将xml文件写出tree: xml树out_path: 写出路径'''tree.write(out_path, encoding="utf-8", xml_declaration=True)def if_match(node, kv_map):'''''判断某个节点是否包含所有传入参数属性node: 节点kv_map: 属性及属性值组成的map'''for key in kv_map:if node.get(key) != kv_map.get(key):return Falsereturn True# ----------------search -----------------
def find_nodes(tree, path):'''''查找某个路径匹配的所有节点tree: xml树path: 节点路径'''return tree.findall(path)def get_node_by_keyvalue(nodelist, kv_map):'''''根据属性及属性值定位符合的节点,返回节点nodelist: 节点列表kv_map: 匹配属性及属性值map'''result_nodes = []for node in nodelist:if if_match(node, kv_map):result_nodes.append(node)return result_nodes# ---------------change ----------------------
def change_node_properties(nodelist, kv_map, is_delete=False):'''修改/增加 /删除 节点的属性及属性值nodelist: 节点列表kv_map:属性及属性值map'''for node in nodelist:for key in kv_map:if is_delete:if key in node.attrib:del node.attrib[key]else:node.set(key, kv_map.get(key))def change_node_text(nodelist, text, is_add=False, is_delete=False):'''''改变/增加/删除一个节点的文本nodelist:节点列表text : 更新后的文本'''for node in nodelist:if is_add:node.text += textelif is_delete:node.text = ""else:node.text = textdef create_node(tag, property_map=None, content=None):'''新造一个节点tag:节点标签property_map:属性及属性值mapcontent: 节点闭合标签里的文本内容return 新节点'''element = Element(tag,content, property_map)element.text = Nonereturn elementdef add_child_node(nodelist, element):'''''给一个节点添加子节点nodelist: 节点列表element: 子节点'''for node in nodelist:node.append(element)def del_node_by_tagkeyvalue(nodelist, tag, kv_map):'''''同过属性及属性值定位一个节点,并删除之nodelist: 父节点列表tag:子节点标签kv_map: 属性及属性值列表'''for parent_node in nodelist:children = parent_node.getchildren()for child in children:if child.tag == tag and if_match(child, kv_map):parent_node.remove(child)def get_xml(input_dir):xml_path_list = []for (root_path,dirname,filenames) in os.walk(input_dir):for filename in filenames:if filename.endswith('.xml'):xml_path = root_path+"/"+filenamexml_path_list.append(xml_path)return xml_path_listif __name__ == "__main__":input_dir ="./"xml_path_list = get_xml(input_dir)for xml_file in xml_path_list:################ 1. 读取xml文件 ##########root = read_xml(xml_file)data = [[1, 1, 1],["abc",1, 1, 1,1],["ABC",1, 1, 1,1]]# 修改图像属性size = root.find('size')size.find('height').text = "new text111"size.find('width').text = "new text111"size.find('depth').text = "new text111"# Find annotations.Object = root.findall('object')for i in range(len(Object)):if len(Object) ==2:# change_node_text(Object[i].find('name'),str(data[i+1][0]))Object[i].find('name').text = str(data[i+1][0]) # 修改节点名Object[i].find('bndbox').find('ymin').text = str(data[i+1][1]) # 修改节点文本Object[i].find('bndbox').find('xmin').text = str(data[i+1][2])Object[i].find('bndbox').find('ymax').text = str(data[i+1][3])Object[i].find('bndbox').find('xmax').text = str(data[i+1][4])else:# change_node_text(Object[0].find('name'),"new text")Object[0].find('name').text = str(data[1][0]) # 修改节点名Object[0].find('bndbox').find('ymin').text = str(data[1][1]) # 修改节点文本Object[0].find('bndbox').find('xmin').text = str(data[1][2])Object[0].find('bndbox').find('ymax').text = str(data[1][3])Object[0].find('bndbox').find('xmax').text = str(data[1][4])del_parent_nodes1 = find_nodes(Object[1], "object/name")del_parent_nodes2 = find_nodes(Object[1], "object/pose")del_parent_nodes3 = find_nodes(Object[1], "object/truncated")del_parent_nodes4 = find_nodes(Object[1], "object/difficult")del_parent_nodes5 = find_nodes(Object[1], "object/bndbox")del_parent_nodes6 = find_nodes(Object[1], "object/bndbox/ymin")del_parent_nodes7 = find_nodes(Object[1], "object/bndbox/xmin")del_parent_nodes8 = find_nodes(Object[1], "object/bndbox/ymax")del_parent_nodes9 = find_nodes(Object[1], "object/bndbox/xmax")Element.remove(del_parent_nodes1)Element.remove(del_parent_nodes2)Element.remove(del_parent_nodes3)Element.remove(del_parent_nodes4)Element.remove(del_parent_nodes5)Element.remove(del_parent_nodes6)Element.remove(del_parent_nodes7)Element.remove(del_parent_nodes8)Element.remove(del_parent_nodes9)################ 输出到结果文件 ##########write_xml(root, "HKEN111113.xml")
批量修改 labelImg 生成的xml文件相关推荐
- python实现对LabelImg标注的xml文件修改其标签名字
使用labelImg标注数据时,通过python批量修改已经标注的数据标签名字,例如,本程序将标注生成的xml文件中的目标名字"zero"批量修改为"num", ...
- HTML批量删除标记,批量删除LabelImg制作的.xml中的部分标签值(删除.xml的节点值)...
概述 自己在用labelImg打好标签后,想只用其中几类训练,不想训练全部类别,又不想重新打标生成.xml文件,因此想到这个办法:直接在.xml文件中删除原有的不需要的标签类及其属性. 打标时标签名出 ...
- python批量导入图片_Python批量导入图片生成PowerPoint 2007+文件
原标题:Python批量导入图片生成PowerPoint 2007+文件 说明:本文是"Python批量爬取微信公众号文章中的图片"的后续文章,用来把从公众号批量抓取的图片还原为P ...
- 【数据库2】生成txt/xml文件,ftp,oracle安装/表操作/虚表/日期/序列/索引/视图/链路/同义词/高可用性,mysql/文件入库/清理/表结构设计/交换/收集
文章目录 1.生成数据:crontab 2.ftp:ftp是tcp/ip协议族中一员,分客户端和服务端 2.1 安装:linux操作系统的用户也是ftp的用户,可以配置专用的ftp用户,专用的ftp用 ...
- 使用Eclipse创建Web工程后未生成web.xml文件
使用Eclipse创建Web工程后未生成web.xml文件 鼠标右击项目,按照如下操作生成web.xml项目:
- 修改Android中strings.xml文件, 动态改变数据
有些朋友可能会动态的修改Android中strings.xml文件中的值,在这里给大家推荐一种简单的方法. strings.xml中节点是支持占位符的,如下所示: <string name=&q ...
- matlab分析xml文件_修改Java中的XML文件(DOM分析器)
matlab分析xml文件 We can modify XML file in Java using DOM parser. We can add elements, remove elements, ...
- 微软 crm开发笔记 创建查询条件,生成Fetch.XML文件
创建查询条件,生成Fetch.XML文件 可生成: <fetch version="1.0" output-format="xml-platform" m ...
- SEO优化之根据网址自动生成sitemap.xml文件
背景: 公司要做一个电商的网站,而该项目是由J2EE架构完成,项目经理说要让Java代码自助每天生成电子商务网站的Sitemap文件,然后开始上网各种查资料!!!然而,终于碰上了本人有生以来第一个在网 ...
最新文章
- mysql修改用户密码
- ios 自定义拍照页面_无需解锁也能使用的iOS实用小组件
- RxSwift之UI控件UISlider与UIStepper扩展的使用
- 9.1 LSMW程序创建操作手册 第1 2步
- html5表单修改颜色,在css中更改输入搜索表单的背景色
- 旅行 jzoj 1281
- 我35岁了,依然可以“横行职场”
- 创建线程的3种方式,线程池的参数详解
- 图解sql内外连接和左连接left join和右连接right join
- 数字通信原理_推荐 | 从飞鸽传书到数字信号,你不得不懂的通信原理
- 德标螺纹规格对照表_德标、欧标、国际、国标对照表
- 监视及系统响应的补充FMEA (FMEA-MSR)
- 在电脑上怎样将长方形图片裁剪成圆形的图片?
- 基于kettle的数据集成平台(汇总)
- 宏观分析(美债利率、美元、黄金、石油、标普500的相关性)
- 2021-06-10 MYSQL存储过程与触发器作业
- 涉密计算机能用固态硬盘,电脑硬盘有坏道还能继续使用吗?不要抱侥幸心理,可能后悔莫及...
- 网络信息安全攻防学习平台——基础关
- Oracle 时间差计算 数据库关于时间计算
- 东方财富、同花顺、大智慧、通达信的Level2行情接口哪个好?
热门文章
- 软工实践第八次作业——项目需求答辩
- 定义一个集合类setColour,要求元素为枚举类型值
- 【读过的书,留下的迹】高性能MySQL(第3版)
- 书论75 钱泳《书学》
- 小学计算机第二课堂内容,小学第二课堂活动实施方案
- 利用js 获取本日 本周 本月时间代码
- android 距离测量工具,手机上有个小功能,可以精确的测量距离,比卷尺还要好用...
- 学python是属于什么行业_学Python能挣多少钱?哪些人适合学Python?
- python中间件有哪些_python 中间件
- 网站服务器怎么恢复原来数据库,五步骤完成WordPress网站和数据库备份、搬迁恢复访问...