IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> 标注修改、转换相关问题 -> 正文阅读

[人工智能]标注修改、转换相关问题

目录

xml格式转yolo格式(txt)

修改xml的name


xml格式转yolo格式(txt)

xml2yolo.py:?

"""
功能:
    xml格式转为yolo(txt)格式标注,生成的文件自动放在[TxtPath]文件夹
提示:
    1、将xml放在当前目录的[XmlPath]文件夹内
    2、修改XmlPath、TxtPath变量为实际的路径
    3、修改代码第3行的类别为数据集中包含的实际类别
"""

# !/usr/bin/env python3
# -*- coding: utf-8 -*-

import xml.etree.ElementTree as ET
import os

XmlPath = './label_xml/'
TxtPath = './label_txt_test/'
classes = ["airship", "airshAip", "2", "3"]  # 类别,此处需要修改为数据集中包含的实际类别

CURRENT_DIR = os.path.dirname(os.path.abspath(__file__))


def mkdir(path):
    folder = os.path.exists(path)

    if not folder:  # 判断是否存在文件夹如果不存在则创建为文件夹
        os.makedirs(path)  # makedirs 创建文件时如果路径不存在会创建这个路径
        print("因没有输出文件夹,所以新建文件夹" + path)


def convert(size, box):
    dw = 1. / size[0]
    dh = 1. / size[1]
    x = (box[0] + box[1]) / 2.0
    y = (box[2] + box[3]) / 2.0
    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_annotation(image_id):
    in_file = open(XmlPath + '%s.xml' % (image_id), encoding='UTF-8')
    out_file = open(TxtPath + '%s.txt' % (image_id), 'w')  # 生成txt格式文件
    tree = ET.parse(in_file)
    root = tree.getroot()
    size = root.find('size')
    w = int(size.find('width').text)
    h = int(size.find('height').text)
    # print(w,h)
    for obj in root.iter('object'):
        cls = obj.find('name').text

        if cls not in classes:
            continue
        cls_id = classes.index(cls)
        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')


mkdir(TxtPath)
xml_path = os.path.join(CURRENT_DIR, XmlPath)

# xml list
img_xmls = os.listdir(xml_path)
for img_xml in img_xmls:
    label_name = img_xml.split('.')[0]
    print(label_name)
    convert_annotation(label_name)

print("输出文件在" + TxtPath + "内")

参考链接:参考了一位博主的链接,但是忘记了,欢迎提醒

修改xml的name

ChangeXmlName.py:

"""
功能:
    修改xml文件内的标注name,修改好的xml存放在[new_ann_dir]文件夹
提示:
    1、修改origin_ann_dir为原始xml文件所在文件夹
    2、修改new_ann_dir为新生成的xml文件夹路径
    3、修改name_rename_origin为需要修改的名字
    4、修改name_rename为修改的目标名字
"""

# !/usr/bin/env python2
# -*- coding: utf-8 -*-

import os
import xml.etree.ElementTree as ET

origin_ann_dir = './label_xml/'  # 设置原始标签路径为 Annos
new_ann_dir = './label_xml_new_test/'  # 设置新标签路径 Annotations
name_rename_origin = ["airshAip"]
name_rename = "airship"
num = 0


def mkdir(path):
    folder = os.path.exists(path)

    if not folder:  # 判断是否存在文件夹如果不存在则创建为文件夹
        os.makedirs(path)  # makedirs 创建文件时如果路径不存在会创建这个路径
        print("因没有输出文件夹,所以新建文件夹" + path)


mkdir(new_ann_dir)
for dirpaths, dirnames, filenames in os.walk(origin_ann_dir):  # os.walk游走遍历目录名
    print('开始处理')
    for filename in filenames:
        num += 1
        print("正在处理第%d个文件:" % num)
        if os.path.isfile(r'%s%s' % (origin_ann_dir, filename)):  # 获取原始xml文件绝对路径,isfile()检测是否为文件 isdir检测是否为目录
            origin_ann_path = os.path.join(r'%s%s' % (origin_ann_dir, filename))  # 如果是,获取绝对路径(重复代码)
            new_ann_path = os.path.join(r'%s%s' % (new_ann_dir, filename))
            tree = ET.parse(origin_ann_path)  # ET是一个xml文件解析库,ET.parse()打开xml文件。parse--"解析"
            root = tree.getroot()  # 获取根节点
            # print(filename)
            for object in root.findall('object'):  # 找到根节点下所有“object”节点
                name = str(object.find('name').text)  # 找到object节点下name子节点的值(字符串)
                # 如果name等于str,则删除该节点
                # if (name in ["car_head"]):
                #     root.remove(object)

                # 如果name等于str,则修改name
                if (name in name_rename_origin):
                    print("修改%s为%s" % (name, name_rename))
                    object.find('name').text = name_rename

            # 检查是否存在labelmap中没有的类别
            # for object in root.findall('object'):
            #     name = str(object.find('name').text)
            #     if not (name in ["airship", "airshAip"]):
            #         print(filename + "------------->label is error--->" + name)
            tree.write(new_ann_path)  # tree为文件,write写入新的文件中。

print("输出文件在" + new_ann_dir + "内")

参考链接:参考了一位博主的链接,但是忘记了,欢迎提醒

  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2021-09-30 11:56:30  更:2021-09-30 11:56:59 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/21 20:58:10-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码