全网最全的yolo系列转换工具,从txt转xml,再从xml转txt,亲自测试好用

news2024/9/24 13:25:54

        在训练yolo的过程中,难免涉及标注的数据格式转化,经过了几次修改和迭代,最终把转化代码跟大家一起分享。

        先把xml转txt部分的代码分享一下,py_convert_xml2txt.py:

# -*- coding:utf-8 -*-

import os
import shutil
import cv2
import numpy as np
import xml.etree.ElementTree as ET

wordname_coco = ['person','bicycle','car','motorbike','aeroplane','bus','train','truck','boat','traffic light','fire hydrant',
                 'stop sign','parking meter','bench','bird','cat','dog','horse','sheep','cow','elephant','bear', 'zebra','giraffe',
                 'backpack','umbrella','handbag','tie','suitcase','frisbee','skis','snowboard','sports ball','kite','baseball bat',
                 'baseball glove','skateboard','surfboard','tennis racket','bottle','wine glass','cup','fork','knife','spoon','bowl',
                 'banana','apple','sandwich','orange','broccoli','carrot','hot dog','pizza','donut','cake','chair','sofa','potted plant',
                 'bed','dining table','toilet','tv','laptop','mouse','remote','keyboard','cell phone','microwave','oven','toaster','sink',
                 'refrigerator','book','clock','vase','scissors','teddy bear','hair drier','toothbrush']

wordname_voc = ['aeroplane','bicycle','bird','boat','bottle','bus','car','cat','chair','cow','diningtable','dog','horse',
                'motorbike','person','pottedplant','sheep','sofa','sheep','train','tvmonitor']

wordname_zkrc = ['person','car','cat','dog']

#person car truck cat dog

def convert(size, box):
    dw = 1. / (size[0])
    dh = 1. / (size[1])
    x = (box[0] + box[1]) / 2.0 - 1
    y = (box[2] + box[3]) / 2.0 - 1
    w = box[1] - box[0]
    h = box[3] - box[2]
    x = x * dw
    w = w * dw
    y = y * dh
    h = h * dh

    return (x, y, w, h)

def convert_xml2txt_voc():

    #text_dir = './data/JPEGImages/'
    xml_dir = "./data/LR_person_car_dataset/train/"
    imagedir = "./data/LR_person_car_dataset/train/"
    out_txt_dir = './InfraredData/txt/'
    out_temp_txt_dir = './InfraredData/temp_Txt/'
    out_images_dir = './InfraredData/Images/'

    title = "20240823_4_"
    count = 0
    list = os.listdir(xml_dir)  # 列出文件夹下所有的目录与文件
    for i in range(0, len(list)):
        name = os.path.splitext(list[i])
        if name[1] == '.xml':
            print(list[i])
            #changeTitle = title + str(i + 1) + "_"
            xml_path = xml_dir + list[i]
            jpg_path = imagedir + name[0] + '.jpg'
            if not os.path.isfile(jpg_path):
                jpg_path = imagedir + name[0] + '.jpeg'
                if not os.path.isfile(jpg_path):
                    jpg_path = imagedir + name[0] + '.bmp'
                    if not os.path.isfile(jpg_path):
                        jpg_path = imagedir + name[0] + '.png'
            image = cv2.imread(jpg_path)
            if image is None:
                continue

            # if not os.path.isfile(jpg_path):
            #     continue
            count = count + 1
            changeTitle = title + str(count) + "_"
            out_file_name = out_temp_txt_dir + changeTitle + '.txt'
            out_jpg_name = out_images_dir + changeTitle + '.jpg'
            out_file = open(out_file_name, 'w')
            tree = ET.parse(xml_path)
            root = tree.getroot()
            size = root.find('size')
            w = int(size.find('width').text)
            h = int(size.find('height').text)

            num = 0
            for obj in root.iter('object'):
                cls = obj.find('name').text
                # print(cls)
                # num += 1
                # cls_id = 0#classes.index(cls)
                #cls_id = wordname_voc.index(cls)

                cls_id = -1
                if cls == 'person':
                    cls_id = 0
                elif cls == 'car':
                    cls_id = 1
                elif cls == 'cat':
                    cls_id = 2
                elif cls == 'dog':
                    cls_id = 3
                else:
                    continue
                num += 1
                xmlbox = obj.find('bndbox')
                b = (float(xmlbox.find('xmin').text), float(xmlbox.find('xmax').text), float(xmlbox.find('ymin').text),
                     float(xmlbox.find('ymax').text))
                bb = convert((w, h), b)
                out_file.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n')
            #     left = int(xmlbox.find('xmin').text)
            #     top = int(xmlbox.find('ymin').text)
            #     right = int(xmlbox.find('xmax').text)
            #     bottom = int(xmlbox.find('ymax').text)
            #     font = cv2.FONT_HERSHEY_SIMPLEX
            #     cv2.putText(image, cls, (left, top - 10), font, 1.2, (255, 255, 255), 2)
            #     cv2.rectangle(image, (left, top), (right, bottom), (0, 0, 255), 2)
            # cv2.imshow("image", image)
            # cv2.waitKey(0)
            out_file.close()
            if num > 0:
                cv2.imwrite(out_jpg_name, image)
                shutil.copy(out_file_name, out_txt_dir)

            # if num > 1:
            #     shutil.copy(jpg_path, out_images_dir)

def check_txt_ok():

    test_dir = './InfraredData/test/'
    image_dir = "./InfraredData/Images/"
    txt_dir = './InfraredData/txt/'

    list = os.listdir(image_dir)  # 列出文件夹下所有的目录与文件
    for i in range(0, len(list)):
        name = os.path.splitext(list[i])
        #print(name)
        #if name[1] == '.jpg':
            #print(name[1])

        count = 0
        if name[1] == '.jpg':

            jpg_path = image_dir + list[i]

            image = cv2.imread(jpg_path)
            shape = image.shape
            print(shape)
            # cv2.imshow("image",imaga)
            # cv2.waitKey(0)
            #print(name[1])
            filename = txt_dir + name[0] + '.txt'
            if os.path.isfile(filename):
                with open(filename, 'r') as file_to_read:
                    while True:
                        lines = file_to_read.readline()  # 整行读取数据
                        if not lines:
                            break
                            pass
                        curLine = lines.split(" ")
                        #floatLine = map(float, lines)

                        # for i in len(lines):
                        #     print(lines[i])
                        #print(curLine[0],curLine[1],curLine[2],curLine[3],curLine[4])
                        numbers = [float(x) for x in curLine]

                        numbers[0] = numbers[0]
                        numbers[1] = numbers[1]*shape[1]
                        numbers[2] = numbers[2] * shape[0]
                        numbers[3] = numbers[3]*shape[1]/2
                        numbers[4]= numbers[4] * shape[0]/2

                        rect_info = [int(x) for x in numbers]
                        #print(rect_info[0],rect_info[1], rect_info[2], rect_info[3], rect_info[4])

                        font = cv2.FONT_HERSHEY_SIMPLEX
                        cv2.putText(image, wordname_zkrc[rect_info[0]], (rect_info[1] - rect_info[3],rect_info[2] - rect_info[4] - 10), font, 1.2, (255, 255, 255), 2)
                        cv2.rectangle(image,(rect_info[1] - rect_info[3],rect_info[2] - rect_info[4]),
                                      (rect_info[1] + rect_info[3],rect_info[2] + rect_info[4]), (0, 0, 255), 2)

                       # saveFile = out_path + '/' +  name[0] + '.jpg'
                        #cv2.imwrite(saveFile,image)

                        # count = count + 1
                        # if count == 1:
                        #     return
                saveFile = test_dir + name[0] + '.jpg'
                cv2.imwrite(saveFile,image)
                # cv2.imshow("image", image)
                # cv2.waitKey(0)


if __name__ == "__main__":
    #convert_xml2txt_coco()
    #convert_xml2txt_voc()
    check_txt_ok()

         再把txt转xml部分的代码分享一下,py_convert_txt2xml.py:

 

import os
import shutil
import xml.etree.ElementTree as ET
from xml.etree.ElementTree import Element, SubElement
from PIL import Image
import cv2
wordname_zkrc = ['person','car','cat','dog']
#wordname_zkrc = ['person','vehicle','animal','object']

class Xml_make(object):
    def __init__(self):
        super().__init__()

    def __indent(self, elem, level=0):
        i = "\n" + level * "\t"
        if len(elem):
            if not elem.text or not elem.text.strip():
                elem.text = i + "\t"
            if not elem.tail or not elem.tail.strip():
                elem.tail = i
            for elem in elem:
                self.__indent(elem, level + 1)
            if not elem.tail or not elem.tail.strip():
                elem.tail = i
        else:
            if level and (not elem.tail or not elem.tail.strip()):
                elem.tail = i

    def _imageinfo(self, list_top):
        annotation_root = ET.Element('annotation')
        annotation_root.set('verified', 'no')
        tree = ET.ElementTree(annotation_root)
        '''
        0:xml_savepath 1:folder,2:filename,3:path
        4:checked,5:width,6:height,7:depth
        '''
        folder_element = ET.Element('folder')
        folder_element.text = list_top[1]
        annotation_root.append(folder_element)

        filename_element = ET.Element('filename')
        filename_element.text = list_top[2]
        annotation_root.append(filename_element)

        path_element = ET.Element('path')
        path_element.text = list_top[3]
        annotation_root.append(path_element)

        # checked_element = ET.Element('checked')
        # checked_element.text = list_top[4]
        # annotation_root.append(checked_element)

        source_element = ET.Element('source')
        database_element = SubElement(source_element, 'database')
        database_element.text = 'Unknown'
        annotation_root.append(source_element)

        size_element = ET.Element('size')
        width_element = SubElement(size_element, 'width')
        width_element.text = str(list_top[5])
        height_element = SubElement(size_element, 'height')
        height_element.text = str(list_top[6])
        depth_element = SubElement(size_element, 'depth')
        depth_element.text = str(list_top[7])
        annotation_root.append(size_element)

        segmented_person_element = ET.Element('segmented')
        segmented_person_element.text = '0'
        annotation_root.append(segmented_person_element)

        return tree, annotation_root

    def _bndbox(self, annotation_root, list_bndbox):
        for i in range(0, len(list_bndbox), 9):
            object_element = ET.Element('object')
            name_element = SubElement(object_element, 'name')
            name_element.text = list_bndbox[i]

            # flag_element = SubElement(object_element, 'flag')
            # flag_element.text = list_bndbox[i + 1]

            pose_element = SubElement(object_element, 'pose')
            pose_element.text = list_bndbox[i + 2]

            truncated_element = SubElement(object_element, 'truncated')
            truncated_element.text = list_bndbox[i + 3]

            difficult_element = SubElement(object_element, 'difficult')
            difficult_element.text = list_bndbox[i + 4]

            bndbox_element = SubElement(object_element, 'bndbox')
            xmin_element = SubElement(bndbox_element, 'xmin')
            xmin_element.text = str(list_bndbox[i + 5])

            ymin_element = SubElement(bndbox_element, 'ymin')
            ymin_element.text = str(list_bndbox[i + 6])

            xmax_element = SubElement(bndbox_element, 'xmax')
            xmax_element.text = str(list_bndbox[i + 7])

            ymax_element = SubElement(bndbox_element, 'ymax')
            ymax_element.text = str(list_bndbox[i + 8])

            annotation_root.append(object_element)

        return annotation_root

    def txt_to_xml(self, list_top, list_bndbox):
        tree, annotation_root = self._imageinfo(list_top)
        annotation_root = self._bndbox(annotation_root, list_bndbox)
        self.__indent(annotation_root)
        tree.write(list_top[0], encoding='utf-8', xml_declaration=True)

def txt_2_xml(source_path, xml_save_dir, jpg_save_dir,txt_dir):

    COUNT = 0
    for folder_path_tuple, folder_name_list, file_name_list in os.walk(source_path):
        for file_name in file_name_list:
            file_suffix = os.path.splitext(file_name)[-1]
            if file_suffix != '.jpg':
                continue
            list_top = []
            list_bndbox = []
            path = os.path.join(folder_path_tuple, file_name)
            xml_save_path = os.path.join(xml_save_dir, file_name.replace(file_suffix, '.xml'))
            txt_path = os.path.join(txt_dir, file_name.replace(file_suffix, '.txt'))
            filename = file_name#os.path.splitext(file_name)[0]
            checked = 'NO'
            #print(file_name)
            im = Image.open(path)
            im_w = im.size[0]
            im_h = im.size[1]

            #shutil.copy(path, jpg_save_dir)

            width = str(im_w)
            height = str(im_h)
            depth = '3'
            flag = 'rectangle'
            pose = 'Unspecified'
            truncated = '0'
            difficult = '0'
            list_top.extend([xml_save_path, folder_path_tuple, filename, path, checked, width, height, depth])
            for line in open(txt_path, 'r'):
                line = line.strip()
                info = line.split(' ')
                if 0 == int(info[0]):
                    name = wordname_zkrc[0]
                elif 1 == int(info[0]):
                    name = wordname_zkrc[1]
                elif 2 == int(info[0]):
                    name = wordname_zkrc[2]
                elif 3 == int(info[0]):
                    name = wordname_zkrc[3]
                else:
                    name = wordname_zkrc[4]
                x_cen = float(info[1]) * im_w
                y_cen = float(info[2]) * im_h
                w = float(info[3]) * im_w
                h = float(info[4]) * im_h
                xmin = int(x_cen - w / 2)
                ymin = int(y_cen - h / 2)
                xmax = int(x_cen + w / 2)
                ymax = int(y_cen + h / 2)

                if xmin < 0:
                    xmin = 0
                if ymin < 0:
                    ymin = 0

                if xmax > im_w - 1:
                    xmax = im_w - 1
                if ymax > im_h - 1:
                    ymax = im_h - 1

                if w > 4 and h > 4:
                  list_bndbox.extend([name, flag, pose, truncated, difficult,str(xmin), str(ymin), str(xmax), str(ymax)])

                if xmin < 0 or xmax > im_w - 1 or ymin < 0 or ymax > im_h - 1:
                    print(xml_save_path)

            Xml_make().txt_to_xml(list_top, list_bndbox)
            COUNT += 1
            #print(COUNT, xml_save_path)

if __name__ == "__main__":

    out_xml_path = "./4_classData/"  # .xml输出文件存放地址
    out_jpg_path = "./4_classData/"  # .jpg输出文件存放地址
    txt_path = "./images_all/"  # yolov3标注.txt和图片文件夹
    images_path = "./images_all/"  # image文件存放地址
    txt_2_xml(images_path, out_xml_path, out_jpg_path, txt_path)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2071064.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

GRAPHCARE:双向图神经网络 + 个性化知识图谱 + 大模型,打开医疗保健预测领域之门

GRAPHCARE&#xff1a;双向图神经网络 个性化知识图谱 大模型&#xff0c;医疗保健预测领域 关系图双向图神经网络个性化知识图谱GRAPHCARE框架创意视角 如果取消双向图神经网络&#xff0c;直接用医学大模型分析&#xff0c;还能做医疗保健预测领域吗&#xff1f;使用双向图…

防患未然:构建AIGC时代下开发团队应对突发技术故障与危机的全面策略

文章目录 一、快速响应与精准问题定位1. 实时监控与预警系统2. 高效的日志管理和分析3. 分布式追踪与调用链分析4. 紧急响应机制 二、建立健全的应急预案与备份机制1. 制定详尽的应急预案2. 定期应急演练3. 数据备份与快速恢复4. 冗余部署与负载均衡 三、事后总结与持续改进1. …

MATLAB 低版本Matlab-读取LAS格式点云文件并可视化(78)

las格式的文件属于标准的激光点云文件,也是最常见的点云文件,下面是读取并可视化方法 MATLAB 低版本Matlab-读取LAS格式点云文件并可视化(78) 一、LAS文件简介二、算法实现1.代码2.下载地址总结之前介绍过MATLAB自带的Las文件读取函数:(稳定,推荐使用该方法) MATLAB 读取…

第135天:内网安全-横向移动非约束委派约束委派数据库攻防

案例一: 横向移动-原理利用-非约束委派 该案例建立了解即可&#xff0c;真实环境应该不可能有人这样配置 非约束委派的原理和利用场景 原理&#xff1a; 机器 A &#xff08;域控&#xff09;访问具有非约束委派权限的机器 B 的服务&#xff0c;会把当前认证用户&#x…

【数据结构6】AVL树、AVL树的旋转-左旋和右旋、二叉搜索树的扩展应用-B树(B-Tree)、B+树

1 AVL树 2 AVL树的旋转-左旋和右旋 2.1 AVL树的旋转实现 3 二叉搜索树的扩展应用-B树 3.2 B树 1 AVL树 AVL树:AVL树是一棵自平衡的二叉搜索树。AVL树具有以下性质&#xff1a;根的左右子树的高度之差的绝对值不能超过1根的左右子树都是平衡二叉树平均情况下&#xff0c;二叉搜…

基于.net的外卖点单系统的设计与实现/基于asp.net的外卖系统

基于.net的外卖点单系统的设计与实现 摘 要 国内餐饮行业的快速发展&#xff0c;人们为了能够更加方便地管理用户点单&#xff0c;外卖点单系统被人们开发出来从而更好地方便管理用户点单&#xff0c;一个完美的外卖点单系统已经成为各个餐饮店的追求目标。 本系统asp.net利用…

ssrf攻击fastcgi复现

文章目录 环境搭建使用网页查看开始攻击 环境搭建 在/usr/local/nginx/html下新建一个php文件 phpinfo.php 1.php <?php highlight_file(__FILE__); $url $_GET[url]; $curl curl_init($url); curl_setopt($curl, CURLOPT_HEADER, 0); $responseText curl_exec($curl)…

Transformer模型中的PositionEmbedding实现:让你的NLP项目飞起来!

在自然语言处理的海洋中&#xff0c;Transformer模型如同一艘巨轮&#xff0c;承载着对文本理解和生成的无限可能。 然而&#xff0c;即使是最强大的模型&#xff0c;也需借助一些关键组件来达到其最佳性能。 其中&#xff0c;PositionEmbedding便是这样一把钥匙&#xff0c;…

BUG——GT911上电后中断一直触发

版型&#xff1a;正点原子 I.MX6UL MINI板 屏幕&#xff1a;7寸 1024*600 ATK-MD0700R V1.4 我的建议是买7寸屏幕就不要Mini板&#xff0c;因为Mini板太小装不下7寸屏幕&#xff0c;你需要一个更大的板子 简介&#xff1a; 算是作为一个后来者对这一现象的补充。解决方案就…

如何使用ssm实现开放式教学评价管理系统+vue

TOC ssm121开放式教学评价管理系统vue 第1章 绪论 1.1 背景及意义 系统管理也都将通过计算机进行整体智能化操作&#xff0c;对于开放式教学评价管理系统所牵扯的管理及数据保存都是非常多的&#xff0c;例如个人中心、教师管理、学生管理、游客管理、评价信息管理、综合评…

如何系统化的学习 Redis?

搭建完整的知识框架和架构体系 张无剑&#xff1a;恭喜码哥&#xff0c;恭喜靓仔&#xff0c;网络资料很多&#xff0c;但碎片化严重&#xff0c;我如何才能成为 Redis 高手&#xff0c;建立完整的知识框架&#xff1f; Redis 是广受欢迎的 NoSQL 数据库&#xff0c;唯快不破是…

class_4:条件语句和逻辑运算符

mood_index int(input("对象今天的心情怎么样&#xff01;"))if mood_index > 80:print("今天可以好好happy一下了")print("O(∩_∩)O哈哈~") else:print("今天还是乖乖的吧&#xff01;否则小命不保") #BMI 体重 /&#xff08;身…

热血传奇经典1.85原始珍藏版单机安装教程+GM+假人+无需虚拟机

今天给大家带来一款单机游戏的架设&#xff1a;热血传奇经典1.85原始珍藏版。 另外&#xff1a;本人承接各种游戏架设&#xff08;单机联网&#xff09; 本人为了学习和研究软件内含的设计思想和原理&#xff0c;带了架设教程仅供娱乐。 教程是本人亲自搭建成功的&#xff0…

编程之路:在Bug的迷宫中寻找出口

编程是一种艺术&#xff0c;也是一种科学。它要求我们既要有创造性的思维&#xff0c;又要有严谨的逻辑。在这条充满挑战的道路上&#xff0c;每个人都会遇到挫折&#xff0c;这些挫折可能来自于一个难以解决的Bug&#xff0c;一个复杂的算法&#xff0c;或者是在实现某个功能时…

UDS诊断系列之十九 读取故障码(DTC)

一、读取符合条件的DTC数量 通过调用19服务的01子功能&#xff0c;我们可以轻松地读取符合特定条件的故障码数量。重要的是要意识到&#xff0c;此功能仅提供故障码的数量&#xff0c;而不包含任何额外的信息。这意味着&#xff0c;虽然你可以获得故障码的总数&#xff0c;但不…

【SQL】关注者数量

目录 题目 分析 代码 题目 表&#xff1a; Followers ------------------- | Column Name | Type | ------------------- | user_id | int | | follower_id | int | ------------------- (user_id, follower_id) 是这个表的主键&#xff08;具有唯一值的列的组合&am…

Global Context Vision Transformers

摘要 https://arxiv.org/pdf/2206.09959 我们提出了全局上下文视觉转换器&#xff08;GC ViT&#xff09;&#xff0c;这是一种新颖的架构&#xff0c;旨在提高计算机视觉中的参数和计算利用率。我们的方法利用全局上下文自注意力模块与标准的局部自注意力相结合&#xff0c;以…

通信协议学习:CAN总线协议

以下的学习主要是观看江科大视频后的总结&#xff0c;需要学习建议观看原视频&#xff1a;https://www.bilibili.com/video/BV1vu4m1F7Gt/?p1&spm_id_frompageDriver&vd_source0a52d160c212359f7f490eb9a868d174 CAN总线简介 CAN总线&#xff08;Controller Area Net…

selenium-java实现自动登录跳转页面

如果要一直刷新一个网页&#xff0c;总不能人工一直去点&#xff0c;所以想到大学时候学过selenium技术&#xff0c;写个脚本来一直刷新&#xff0c;因为经常写java语言&#xff0c;所以选用java语言来写 实验环境 注意&#xff0c;需要先准备好Google浏览器和Chrome-Driver驱…

mysql高可用之组复制 (MGR)

目录 1 MySQL的主从复制介绍 2 组复制流程 3 组复制单主和多主模式 3.1 single-primary mode(单写或单主模式) 3.2 multi-primary mode(多写或多主模式) 4 实现mysql组复制 4.1 MASTER 1 4.2 MASTER 2 4.3 MASTER 3 4.4 MASTER 1 检验 1 MySQL的主从复制介绍 MySQL Group Rep…