使用Python+xml+shutil修改目标检测图片文件名和对应xml标注文件:
import os
import glob
import xml.etree.ElementTree as et
import shutil
def change_labels(source_dir):
name_id = 18001
file_list = glob.glob(os.path.join(source_dir, "*.xml"))
print(len(file_list))
index = 1
for file in file_list:
print(file, index)
index += 1
tree_ = 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").text
filename.text = "%06d.jpg" % name_id
path = 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").text
height = et.SubElement(size, "height")
height.text = tree_.find(".//height").text
depth = et.SubElement(size, "depth")
depth.text = "3"
segmented = et.SubElement(root, "segmented")
segmented.text = "0"
objects = tree_.findall(".//object")
anchor = 0
for object in objects:
try:
name_ = object.find("name").text
except:
print(file)
print("-----------------------------------------")
continue
n = ""
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:
continue
object_ = et.SubElement(root, "object")
name = et.SubElement(object_, "name")
name.text = n
pose = 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").text
ymin = et.SubElement(bndbox, "ymin")
ymin.text = object.find(".//ymin").text
xmax = et.SubElement(bndbox, "xmax")
xmax.text = object.find(".//xmax").text
ymax = et.SubElement(bndbox, "ymax")
ymax.text = object.find(".//ymax").text
file_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 + 1
if __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