针对交通灯数据集,因为其包含其它标签,而我这里只需要标签为traffic light的

一共是70000个jason文件

对应的路径文件应该这样,每个人存放的位置不一致,所以自行设置就行

文件结构如图所示

文件代码

bdd2voc.py

# -*- coding: utf8 -*-
import os
import pascal_voc_io
import parseJsondef main(srcDir, dstDir):i = 1# os.walk()# dirName是你所要遍历的目录的地址, 返回的是一个三元组(root,dirs,files)# root所指的是当前正在遍历的这个文件夹的本身的地址# dirs是一个 list ,内容是该文件夹中所有的目录的名字(不包括子目录)# files 同样是 list , 内容是该文件夹中所有的文件(不包括子目录)for dirpath, dirnames, filenames in os.walk(srcDir):
#        print(dirpath, dirnames, filenames)for filepath in filenames:fileName = os.path.join(dirpath,filepath)print(fileName)print("processing: {}, {}".format(i, fileName))i = i + 1xmlFileName = filepath[:-5] # remove ".json" 5 character# 解析该json文件,返回一个列表的列表,存储了一个json文件里面的所有方框坐标及其所属的类objs = parseJson.parseJson(str(fileName))# 如果存在检测对象,创建一个与该json文件具有相同名的VOC格式的xml文件if len(objs):tmp = pascal_voc_io.PascalVocWriter(dstDir, xmlFileName, (720,1280,3), fileName)for obj in objs:tmp.addBndBox(obj[0],obj[1],obj[2],obj[3],obj[4])tmp.save()else:print(fileName)if __name__ == '__main__':# test# these paths should be your own path
#    srcDir = '/media/xavier/SSD256/global_datasets/BDD00K/bdd100k/labels/100k/val'
#    dstDir = '/media/xavier/SSD256/global_datasets/BDD00K/bdd100k/Annotations/val'srcDir = 'D:/pythonProject/bdd100ktoxml-master/bdd100k/labels/100k/train'dstDir = 'D:/pythonProject/bdd100ktoxml-master/bdd100k/Annotations/train'main(srcDir, dstDir)
globalvar.py
#!/usr/bin/python
# -*- coding: utf-8 -*-def _init():global _global_dict_global_dict = {}def set_value(name, value):_global_dict[name] = valuedef get_value(name, defValue=None):try:return _global_dict[name]except KeyError:return defValue
parseJson.py
#!/usr/bin/env python
# -*- coding: utf8 -*-
#parse json,input json filename,output info needed by vocimport json
#这里是我需要的10个类别
categorys = [ 'traffic light']def parseJson(jsonFile):'''params:jsonFile -- BDD00K数据集的一个json标签文件return:返回一个列表的列表,存储了一个json文件里面的方框坐标及其所属的类,形如:[[325, 342, 376, 384, 'car'], [245, 333, 336, 389, 'car']]'''objs = []obj = []f = open(jsonFile)info = json.load(f)objects = info['frames'][0]['objects']for i in objects:if(i['category'] in categorys):obj.append(int(i['box2d']['x1']))obj.append(int(i['box2d']['y1']))obj.append(int(i['box2d']['x2']))obj.append(int(i['box2d']['y2']))obj.append(i['category'])objs.append(obj)obj = []#print("objs",objs)return objs#test
#result = parseJson("/media/xavier/SSD256/global_datasets/BDD00K/bdd100k/labels/100k/val/b1c9c847-3bda4659.json")
#print(len(result))
#print(result)
pascal_voc_ipyyi
#!/usr/bin/env python
# -*- coding: utf8 -*-
import sys
import os
from xml.etree import ElementTree
from xml.etree.ElementTree import Element, SubElement
from lxml import etree
from xml.dom.minidom import parseStringclass PascalVocWriter:def __init__(self, foldername, filename, imgSize, databaseSrc='Unknown', localImgPath=None):'''params:foldername -- 要存储的xml文件的父目录filename -- xml文件的文件名imgSize -- 图片的尺寸databaseSrc -- 数据库名,这里不需要,默认为UnknownlocalImaPath -- xml文件里面的<path></path>标签的内容'''self.foldername = foldernameself.filename = filenameself.databaseSrc = databaseSrcself.imgSize = imgSizeself.boxlist = []self.localImgPath = localImgPathdef prettify(self, elem):"""params:elem -- xml的根标签,以<annotation>开始return:返回一个美观输出的xml(用到minidom),本质是一个str"""xml = ElementTree.tostring(elem)dom = parseString(xml)#        print(dom.toprettyxml('  '))prettifyResult = dom.toprettyxml('    ')return prettifyResultdef genXML(self):"""return:生成一个VOC格式的xml,返回一个xml的根标签,以<annotation>开始"""# Check conditionsif self.filename is None or \self.foldername is None or \self.imgSize is None or \len(self.boxlist) <= 0:return Nonetop = Element('annotation')  # 创建一个根标签<annotation>folder = SubElement(top, 'folder')  # 在根标签<annotation>下创建一个子标签<folder>folder.text = self.foldername  # 用self.foldername的数据填充子标签<folder>filename = SubElement(top, 'filename')  # 在根标签<annotation>下创建一个子标签<filename>filename.text = self.filename  # 用self.filename的数据填充子标签<filename>localImgPath = SubElement(top, 'path')  # 在根标签<annotation>下创建一个子标签<path>localImgPath.text = self.localImgPath  # 用self.localImgPath的数据填充子标签<path>source = SubElement(top, 'source')  # 在根标签<annotation>下创建一个子标签<source>database = SubElement(source, 'database')  # 在根标签<source>下创建一个子标签<database>database.text = self.databaseSrc  # 用self.databaseSrc的数据填充子标签<database>size_part = SubElement(top, 'size')  # 在根标签<annotation>下创建一个子标签<size>width = SubElement(size_part, 'width')  # 在根标签<size>下创建一个子标签<width>height = SubElement(size_part, 'height')  # 在根标签<size>下创建一个子标签<height>depth = SubElement(size_part, 'depth')  # 在根标签<size>下创建一个子标签<depth>width.text = str(self.imgSize[1])  # 用self.imgSize[1]的数据填充子标签<width>height.text = str(self.imgSize[0])  # 用self.imgSize[0]的数据填充子标签<height>if len(self.imgSize) == 3:  # 如果图片深度为3,则用self.imgSize[2]的数据填充子标签<height>,否则用1填充depth.text = str(self.imgSize[2])else:depth.text = '1'segmented = SubElement(top, 'segmented')segmented.text = '0'return topdef addBndBox(self, xmin, ymin, xmax, ymax, name):'''将检测对象框坐标及其对象类别作为一个字典加入到self.boxlist中params:xmin -- 检测框的左上角的x坐标ymin -- 检测框的左上角的y坐标xmax -- 检测框的右下角的x坐标ymax -- 检测框的右下角的y坐标name -- 检测框内的对象类别名'''bndbox = {'xmin': xmin, 'ymin': ymin, 'xmax': xmax, 'ymax': ymax}bndbox['name'] = nameself.boxlist.append(bndbox)def appendObjects(self, top):'''在xml文件中加入检测框的坐标及其对象类别名params:top -- xml的根标签,以<annotation>开始'''for each_object in self.boxlist:object_item = SubElement(top, 'object')name = SubElement(object_item, 'name')name.text = str(each_object['name'])pose = SubElement(object_item, 'pose')pose.text = "Unspecified"truncated = SubElement(object_item, 'truncated')truncated.text = "0"difficult = SubElement(object_item, 'Difficult')difficult.text = "0"bndbox = SubElement(object_item, 'bndbox')xmin = SubElement(bndbox, 'xmin')xmin.text = str(each_object['xmin'])ymin = SubElement(bndbox, 'ymin')ymin.text = str(each_object['ymin'])xmax = SubElement(bndbox, 'xmax')xmax.text = str(each_object['xmax'])ymax = SubElement(bndbox, 'ymax')ymax.text = str(each_object['ymax'])def save(self, targetFile=None):'''以美观输出的xml格式来保存xml文件params:targetFile -- 存储的xml文件名,不包括.xml部分'''root = self.genXML()self.appendObjects(root)out_file = Nonesubdir = self.foldername.split('/')[-1]if not os.path.isdir(subdir):os.mkdir(subdir)if targetFile is None:with open(self.foldername + '/' + self.filename + '.xml', 'w') as out_file:prettifyResult = self.prettify(root)out_file.write(prettifyResult)out_file.close()else:with open(targetFile, 'w') as out_file:prettifyResult = self.prettify(root)out_file.write(prettifyResult)out_file.close()class PascalVocReader:def __init__(self, filepath):# shapes type:# [labbel, [(x1,y1), (x2,y2), (x3,y3), (x4,y4)], color, color]self.shapes = []self.filepath = filepathself.parseXML()def getShapes(self):return self.shapesdef addShape(self, label, bndbox):xmin = int(bndbox.find('xmin').text)ymin = int(bndbox.find('ymin').text)xmax = int(bndbox.find('xmax').text)ymax = int(bndbox.find('ymax').text)points = [(xmin, ymin), (xmax, ymin), (xmax, ymax), (xmin, ymax)]self.shapes.append((label, points, None, None))def parseXML(self):assert self.filepath.endswith('.xml'), "Unsupport file format"parser = etree.XMLParser(encoding='utf-8')xmltree = ElementTree.parse(self.filepath, parser=parser).getroot()filename = xmltree.find('filename').textfor object_iter in xmltree.findall('object'):bndbox = object_iter.find("bndbox")label = object_iter.find('name').textself.addShape(label, bndbox)return True# tempParseReader = PascalVocReader('test.xml')
# print tempParseReader.getShapes()
# """
# Test
# tmp = PascalVocWriter('temp','test', (10,20,3))
# tmp.addBndBox(10,10,20,30,'chair')
# tmp.addBndBox(1,1,600,600,'car')
# tmp.save()
# """

以上代码绝对能跑通,容易出错的地方就是在建立路径的时候容易出错,我之前把Annotations文件夹建立在了D:/pythonProject/bdd100ktoxml-master/bdd100k/labels/100k/train这个文件夹下面,所以一直报错,。

BDD100K数据集的Jason文件转xml文件相关推荐

  1. 比赛中学习(2)-voc数据集制作中将.txt文件变为.xml文件

    描述 和voc数据集制作有一点不同的是,因为参加的比赛中坐标给了4个,也就是说目标的形状可能是是平行四边形.所以和voc数据集有点不同啊.放出一张.txt文件的形式 最后的结果大致是这样的(和上面的图 ...

  2. GDCM:将DICOM文件和XML文件相互转换的测试程序

    GDCM:将DICOM文件和XML文件相互转换 GDCM:将DICOM文件和XML文件相互转换 GDCM:将DICOM文件和XML文件相互转换 #include "gdcmFilename. ...

  3. java文件和xml文件_用Java分割大型XML文件

    java文件和xml文件 上周,我被要求用Java编写一些东西,该东西能够将一个30GB的XML文件拆分为可配置文件大小的较小部分. 文件的使用者将是一个中间件应用程序,该应用程序在XML的大尺寸方面 ...

  4. (C++)将数据库文件导出XML文件以及解析XML文件生成数据库文件的处理方法

    将数据库文件导出XML文件以及解析XML文件生成数据库文件的处理方法 思路:将数据库所有要导出的信息通过sql语句得到,存储到结构体中,然后将结构体的内容通过自定义的xml格式导出. 此方法使用的是T ...

  5. sumo路由文件(.rou.xml文件)的生成以及关于生成交通流的一些方法

    1. 首先准备好一个构建的路网(.net.xml)文件 这里我所利用的一个路网构造如下: 2. 路由文件(.rou.xml)文件 可以在netedit里边对路网个各个道路边缘id长度以及相关参数进行配 ...

  6. 安卓开发的java文件与xml文件

    安卓开发新建Activity时创建的java文件和xml文件 作用: Android布局以xml形式写在res/layout文件夹中,这样不光可以将将前台界面与业务逻辑区分开,让代码更加清晰,将这些控 ...

  7. python实现tsinghua-tencent 100000数据集的json文件转为xml文件

    算法解决问题: 1,从json文件中抽取数据集中的小目标pne.p11.i5.w57四种交通标志数据集 2.小目标判断标注像素范围在[32,32] 3.转为对应的xml文件 4.标出选出的类别的个数 ...

  8. 【数据集处理】Python根据xml文件在图片上标注目标

    有时候想判断自己数据集标注的是否准确,那么可以根据xml文件中的坐标和图片信息,在图片上把目标框出来,另存到另一个文件夹中.由于数据集一般是很多图片,所以我选择了批量处理的方式进行标注. # -*- ...

  9. (训练三)王朗自然保护区---数据集部分补充说明:计算xml文件里面目标数量   生成训练和测试的txt文件

    1 计算xml文件里面目标数量 # -*- coding:utf-8 -*- import os import xml.etree.ElementTree as ET import numpy as ...

最新文章

  1. TCP/IP四层模型和OSI七层模型
  2. 报名 | 2019年第六届清华大学大数据社会科学讲习班
  3. 什么是微分?什么是导数?如何利用微分-导数方程求导数?
  4. PyQt5 图形界面 - 配置界面跟随窗口大小调整灵活伸缩,设置页面控件居中显示实例演示
  5. ajax异步日历,用AJAX自定义日历(示例代码)
  6. 光模块的分类与HBA卡的区别
  7. 数据库班级字段怎么定义名称_班级名称
  8. 小学数学动画 android,小学数学动画教学下载-小学数学动画 安卓版v5.0-pc6手机下载...
  9. c语言运行后出现xt073,2017年北京工业大学城市交通学院894C语言与数据结构之C程序设计考研强化模拟题...
  10. 成功就是成为最好的你自己
  11. MySQL—一个单引号引发的MYSQL性能损失
  12. 使用PDFObject添加将本地磁盘pdf文件在前端页面展示
  13. Win2019 ServerManager.exe 0xc0000135 应用程序错误
  14. 动词ing形式的5种用法_动词ing形式的用法及变化规则
  15. 第十二周项目一----图基本算法库
  16. Linux下minicom配置
  17. maven打包时本地的jar包打不进去
  18. 数据结构 散列表 除留余数法 线性探测法解决冲突
  19. 深圳python多少钱信息_用Python分析深圳在售二手房数据,看看买房需要多少预算...
  20. 老王课程学习,第八课

热门文章

  1. python接口测试断言返回值json格式和数据类型
  2. 大佬手把手教你如何仿写出大厂的APP,原理+实战+视频+源码
  3. 中国著名电子商务网站网址名单大全
  4. 计算机控制实验总结电机调速,实验八-电机调速实验.docx
  5. 整理后的IMF国际收支统计年鉴数据(2012-2018年)
  6. Windows 已在tong.exe 中触发一个断点。
  7. 分省固定资产投资数据(2004-2019年)
  8. BS酒店管理系统的设计与实现论文+任务书+中期检查+设计源码+答辩PPT
  9. android mysql储存动态数据_Android中数据的保存
  10. C语言判断是否为闰年的代码