标注数据时发现标签名称有误?百个XML文件手动修改太耗时?这个Python脚本让你一键完成批量替换!
在目标检测任务中,使用LabelImg等工具标注数据后,常会遇到需要批量修改标签名称的情况。例如将hat
统一改为helmet
,或将person
改为head
。手动逐个修改XML文件不仅低效还易出错。本文将详解如何用Python脚本一键完成XML标签的批量替换。
一、为什么需要批量修改XML标签?
- 标注规范调整
项目初期定义的标签名称可能在后需优化(如car
改为sedan
/suv
)。 - 标签名称错误修正
标注时手误导致标签错误(如dog
误标为cat
)。 - 数据集合并与统一
合并多个数据集时需统一标签命名规范。
二、核心脚本详解
以下脚本基于Python的xml.etree.ElementTree
库,通过遍历XML中所有<object>
节点,实现标签名称的批量替换
import os
import xml.etree.ElementTree as ET
from tqdm import tqdm # 进度条工具
def modify_xml(input_path: str, src_name: list, out_name: list) -> None:
'''
批量修改XML中的标签名称
:param input_path: XML文件夹路径
:param src_name: 待修改的原始标签列表
:param out_name: 目标标签列表(与src_name一一对应)
'''
xml_files = [f for f in os.listdir(input_path) if f.endswith('.xml')]
for xml_file in tqdm(xml_files, desc='Processing XMLs'):
xml_path = os.path.join(input_path, xml_file)
tree = ET.parse(xml_path)
root = tree.getroot()
for obj in root.findall('.//object'): # 查找所有object节点
old_name = obj.find('name').text
if old_name in src_name:
# 根据映射关系更新标签
new_name = out_name[src_name.index(old_name)]
obj.find('name').text = new_name
tree.write(xml_path, encoding='utf-8') # 写回原文件
if __name__ == '__main__':
input_path = r'D:\dataset\annotations' # 替换为你的XML文件夹路径
error_names = ['hat', 'person'] # 原始错误标签
correct_names = ['helmet', 'head'] # 修正后标签
modify_xml(input_path, error_names, correct_names)
三、代码关键功能解析
-
智能遍历XML文件
os.listdir
+ 后缀过滤确保只处理XML文件,避免误操作其他文件。 -
精准定位目标标签
使用
root.findall('.//object')
递归搜索所有<object>
节点,兼容多层级嵌套结构。 -
映射式替换逻辑
通过
src_name.index(old_name)
定位新旧标签的映射关系,确保一一对应修改。 -
进度可视化
集成
tqdm
库,实时显示处理进度,尤其适合大规模数据集。
四、使用示例
假设需将hat
改为helmet
,person
改为head
:
-
设置参数:
input_path = "VOC2007/Annotations" # XML文件夹路径 error_names = ['hat', 'person'] # 原始标签 correct_names = ['helmet', 'head'] # 修正后标签
-
运行脚本:
python modify_xml_labels.py
-
输出效果:
Processing XMLs: 100%|██████████| 200/200 [00:03<00:00, 62.3 files/s]
五、常见问题与优化建议
-
编码问题导致乱码
解决方案 :在
ET.parse()
前用open(xml_path, encoding='utf-8')
显式指定编码。 -
部分文件修改失败
排查方向:
- 检查XML是否符合PASCAL VOC格式(含
<object><name>
节点) - 确认标签名称大小写一致 (如
Hat
与hat
不同)
- 检查XML是否符合PASCAL VOC格式(含
-
性能优化
若处理超万级文件:
- 使用多进程加速(
multiprocessing.Pool
) - 禁用
tqdm
进度条减少I/O消耗
- 使用多进程加速(
六、扩展应用场景
- 批量更新路径信息
修改<path>
或<filename>
节点,适配新的图像存储路径。 - 属性值统一调整
如将<truncated>1</truncated>
改为<truncated>0</truncated>
。 - 尺寸规范化
统一修改<width>
和<height>
为固定值(如1920×1080)。
结语
通过这个不到30行的Python脚本,你可以彻底告别XML标签的手动修改时代。无论是PASCAL VOC格式还是自定义XML结构,只需调整节点搜索逻辑(如将.//object
改为.//className
),即可快速适配不同需求。
高效训练始于规范数据,而自动化脚本正是规范化的第一步!
相关工具推荐:
- 可视化XML检查: LabelImg
- 高级XML处理库:lxml(支持XPath复杂查询)
技术不会取代人,但会用技术的人会取代不用技术的人。------Andrew Ng