目标检测中TXT文件转为xml文件(yolo格式)

文件准备:原始图像、还有标注信息的TXT文件

# .txt-->.xml
# ! /usr/bin/python
# -*- coding:UTF-8 -*-
import os
import cv2

def txt_to_xml(txt_path, img_path, xml_path):
    # 标签中标注的类别及所用的数字代号
    dict = {
            '0': 'pedestrian',
            '1': 'people',
            '2': 'bicycle',
            '3': 'car',
            '4': 'van',
            '5': 'truck',
            '6': 'tricycle',
            '7': 'awning-tricycle',
            '8': 'bus',
            '9': 'motor'
            }

    files = os.listdir(txt_path)
    pre_img_name = ''
    # 遍历文件内的TXT文件
    for i, name in enumerate(files):
        print(name)

        txtFile = open(txt_path + name)
        txtList = txtFile.readlines()
        # 获取TXT文件所对应的原始图片的名称
        img_name = name.split(".t")[0]

        pic = cv2.imread(img_path + img_name + ".jpg")
        if pic is None:
            pic = cv2.imread(img_path + img_name + ".bmp")
        # 获取图像大小信息
        Pheight, Pwidth, Pdepth = pic.shape
        # 读取TXT文件中每一行的标签信息(每一行代表一个标注目标的位置信息)
        for row in txtList:
            # 按' '分割txt的一行的内容
            oneline = row.strip().split(" ")
            # 遇到的是一张新图片
            if img_name != pre_img_name:
                # 将标签信息写进xml文件
                xml_file = open((xml_path + img_name + '.xml'), 'w')
                xml_file.write('<annotation>/n')
                xml_file.write('    <folder>VOC2007</folder>/n')
                xml_file.write('    <filename>' + img_name + '.jpg' + '</filename>/n')
                xml_file.write('<path>C:/Users/GXUFE-204/Desktop/yolov5/datasets/guang/ceshi/imagetest</path>/n')
                xml_file.write('<source>/n')
                xml_file.write('<database>orgaquant</database>/n')
                xml_file.write('<annotation>organoids</annotation>/n')
                xml_file.write('</source>/n')
                xml_file.write('    <size>/n')
                xml_file.write('        <width>' + str(Pwidth) + '</width>/n')
                xml_file.write('        <height>' + str(Pheight) + '</height>/n')
                xml_file.write('        <depth>' + str(Pdepth) + '</depth>/n')
                xml_file.write('    </size>/n')
                xml_file.write('    <object>/n')
                xml_file.write('<name>' + dict[oneline[0]] + '</name>/n')
                xml_file.write('        <bndbox>/n')
                xml_file.write('            <xmin>' + str(
                    int(((float(oneline[1])) * Pwidth + 1) - (float(oneline[3])) * 0.5 * Pwidth)) + '</xmin>/n')
                xml_file.write('            <ymin>' + str(
                    int(((float(oneline[2])) * Pheight + 1) - (float(oneline[4])) * 0.5 * Pheight)) + '</ymin>/n')
                xml_file.write('            <xmax>' + str(
                    int(((float(oneline[1])) * Pwidth + 1) + (float(oneline[3])) * 0.5 * Pwidth)) + '</xmax>/n')
                xml_file.write('            <ymax>' + str(
                    int(((float(oneline[2])) * Pheight + 1) + (float(oneline[4])) * 0.5 * Pheight)) + '</ymax>/n')
                xml_file.write('        </bndbox>/n')
                xml_file.write('    </object>/n')
                xml_file.close()
                pre_img_name = img_name  # 将其标记为已经转换过的图片
            else:  # 转换过的图片
                # 同一张图片,只需要追加写入object
                xml_file = open((xml_path + img_name + '.xml'), 'a')
                xml_file.write('    <object>/n')
                xml_file.write('<name>' + dict[oneline[0]] + '</name>/n')
                '''  按需添加这里和上面
                xml_file.write('        <pose>Unspecified</pose>/n')
                xml_file.write('        <truncated>0</truncated>/n')
                xml_file.write('        <difficult>0</difficult>/n')
                '''
                xml_file.write('        <bndbox>/n')
                xml_file.write('            <xmin>' + str(
                    int(((float(oneline[1])) * Pwidth + 1) - (float(oneline[3])) * 0.5 * Pwidth)) + '</xmin>/n')
                xml_file.write('            <ymin>' + str(
                    int(((float(oneline[2])) * Pheight + 1) - (float(oneline[4])) * 0.5 * Pheight)) + '</ymin>/n')
                xml_file.write('            <xmax>' + str(
                    int(((float(oneline[1])) * Pwidth + 1) + (float(oneline[3])) * 0.5 * Pwidth)) + '</xmax>/n')
                xml_file.write('            <ymax>' + str(
                    int(((float(oneline[2])) * Pheight + 1) + (float(oneline[4])) * 0.5 * Pheight)) + '</ymax>/n')
                xml_file.write('        </bndbox>/n')
                xml_file.write('    </object>/n')
                xml_file.close()

        # 8.读完txt文件最后写入</annotation>
        xml_file1 = open((xml_path + pre_img_name + '.xml'), 'a')
        xml_file1.write('</annotation>')
        xml_file1.close()
    print("Done !")


# 修改文件夹的路径, 注意文件夹最后要加上/
txt_to_xml("F:/Dataset/VisDrone2019/labels_view/VisDrone2019-DET-val/labels/",  # txt_path
           "F:/Dataset/VisDrone2019/labels_view/VisDrone2019-DET-val/images/",  # img_path
           "F:/Dataset/VisDrone2019/labels_view/VisDrone2019-DET-val/xml_labels/")   # xml_path  用来保存转换后生成的xml文件

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
YOLO(You Only Look Once)是一种基于深度学习目标检测算法,它可以将图像的目标进行快速且准确的检测和定位。在YOLO目标检测过程,通常需要将检测到的目标信息以特定的格式保存到文件,方便后续的分析和应用。这里将更具体地介绍如何将JSON格式目标检测结果化为TXT文件。 首先,我们需要了解YOLO目标检测的输出结果是以JSON格式保存的。该JSON文件包含了每个检测到的目标的类别、位置和置信度等信息。我们需要将这些信息化为TXT文件,以便于后续的使用。 化的步骤如下: 1. 首先,我们需要读取JSON文件,可以使用Python的json库进行读取和解析。通过逐行读取JSON文件,可以获得每个目标的类别、位置和置信度等信息。 2. 接着,我们需要将读取到的目标信息进行格式换。例如,将每个目标的类别、位置和置信度等信息按照一定的规则化为TXT文件的一行。 3. 然后,我们将化后的每行信息逐行写入到TXT文件。可以使用Python文件操作函数进行写入。 4. 最后,保存并关闭TXT文件。 需要注意的是,根据具体的需求,可能还需要对目标信息进行一定的筛选和处理,以满足实际应用的需要。 综上所述,将YOLO目标检测的JSON文件化为TXT文件的过程大致如上所述。通过这样的化,可以将检测到的目标信息保存为易于读取和处理的文本格式,方便后续的分析和应用。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值