图像Resize后如何调整labelImg生成的对应.xml标注文件适配训练?
适配Resize后图像的XML标注调整方案
核心实现逻辑非常简单:先获取原始图像的宽高和Resize后新图像的宽高,分别计算宽、高维度的缩放比例,再将原始标注中所有目标框的坐标按对应比例换算,同时更新XML文件中的图像尺寸信息即可。
所需依赖
仅需安装Python图片处理库Pillow:pip install pillow
完整可运行脚本
import os import xml.etree.ElementTree as ET from PIL import Image # 请根据你的实际路径修改以下参数 ORIGINAL_IMG_DIR = "替换为原始未Resize的图像存放文件夹路径" RESIZED_IMG_DIR = "替换为Resize后的新图像存放文件夹路径" OLD_XML_DIR = "替换为原始XML标注存放文件夹路径" NEW_XML_DIR = "替换为调整后新XML的输出文件夹路径" # 自动创建输出文件夹 os.makedirs(NEW_XML_DIR, exist_ok=True) # 遍历所有标注文件 for xml_file in os.listdir(OLD_XML_DIR): if not xml_file.endswith(".xml"): continue # 读取原始XML文件 tree = ET.parse(os.path.join(OLD_XML_DIR, xml_file)) root = tree.getroot() # 获取对应图像文件名(默认标注与图像文件名仅后缀不同) img_filename = root.find("filename").text # 读取原始图像尺寸 orig_img = Image.open(os.path.join(ORIGINAL_IMG_DIR, img_filename)) orig_w, orig_h = orig_img.size # 读取Resize后新图像尺寸 new_img = Image.open(os.path.join(RESIZED_IMG_DIR, img_filename)) new_w, new_h = new_img.size # 计算宽高缩放比例 scale_w = new_w / orig_w scale_h = new_h / orig_h # 更新XML中的图像尺寸信息 size_node = root.find("size") size_node.find("width").text = str(new_w) size_node.find("height").text = str(new_h) # 遍历所有标注目标,更新框坐标 for obj in root.iter("object"): bndbox = obj.find("bndbox") xmin = int(round(float(bndbox.find("xmin").text) * scale_w)) ymin = int(round(float(bndbox.find("ymin").text) * scale_h)) xmax = int(round(float(bndbox.find("xmax").text) * scale_w)) ymax = int(round(float(bndbox.find("ymax").text) * scale_h)) bndbox.find("xmin").text = str(xmin) bndbox.find("ymin").text = str(ymin) bndbox.find("xmax").text = str(xmax) bndbox.find("ymax").text = str(ymax) # 保存调整后的新XML文件 tree.write(os.path.join(NEW_XML_DIR, xml_file))
注意事项
- 脚本默认图像与标注文件名完全一致、仅后缀不同,如果你的命名规则有差异,需要自行调整文件名匹配逻辑
- 坐标计算时用
round取整,避免出现浮点型坐标导致TensorFlow Object API或标注工具读取报错 - 运行完成后建议随机抽3-5组结果用labelImg打开核验,确认标注框和目标对齐无误后再投入训练
- 如果原始图像已经删除,可以直接读取原始XML中
<size>节点下的width和height值作为原始宽高,无需加载原始图像
内容的提问来源于stack exchange,提问作者Andrii Zelenko
相关产品推荐
相关产品推荐

