需求:
在集成多个数据集一同训练时,可能会存在不同数据集针对同一种目标有不同的类名,可以通过python脚本修改数据内的类名映射,实现统一数据集标签名的目的。
代码:
# -*- coding: utf-8 -*-
# @Time : 2023/9/11 10:58
# @Author : CLW
# @FileName: change_xml_label.py
# @Software: PyCharm
import os
import xml.etree.ElementTree as ET
'''
算法功能:
针对目录下的所有voc格式的xml标签文件,将类别的名称修改为指定名称
要求:label_dict的key值表示修改前的标签名,该key对应的value值表示修改后的标签名
e.x. 需要将xml文件中'workwear'的名称替换为'reflectivevest',那么可以这样设置:
label_dict['workwear'] = 'reflectivevest'
'''
'''
#################### 输入参数设置(开始) ####################
'''
org_label_dir = r'D:\dataset\pretrain_GW'
new_label_dir = r'D:\dataset\pretrain_GW'
label_dict = {}
label_dict['head'] = '头'
label_dict['hand'] = '手'
'''
#################### 输入参数设置(结束) ####################
'''
def change_xml_label(xml_path, output_path, label_dict):
if not os.path.getsize(xml_path):
print("内容为空的xml:",xml_path)
tree = ET.parse(xml_path)
root = tree.getroot()
for obj in root.iter('object'):
cls = obj.find('name').text
if cls in label_dict.keys():
obj.find('name').text = label_dict[cls]
tree.write(output_path, encoding="utf-8", xml_declaration=True) # 输出新的xml文件
if __name__ == "__main__":
# 遍历xml
for root, dir, files in os.walk(org_label_dir):
for file in files:
if file[-3:] == 'xml':
print(os.path.join(root, file))
change_xml_label(os.path.join(root, file), os.path.join(new_label_dir, file),label_dict)
参数说明:
org_label_dir:xml标签的目录。
new_label_dir:输出的新xml标签的目录。
label_dict:标签类名的映射字典,key值为修改前的类名,value值为修改后的类名。
操作案例:
先使用labelImg查看修改前的标签:
然后修改脚本中的对应参数,案例中类名修改如下:
label_dict[‘head’] = ‘头’
label_dict[‘SF6’] = ‘sf6’
执行完成后,用labelImg工具打开新生成的标签:
如图,修改标签类别名成功!