COCO数据集是目标检测和实例分割领域的经典数据集,从事相关领域自然免不了与其打交道。网上对于COCO数据集的介绍已经很多,这里不再赘述。本部分主要从标签的角度探究一下COCO数据集的检测部分,由于内容较多,我将其整理为一个专题,分为三个部分,分别是:
深入探究COCO数据集(一)——COCO标签格式
深入探究COCO数据集(二)——制作COCO style的数据集
深入探究COCO数据集(三)——加载数据集
本节是专题的第一部分,主要分析讲解一下COCO数据集的标签格式。
COCO标签格式
COCO标签以json文件的形式存储,整个标签文件可以视为一个字典,其中有5个键值对,键(key)分别是info
、licenses
、categories
、images
和annotations
。
1 | annotation |
info
提供数据集的一些信息,如contributor
、description
等。
licenses
提供数据集使用的许可证。
info
和licenses
并不提供数据集标签的重要信息。在val2017
中这两项的值为(licenses
仅列出部分):
1 | # info |
categories
是一个列表,提供数据集每一个类的类别信息。每一类用列表中的一个字典表示,字典键值对有唯一类别索引id
,类别名称name
和类别父类supercategory
。
1 | "categories": [ |
images
是一个列表,提供数据集中全部图像的信息,列表中每一项是一个字典,代表一张图像信息。字典中比较重要的键是图像文件名file_name
、图像高度height
、图像宽度width
以及唯一图像索引id
。
1 | "images": [ |
annotations
也是一个列表,提供数据集中图像对应的标签信息,列表中每一项是一个字典,对应于一个标签。字典中的键分别为:
segmentation
:每个实例的轮廓顶点,值是二维列表,这主要是考虑到物体存在被截断的情况。其形式为\([[x^1_1, y^1_1, x^1_2, y^1_2, ... x^1_m, y^1_m], ..., [x^k_1, y^k_1, x^k_2, y^k_2, ... x^k_n, y^k_n]]\),这表示该实例由k
个截断的区域构成,每个区域的轮廓顶点表示为一个一维列表。此外,x
表示宽度方向,y
表示高度方向。area
:实例轮廓包围区域的面积bbox
:实例对应的最小边界矩形框,是一个以xywh
形式存储的列表,四个值分别表示边界框左上角坐标、宽度和高度image_id
:该标签对应的图像索引号,该索引对应于images
项中的id
category_id
:该标签对应的类别索引号,该索引号对应于categories
项中的id
id
:唯一标注索引iscrowd
:是否密集标注
1 | "annotations": [ |
id,id,id......
在COCO标签中,categories
项、images
项和annotations
项中都有名为id
的键,此外还有image_id
和category_id
,初看很容易搞混。然而区分这几个id
的不同对于理解COCO标签非常必要,上边其实已经说过了,这里再放在一起集中说一下。
首先,每一项中的id
都相当于“身份证”,是一个内容(类别、图像或标签)的唯一标识,给一个id
就能找到对应的内容。如在categories
中就是类别的唯一标识、在images
中就是图像的唯一索引、在annotations
中就是标签的唯一索引。
其次,image_id
和category_id
仅在annotations
中出现,image_id
标识出这个标签是哪张图像的标签,category_id
则标识出这个标签对应于哪个类别。