长春市住房建设局网站,清润邯郸网站,广州做网站做得比较好,品牌建设过程中的正确名利观文章目录一、xml文件1.1 什么是 XML#xff1f;1.2XML 和 HTML 之间的差异1.3XML 不会做任何事情1.4通过 XML 您可以发明自己的标签1.5XML 不是对 HTML 的替代1.6XML 无所不在二、json文件基本的JSON结构体类型#xff08;共享部分#xff09;三、转COCO数据集3.1 info3.2 l…
文章目录一、xml文件1.1 什么是 XML1.2XML 和 HTML 之间的差异1.3XML 不会做任何事情1.4通过 XML 您可以发明自己的标签1.5XML 不是对 HTML 的替代1.6XML 无所不在二、json文件基本的JSON结构体类型共享部分三、转COCO数据集3.1 info3.2 licenses3.3 Image3.4 categories3.5 annotations四、组装coco4.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
note
toTove/to
fromJani/from
headingReminder/heading
bodyDont forget me this weekend!/body
/note上面的这条便签具有自我描述性。它包含了发送者和接受者的信息同时拥有标题以及消息主体。
但是这个 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 TurkAMT。
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, # dictlicenses: [license], # list 内部是dictimages: [image], # list 内部是dictannotations: [annotation], # list 内部是dictcategories: # 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集合
cocodict()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]info3.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 license3.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_info3.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 cat3.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坐标值第三个元素是个标志位vv为0时表示这个关键点没有标注这种情况下xyv0v为1时表示这个关键点标注了但是不可见被遮挡了v为2时表示这个关键点标注了同时也可见。
num_keypoints表示这个目标上被标注的关键点的数量v0比较小的目标上可能就无法标注关键点。
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,
}此次需要的数据如下
bboxkeypoints
四、组装coco
前面定义了coco集合加入了info现在组装其他数据主要有
licenseimageannotation
4.1定义大项集合
coco[images] []
coco[annotations] []
coco[categories] []
coco[licenses] []4.2 遍历组装
info前面已经组装了现在组装其他部分
imagescategorieslicensesannotations 目标检测关键点
# 遍历组装
ii0for i in json_data.keys():image_tempdict()# 1.coco[images]信息组装# 获取图片信息# print(i, ii)image_info_some image_info(image_namei, image_idii)# 添加到 coco[images] 数组coco[images].append(image_info_some)# 2.coco[images]信息组装# 类别信息获取cat_infogenerate_categories(image_idii)# 添加到 coco[categories] 数组coco[categories].append(cat_info)# 3.coco[licenses] 信息组装# 版权信息获取lic_infogenerate_license(image_idii)# 添加到 coco[licenses] 数组coco[licenses].append(lic_info)# 4.coco[annotations] 信息组装# 标注信息集合定义 annotation_tempdict()# 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坐标值第三个元素是个标志位vv为0时表示这个关键点没有标注这种情况下xyv0v为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)iiii1五、保存标注文件
import jsonff open(table_keypoints_val2017.json, w)
ff.write(json.dumps(coco, ensure_asciiFalse ) \n)
ff.close()参考文章表格关键点检测之COCO数据集转换
为什么JSON比XML更受欢迎
JSON和XML完全是两种不同的数据格式。都是在Web中用于数据交换目的。与XML相比放置java脚本或JSON Object Notation是一种更轻量级的数据交换格式。而且XML使用了大量的开始和结束标记而JSON只使用{}表示对象[]表示数组这使得它更加轻量级。有利于快速传输和处理JSON的对象和数组的表示使得映射更直接容易