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项中的idcategory_id:该标签对应的类别索引号,该索引号对应于categories项中的idid:唯一标注索引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则标识出这个标签对应于哪个类别。