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实现动态添加类的属性或成员函数的解决方法
Jul 16 Python
Python创建系统目录的方法
Mar 11 Python
Python编程对列表中字典元素进行排序的方法详解
May 26 Python
Python简单删除列表中相同元素的方法示例
Jun 12 Python
Python实现MySQL操作的方法小结【安装,连接,增删改查等】
Jul 12 Python
磁盘垃圾文件清理器python代码实现
Aug 24 Python
详解Python中正则匹配TAB及空格的小技巧
Jul 26 Python
Django在admin后台集成TinyMCE富文本编辑器的例子
Aug 09 Python
Python中生成一个指定长度的随机字符串实现示例
Nov 06 Python
使用PyQt的QLabel组件实现选定目标框功能的方法示例
May 19 Python
python进行二次方程式计算的实例讲解
Dec 06 Python
python-opencv 中值滤波{cv2.medianBlur(src, ksize)}的用法
Jun 05 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
thinkphp实现数组分页示例
2014/04/13 PHP
php创建无限级树型菜单
2015/11/05 PHP
PHP封装的数据库保存session功能类
2016/07/11 PHP
Yii实现复选框批量操作实例代码
2017/03/15 PHP
document.open() 与 document.write()的区别
2007/08/13 Javascript
ajaxControlToolkit AutoCompleteExtender的用法
2008/10/30 Javascript
JavaScript中json使用自己总结
2013/08/13 Javascript
如何正确使用javascript 来进行我们的程序开发
2014/06/23 Javascript
jQuery实现冻结表头的方法
2015/03/09 Javascript
.NET微信公众号开发之创建自定义菜单
2015/07/16 Javascript
浅析四种常见的Javascript声明循环变量的书写方式
2015/10/14 Javascript
nodejs简单实现操作arduino
2016/09/25 NodeJs
jQuery模拟窗口抖动效果
2017/03/15 Javascript
Angular4学习笔记之实现绑定和分包
2017/08/01 Javascript
JS双向链表实现与使用方法示例(增加一个previous属性实现)
2019/01/31 Javascript
详解vue中axios的使用与封装
2019/03/20 Javascript
小程序实现左滑删除效果
2019/07/25 Javascript
vue props 单项数据流实例分享
2020/02/16 Javascript
vue 使用 vue-pdf 实现pdf在线预览的示例代码
2020/04/26 Javascript
Python 可爱的大小写
2008/09/06 Python
python 实现tar文件压缩解压的实例详解
2017/08/20 Python
Python之ReportLab绘制条形码和二维码的实例
2018/01/15 Python
python爬虫 基于requests模块的get请求实现详解
2019/08/20 Python
Python HTMLTestRunner可视化报告实现过程解析
2020/04/10 Python
如何用python处理excel表格
2020/06/09 Python
PyInstaller运行原理及常用操作详解
2020/06/13 Python
Python3爬虫中Splash的知识总结
2020/07/10 Python
Django框架实现在线考试系统的示例代码
2020/11/30 Python
HTML5之SVG 2D入门13—svg对决canvas及长处和适用场景分析
2013/01/30 HTML / CSS
Interflora澳大利亚:同日鲜花速递
2019/06/25 全球购物
开工庆典邀请函范文
2014/01/16 职场文书
考试没考好检讨书
2015/05/06 职场文书
【超详细】八大排序算法的各项比较以及各自特点
2021/03/31 Python
深入理解Vue的数据响应式
2021/05/15 Vue.js
Oracle 触发器trigger使用案例
2022/02/24 Oracle
如何解决goland,idea全局搜索快捷键失效问题
2022/04/03 Golang