使用Python+xml+shutil修改目标检测图片文件名和对应xml标注文件:
import os
import glob
import xml.etree.ElementTree as et
import shutildef change_labels(source_dir):name_id = 18001file_list = glob.glob(os.path.join(source_dir, "*.xml"))print(len(file_list))index = 1for file in file_list:print(file, index)index += 1tree_ = et.ElementTree()tree_.parse(file)root = et.Element("annotation")folder = et.SubElement(root, "folder")folder.text = "images"filename = et.SubElement(root, "filename")# filename.text = tree_.find(".//filename").textfilename.text = "%06d.jpg" % name_idpath = et.SubElement(root, "path")path.text = "/ADAS/labels"source = et.SubElement(root, "source")database = et.SubElement(source, "database")database.text = "Unknown"size = et.SubElement(root, "size")width = et.SubElement(size, "width")width.text = tree_.find(".//width").textheight = et.SubElement(size, "height")height.text = tree_.find(".//height").textdepth = et.SubElement(size, "depth")depth.text = "3"segmented = et.SubElement(root, "segmented")segmented.text = "0"objects = tree_.findall(".//object")anchor = 0for object in objects:try:name_ = object.find("name").textexcept:print(file)print("-----------------------------------------")continuen = ""if name_ == "pedestrian" or name_ == "rider":n = "person"elif name_ == "other vehicle":n = "truck"elif name_ in ["motorcycle", "bicycle","motor","bike"] :n = "others"elif name_ in ["car","minibus","bus","truck","others","person","leftline","rightline"] :n = name_else:continueobject_ = et.SubElement(root, "object")name = et.SubElement(object_, "name")name.text = npose = et.SubElement(object_, "pose")pose.text = "Unspecified"truncated = et.SubElement(object_, "truncated")truncated.text = "0"difficult = et.SubElement(object_, "difficult")difficult.text = "0"bndbox = et.SubElement(object_, "bndbox")xmin = et.SubElement(bndbox, "xmin")xmin.text = object.find(".//xmin").textymin = et.SubElement(bndbox, "ymin")ymin.text = object.find(".//ymin").textxmax = et.SubElement(bndbox, "xmax")xmax.text = object.find(".//xmax").textymax = et.SubElement(bndbox, "ymax")ymax.text = object.find(".//ymax").textfile_label = file.replace(tree_.find(".//filename").text.replace(".jpg",".xml"), "%06d.xml" % name_id).replace("Annotations","new-Annotations")# print("------",file,tree_.find(".//filename").text.replace(".jpg",".xml"),"%06d.xml" % name_id)tree = et.ElementTree(root)tree.write(file_label, encoding="utf-8")if tree_.find(".//filename").text.split(".")[-1] == "jpg":shutil.copy(file.replace("Annotations","JPEGImages").replace(".xml",".jpg"), file.replace("Annotations","new-JPEGImages").replace(tree_.find(".//filename").text.replace(".jpg",".xml"), "%06d.jpg" % name_id))print(file.replace("Annotations","new-JPEGImages").replace(tree_.find(".//filename").text.replace(".jpg",".xml"), "%06d.jpg" % name_id), tree_.find(".//filename").text)elif tree_.find(".//filename").text.split(".")[-1] == "png":shutil.copy(file.replace("Annotations", "JPEGImages").replace(".xml", ".png"),file.replace("Annotations", "new-JPEGImages").replace(tree_.find(".//filename").text.replace(".png",".xml"),"%06d.png" % name_id))name_id = name_id + 1if __name__ == '__main__':source_dir = "Q:\\DATAS\\nighttime-5000\\Annotations"change_labels(source_dir)
代码解读:
1、原始图片文件目录:JPEGImages
2、原始XML标注文件目录:Annotations
3、新生成的图片文件目录:new-JPEGImages
4、新生成的XML标注文件目录:new-Annotations