目标检测中如何读取.xml后缀格式的标签文件

目标检测中如何读取.xml后缀格式的标签文件

本文代码是参考B站视频(BV1Q54y1D7vj)讲解yolo v4网络的代码(voc_annotation.py和dataloader两个文件)

文件介绍

在我的项目中有两个文件夹和一个txt文件,一个jpg文件夹保存的是jpg格式图片,xml文件夹里保存的是xml格式的标签文件,两个文件名是对应的,classes.txt保存的是class类型名称。
image-19

  • 010002.xml标签文件部分内容结构如下

    <?xml version="1.0" ?><annotation>
      <folder>JPEGImages</folder>
      <filename>010002.jpg</filename>
      <path></path>
      <source>
      	<database>Unknown</database>
      </source>
      <size>
      	<width>1280</width>
      	<height>1024</height>
      	<depth>1</depth>
      </size>
      <segmented>0</segmented>
      <object>
      	<name>person</name>
      	<pose>Unspecified</pose>
      	<truncated>1</truncated>
      	<difficult>0</difficult>
      	<bndbox>
      		<xmin>978</xmin>
      		<ymin>1</ymin>
      		<xmax>1074</xmax>
      		<ymax>248</ymax>
      	</bndbox>
    

    我们是要提取里面object里面的内容

  • classes.txt内容如下

      person
      bicycle
      car
      motorbike
      aeroplane
      bus
      train
      truck
      boat
      traffic light
      fire hydrant
      stop sign
      parking meter
      bench
      bird
    

读取xml文件内容并保存到txt文件中

  • 代码
    import os
    import xml.etree.ElementTree as ET
    
    # 读取xml文件存放到txt文件中
    in_file = open("xml/010002.xml")
    #构建树状结构
    tree = ET.parse(in_file)
    #获取根节点
    root = tree.getroot()
    
    
    #   获得类
    def get_classes(classes_path):
        with open(classes_path, encoding='utf-8') as f:
            class_names = f.readlines()
        class_names = [c.strip() for c in class_names]
        return class_names, len(class_names)
    
    
    classes, _ = get_classes("classes.txt")
    
    jpg_dir = 'jpg'
    image_id = '010002'
    list_file = open("010002.txt", "w")
    #将图片路径写入txt文件中
    list_file.write(os.path.join(os.path.abspath(jpg_dir), f"{image_id}.jpg"))
    
    #循环遍历 XML 文件中所有的对象(object)标签
    for obj in root.iter("object"):
        difficult = obj.find('difficult')
        #标签名
        cls = obj.find("name").text
        #标签在classes.txt中位置编号
        cls_id = classes.index(cls)
        #如果类别不在指定的类别列表中或者 difficult 标记为 1(即困难标记),则跳过当前对象的处理
        if difficult == 1:
            continue
        xmlbox = obj.find("bndbox")
        #边界框两个坐标点
        b = [int(float(xmlbox.find("xmin").text)), int(float(xmlbox.find("ymin").text)), int(float(xmlbox.find("xmax").text)), int(float(xmlbox.find("ymax").text)), ]
        #将数据写入txt文件中
        list_file.write(" " + ",".join([str(a) for a in b]) + "," + str(cls_id))
    
    #关闭文件
    list_file.close()
    
  • 获得数据的txt文件内容
    C:\Users\34920\Desktop\读取xml\jpg\010002.jpg 978,1,1074,248,0 402,284,518,546,0 337,353,455,604,0 292,426,415,701,0
    
    可以看见这张图像有四个边界框,类别都是person

读取txt文件,将边界框坐标和类别转换成numpy数组

  • 代码

    from PIL import Image
    import numpy as np
    
    
    #   将图像转换成RGB图像,防止灰度图在预测时报错。
    #   代码仅仅支持RGB图像的预测,所有其它类型的图像都会转化成RGB
    def cvtColor(image):
        if len(np.shape(image)) == 3 and np.shape(image)[2] == 3:
            return image
        else:
            image = image.convert('RGB')
            return image
    #读取txt文件
    
    with open("010002.txt") as f:
        train_lines = f.readlines()
    
    for train_line in train_lines:
        line=train_line.split()
        # print(line,type(line))
    
        #读取图像并转换成RGB图像
        image = Image.open(line[0])
        # image = cvtColor(image)
    
        #line[1:]是一个字符串列表,其中每个字符串代表一组以逗号分隔的整数。
        # map(int, box.split(','))将每个字符串box按逗号拆分为整数,并将其转换为整数列表。
        # np.array(...)将每个整数列表转换为NumPy数组。
        # 外层的np.array(...)将所有这些NumPy数组组合成一个多维数组。
        box = np.array([np.array(list(map(int, box.split(',')))) for box in line[1:]])
        print(box.shape)
        print(box)
    
  • 输出结果
    image-20
    从结果可以看见已经转成numpy数组格式了,最后一列就是标签类型的id号。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值