深入探究COCO数据集(一)

COCO数据集是目标检测和实例分割领域的经典数据集,从事相关领域自然免不了与其打交道。网上对于COCO数据集的介绍已经很多,这里不再赘述。本部分主要从标签的角度探究一下COCO数据集的检测部分,由于内容较多,我将其整理为一个专题,分为三个部分,分别是:

深入探究COCO数据集(一)——COCO标签格式

深入探究COCO数据集(二)——制作COCO style的数据集

深入探究COCO数据集(三)——加载数据集

本节是专题的第一部分,主要分析讲解一下COCO数据集的标签格式。

COCO标签格式

COCO标签以json文件的形式存储,整个标签文件可以视为一个字典,其中有5个键值对,键(key)分别是infolicensescategoriesimagesannotations

1
2
3
4
5
6
annotation
├──info
├──licenses
├──categories
├──images
└──annotations

info提供数据集的一些信息,如contributordescription等。

licenses提供数据集使用的许可证。

infolicenses并不提供数据集标签的重要信息。在val2017中这两项的值为(licenses仅列出部分):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# info
"info": {
"description": "COCO 2017 Dataset",
"url": "http://cocodataset.org",
"version": "1.0",
"year": 2017,
"contributor": "COCO Consortium",
"date_created": "2017/09/01"
}
# licenses
"licenses": [
{
"url": "http://creativecommons.org/licenses/by-nc-sa/2.0/",
"id": 1,
"name": "Attribution-NonCommercial-ShareAlike License"
},
# ......
{
"url": "http://www.usa.gov/copyright.shtml",
"id": 8,
"name": "United States Government Work"
}
]

categories是一个列表,提供数据集每一个类的类别信息。每一类用列表中的一个字典表示,字典键值对有唯一类别索引id,类别名称name和类别父类supercategory

1
2
3
4
5
"categories": [
{"supercategory": "person", "id": 1, "name": "person"},
# ......
{"supercategory": "indoor", "id": 90, "name": "toothbrush"}
]

images是一个列表,提供数据集中全部图像的信息,列表中每一项是一个字典,代表一张图像信息。字典中比较重要的键是图像文件名file_name、图像高度height、图像宽度width以及唯一图像索引id

1
2
3
4
5
6
7
8
9
10
11
12
13
"images": [
{
"license": 4,
"file_name": "000000397133.jpg",
"coco_url": "http://images.cocodataset.org/val2017/000000397133.jpg",
"height": 427,
"width": 640,
"date_captured": "2013-11-14 17:02:52",
"flickr_url": "http://farm7.staticflickr.com/6116/6255196340_da26cf2c9e_z.jpg",
"id": 397133
},
# ......
]

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
2
3
4
5
6
7
8
9
10
11
"annotations": [
{
"segmentation": [[363.0,213.11,561.69,164.4,640.0,142.43,640.0,301.0,356.31,240.82]],
"area": 25818.402449999994,
"iscrowd": 0,
"image_id": 25181,
"bbox": [356.31,142.43,283.69,158.57],
"category_id": 7,
"id": 173761
},
]

id,id,id......

在COCO标签中,categories项、images项和annotations项中都有名为id的键,此外还有image_idcategory_id,初看很容易搞混。然而区分这几个id的不同对于理解COCO标签非常必要,上边其实已经说过了,这里再放在一起集中说一下。

首先,每一项中的id都相当于“身份证”,是一个内容(类别、图像或标签)的唯一标识,给一个id就能找到对应的内容。如在categories中就是类别的唯一标识、在images中就是图像的唯一索引、在annotations中就是标签的唯一索引。

其次,image_idcategory_id仅在annotations中出现,image_id标识出这个标签是哪张图像的标签,category_id则标识出这个标签对应于哪个类别。