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三元运算实现方法
Jan 12 Python
Python中类型关系和继承关系实例详解
May 25 Python
详解Python中的变量及其命名和打印
Mar 11 Python
python字符串的常用操作方法小结
May 21 Python
Django返回json数据用法示例
Sep 18 Python
利用Python破解斗地主残局详解
Jun 30 Python
Python各类图像库的图片读写方式总结(推荐)
Feb 23 Python
django的登录注册系统的示例代码
May 14 Python
python3.5安装python3-tk详解
Apr 26 Python
Python使用mongodb保存爬取豆瓣电影的数据过程解析
Aug 14 Python
Python借助with语句实现代码段只执行有限次
Mar 23 Python
Python通过loop.run_in_executor执行同步代码 同步变为异步
Apr 11 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
第十一节--重载
2006/11/16 PHP
mysql_num_rows VS COUNT 效率问题分析
2011/04/23 PHP
PHP设置images目录不充许http访问的方法
2016/11/01 PHP
PHP实现绘制二叉树图形显示功能详解【包括二叉搜索树、平衡树及红黑树】
2017/11/16 PHP
基于jquery的滚动鼠标放大缩小图片效果
2011/10/27 Javascript
javascript中自定义对象的属性方法分享
2013/07/12 Javascript
AngularJS基础知识笔记之过滤器
2015/05/10 Javascript
基于jquery实现无限级树形菜单
2016/03/22 Javascript
location.hash保存页面状态的技巧
2016/04/28 Javascript
js实现文字超出部分用省略号代替实例代码
2016/09/01 Javascript
使用bootstrap实现多窗口和拖动效果
2016/09/22 Javascript
vue-cli webpack 开发环境跨域详解
2017/05/18 Javascript
PHP 实现一种多文件上传的方法
2017/09/20 Javascript
react-native fetch的具体使用方法
2017/11/01 Javascript
记录vue项目中遇到的一点小问题
2019/05/14 Javascript
vue组件三大核心概念图文详解
2019/05/30 Javascript
vue+swiper实现左右滑动的测试题功能
2020/10/30 Javascript
python自动安装pip
2014/04/24 Python
使用Python标准库中的wave模块绘制乐谱的简单教程
2015/03/30 Python
python3简单实现微信爬虫
2015/04/09 Python
Python实现比较两个文件夹中代码变化的方法
2015/07/10 Python
Python中一般处理中文的几种方法
2019/03/06 Python
基于Numpy.convolve使用Python实现滑动平均滤波的思路详解
2019/05/16 Python
python支付宝支付示例详解
2019/08/22 Python
python3 tcp的粘包现象和解决办法解析
2019/12/09 Python
django教程如何自学
2020/07/31 Python
python温度转换华氏温度实现代码
2020/12/06 Python
基于HTML5+tracking.js实现刷脸支付功能
2020/04/16 HTML / CSS
Nicole Miller官方网站:纽约女装品牌
2019/09/14 全球购物
长青弘远的面试题
2012/06/09 面试题
应届毕业生个人自我评价
2013/09/20 职场文书
团代会宣传工作方案
2014/05/08 职场文书
小学班主任事迹材料
2014/12/17 职场文书
拾金不昧表扬稿大全
2015/05/05 职场文书
python 远程执行命令的详细代码
2022/02/15 Python
各种货币符号快捷输入
2022/02/17 杂记