COCO数据集格式介绍

本文详细介绍了COCO数据集的结构和标注格式,包括训练、验证和测试集的组织方式,以及json标注文件中images、categories和annotations等关键部分的内容。COCO数据集广泛用于目标检测任务,同时对比了与VOC和YOLO格式的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        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在imagescategories中),接下来的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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

闲云野鹤01

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值