使用Python+xml+shutil修改目标检测图片和对应xml标注文件

使用Python+xml+shutil修改目标检测图片文件名和对应xml标注文件:

python 复制代码
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

相关推荐
Flittly7 小时前
【从零手写 ClaudeCode:learn-claude-code 项目实战笔记】(3)TodoWrite (待办写入)
python·agent
千寻girling12 小时前
一份不可多得的 《 Django 》 零基础入门教程
后端·python·面试
databook15 小时前
探索视觉的边界:用 Manim 重现有趣的知觉错觉
python·动效
明月_清风16 小时前
Python 性能微观世界:列表推导式 vs for 循环
后端·python
明月_清风16 小时前
Python 性能翻身仗:从 O(n) 到 O(1) 的工程实践
后端·python
helloweilei1 天前
python 抽象基类
python
用户8356290780511 天前
Python 实现 PPT 转 HTML
后端·python
zone77392 天前
004:RAG 入门-LangChain读取PDF
后端·python·面试
zone77392 天前
005:RAG 入门-LangChain读取表格数据
后端·python·agent
树獭非懒2 天前
AI大模型小白手册|Embedding 与向量数据库
后端·python·llm