COCO是微软构建的一个目标检测大型基准数据集,非常非常著名,包括检测、分割、关键点估计等任务,目前用的比较多的是COCO2017数据集,其他如COCO2014数据集格式类似,所以我这里以COCO2017为例。
首先我们来看目录结构,关键的文件如下所示。其中unlabeled2017存放的是无标注的图片,train2017、val2017以及test2017则存放的分别为训练集图片、验证集图片和测试集图片,图片以jpg格式存储。annotations文件夹中包含各种类型的标注,它们的命名风格为任务_子集名称.json,其中检测和分割对应的任务名为实例级别标注用instance表示,子集名称就是我们上面提到的三个文件夹(测试集标注是不公开的),所以对目标检测任务而言有效的标注文件就是instances_train2017.json和instances_val2017.json,下面我具体来解析这个json标注文件(以训练集标注为例)。
─coco2017├─annotations│ ├─instances_train2017.json│ ├─instances_val2017.json│ └─*.json├─train2017│ ├─1.jpg│ ├─2.jpg│ └─3.jpg├─val2017│ ├─4.jpg│ ├─5.jpg│ └─6.jpg├─test2017│ ├─7.jpg│ ├─8.jpg│ └─9.xml└─unlabeled2017
首先,和VOC不同的是,COCO整个训练集的标注都在一个文件内,json文件可以理解为键值对的格式,所以这边看最外层可以发现,整个标注其实由下面5个部分组成,每个部分又是新的键值对。info
包含的是整个数据集的一些信息,包括年份、版本、描述等,这些信息对训练而言不是必要的。licenses
则是一个列表,它包含多个license对象,每个license由id、name、url组成,这是
数据集的多个协议许可证,这对训练也不是必须的。也就是说,自定义数据集转为COCO格式时,上述两项是可以没有的。
接着我们来看images这一项,这是个列表,列表中的每个元素是如下格式的对象,它指的其实就是一张图片的信息,包括图片的license、文件名、链接地址、宽高、捕获日期、网络链接、图片id这些信息,其中filename、height、width和id是必须的,所以在构建自己的数据集时保证有这四项就行了。这个id指的是图片id,每个图像唯一对应这个id,这个用来和后面的标注进行对应,因为多个标注可能有同一个图像id(这是因为多个目标在一幅图上)。
{"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
}
我们再来看一开始五个对象中的categories
,这也是一个列表,列表中每个对象为一个类别对象,这个类别对象由父类别、类别id和名称组成,比如下面的bicycle这个类别的父类为vehicle,id号为2。原始的COCO2017共有80类目标。
[{"supercategory": "person","id": 1,"name": "person"
}, {"supercategory": "vehicle","id": 2,"name": "bicycle"
}, {"supercategory": "vehicle","id": 3,"name": "car"
}, {"supercategory": "vehicle","id": 4,"name": "motorcycle"
}, {"supercategory": "vehicle","id": 5,"name": "airplane"
}, {"supercategory": "vehicle","id": 6,"name": "bus"
}, ...]
最后,我们来开开始五个对象中最关键的annotations
,它依然是一个列表,列表的每一个对象是一个标注annotation,它包含的字段如下。首先有一个唯一确定这个标注框的id号,然后是这个边界框所在的图像的id和类别的id(这俩id在images
和categories
中),接下来的segmentation
是分割级别标注,根据iscrowd
的值不同有两种类型,下面的示例用的是polygon格式这种比较简单的,还有当iscrowd=1时的RLE格式,因为我们这里不以分割为主,所以不做拓展,自己构造数据集的时候填写如下就行。area
是分割区域的面积,bbox
就是我们最关注的边界框标注,格式为[x,y,w,h]
,iscrowd
表示实例是否密集。
{"id": int, "image_id": int,"category_id": int,"segmentation": [[x1, y1, x2, y1, x2, y2, x1, y2]],"area": float,"bbox": [x,y,width,height],"iscrowd": 0 or 1,
}
至此,我们讲完了COCO数据集格式,我们构造的时候只要生成子集文件夹和标注文件夹即可,标注文件夹每个json对应一个子集的标注,标注的格式上面已经说了。
这里补充一下YOLO格式(它虽然不常用,因为每个版本的YOLO都不太一样),和VOC类似,它的标注也是一个图像一个标注文件,不过这个标注文件是txt格式的,它包含多行内容,每行是一个目标框,空格分隔的数值含义如下。当然,熟悉YOLO的都知道,这个x,y,w,h不同于VOC和COCO那种,是归一化之后的。
类别编号 x y w h类别编号 x y w h