深度学习数据集处理基础内容——xml和json文件详解
创始人
2025-05-28 10:19:41
0

文章目录

  • 一、xml文件
      • 1.1 什么是 XML?
      • 1.2XML 和 HTML 之间的差异
      • 1.3XML 不会做任何事情
      • 1.4通过 XML 您可以发明自己的标签
      • 1.5XML 不是对 HTML 的替代
      • 1.6XML 无所不在
  • 二、json文件
      • 基本的JSON结构体类型(共享部分)
  • 三、转COCO数据集
      • 3.1 info
      • 3.2 licenses
      • 3.3 Image
      • 3.4 categories
      • 3.5 annotations
  • 四、组装coco
      • 4.1定义大项集合
      • 4.2 遍历组装
  • 五、保存标注文件
  • 为什么JSON比XML更受欢迎

一、xml文件

XML 被设计用来传输和存储数据。

HTML 被设计用来显示数据。

XML 指可扩展标记语言(eXtensible Markup Language)。

可扩展标记语言(英语:Extensible Markup Language,简称:XML)是一种标记语言,是从标准通用标记语言(SGML)中简化修改出来的。它主要用到的有可扩展标记语言、可扩展样式语言(XSL)、XBRL和XPath等。

在这里插入图片描述

1.1 什么是 XML?

  • XML 指可扩展标记语言(EXtensible Markup Language)。
  • XML 是一种很像HTML的标记语言。
  • XML 的设计宗旨是传输数据,而不是显示数据。
  • XML 标签没有被预定义。您需要自行定义标签。
  • XML 被设计为具有自我描述性。
  • XML 是 W3C 的推荐标准。

1.2XML 和 HTML 之间的差异

XML 不是 HTML 的替代。

XML 和 HTML 为不同的目的而设计:

  • XML 被设计用来传输和存储数据,其焦点是数据的内容。
  • HTML 被设计用来显示数据,其焦点是数据的外观。

HTML 旨在显示信息,而 XML 旨在传输信息。

1.3XML 不会做任何事情

也许这有点难以理解,但是 XML 不会做任何事情。XML 被设计用来结构化、存储以及传输信息。

下面实例是 Jani 写给 Tove 的便签,存储为 XML:


Tove
Jani
Reminder
Don't forget me this weekend!

上面的这条便签具有自我描述性。它包含了发送者和接受者的信息,同时拥有标题以及消息主体。

但是,这个 XML 文档仍然没有做任何事情。它仅仅是包装在 XML 标签中的纯粹的信息。我们需要编写软件或者程序,才能传送、接收和显示出这个文档。

1.4通过 XML 您可以发明自己的标签

上面实例中的标签没有在任何 XML 标准中定义过(比如 和 )。这些标签是由 XML 文档的创作者发明的。

这是因为 XML 语言没有预定义的标签。

HTML 中使用的标签都是预定义的。HTML 文档只能使用在 HTML 标准中定义过的标签(如< p > 、 < h1 >等等)。

XML 允许创作者定义自己的标签和自己的文档结构。

1.5XML 不是对 HTML 的替代

XML 是对 HTML 的补充。

XML 不会替代 HTML,理解这一点很重要。在大多数 Web 应用程序中,XML 用于传输数据,而 HTML 用于格式化并显示数据。

对 XML 最好的描述是:

XML 是独立于软件和硬件的信息传输工具。

1.6XML 无所不在

目前,XML 在 Web 中起到的作用不会亚于一直作为 Web 基石的 HTML。

XML 是各种应用程序之间进行数据传输的最常用的工具。

二、json文件

JSON是全称为JavaScript Object Notation,是一种有条理,易于访问的存储信息的方法。它为我们提供了一个可读的数据集合,我们可以通过合理的方式来访问这些数据。JSON文件可以存储简单的数据结构和对象。JSON文件在许多不同的编程API中都被支持。如今,JSON已被用于许多Web应用程序来进行数据交换,并且它们实际上不会在硬盘驱动器上保存“.JSON”文件,可以在互联网连接的计算机之间进行数据交换。某些应用程序允许用户将其保存在“.JSON”文件中

提到json,我们首先应该想到的是COCO格式的数据集。

COCO的 全称是Common Objects in COntext,是微软团队提供的一个可以用来进行图像识别的数据集。MS COCO数据集中的图像分为训练、验证和测试集。COCO通过在Flickr上搜索80个对象类别和各种场景类型来收集图像,其使用了亚马逊的Mechanical Turk(AMT)。

COCO通过大量使用Amazon Mechanical Turk来收集数据。COCO数据集现在有3种标注类型:object instances(目标实例), object keypoints(目标上的关键点), 和image captions(看图说话),使用JSON文件存储。

基本的JSON结构体类型(共享部分)

object instances(目标实例)、object keypoints(目标上的关键点)、image captions(看图说话)这3种类型共享这些基本类型:info、image、license。而annotation类型则呈现出了多态:

{"info": info, # dict"licenses": [license], # list ,内部是dict"images": [image], # list ,内部是dict"annotations": [annotation], # list ,内部是dict"categories": # list ,内部是dict
}info{ # 数据集信息描述"description": str, # 数据集描述"url": str, # 下载地址"version": str, # 版本"year": int, # 年份"contributor": str, # 提供者"date_created": str # 数据创建日期},license{"id": int,"name": str,"url": str,
} 
image{"id": int,# 图片的ID编号(每张图片ID是唯一的)"width": int,# 宽"height": int,# 高"file_name": str,# 图片名"license": int,"flickr_url": str,# flickr网路地址"coco_url": str,"date_captured": datetime,# 数据获取日期
}

三、转COCO数据集

# 定义coco集合
coco=dict()

3.1 info

info类型,比如一个info类型的实例

{"info": info,"licenses": [license],"images": [image],#数组元素的数量等同于划入训练集(或者测试集)的图片的数量;"annotations": [annotation],#数组元素的数量等同于训练集(或者测试集)中bounding box的数量;"categories": [category]
}
info={"description":"This is stable 1.0 version of the 2014 MS COCO dataset.","url":"http:\/\/mscoco.org","version":"1.0","year":2014,"contributor":"Microsoft COCO group","date_created":"2022-12-26"
}
# 定义coco的info部分,并加入coco集合info={"description":"This is stable 1.0 version of the 2014 MS COCO dataset.","url":"http:\/\/mscoco.org","version":"1.0","year":2014,"contributor":"Microsoft COCO group","date_created":"2022-12-26"
}
coco['info']=info

3.2 licenses

licenses是包含多个license实例的数组,对于一个license类型的实例

license{"id": int,"name": str,"url": str,
} 

例如

licenses={"url":"http:\/\/creativecommons.org\/licenses\/by-nc-sa\/2.0\/","id":1,"name":"Attribution-NonCommercial-ShareAlike License"
}
  • license跟图像 id 有关,定义函数如下:
def generate_license(image_id):license = {"url": "http:\/\/goingtodo.cn\/licenses\/","id": image_id,"name": "nothing just awsome License"}return license

3.3 Image

Images是包含多个image实例的数组,对于一个image类型的实例:

image{"id": int,# 图片的ID编号(每张图片ID是唯一的)"width": int,# 宽"height": int,# 高"file_name": str,# 图片名"license": int,"flickr_url": str,# flickr网路地址"coco_url": str,"date_captured": datetime,# 数据获取日期
}
  • Image跟图像 id 以及图片尺寸有关,定义函数如下:
import cv2def image_info(image_name, image_id):# img = cv2.imread(image_name)# 加入相对路径img = cv2.imread(os.path.join('data/train/imgs', image_name))image_info = {"id": image_id,  # 图片的ID编号(每张图片ID是唯一的)"width": img.shape[1],  # 宽"height": img.shape[0],  # 高"file_name": image_name,  # 图片名"license": "awsome license","flickr_url": "no url",  # flickr网路地址"coco_url": "no url","date_captured": "2022-12-26"  # 数据获取日期}return image_info

3.4 categories

categories是一个包含多个category实例的数组,而category结构体描述如下:

"categories":{ # 类别描述"id": int,# 类对应的id (0 默认为背景)"name": str, # 子类别"supercategory": str,# 主类别
}

从instances_val2017.json文件中摘出的2个category实例如下所示:

{"supercategory": "person","id": 1,"name": "person"
},
{"supercategory": "vehicle","id": 2,"name": "bicycle"
}
  • categories跟图像id有关

def generate_categories(image_id):cat = {"supercategory": "table","id": image_id,"name": "table","keypoints": ['lb', 'lt' , 'rt' , 'rb'],"skeleton":  [[1,2],[2,3],[3,4],[4,1]]}return cat

3.5 annotations

annotation{"id": int,     # int 图片中每个被标记物体的id编号"image_id": int, # int 该物体所在图片的编号"category_id": int,# int 被标记物体的类别id编号"segmentation": RLE or [polygon],#分割区域的坐标,对象的边界点(边界多边形)"area": float,# float 被检测物体的面积"bbox": [x,y,width,height],# 目标检测框的坐标信息"iscrowd": 0 or 1,# 0 or 1 目标是否被遮盖,默认为0
}

这个类型中的annotation结构体包含了Object Instance中annotation结构体的所有字段,再加上2个额外的字段。

新增的keypoints是一个长度为3*k的数组,其中k是category中keypoints的总数量。每一个keypoint是一个长度为3的数组,第一和第二个元素分别是x和y坐标值,第三个元素是个标志位v,v为0时表示这个关键点没有标注(这种情况下x=y=v=0),v为1时表示这个关键点标注了但是不可见(被遮挡了),v为2时表示这个关键点标注了同时也可见。

num_keypoints表示这个目标上被标注的关键点的数量(v>0),比较小的目标上可能就无法标注关键点。

annotation{"keypoints": [x1,y1,v1,...],"num_keypoints": int,"id": int,"image_id": int,"category_id": int,"segmentation": RLE or [polygon],"area": float,"bbox": [x,y,width,height],"iscrowd": 0 or 1,
}

此次需要的数据如下:

  • bbox
  • keypoints

四、组装coco

前面定义了coco集合,加入了info,现在组装其他数据,主要有:

  • license
  • image
  • annotation

4.1定义大项集合

coco['images'] = []
coco['annotations'] = []
coco['categories'] = []
coco['licenses'] = []

4.2 遍历组装

info前面已经组装了,现在组装其他部分:

  • images
  • categories
  • licenses
  • annotations
    • 目标检测
    • 关键点
# 遍历组装
ii=0for i in json_data.keys():image_temp=dict()# 1.coco['images']信息组装# 获取图片信息# print(i, ii)image_info_some = image_info(image_name=i, image_id=ii)# 添加到 coco['images'] 数组coco['images'].append(image_info_some)# 2.coco['images']信息组装# 类别信息获取cat_info=generate_categories(image_id=ii)# 添加到 coco['categories'] 数组coco['categories'].append(cat_info)# 3.coco['licenses'] 信息组装# 版权信息获取lic_info=generate_license(image_id=ii)# 添加到 coco['licenses'] 数组coco['licenses'].append(lic_info)# 4.coco['annotations'] 信息组装# 标注信息集合定义    annotation_temp=dict()# 4.1 annotations公共部分信息# 标注id信息annotation_temp['id']=ii# 图像idannotation_temp['image_id']=ii# 关键点个数 4个,上下左右 annotation_temp['num_keypoints']=4# 0好像是背景annotation_temp['category_id']=1image_anno= json_data[i][0]# 4.2 annotations目标检测部分# bbox,目标检测框的坐标信息,一张图只有一个表格,所以就这样了。# print(image_anno)# [{'box': [987, 2135, 2343, 2550], 'lb': [987, 2542], 'lt': [1029, 2135], 'rt': [2264, 2139], 'rb': [2343, 2550]}]annotation_temp['bbox']=image_anno['box']# 0 or 1 目标是否被遮盖,默认为0annotation_temp['iscrowd']=0# 被标记物体的类别id编号# 4.3 annotations关键点部分部分# 新增的keypoints是一个长度为3*k的数组,其中k是category中keypoints的总数量。# 每一个keypoint是一个长度为3的数组,第一和第二个元素分别是x和y坐标值,第三个元素是个标志位v,v为0时表示这个关键点没有标注(这种情况下x=y=v=0),v为1时表示这个关键点标注了但是不可见(被遮挡了),v为2时表示这个关键点标注了同时也可见。keypoints=[image_anno['lb'][0],image_anno['lb'][1],2, image_anno['lt'][0],image_anno['lt'][1],2,image_anno['rt'][0],image_anno['rt'][1],2,image_anno['rb'][0],image_anno['rb'][1],2]# 加入annotation标注集合annotation_temp['keypoints']=keypointscoco['annotations'].append(annotation_temp)ii=ii+1

五、保存标注文件

import jsonff = open('table_keypoints_val2017.json', 'w')
ff.write(json.dumps(coco, ensure_ascii=False ) + '\n')
ff.close()

参考文章表格关键点检测之COCO数据集转换

为什么JSON比XML更受欢迎

JSON和XML完全是两种不同的数据格式。都是在Web中用于数据交换目的。与XML相比,放置java脚本或JSON Object Notation是一种更轻量级的数据交换格式。而且XML使用了大量的开始和结束标记,而JSON只使用{}表示对象,[]表示数组,这使得它更加轻量级。有利于快速传输和处理,JSON的对象和数组的表示使得映射更直接容易

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
美团联名卡审核成功待激活(美团... 今天百科达人给各位分享美团联名卡审核成功待激活的知识,其中也会对美团联名卡审核未通过进行解释,如果能...
一帆风顺二龙腾飞三阳开泰祝福语... 本篇文章极速百科给大家谈谈一帆风顺二龙腾飞三阳开泰祝福语,以及一帆风顺二龙腾飞三阳开泰祝福语结婚对应...