python 批量修改 labelImg 生成的xml文件的方法
Python  /  管理员 发布于 7年前   194
概述
自己在用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 ElementTreefrom os import walk, pathdef read_xml(in_path): tree = ElementTree() tree.parse(in_path) return treedef 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, prefixsif __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>
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
122 在
学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..123 在
Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..原梓番博客 在
在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..博主 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..1111 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
Copyright·© 2019 侯体宗版权所有·
粤ICP备20027696号