python 批量修改 labelImg 生成的xml文件的方法


Posted in Python onSeptember 09, 2019

概述

自己在用labelImg打好标签后,想只用其中几类训练,不想训练全部类别,又不想重新打标生成.xml文件,因此想到这个办法:直接在.xml文件中删除原有的不需要的标签类及其属性。

打标时标签名出现了大小写(工程量大时可能会手滑),程序中有改写标签值为小写的过程,因为我做py-faster-rcnn 训练时,标签必须全部为小写。

以如下的.xml文件为例,我故意把标签增加了大写

<annotation verified="yes">
 <filename>test.jpg</filename>
 <path>C:\Users\yasin\Desktop\test</path>
 <source>
 <database>Unknown</database>
 </source>
 <size>
 <width>400</width>
 <height>300</height>
 <depth>3</depth>
 </size>
 <segmented>0</segmented>
 <object>
 <name>People</name>
 <pose>Unspecified</pose>
 <truncated>0</truncated>
 <difficult>0</difficult>
 <bndbox>
  <xmin>80</xmin>
  <ymin>69</ymin>
  <xmax>144</xmax>
  <ymax>89</ymax>
 </bndbox>
 </object>
 <object>
 <name>CAT</name>
 <pose>Unspecified</pose>
 <truncated>0</truncated>
 <difficult>0</difficult>
 <bndbox>
  <xmin>40</xmin>
  <ymin>69</ymin>
  <xmax>143</xmax>
  <ymax>16</ymax>
 </bndbox>
 </object>
 <object>
 <name>dog</name>
 <pose>Unspecified</pose>
 <truncated>0</truncated>
 <difficult>0</difficult>
 <bndbox>
  <xmin>96</xmin>
  <ymin>82</ymin>
  <xmax>176</xmax>
  <ymax>87</ymax>
 </bndbox>
 </object> 
</annotation>

具体实现

假如我们只想保留图片上的people和cat类,其他都删除,代码如下:

from xml.etree.ElementTree import ElementTree
from os import walk, path

def read_xml(in_path):
  tree = ElementTree()
  tree.parse(in_path)
  return tree

def write_xml(tree, out_path):
  tree.write(out_path, encoding="utf-8", xml_declaration=True)

def find_nodes(tree, path):
  return tree.findall(path)

def del_node_by_target_classes(nodelist, target_classes_lower, tree_root):
  for parent_node in nodelist:
    children = parent_node.getchildren()
    if (parent_node.tag == "object" and children[0].text.lower() not in target_classes_lower):
      tree_root.remove(parent_node)
    elif (parent_node.tag == "object" and children[0].text.lower() in target_classes_lower):
      children[0].text = children[0].text.lower()

def get_fileNames(rootdir):
  data_path = []
  prefixs = []
  for root, dirs, files in walk(rootdir, topdown=True):
    for name in files:
      pre, ending = path.splitext(name)
      if ending != ".xml":
        continue
      else:
        data_path.append(path.join(root, name))
        prefixs.append(pre)

  return data_path, prefixs

if __name__ == "__main__":
  # get all the xml paths, prefixes if not used here
  paths_xml, prefixs = get_fileNames("/home/yasin/old_labels/")

  target_classes = ["PEOPLE", "CAT"] # target flags you want to keep

  target_classes_lower = []
  for i in range(len(target_classes)):
    target_classes_lower.append(target_classes[i].lower()) # make sure your target is lowe-case

  # print(target_classes_lower)
  for i in range(len(paths_xml)):
    # rename and save the corresponding xml
    tree = read_xml(paths_xml[i])
    
    # get tree node
    tree_root = tree.getroot()

    # get parent nodes
    del_parent_nodes = find_nodes(tree, "./")
    
    # get target classes and delete
    target_del_node = del_node_by_target_classes(del_parent_nodes, target_classes_lower, tree_root)
    
    # save output xml, 000001.xml
    write_xml(tree, "/home/yasin/new_labels/{}.xml".format("%06d" % i))

按照上述代码,示例.xml变为如下.xml,可以看出我们删除了除people和cat类的类别(即dog类),并把保留类别的打标改成了小写:

<?xml version='1.0' encoding='utf-8'?>
<annotation verified="yes">
 <filename>test.jpg</filename>
 <path>C:\Users\yasin\Desktop\test</path>
 <source>
 <database>Unknown</database>
 </source>
 <size>
 <width>400</width>
 <height>300</height>
 <depth>3</depth>
 </size>
 <segmented>0</segmented>
 <object>
 <name>people</name>
 <pose>Unspecified</pose>
 <truncated>0</truncated>
 <difficult>0</difficult>
 <bndbox>
  <xmin>80</xmin>
  <ymin>69</ymin>
  <xmax>144</xmax>
  <ymax>89</ymax>
 </bndbox>
 </object>
 <object>
 <name>cat</name>
 <pose>Unspecified</pose>
 <truncated>0</truncated>
 <difficult>0</difficult>
 <bndbox>
  <xmin>40</xmin>
  <ymin>69</ymin>
  <xmax>143</xmax>
  <ymax>16</ymax>
 </bndbox>
 </object>
</annotation>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python httplib模块使用实例
Apr 11 Python
python采集百度百科的方法
Jun 05 Python
Python连接DB2数据库
Aug 27 Python
解决python文件双击运行秒退的问题
Jun 24 Python
Python适配器模式代码实现解析
Aug 02 Python
python自动化测试之异常及日志操作实例分析
Nov 09 Python
vue常用指令代码实例总结
Mar 16 Python
Python打印特殊符号及对应编码解析
May 07 Python
django filter过滤器实现显示某个类型指定字段不同值方式
Jul 16 Python
Django模板报TemplateDoesNotExist异常(亲测可行)
Dec 18 Python
Python基础之tkinter图形化界面学习
Apr 29 Python
TensorFlow中tf.batch_matmul()的用法
Jun 02 Python
Python定时发送天气预报邮件代码实例
Sep 09 #Python
python英语单词测试小程序代码实例
Sep 09 #Python
Python实现TCP通信的示例代码
Sep 09 #Python
Python3使用PySynth制作音乐的方法
Sep 09 #Python
python智联招聘爬虫并导入到excel代码实例
Sep 09 #Python
python 的 openpyxl模块 读取 Excel文件的方法
Sep 09 #Python
pymysql模块的使用(增删改查)详解
Sep 09 #Python
You might like
滚动图片效果 jquery实现回旋滚动效果
2013/01/08 Javascript
setInterval,setTimeout与jquery混用的问题
2013/04/08 Javascript
js数值和和字符串进行转换时可以对不同进制进行操作
2014/03/05 Javascript
使用js判断TextBox控件值改变然后出发事件
2014/03/07 Javascript
bootstrap-wysiwyg结合ajax实现图片上传实时刷新功能
2016/05/27 Javascript
JavaScript中const、var和let区别浅析
2016/10/11 Javascript
Javascript同时声明一连串(多个)变量的方法
2017/01/23 Javascript
js 博客内容进度插件详解
2017/02/19 Javascript
JavaScript转换数据库DateTime字段类型方法
2017/06/27 Javascript
详解jQuery中关于Ajax的几个常用的函数
2017/07/17 jQuery
js实现图片轮播效果学习笔记
2017/07/26 Javascript
vue.js实例对象+组件树的详细介绍
2017/10/20 Javascript
Vue数字输入框组件使用方法详解
2020/02/10 Javascript
原生js实现html手机端城市列表索引选择城市
2020/06/24 Javascript
element日历calendar组件上月、今天、下月、日历块点击事件及模板源码
2020/07/27 Javascript
[01:08:33]OG vs VGJ.T 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
python压缩文件夹内所有文件为zip文件的方法
2015/06/20 Python
Python实现检测文件MD5值的方法示例
2018/04/11 Python
Python 获取windows桌面路径的5种方法小结
2019/07/15 Python
python3中利用filter函数输出小于某个数的所有回文数实例
2019/11/24 Python
Python面向对象原理与基础语法详解
2020/01/02 Python
pytorch torch.nn.AdaptiveAvgPool2d()自适应平均池化函数详解
2020/01/03 Python
python selenium操作cookie的实现
2020/03/18 Python
使用Python将图片转正方形的两种方法实例代码详解
2020/04/29 Python
使用Python实现批量ping操作方法
2020/05/06 Python
Python实现寻找回文数字过程解析
2020/06/09 Python
python接口自动化之ConfigParser配置文件的使用详解
2020/08/03 Python
Python fileinput模块如何逐行读取多个文件
2020/10/05 Python
HSRP的含义以及如何工作
2014/09/10 面试题
网络维护管理员的自我评价分享
2013/11/11 职场文书
幸福中国演讲稿
2014/09/12 职场文书
2014光棍节单身联谊活动策划书
2014/10/10 职场文书
拯救大兵瑞恩观后感
2015/06/09 职场文书
教师廉政准则心得体会
2016/01/20 职场文书
教你怎么用Python操作MySql数据库
2021/05/31 Python
golang连接MySQl使用sqlx库
2022/04/14 Golang