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

相关推荐
子夜四时歌1 小时前
Python详细安装与环境搭建
开发语言·python
Jinkxs1 小时前
SkyWalking - Python 应用追踪:基于 skywalking-python 的埋点
开发语言·python·skywalking
大头博士先生1 小时前
【3月考】二级Python最新真题及满分代码合集(基本操作题部分)
开发语言·python
白狐_7981 小时前
【实战架构】一人抵一家设计公司:基于 ComfyUI + Python RPA + Photoshop 的全自动化工业制图工作流
python·photoshop·rpa
shengli7221 小时前
Python在金融科技(FinTech)中的应用
jvm·数据库·python
xcLeigh1 小时前
IoTDB Python原生接口全攻略:从基础读写到高级实战
开发语言·数据库·python·api·iotdb·原生接口·读写数据
User_芊芊君子1 小时前
文科生封神!Python+AI 零门槛变现:3 天造 App,指令即收入(附脉脉 AI 沙龙干货)
开发语言·人工智能·python
MeowNeko1 小时前
为什么说程序员重命名时电脑不要带中文?记一次python manage.py runserver时UnicodeDecodeError的原因与解决方案
人工智能·python·chatgpt·中间件·django·utf8
是Dream呀1 小时前
2025年中秋月亮只有94.91%圆?Python告诉你真相
开发语言·python·中秋节
星辰徐哥1 小时前
Python开发从入门到精通:异步编程与协程
开发语言·python