简介
MS COCO
数据集是目标检测领域中另一个非常有名的大型数据集(前面介绍过 PASCAL VOC
),其中COCO
是Common Objects in COntext
的缩写,由微软公司构建,其中包含了detection
、segmentation
、keypoints
等任务,目前主要的赞助者有Microsoft
、Facebook
、Google
等大厂。
与 PASCAL VOC
数据集相比,MS COCO
中的图片数据,目标更多,尺寸更小且图片背景更加复杂,因此,在此数据集上的任务就显得更难。对于现在的检测算法来讲,在MS COCO
上的检测结果俨然成为了衡量模型好坏的事实标准。
MS COCO
总共包含91个stuff categories
,80个object cagegories
也就是我们常说的物体类别,下图是与PASCAL VOC
的一个类别及数据量对比
评估标准
MS COCO
的评估标准比PASCAL VOC
更加严格,跟PASCAL VOC
使用mAP
不同,MS COCO
的主要评价指标是AP
从上图中可以看到:
MS COCO
中的AP
是在10个IOU
(0.5开始,步长0.05,直到0.95) 层面以及80个类别层面的平均值- 针对三种不同大小(
small
、medium
、large
)提出了不同的测量标准 - 除了
AP
,还提出了AR
即(Average Recall
)的评价标准,它的计算方法跟AP
是类似的
标注格式
不同于PASCAL VOC
,一张图片对应一个xml
文件,MS COCO
是直接将所有图片以及对应的bbox
信息写在了一个json
文件里。标注的json
文件是这样的
{
"info": info,
"images": [image],
"annotations": [annotation],
"licenses": [license],
"categories": [category]
}
info{
"year": int,
"version": str,
"description": str,
"contributor": str,
"url": str,
"date_created": datetime,
}
image{
"id": int,
"width": int,
"height": int,
"file_name": str,
"license": int,
"flickr_url": str,
"coco_url": str,
"date_captured": datetime,
}
license{
"id": int,
"name": str,
"url": str,
}
{
"id": int,
"name": str,
"supercategory": str,
"keypoints": [str],
"skeleton": [edge]
}
annotation{
"id": int,
"image_id": int,
"category_id": int,
"segmentation": RLE or [polygon],
"area": float,
"bbox": [x,y,width,height],
"iscrowd": 0 or 1,
}
这里有几个关键字,解释一下
info
:记录数据集的基本信息license
:版权信息,也就是图片的出处images
:包含每一张图片的信息,主要包括文件名、宽、高、id
等categories
:类别信息,id
编号从1开始,0是背景,还有个supercategory
,比如说狗和猫,supercategory
就是动物annotations
:训练集(或测试集)中bbox
的数量
MS COCO
数据集中共有3种标注类型,分别是object instances
、object keypoints
和image captions
,其中,info
、licenses
和images
三种结构是共享的,在不同的json
文件中这三个类型是一样的,而annotation
和category
是不同的
数据集下载
主要有2014和2017两个数据集,2014年的数据用于Detection
目标检测、Captioning
字幕标注、Keypoints
关键点检测三个任务中,而2017年的数据在此基础之上,多了Stuff
和Panoptic
分割任务。
标注工具
推荐 labelme,直接使用 pip install labelme
就可以完成安装。使用方法也很简单,跟labelImg
差不太多
PASCAL VOC和MS COCO相互转化
可以使用下面这个开源工具 https://github.com/veraposeidon/labelme2Datasets
COCO API
MS COCO
提供了相关的API
,用来进行数据集的操作,地址是: https://github.com/cocodataset/cocoapi,它提供了Python
、Lua
和Matlib
的接口,这里以Python
为例
首先是安装
git clone https://github.com/cocodataset/cocoapi.git
cd cocoapi/PythonAPI
make
下面是官方给出的一个使用示例
from pycocotools.coco import COCO
import numpy as np
import skimage.io as io
import matplotlib.pyplot as plt
import pylab
pylab.rcParams['figure.figsize'] = (8.0, 10.0)
dataDir='..'
dataType='val2017'
annFile='{}/annotations/instances_{}.json'.format(dataDir,dataType)
# 通过instance annotations的json文件得到coco对象
coco=COCO(annFile)
cats = coco.loadCats(coco.getCatIds())
nms=[cat['name'] for cat in cats]
# 输出目标类别
print('COCO categories: \n{}\n'.format(' '.join(nms)))
nms = set([cat['supercategory'] for cat in cats])
# 输出大类别,supercategory
print('COCO supercategories: \n{}'.format(' '.join(nms)))
# get all images containing given categories, select one at random
catIds = coco.getCatIds(catNms=['person','dog','skateboard']);
imgIds = coco.getImgIds(catIds=catIds );
imgIds = coco.getImgIds(imgIds = [324158])
# 得到img对象,图片信息都在这里
img = coco.loadImgs(imgIds[np.random.randint(0,len(imgIds))])[0]
# 读取图片并显示出来
# I = io.imread('%s/images/%s/%s'%(dataDir,dataType,img['file_name']))
# use url to load image
I = io.imread(img['coco_url'])
plt.axis('off')
plt.imshow(I)
plt.show()
代码执行后显示