【yolo】yolo的txt标签转VOC格式的xml标签

2023-10-26

脚本介绍:

1. 可以为原图提供自动标注的功能。

例如:需要标注10000+的数据,可以人工标注1000+,然后训练yolo模型,再用detect.py用模型对剩下来的原图进行推理,推理中保存txt格式的推理结果。然后可以采用本代码,对剩下来的原图进行自动标注,再人工调整。

2. 通过模型自动标注,可以为已有标签补充其他类别

例如:原来的数据集的xml标签文件有[a,b,c]3个类,但是实际需求还需要增加一个d类。然后我们采用另一个检测模型,可以检测[d,e,f]类。
使用yolo项目中的detect.py用模型对需要补充类别的数据集原图进行推理,推理中保存txt格式的推理结果。
然后可以采用本代码,对txt标签文件中提取出[d]类的检测框信息,然后添加到原来数据集的xml标签中。

txt转xml转换代码:

import os
import xml.etree.ElementTree as ET
from xml.dom.minidom import Document
import cv2
import xml.etree.ElementTree as ET

xml_obj = '''
    <object>        
        <name>{}</name>
        <pose>Unspecified</pose>
        <truncated>0</truncated>
        <difficult>0</difficult>
        <bndbox>
            <xmin>{}</xmin>
            <ymin>{}</ymin>
            <xmax>{}</xmax>
            <ymax>{}</ymax>
        </bndbox>
    </object>
    '''

class YOLO2VOCConvert:
    def __init__(self, txts_path, out_xmls_path,org_xml_path, imgs_path, classes, jpg_type, valid_class) :
        self.txts_path = txts_path   # 标注的yolo格式标签文件路径
        self.xmls_path = out_xmls_path   # 转化为voc格式标签之后保存路径
        self.org_xmls_path = org_xml_path   # 原来自带的xml路径
        self.imgs_path = imgs_path   # 读取读片的路径各图片名字,存储到xml标签文件中
        self.classes = classes
        self.jpg_type = jpg_type
        self.valid_class = valid_class

    # 从所有的txt文件中提取出所有的类别, yolo格式的标签格式类别为数字 0,1,...
    # writer为True时,把提取的类别保存到'./Annotations/classes.txt'文件中
    def search_all_classes(self, writer=False):
        # 读取每一个txt标签文件,取出每个目标的标注信息
        all_names = set()
        txts = os.listdir(self.txts_path)
        # 使用列表生成式过滤出只有后缀名为txt的标签文件
        txts = [txt for txt in txts if txt.split('.')[-1] == 'txt']
        # print(len(txts), txts)
        # 11 ['0002030.txt', '0002031.txt', ... '0002039.txt', '0002040.txt']
        for txt in txts:
            txt_file = os.path.join(self.txts_path, txt)
            with open(txt_file, 'r') as f:
                objects = f.readlines()
                for object in objects:
                    object = object.strip().split(' ')
                    print(object)  # ['2', '0.506667', '0.553333', '0.490667', '0.658667']
                    all_names.add(int(object[0]))
            # print(objects)  # ['2 0.506667 0.553333 0.490667 0.658667\n', '0 0.496000 0.285333 0.133333 0.096000\n', '8 0.501333 0.412000 0.074667 0.237333\n']

        print("所有的类别标签:", all_names, "共标注数据集:%d张" % len(txts))

        return list(all_names)

    def find_nodes(self,tree, path):
        return tree.findall(path)

    def yolo2voc(self):
        # 创建一个保存xml标签文件的文件夹
        if not os.path.exists(self.xmls_path):
            os.mkdir(self.xmls_path)

        # 把上面的两个循环改写成为一个循环:
        imgs = os.listdir(self.imgs_path)
        txts = os.listdir(self.txts_path)
        txts = [txt for txt in txts if not txt.split('.')[0] == "classes"]  # 过滤掉classes.txt文件
        print(txts)

        for root, dir, files in os.walk(self.txts_path):
            for file in files:
                if file.endswith('txt'):
                    img_name = file[:-3]+self.jpg_type
                    if not os.path.exists(os.path.join(self.imgs_path, img_name)):
                        continue
                    print("读取图片:", os.path.join(self.imgs_path, img_name))
                    img = cv2.imread(os.path.join(self.imgs_path, img_name))
                    height_img, width_img, depth_img = img.shape

                    # 获取标注文件txt中的标注信息
                    all_objects = []
                    txt_file = os.path.join(root, file)
                    print('txt_file:', txt_file)
                    with open(txt_file, 'r') as f:
                        objects = f.readlines()
                        for object in objects:
                            object = object.strip().split(' ')
                            all_objects.append(object)
                    xml_name = file[:-3]+'xml'
                    self.txt2xml(all_objects, height_img, width_img, depth_img, file)

                    # 不存在,则新建xml
                    if os.path.exists(os.path.join(self.org_xmls_path, xml_name)):
                        self.txtAddXml(xml_name)

    def add_node_by_target_classes(self, nodelist, classes, tree_root):
        print(222)
        for parent_node in nodelist:
            # print(333)
            children = parent_node.getchildren()
            # print(children[0].text)
            if (parent_node.tag == "object" and children[0].text in classes):
                # print(children[0].text.lower())
                tree_root.append(parent_node)

    def txtAddXml(self, xml_name):
        new_tree = ET.parse(os.path.join(self.org_xmls_path, xml_name))
        tree = ET.parse(os.path.join(self.xmls_path, xml_name))
        old_root = tree.getroot()
        new_root = new_tree.getroot()
        # get parent nodes
        add_parent_nodes = self.find_nodes(old_root, "./")
        self.add_node_by_target_classes(add_parent_nodes, self.valid_class, new_root)
        new_tree.write(os.path.join(self.xmls_path, xml_name), encoding="utf-8", xml_declaration=True)

    def txt2xml(self, all_objects, height_img, width_img, depth_img, txt_name):
        # 创建xml标签文件中的标签
        xmlBuilder = Document()
        # 创建annotation标签,也是根标签
        annotation = xmlBuilder.createElement("annotation")

        # 给标签annotation添加一个子标签
        xmlBuilder.appendChild(annotation)

        # 创建子标签folder
        folder = xmlBuilder.createElement("folder")
        # 给子标签folder中存入内容,folder标签中的内容是存放图片的文件夹,例如:JPEGImages
        folderContent = xmlBuilder.createTextNode(self.imgs_path.split('/')[-1])  # 标签内存
        folder.appendChild(folderContent)  # 把内容存入标签
        annotation.appendChild(folder)  # 把存好内容的folder标签放到 annotation根标签下

        # 创建子标签filename
        filename = xmlBuilder.createElement("filename")
        # 给子标签filename中存入内容,filename标签中的内容是图片的名字,例如:000250.jpg
        filenameContent = xmlBuilder.createTextNode(txt_name.split('.')[0] + '.jpg')  # 标签内容
        filename.appendChild(filenameContent)
        annotation.appendChild(filename)

        # 把图片的shape存入xml标签中
        size = xmlBuilder.createElement("size")
        # 给size标签创建子标签width
        width = xmlBuilder.createElement("width")  # size子标签width
        widthContent = xmlBuilder.createTextNode(str(width_img))
        width.appendChild(widthContent)
        size.appendChild(width)  # 把width添加为size的子标签
        # 给size标签创建子标签height
        height = xmlBuilder.createElement("height")  # size子标签height
        heightContent = xmlBuilder.createTextNode(str(height_img))  # xml标签中存入的内容都是字符串
        height.appendChild(heightContent)
        size.appendChild(height)  # 把width添加为size的子标签
        # 给size标签创建子标签depth
        depth = xmlBuilder.createElement("depth")  # size子标签width
        depthContent = xmlBuilder.createTextNode(str(depth_img))
        depth.appendChild(depthContent)
        size.appendChild(depth)  # 把width添加为size的子标签
        annotation.appendChild(size)  # 把size添加为annotation的子标签

        # 每一个object中存储的都是['2', '0.506667', '0.553333', '0.490667', '0.658667']一个标注目标
        for object_info in all_objects:
            # 开始创建标注目标的label信息的标签
            object = xmlBuilder.createElement("object")  # 创建object标签
            # 创建label类别标签
            # 创建name标签
            imgName = xmlBuilder.createElement("name")  # 创建name标签
            imgNameContent = xmlBuilder.createTextNode(self.classes[int(object_info[0])])
            imgName.appendChild(imgNameContent)
            object.appendChild(imgName)  # 把name添加为object的子标签

            # 创建pose标签
            pose = xmlBuilder.createElement("pose")
            poseContent = xmlBuilder.createTextNode("Unspecified")
            pose.appendChild(poseContent)
            object.appendChild(pose)  # 把pose添加为object的标签

            # 创建truncated标签
            truncated = xmlBuilder.createElement("truncated")
            truncatedContent = xmlBuilder.createTextNode("0")
            truncated.appendChild(truncatedContent)
            object.appendChild(truncated)

            # 创建difficult标签
            difficult = xmlBuilder.createElement("difficult")
            difficultContent = xmlBuilder.createTextNode("0")
            difficult.appendChild(difficultContent)
            object.appendChild(difficult)

            # 先转换一下坐标
            # (objx_center, objy_center, obj_width, obj_height)->(xmin,ymin, xmax,ymax)
            x_center = float(object_info[1]) * width_img + 1
            y_center = float(object_info[2]) * height_img + 1
            xminVal = int(x_center - 0.5 * float(object_info[3]) * width_img)  # object_info列表中的元素都是字符串类型
            yminVal = int(y_center - 0.5 * float(object_info[4]) * height_img)
            xmaxVal = int(x_center + 0.5 * float(object_info[3]) * width_img)
            ymaxVal = int(y_center + 0.5 * float(object_info[4]) * height_img)

            # 创建bndbox标签(三级标签)
            bndbox = xmlBuilder.createElement("bndbox")
            # 在bndbox标签下再创建四个子标签(xmin,ymin, xmax,ymax) 即标注物体的坐标和宽高信息
            # 在voc格式中,标注信息:左上角坐标(xmin, ymin) (xmax, ymax)右下角坐标
            # 1、创建xmin标签
            xmin = xmlBuilder.createElement("xmin")  # 创建xmin标签(四级标签)
            xminContent = xmlBuilder.createTextNode(str(xminVal))
            xmin.appendChild(xminContent)
            bndbox.appendChild(xmin)
            # 2、创建ymin标签
            ymin = xmlBuilder.createElement("ymin")  # 创建ymin标签(四级标签)
            yminContent = xmlBuilder.createTextNode(str(yminVal))
            ymin.appendChild(yminContent)
            bndbox.appendChild(ymin)
            # 3、创建xmax标签
            xmax = xmlBuilder.createElement("xmax")  # 创建xmax标签(四级标签)
            xmaxContent = xmlBuilder.createTextNode(str(xmaxVal))
            xmax.appendChild(xmaxContent)
            bndbox.appendChild(xmax)
            # 4、创建ymax标签
            ymax = xmlBuilder.createElement("ymax")  # 创建ymax标签(四级标签)
            ymaxContent = xmlBuilder.createTextNode(str(ymaxVal))
            ymax.appendChild(ymaxContent)
            bndbox.appendChild(ymax)

            object.appendChild(bndbox)
            annotation.appendChild(object)  # 把object添加为annotation的子标签
        f = open(os.path.join(self.xmls_path, txt_name[:-3] + 'xml'), 'w')
        print(os.path.join(self.xmls_path, txt_name[-3] + 'xml'))
        xmlBuilder.writexml(f, indent='\t', newl='\n', addindent='\t', encoding='utf-8')
        f.close()



if __name__ == '__main__':
    '''
    脚本功能:
    1. 可以为原图提供自动标注的功能。
        例如:需要标注10000+的数据,可以人工标注1000+,然后训练yolo模型,再用detect.py用模型对剩下来的原图进行推理,
            推理中保存txt格式的推理结果。然后可以采用本代码,对剩下来的原图进行自动标注,再人工调整。
        [参数]
        imgs_path1:需要自动标注的图片路径
        txts_path1:输入推理中保存txt文件
        xmls_path1:输出的xml文件路径
        其他参数可以设置为空,程序内不会进行调用

    2. 通过模型自动标注,可以为已有标签补充其他类别
        例如:原来的数据集的xml标签文件有[a,b,c]3个类,但是实际需求还需要增加一个d类。然后我们采用另一个检测模型,可以检测[d,e,f]类。
            使用yolo项目中的detect.py用模型对需要补充类别的数据集原图进行推理,推理中保存txt格式的推理结果。
            然后可以采用本代码,对txt标签文件中提取出[d]类的检测框信息,然后添加到原来数据集的xml标签中。
        [参数]
        imgs_path1: 需要自动标注的图片路径
        txts_path1: 输入推理中保存txt文件,即案例中用另一个模型推理出包含[d,e,f]3个类的txt结果文件
        xmls_path1: 输出的xml文件路径
        xmls_path2: 原始的xml标签文件,即案例中只有[a,b,c]3个类的xml标签文件
        valid_class: 在推理输出的txt文件中,提取指定类别的信息,即案例中的[d]类,而e,f两类的检测框信息会被忽略。
    '''

    # 把yolo的txt标签文件转化为voc格式的xml标签文件
    # yolo格式txt标签文件相对路径
    txts_path1 = r'D:\dataset\LabeledDataset\FieldDatasets\unusual\2.ZH(charger,cabinet)\ZH-breakage\labels'
    # 输出目录转化为voc格式xml标签文件存储的相对路径
    xmls_path1 = r'D:\dataset\LabeledDataset\FieldDatasets\unusual\2.ZH(charger,cabinet)\ZH-breakage'
    # 存放图片的相对路径
    imgs_path1 = r'D:\dataset\LabeledDataset\FieldDatasets\unusual\2.ZH(charger,cabinet)\ZH-breakage'
    # 原图片对应的xml路径(当功能1时,没有原始xml标签时,可以为空)
    xmls_path2 = r'D:\dataset\LabeledDataset\FieldDatasets\unusual\2.ZH(charger,cabinet)\ZH-breakage-158'
    # txt转xml时,每个类别的id对用的label名称
    classes = ["fire", "charger", "cabinet", "lbrblue", "dooropen", "breakage"]
    # 当用txt标签文件给已存在的xml标签进行一个检测类别补充时,可以对类别进行一个筛选。功能1时,可以设置为空。
    valid_class = ["charger", "cabinet"]
    jpg_type='jpg'

    yolo2voc_obj1 = YOLO2VOCConvert(txts_path1, xmls_path1,xmls_path2, imgs_path1,classes,jpg_type,valid_class)
    labels = yolo2voc_obj1.search_all_classes()
    print('labels: ', labels)
    yolo2voc_obj1.yolo2voc()

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【yolo】yolo的txt标签转VOC格式的xml标签 的相关文章

  • 希伯来语中的稀疏句子标记化错误

    尝试对希伯来语使用稀疏句子标记 import spacy nlp spacy load he doc nlp text sents list doc sents I get Warning no model found for he Onl
  • Jupyter Notebooks 不显示进度条

    我正在尝试在 Jupyter 笔记本中显示进度条 这是一台新电脑 我通常做的事情似乎不起作用 from tqdm import tqdm notebook example iter 1 2 3 4 5 for rec in tqdm not
  • TF map_fn 或 while_loop 用于不同形状的张量列表

    我想处理不同形状的张量序列 列表 并输出另一个张量列表 考虑每个时间戳上具有不同隐藏状态大小的 RNN 就像是 输入 tf ones 1 2 2 tf ones 2 2 3 tf ones 3 2 1 输出 tf zeros 1 2 4 t
  • 如何在 PyCharm 4.5.2 中使用 PyPy 作为标准/默认解释器?

    如何在 PyCharm 4 5 2 中使用 PyPy 作为标准 默认解释器 一切都在 Ubunutu 14 10 下运行 并且 pypy 已经安装 您可以在项目的设置下进行配置 这个官方文档直接涵盖了 https www jetbrains
  • 当我在 Pandas 中使用 df.corr 时,我的一些列丢失了

    这是我的代码 import numpy as np import pandas as pd import seaborn as sns import matplotlib pyplot as plt data pd read csv dea
  • 根据开始列和结束列扩展数据框(速度)

    我有一个pandas DataFrame含有start and end列 加上几个附加列 我想将此数据框扩展为一个时间序列 从start值并结束于end值 但复制我的其他专栏 到目前为止 我想出了以下内容 import pandas as
  • 更改 Altair 中的构面标题位置?

    如何将方面标题 在本例中为年份 移动到每个图的上方 默认值似乎位于图表的一侧 这可以轻易改变吗 import altair as alt from vega datasets import data df data seattle weat
  • 可以用 Django 制作移动应用程序吗?

    我想知道我是否可以在我的网站上使用 Django 代码 并以某种方式在移动应用程序 Flutter 等框架中使用它 那么是否可以使用我现在拥有的 Django 后端并在移动应用程序中使用它 所以就像models views etc 是的 有
  • Python Fabric - 未找到主机。请指定用于连接的(单个)主机字符串:

    如何获取 找不到主机 请指定用于连接的 单个 主机字符串 面料如何解决 def bootstrap host ec2 54 xxx xxx xxx compute 1 amazonaws com env hosts host env use
  • python 中的 Johansen 协整检验

    我找不到任何有关在处理统计和时间序列分析 pandas 和 statsmodel 的 Python 模块中执行 Johansen 协整检验的功能的参考 有谁知道是否有一些代码可以执行时间序列之间的协整测试 现在 这已在 Python 的 s
  • Apache Spark 中的高效字符串匹配

    我使用 OCR 工具从屏幕截图中提取文本 每个大约 1 5 句话 然而 当手动验证提取的文本时 我注意到时不时会出现一些错误 鉴于文本 你好 我真的很喜欢 Spark 我注意到 1 像 I 和 l 这样的字母被 替换 2 表情符号未被正确提
  • Python 惰性迭代器

    我试图了解迭代器表达式如何以及何时被求值 以下似乎是一个懒惰的表达 g i for i in range 1000 if i 3 i 2 然而 这个在构造上失败了 g line strip for line in open xxx r if
  • 具有屏蔽无效值的 pcolormesh

    我试图将一维数组绘制为 pcolormesh 因此颜色沿 x 轴变化 但每个 x 的 y 轴保持不变 但我的数据有一些错误值 因此我使用屏蔽数组和自定义颜色图 其中屏蔽值设置为蓝色 import numpy as np import mat
  • Pandas style.bar 颜色基于条件?

    如何渲染其中一列的 Pandas dfstyle bar color属性是根据某些条件计算的 Example df style bar subset before after color ff781c vmin 0 0 vmax 1 0 而
  • 由于 json 字符串化 dict 键导致数据丢失

    考虑下面的例子 gt gt gt import json gt gt gt d 0 potato 0 spud gt gt gt json dumps d 0 potato 0 spud gt gt gt json loads json d
  • 线性布局高度和重量

    我有以下内容
  • 为什么 smtplib.SMTP().sendmail 不发送 DKIM 签名邮件

    我已经在服务器上设置了 postfix 以及 openDKIM 当我跑步时 echo Testing setup mail s Postfix test my email address 我收到电子邮件 邮件标题中有一个DKIM Signa
  • Python:高精度time.sleep

    你能告诉我如何在 Win32 和 Linux 上的 Python 2 6 中获得高精度睡眠函数吗 您可以在中使用浮点数sleep http docs python org library time html time sleep 该参数可以
  • 在 Django shell 会话期间获取 SQL 查询计数

    有没有办法打印 Django ORM 在 Django shell 会话期间执行的原始 SQL 查询的数量 Django 调试工具栏已经提供了此类信息 例如 5 QUERIES in 5 83MS但如何从 shell 中获取它并不明显 您可
  • 如何为所有用户安装 Anaconda python?

    Anaconda python 发行版 https store continuum io cshop anaconda 非常方便地部署科学计算环境 SCE 并根据需要切换python版本 默认情况下 安装会将 python 定位到 anac

随机推荐

  • JavaWeb-实体类对象嵌套实体类对象的查询

    1 1 实体类代码 Cart类 购物车类 public class Cart 自增的购物车记录id private int cid 用户id private int uid 产品id private int pid 产品数量 private
  • C# 中的委托和事件(详解) ....

    C 中的委托和事件 委托和事件在 NET Framework 中的应用非常广泛 然而 较好地理解委托和事件对很多接触 C 时间不长的人来说并不容易 它们就像是一道槛儿 过了这个槛的人 觉得真是太容易了 而没有过去的人每次见到委托和事件就觉得
  • 编译原理题-带答案

    一 判断题 1 一个 LL l 文法一定是无二义的 Y 2 正规文法产生的语言都可以用上下文无关文法来描述 N 3 一张转换图只包含有限个状态 其中有一个被认为是初态 最多只有一个终态 Y 4 目标代码生成时 应考虑如何充分利用计算机的寄存
  • 协同过滤(Collaborative Filtering):UserCF and Item CF

    具体的学习资料可以参考王喆老师的 深度学习推荐系统 已经梳理好了知识体系 我也将按照这个路线再次梳理一遍 同时做一些拓展和加深理解 一 前言 系统过滤曾是多年前推荐系统领域的应用最广泛的模型 也是基石一样的存在 重要 重要 这里推出两篇论文
  • php书籍

    1 Extending and Embedding PHP 讲述php的引擎zend 告知如何进行php的扩展 php是开源的 所以我们可以对php进行改进 实现自己的php 真好呀
  • 利用Matlab搭建U_net回归网络,以及绘制loss函数曲线图

    U net网络一般用于图像处理比较广泛 但是强大的U net同样也可以用于探索各类回归拟合问题 现在我们就开始用matlab去搭建一个U net拟合回归网络 第一步 数据集处理 在此任务中首先得拥有一套用于回归得数据集 首先将数据集导入工作
  • deployment介绍和使用

    什么是deployment deployment是对pods和ReplicaSet的定义 定义了pods和ReplicaSet的定义和实现方式等 如下为deployment的定义 apiVersion apps v1 kind Deploy
  • C/C++编程:右值引用

    右值引用不过是C 的一种新语法 重要的是基于右值引用引申处理的两种C 编程技巧 移动语义和完美转发 右值引用 C 98 03标准中就有引用 用 表示 但是此种引用方式有一个缺陷 即正常情况下只能操作C 中的左值 无法对右值添加引用 举个例子
  • 狙击涨停板-通达信,同花顺,金字塔,TB等指标公式量化开发安装及使用教程...

    原文链接 http tecdat cn p 7260 选股结果 如果您有任何疑问 请在下面发表评论 大数据部落 中国专业的第三方数据服务提供商 提供定制化的一站式数据挖掘和统计分析咨询服务 统计分析和数据挖掘咨询服务 y0 cn terad
  • Spring 快速入门的一个程序:HelloSpring

    Spring 快速入门的一个程序 HelloSpring 1 新建一个Maven项目 建好之后有以下文件 2 pom xml中注入依赖项 然后刷新Maven 会自动下载依赖包
  • C# 获取本机连接的所有 串口设备名称 与 串口号

    代码 class Program static void Main string args GetComList private static void GetComList try using ManagementObjectSearch
  • vscode添加自定义的用户代码片段

    在vscode中添加代码片段 选择 新建全局代码片段文件 然后输入文件名 随便输入 然后会生成文件 安装文件中的Example就可以添加代码片段 里面各个字段的含义 Print to console 代码片段的名称 不同代码片段需要不同 在
  • 中断请求级

    返回 上一页 下一页 中断请求级 Windows NT为每个硬件中断和少数软件事件赋予了一个优先级 即中断请求级 interrupt request level IRQL IRQL为单CPU上的活动提供了同步方法 它基于下面规则 一旦某CP
  • PADS Logic BOM Output

    Dim fn As String Sub Main fn ActiveDocument If fn Then fn Untitled End If tempFile DefaultFilePath temp txt Open tempFil
  • markdown中图片靠左对齐或靠右对齐

    第一次在markdown中写博客 发现插入图片默认是居中显示的 一开始我是按下面这种方式插入图片的 当图片无法显示的时候 显示的文字 图片URL 然后图片默认居中显示 然后就一通百度 有的说可以这样写 div align left 这里写图
  • java unreachable code不可达代码

    例子 static int test int testval int target 1 if testval gt target System out println 1 return 1 下边是永远不会达到的代码 所以编译器提示错误 un
  • 【Docker】配置容器的hosts来实现域名指定服务

    需求 在使用docker chrome进行selenium自动化测试的时候 希望客户端能够通过某种形式 让我们的case跑到测试环境取 这时候有两个方式 1 给浏览器使用代理 这里不讲 前面有个文章已经说过了 2 修改执行的selenium
  • pyqt_点击button("添加")弹出新的页面

    目标 通过点击主窗口中的button弹出另一个窗口页面 首先需要注意的是 两个窗口不能是同一类型 否则会崩溃 并保存为名称不同的ui文件 并使用UIC工具转成 py文件 因此在目前文件夹中既有mainwindow又有dialog窗体形式的界
  • openstack-keystone入门

    作用 身份验证 令牌发放和校验 服务列表 用户权限定义 不适合新手看 想到哪儿写到哪儿 写一些关于自己在看书学习的过程中对一些知识的理解 Service决定每个Role能干什么事情 而每个User可以给他分配多个Role 进而具备了多服务的
  • 【yolo】yolo的txt标签转VOC格式的xml标签

    脚本介绍 1 可以为原图提供自动标注的功能 例如 需要标注10000 的数据 可以人工标注1000 然后训练yolo模型 再用detect py用模型对剩下来的原图进行推理 推理中保存txt格式的推理结果 然后可以采用本代码 对剩下来的原图