训练数据转换为PASCAL VOC2007

数据

我们已有标注数据个数为json保存的,现在训练代码使用的标注格式为PASCAL VOC2007,为了不修改代码,将数据转换到PASCAL VOC2007的xml格式。

转换代码

import os
import json
from lxml.etree import Element, SubElement, tostring, ElementTree
from xml.dom import minidom
# 从文件夹下获取json文件名
def ReadFileDir(path):
    file = []
    dirs = os.listdir(path)                    # 获取指定路径下的文件
    for i in dirs:                             # 循环读取路径下的文件并筛选输出
        if os.path.splitext(i)[1] == ".json":   # 筛选json文件
            file.append(i)
    return file
# 加载json文件
def ReadJson(path):
    with open(path,'r') as load_f:
        load_dict = json.load(load_f)
    return load_dict
# xml创建一个子项
def subElement(root, tag, text):
    ele = SubElement(root, tag)
    if text != "":
        ele.text = text
    return ele
# 保存为xml文件,并格式化
def saveXML(root, filename, indent="\t", newl="\n", encoding="utf-8"):
    rawText = tostring(root)
    dom = minidom.parseString(rawText)
    with open(filename, 'w') as f:
        dom.writexml(f, "", indent, newl, encoding)
# 基础信息保存在xml中
def make_xml(image_name, width, height):
    node_root = Element('annotation')
    subElement(node_root, "folder", "widerface")
    subElement(node_root, "filename", image_name)
    node_source = subElement(node_root, "source", "")
    subElement(node_source, "database", "wider face Database")
    subElement(node_source, "annotation", "PASCAL VOC2007")
    subElement(node_source, "image", "flickr")
    subElement(node_source, "flickrid", "-1")
    node_owner = subElement(node_root, "owner", "")
    subElement(node_owner, "flickrid", "yanyu")
    subElement(node_owner, "name", "yanyu")
    subElement(node_root, "segmented", "0")
    node_size = subElement(node_root, "size", "")
    subElement(node_size, "width", str(width))
    subElement(node_size, "height", str(height))
    subElement(node_size, "depth", "3")
    return node_root
if __name__ == "__main__":
    path = '/home/q/train/Data/images/hxlx'
    save_xml_dir = 'xml'
    jsonfile = ReadFileDir(path)

    for i, v in enumerate(jsonfile):
        dict = ReadJson(os.path.join(path, v))

        if 'photo_id' in dict:
            image_id = dict['photo_id']
            image_name = image_id + ".jpg"
        else:
            continue
        if 'width' in dict:
            width = dict['width']
        else:
            continue
        if 'height' in dict:
            height = dict['height']
        else:
            continue
        
        node_root = make_xml(image_name, width, height)

        if 'croppers' in dict:
            croppers = dict['croppers']
            for i, crop_dict in enumerate(croppers):
                print (crop_dict)

                xmin = int(crop_dict['x'] * width)
                ymin = int(crop_dict['y'] * height)
                xmax = int((crop_dict['x'] + crop_dict['width']) * width)
                ymax = int((crop_dict['x'] + crop_dict['height']) * height)

                node_object = subElement(node_root, "object", "")
                subElement(node_object, "name", crop_dict["cropper_type"])
                subElement(node_object, "pose", 'Unspecified')
                subElement(node_object, "truncated", '1')
                subElement(node_object, "difficult", '0')
                node_bndbox = subElement(node_object, "bndbox", "")
                subElement(node_bndbox, "xmin", str(xmin))
                subElement(node_bndbox, "ymin", str(ymin))
                subElement(node_bndbox, "xmax", str(xmax))
                subElement(node_bndbox, "ymax", str(ymax))
                subElement(node_object, "has_lm", '0')

        
        # 保存xml文件
        saveXML(node_root, os.path.join(save_xml_dir, image_id + ".xml"))

具体使用根据自己的数据来添加

热门文章

编程学习 ·

sqlserver:临时表的删除

遇到一个坑: 某天,定时作业失败了多次,但代码没变动,这就奇了怪了。。 结果:经检查,每次执行的时候,临时表若存在,就会失败。 分析:当初不写删除临时表,是查询了临时表的定义,会话内自动结束,不知道是哪出现了问题。 解决: if OBJECT_ID(tempdb..#tempList) is no…
编程学习 ·

python学习记录

变量和简单数据类型 message="Hello Python world!" print(message)message就是一个变量,绿色部分用双引号括起来的(也可以用单引号)就是一个字符串。变量的命名和使用: 1.变量名只能包含字母、数字和下划线。字母下划线可以打头数字不可以。 2.变量名不能包含空…
编程学习 ·

开挂的印度裔00后:7岁“出道”教编程,12岁成为IBM荣誉顾问

9年教学经验,400万播放量,还出了3本编程教学书。解锁如此成就的,正是在油管(Youtube)爆火的一位up主,印度裔加拿大籍程序员——Tanmay Bakshi。他的课程覆盖主流操作系统、编程语言,以及基础科学。其深入浅出、通俗易懂的讲解方式,大获网友们的好评。有中国网友,还将他与…
编程学习 ·

AcWing - 90. 64 位整数乘法 【 位运算 】题解

目录1.题目2.代码 1.题目 求 a 乘 b 对 p 取模的值。 输入格式 第一行输入整数a,第二行输入整数b,第三行输入整数p。 输出格式 输出一个整数,表示a*b mod p的值。 数据范围 1≤a,b,p≤1018 输入样例: 3 4 5 输出样例: 2 2.代码 #include<iostream> #include<cstd…
编程学习 ·

小程序学习之路五:scroll-view实现多列布局

上面讲解了一些部分简单功能,接下来讲讲scroll-view的进阶,实现多列布局,先上效果:首先来看看布局文件<scroll-view class="scroll"><view class="item" wx:for={{datas}} wx:key=index wx:for-item="item" data-item="{{item…
编程学习 ·

iOS开发之多线程(2)—— Thread

目录版本简介方法属性示例 版本 Xcode 11.5 Swift 5.2.2 简介 一个Thread即为一个线程. 方法属性 OC中的属性方法(Swift方法名类似): #pragma mark - 属性 // 可以使用返回的字典来保存线程的特定数据. (这只是一个普通的字典, 用来保存所有开发者感兴趣的数据.) @property (r…
编程学习 ·

Jmeter学习

官网下载的Jmeter5.1的包,Ubuntu控制台运行./jmeter.sh即可运行。简体中文版。在了解常用元件后,再记录一些常用手段1.集合点,瞬间施压,峰值测试在添加->定时器->同步定时器,可以设置让一定数量的线程于同一时刻发起的请求。2.参数化,不同输入参数可以添加->配置…
编程学习 ·

qtdesigner-请假(仅仅是尝试使用软件)

下面是我给他们起的名字。现在修改完名字之后,导出成MainWindow.ui文件打开anaconda的shell现在就产生了MainWindow.py,打开它 打开pycharm,创建一个新的名为askForLeave的project,把MainWindow.py移进来。 创建Leave.py作为主程序(起名废) 现在给MainWindow.py配置环境写…
编程学习 ·

剑指Offer 10-| 学习笔记

剑指Offer 10-| 学习笔记 写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项。斐波那契数列的定义如下: F(0) = 0, F(1) = 1 F(N) = F(N - 1) + F(N - 2), 其中 N > 1. 斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前的两数相加而得出。 答案需要取模…
编程学习 ·

vue前端代码优化-1

也许有人会感觉CR没有什么卵用,只要我代码实现了功能,我完成了开发任务,我就OK了,为啥还要CR??但是CR真的是有必要的,你不仅可以发现自己代码中的不足之处,待优化点,简洁明了的代码易读别人接手也会很快。1. 比如在vue项目中只有某一个组件用某一个特别长的常量对象,…
编程学习 ·

堪称零瑕疵!仅用了330页直接封神,我要吹爆这份RocketMQ笔记

RocketMQ天生为金融互联网领域而生,追求高可靠、高可用、高并发、低延迟 RocketMQ在阿里集团也被广泛应用在订单,交易,充值,流计算,消息推送,日志流式处理,binglog分发等场景 其主要功能有:灵活可扩展性、 海量消息堆积能力、 能够保证严格的消息顺序 提供丰富的消息拉…
编程学习 ·

java面试-JVM内存区域划分

JVM内存划分说到Java内存区域,刚开始接触java的人会下意识说出“堆栈”。这里要明确堆栈不是一个概念,而是两个概念,堆和栈是两块不同的内存区域,简单理解的话,堆是用来存放对象而栈是用来执行程序的。其次,堆内存和栈内存的这种划分方式比较粗糙,这种划分方式只能说明大…
编程学习 ·

MyBatis中#{}和${}的区别详解 区别

区别1.#将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。如:order by #user_id#,如果传入的值是111,那么解析成sql时的值为order by "111", 如果传入的值是id,则解析成的sql为order by "id".2.将传入的数据直接显示生成在sql中。如:or…
编程学习 ·

Autosar4.4:通用架构模板 - 元建模模式与模型转换(2/3)

元模型化模式是参数化的结构,当将其应用于实际参数时,会产生规则的,非参数化的结构。 结构只是由关联和聚合关联的元类的集合。 模式的好处在于,它们允许重复使用重复结构,而无需重复其定义。 本章介绍元建模模式的概念,以及它们在AUTOSAR元模型中的使用和表示法。 另一个…
编程学习 ·

FRM考场的这些注意事项,估计你还不知道!

1、FRM一二级考试时,会提前15分钟关闭考场,请考生务必提前到达考场。 2、FRM准考证一定要是纸质的,其他类型将不受认可。打印需保持纸张整洁。 3、FRM发放试卷期间注意聆听监考老师讲述的FRM考试规则。提前看卷和答卷视为违规。 4、FRM考试最后半小时不允许出入考场,任何出…
编程学习 ·

requests实现token鉴权-学习笔记总结

import requests# 第一步 登录 获取token值 login_url = "http://api.lemonban.com/futureloan/member/login" # 登录地址 login_data = {"mobile_phone":"18311783673","pwd":"1234567890"} # 登录数据 hea…