之前对阿里比赛的一个数据集格式进行转换,数据集是瓶装白酒瑕疵品检测,数据集瓶装酒的瑕疵分为3个大类:瓶盖瑕疵、标贴瑕疵、喷码瑕疵,以下列举部分瑕疵示例图像。

图像都存放在images文件夹,图像后缀为.jpg。标注文件为annotations.json。标注采用类似MSCOCO数据集的标注格式(http://cocodataset.org),数据结构如下:

{
"images":
[
{"file_name":"cat.jpg", "id":1, "height":1000, "width":1000},
{"file_name":"dog.jpg", "id":2, "height":1000, "width":1000},

]
"annotations":
[
{"image_id":1, "bbox":[100.00, 200.00, 10.00, 10.00], "category_id": 1}
{"image_id":2, "bbox":[150.00, 250.00, 20.00, 20.00], "category_id": 2}

]
"categories":
[
{"id":0, "name":"bg"}
{"id":1, "name":"cat"}
{"id":2, "name":"dog"}

]
}

标注文件中,"images" 关键字对应图片信息;

"annotations" 关键字对应标注信息;

"categories" 对应类别信息:

"images": 该关键字对应的数据中,每一项对应一张图片,"file_name"对应图片名称,"id"对应图片序号,"height""width"分别对应图像的高和宽。

"annotations": 该关键字对应的数据中,每一项对应一条标注,"image_id"对应图片序号,"bbox"对应标注矩形框,顺序为[x, y, w, h],分别为该矩形框的起始点x坐标,起始点y坐标,宽、高(左上角坐标,宽高)。"category_id"对应类别序号。

"categories": 该关键字对应的数据中,每一项对应一个类别,"id"对应类别序号,"name"对应类别名称。

关键字关联说明:

  1. "annotations"中的元素通过"image_id"关联图像,比如"image_id":2,该条标注信息对应"images""id"为2的图像。
  2. "annotations"中的元素通过"category_id"关联类别,比如"category_id":2,该条标注信息对应"categories""id"为2的类别。

例: 在上面列出的数据结构中

{"image_id":1, "bbox":[100.00, 200.00, 10.00, 10.00], "category_id": 1}

这条标注信息通过"image_id"可以找到对应的图像为"cat.jpg",通过"category_id"可以找到对应的类别为"cat"

背景图片说明:

"annotations"中的元素,"category_id":0对应的是背景。当且仅当一张图片对应的所有annotations中,"category_id"都为0,该图片为背景图片。

代码如下:

# .txt-->.xml
# ! /usr/bin/python
# -*- coding:UTF-8 -*-
import os
import cv2
import jsondef json_to_xml(data, img_path, xml_path):# 1.字典对标签中的类别进行转换dict = {'0': "background",'1': "Broken bottle cap",'2': "Bottle cap deformation",'3': "Broken edge of bottle cap",'4': "Bottle cap spinning",'5': "Cap breakpoint",'6': "Label skew",'7': "Label wrinkled",'8': "Label bubble",'9': "Code spraying is normal",'10': "Code spraying is not normal"}# 用于存储 "老图"pre_img_name = ''# 3.遍历文件夹for id, name in data_dic.items():print(name)img_name = name[:-4]pic = cv2.imread(img_path + name)# 获取图像大小信息Pheight, Pwidth, Pdepth = pic.shapefor ann in data['annotations']:if id == ann['image_id']:# 遇到的是一张新图片if ann['image_id'] != pre_img_name:# 6.新建xml文件xml_file = open((xml_path + img_name + '.xml'), 'w')xml_file.write('<annotation>\n')xml_file.write('    <folder>VOC2007</folder>\n')xml_file.write('    <filename>' + name + '</filename>\n')xml_file.write('<source>\n')xml_file.write('<database>orgaquant</database>\n')xml_file.write('<annotation>organoids</annotation>\n')xml_file.write('</source>\n')xml_file.write('    <size>\n')xml_file.write('        <width>' + str(Pwidth) + '</width>\n')xml_file.write('        <height>' + str(Pheight) + '</height>\n')xml_file.write('        <depth>' + str(Pdepth) + '</depth>\n')xml_file.write('    </size>\n')xml_file.write('            <segmented>0</segmented>\n')xml_file.write('    <object>\n')xml_file.write('<name>' + dict[str(ann['category_id'])] + '</name>\n')xml_file.write('                    <pose>Unspecified</pose>\n')xml_file.write('                    <truncated>0</truncated>\n')xml_file.write('                    <difficult>0</difficult>\n')xml_file.write('        <bndbox>\n')xml_file.write('            <xmin>' + str(int(ann['bbox'][0])) + '</xmin>\n')xml_file.write('            <ymin>' + str(int(ann['bbox'][1])) + '</ymin>\n')xml_file.write('            <xmax>' + str(int(ann['bbox'][0] + ann['bbox'][2])) + '</xmax>\n')xml_file.write('            <ymax>' + str(int(ann['bbox'][1] + ann['bbox'][3])) + '</ymax>\n')xml_file.write('        </bndbox>\n')xml_file.write('    </object>\n')xml_file.close()pre_img_name = ann['image_id']  # 将其设为"老"图else:  # 不是新图而是"老图"# 7.同一张图片,只需要追加写入objectxml_file = open((xml_path + img_name + '.xml'), 'a')xml_file.write('    <object>\n')xml_file.write('<name>' + dict[str(ann['category_id'])] + '</name>\n')xml_file.write('        <bndbox>\n')xml_file.write('            <xmin>' + str(int(ann['bbox'][0])) + '</xmin>\n')xml_file.write('            <ymin>' + str(int(ann['bbox'][1])) + '</ymin>\n')xml_file.write('            <xmax>' + str(int(ann['bbox'][0]+ann['bbox'][2])) + '</xmax>\n')xml_file.write('            <ymax>' + str(int(ann['bbox'][1]+ann['bbox'][3])) + '</ymax>\n')xml_file.write('        </bndbox>\n')xml_file.write('    </object>\n')xml_file.close()# 8.读完txt文件最后写入</annotation>xml_file1 = open((xml_path + img_name + '.xml'), 'a')xml_file1.write('</annotation>')xml_file1.close()print("Done !")# 修改成自己的文件夹 注意文件夹最后要加上/
if __name__ == '__main__':f = open('annotations.json', encoding='utf-8')data = json.load(f)data_dic = {}# 把图片名和id对应起来存到字典中for img in data['images']:data_dic[img['id']] = img['file_name'].strip()json_to_xml(data,"images/", "XML/")

json文件转xml相关推荐

  1. python批量json文件转xml文件脚本(附代码)

    场景:在使用了mask rcnn跑实验后标注了大量地json格式文件,现在打算使用yolo和faster rcnn 跑实验 所以需要将之前地json文件转为xml     但是找了很久,没发现有批量处 ...

  2. php json 转 xml格式,PHP中如何将JSON文件转XML格式

    首先获取JSON文件中的字符:$content = file_get_contents('./data.json'); 然后使用函数"json_decode()"函数将字符串转为数 ...

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

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

  4. java导出json格式化的json文件及xml文件

    场景 点击ztree树的节点,导出该节点下的所有子节点数据(要求:导出过程不跳转页面) 前端: <div id="rolesGroupmenu" class="ea ...

  5. json文件转xml格式

    通过mmdection预测,将预测结果输出为json文件保存,具体是一张图片对应一个json文件.为了将这些json文件和原来的xml文件进行合并,所以先把得到结果转为xml格式的,然后将之前的xml ...

  6. 使用python将COCO格式的json文件转化为VOC格式的xml文件

    起因是得到一批标准的COCO数据集(json文件),自己后来又手动标了一批数据,但是标注出来的文件是VOC格式,现在想要把这些数据合并到一起,再转成标准的COCO数据集用于训练. 个人觉得json转x ...

  7. 关于 pandas 解析 json 文件和其他类型文件的结果中日期格式数据类型不一致的问题

    问题: 我有两个文件,一个 .csv 文件和一个 .json 文件,数据截图分别如下: 我的目的是解析这些文件,并将结果统一交由下一个程序块进行处理. 在了解到 pandas 可以解析数据文件(csv ...

  8. 【JSON文件解析】JSON文件

    文章目录 概要:本期主要介绍Qt解析JSON数据格式文件的方式. 一.JSON数据格式 1.JSON类似于XML,在JSON文件中,==有且只有一个根节点 2.JSON有两种主流包含型构造字符:{对象 ...

  9. SDL Trados 中翻译Json文件的处理和设置

    什么是JSON文件 JSON文件是用来存储简单的数据结构和对象的文件,可以在web应用程序中进行数据交换:JSON是全称为JavaScript Object Notation,是一种有条理,易于访问的 ...

最新文章

  1. 高定位精度的交通标志识别----开源了
  2. jQueryUI Repeater 无刷新删除 新建 更新数据 - JQueryElement [7]
  3. 阻碍职场发达的十种做法
  4. PHP中操作MySQL的一些要注意的问题
  5. php中的file_upload,PHP文件上传(PHP file upload)
  6. 如何从rpm包中提取文件
  7. linux打印JAVA日志命令_Linux下查看日志用到的常用命令
  8. python骰子游戏分析_python 用python写一个骰子游戏
  9. 一行Python代码统计词频
  10. php的require 失败,PHP在require_once上失败
  11. 报此错错解决办法:java.lang.NoSuchMethodError: javax.persistence.OneToMany.orphanRemoval()Z
  12. pjlib深入剖析和使用详解
  13. ✨Synchronized底层实现---概述
  14. css3位移过度效果,详解Css3新特性应用之过渡与动画
  15. python:rs, ws, es = select.select(inputs, [], []) --报错error 10022
  16. codeforces C. Ryouko's Memory Note
  17. jq方法中 $(window).load() 与 $(document).ready() 的区别
  18. 通达信自带指标 阶段放量(c112)
  19. vm15安装mac10.14提取ipa包
  20. 至高心法 - SpringCloud Alibaba (二)Nacos 服务注册与配置中心

热门文章

  1. 《图解机器学习》(杉山将.著)笔记——第一章 什么是机器学习
  2. vs2019 资源管理器 过滤显示文件
  3. springboot实现长链接转短链接
  4. 如何下载不同格式的卫星地图
  5. php图片一句话木马使用方法
  6. 记事本编写java文件并运行
  7. 用MATLAB实现plu分解,编制计算给定矩阵 A 的 LU 分解和 PLU 分解的通用程序
  8. redis的延迟双删策略总结
  9. 《傅雷家书》读后感之一
  10. C#在Win 7/8/10 OS下删除HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USB子项