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 Web开发模板引擎优缺点总结
May 06 Python
用于统计项目中代码总行数的Python脚本分享
Apr 21 Python
20招让你的Python飞起来!
Sep 27 Python
python中import reload __import__的区别详解
Oct 16 Python
Python编程实现的简单神经网络算法示例
Jan 26 Python
dataframe设置两个条件取值的实例
Apr 12 Python
解决python升级引起的pip执行错误的问题
Jun 12 Python
详解分布式任务队列Celery使用说明
Nov 29 Python
python实现维吉尼亚算法
Mar 20 Python
python-视频分帧&amp;多帧合成视频实例
Dec 10 Python
Python列表list操作相关知识小结
Jan 29 Python
python3.5的包存放的具体路径
Aug 16 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
全国FM电台频率大全 - 11 浙江省
2020/03/11 无线电
php 处理上百万条的数据库如何提高处理查询速度
2010/02/08 PHP
解析:通过php socket并借助telnet实现简单的聊天程序
2013/06/18 PHP
ie与session丢失(新窗口cookie丢失)实测及解决方案
2013/07/15 PHP
在SAE上搭建最新wordpress的方法
2014/12/21 PHP
PHP设计模式之工厂模式详解
2017/10/24 PHP
PHP数组访问常用方法解析
2020/09/05 PHP
PHP扩展安装方法步骤解析
2020/11/24 PHP
关于文本框的一些限制控制总结~~
2010/04/15 Javascript
JSON JQUERY模板实现说明
2010/07/03 Javascript
input 和 textarea 输入框最大文字限制的jquery插件
2011/10/27 Javascript
使用jquery动态加载javascript以减少服务器压力
2012/10/29 Javascript
JavaScript中的关键字&quot;VAR&quot;使用详解 分享
2013/07/31 Javascript
Js+Jq获取URL参数的集中方法示例代码
2014/05/20 Javascript
Dojo Javascript 编程规范 规范自己的JavaScript书写
2014/10/26 Javascript
浅谈JavaScript函数节流
2014/12/09 Javascript
Underscore.js常用方法总结
2015/02/28 Javascript
JS实现按比例缩放图片的方法(附C#版代码)
2015/12/08 Javascript
Webpack 实现 AngularJS 的延迟加载
2016/03/02 Javascript
Angular.js中定时器循环的3种方法总结
2017/04/27 Javascript
详解Vue组件之间的数据通信实例
2017/06/17 Javascript
jQuery niceScroll滚动条错位问题的解决方法
2018/02/03 jQuery
Angular实现svg和png图片下载实现
2019/05/05 Javascript
详解Vue.js中引入图片路径的几种方式
2019/06/17 Javascript
[10:04]国际邀请赛采访专栏:DK.Farseer,mouz.Black^,采访员Josh专访
2013/08/05 DOTA
python生成随机图形验证码详解
2017/11/08 Python
用Python一键搭建Http服务器的方法
2018/06/01 Python
Python实现按逗号分隔列表的方法
2018/10/23 Python
Django框架模板注入操作示例【变量传递到模板】
2018/12/19 Python
Python面向对象类编写细节分析【类,方法,继承,超类,接口等】
2019/01/05 Python
opencv实现静态手势识别 opencv实现剪刀石头布游戏
2019/01/22 Python
Pyinstaller 打包exe教程及问题解决
2019/08/16 Python
Python更新所有已安装包的操作
2020/02/13 Python
小学运动会入场式解说词
2014/02/18 职场文书
出纳员岗位职责风险
2014/03/06 职场文书
最新结婚典礼主持词
2014/03/14 职场文书