coco2017数据集标注格式说明

今天准备看看coco数据集到底长啥样,还有其标注格式是什么样的,怀着好奇心,开始百度,于是来到知乎~
感谢知乎给我释疑了~
参考知乎:https://zhuanlan.zhihu.com/p/29393415
这里做个记录以免忘记~

一、下载coco2017数据集

官网下载实在是太慢了,而且打不开
链接:http://mscoco.org/

后来找到这哥们的镜像,很快哟~(想打赏,但是二维码扫不出来是什么鬼)
链接:https://blog.csdn.net/weixin_43599336/article/details/86533575

下载完之后,解压一下标注文件,可以看到以下内容:
coco2017数据集标注格式说明_第1张图片
虽然是6个文件,但是就是三种啦,因为对应train和val
这三种分别为:captions、instances 和 person_keypoints

如果你要打开看的话,建议是打开那个val2017结尾的,因为比较小一点,不然卡死~

我是把它复制到json在线格式验证的平台:http://www.bejson.com/
看着舒服多了~

下面就一一来讲解标注文件吧~

二、标注文件说明

对标注文件进行说明之前,先讲下coco2017数据集的由来吧~

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

Flickr网址:http://blog.flickr.net/en
Mechanical Turk(AMT) 网址:https://www.mturk.com/
(这是一个众包平台,我还注册了一个)

json数据结构

captions.json数据包含的键如下:

{
    "info": info,
    "licenses": [license],
    "images": [image],
    "annotations": [annotation]
}

instances.json数据包含的键如下:

{
    "info": info,
    "licenses": [license],
    "images": [image],
    "annotations": [annotation],
    "categories": [category]
}

person_keypoints.json数据包含的键如下:

{
    "info": info,
    "licenses": [license],
    "images": [image],
    "annotations": [annotation],
    "categories": [category]
}

那我们就开始来说异同点吧~

object instances(目标实例)、object keypoints(目标上的关键点)、image captions(看图说话)这3种类型共享这些基本类型:info、image、license

{
    "info": info,
    "licenses": [license],
    "images": [image]
}

其中:
"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":"2015-01-27 09:11:52.357475"
},
"license":[{
	"url":"http:\/\/creativecommons.org\/licenses\/by-nc-sa\/2.0\/",
	"id":1,
	"name":"Attribution-NonCommercial-ShareAlike License"
},...]
"images":[{
	"license":3,
	"file_name":"COCO_val2014_000000391895.jpg",
	"coco_url":"http:\/\/mscoco.org\/images\/391895",
	"height":360,"width":640,"date_captured":"2013-11-14 11:18:45",
	"flickr_url":"http:\/\/farm9.staticflickr.com\/8186\/8119368305_4e622c8349_z.jpg",
	"id":391895
},...]

那这个captions.json中的那个annotation键对应的是啥呢?
看:就是图片的描述

"annotations":[{
	"image_id": 179765,
	"id": 38,
	"caption": "A black Honda motorcycle parked in front of a garage."
},...]

好了,那 captions.json 就解决了~

再来看这个instance.json,这里面剩下的annotations 和 categories长啥样呢?

{
    "annotations": [annotation],
    "categories": [category]
}

其中:
"annotation":[{
    "id": int,    
    "image_id": int,
    "category_id": int,
    "segmentation": RLE or [polygon],
    "area": float,
    "bbox": [x,y,width,height],
    "iscrowd": 0 or 1,
},...]
"categories":[{
    "id": int,
    "name": str,
    "supercategory": str,
},...]

下面给个实例,并解释参数:

实例1(polygon格式,iscrowd为0):
"annotation":[{
	"segmentation": [[510.66,423.01,511.72,420.03,510.45......]], //见下面
	"area": 702.1057499999998,
	"iscrowd": 0,	//见下面
	"image_id": 289343,
	"bbox": [473.07,395.93,38.65,28.67],  //矩形框左上角的坐标和矩形框的长宽
	"category_id": 18,  //类别id
	"id": 1768
},...]
//segmentation:polygon格式比较简单,这些数按照相邻的顺序两两组成一个点的xy坐标,如果有n个数(必定是偶数),那么就是n/2个点坐标。
//iscrowd=0那么segmentation就是polygon格式;只要iscrowd=1那么segmentation就是RLE格式。
//另外,每个对象(不管是iscrowd=0还是iscrowd=1)都会有一个矩形框bbox
实例2RLE格式,iscrowd为1):
如果iscrowd=1,那么segmentation就是RLE格式(segmentation字段会含有counts和size数组),如下所示:
"segmentation":
{
    'counts': [272, 2, 4, 4, 4, 4, 2, 9, 1, 2, 16, 43, 143, 24......], 
    'size': [240, 320]
}
//就是这个segmentation键对应的东西变成那个样子~
//那这个counts和size又代表啥哇~
//size:size是这幅图片的宽高(240*320)
//counts:好,来,整幅图片包含240*320个像素,我们认为有包含目标的像元赋值1,没有的话就0咯
//那整幅图从第一个像素到最后一个像素就可以这个样子来说明它:0011000111(无无有有无无无有有有)
//这样表示下去太长了吧~那就编码,几个无几个有
//0011000111表示为[2,2,3,3]即[2个无,2个有,3个无,3个有]
//我想应该明白了

categorys就很简单了:

"categories":[{
	"supercategory": "person",
	"id": 1,
	"name": "person"
}},...]

好了,剩最后一个了

这个person_keypoints.json的结构哇和那个instance.json结构一毛一样哇~

不一样在这~
person_keypoints.json中的annotation结构体包含了Object Instance中annotation结构体的所有字段,再加上2个额外的字段
keypointsnum_keypoints
这两个我们来解释解释~

keypoints
新增的keypoints是一个长度为3*k的数组,其中k(这边是17,在categories中的keypoints数组中,数一数就知道)是categories中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,
},...]

实例:
{
	"segmentation": [[125.12,539.69,140.94,522.43...]],
	"num_keypoints": 10,
	"area": 47803.27955,
	"iscrowd": 0,
	"keypoints": [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,142,309,1,177,320,2,191,398...],//这兄弟固定3*17个坑
	"image_id": 425226,
	"bbox": [73.35,206.02,300.58,372.5],
	"category_id": 1,
	"id": 183126
},

终于要写完了,好激动~
categories字段
最后,对于每一个category结构体,相比Object Instance中的category新增了2个额外的字段,keypoints是一个长度为k的数组,包含了每个关键点的名字;skeleton定义了各个关键点之间的连接性(比如人的左手腕和左肘就是连接的,但是左手腕和右手腕就不是)。目前,COCO的keypoints只标注了person category (分类为人)。
定义如下:

{
    "id": int,
    "name": str,
    "supercategory": str,
    "keypoints": [str],
    "skeleton": [edge]
}
实例:
{
	"supercategory": "person",
	"id": 1,
	"name": "person",
	"keypoints": ["nose","left_eye","right_eye","left_ear","right_ear","left_shoulder","right_shoulder","left_elbow","right_elbow","left_wrist","right_wrist","left_hip","right_hip","left_knee","right_knee","left_ankle","right_ankle"],
	"skeleton": [[16,14],[14,12],[17,15],[15,13],[12,13],[6,12],[7,13],[6,7],[6,8],[7,9],[8,10],[9,11],[2,3],[1,2],[1,3],[2,4],[3,5],[4,6],[5,7]]
}

写完啦~ 记得赞一个~

你可能感兴趣的:(目标检测,数据集)