使用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

相关推荐
量化金策23 分钟前
截面动量策略思路
python
心软且酷丶43 分钟前
leetcode:7. 整数反转(python3解法,数学相关算法题)
python·算法·leetcode
逾非时1 小时前
python:selenium爬取网站信息
开发语言·python·selenium
天才测试猿1 小时前
Selenium操作指南(全)
自动化测试·软件测试·python·selenium·测试工具·职场和发展·测试用例
不学无术の码农2 小时前
《Effective Python》第六章 推导式和生成器——避免在推导式中使用超过两个控制子表达式
开发语言·python
G皮T2 小时前
【Python Cookbook】文件与 IO(一)
python·i/o·文件·file
钮钴禄·爱因斯晨2 小时前
赛博算命之“帝王之术”——奇门遁甲的JAVA实现
java·开发语言·python
dudly2 小时前
Python字符串格式化(三): t-string前瞻(Python 3.14 新特性)
开发语言·python
kyle~2 小时前
Pytorch---ImageFolder
人工智能·pytorch·python
向哆哆2 小时前
Java代码重构:如何提升项目的可维护性和扩展性?
java·python·重构