今天准备看看coco数据集到底长啥样,还有其标注格式是什么样的,怀着好奇心,开始百度,于是来到知乎~
感谢知乎给我释疑了~
参考知乎:https://zhuanlan.zhihu.com/p/29393415
这里做个记录以免忘记~
官网下载实在是太慢了,而且打不开
链接:http://mscoco.org/
后来找到这哥们的镜像,很快哟~(想打赏,但是二维码扫不出来是什么鬼)
链接:https://blog.csdn.net/weixin_43599336/article/details/86533575
下载完之后,解压一下标注文件,可以看到以下内容:
虽然是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/
(这是一个众包平台,我还注册了一个)
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
实例2(RLE格式,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个额外的字段
keypoints 和 num_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]]
}
写完啦~ 记得赞一个~