COCO 数据集中目标检测标注说明

此篇文章会不断补充内容,建议长期关注。最后更新日期为2018年11月25日。

原文:http://cocodataset.org/#format-data

需要用到的工具:

UltraEdit

Git

Python ,包含 jupyter notebook,以及其它必要的包

Adobe Photoshop CC

目前官方 API 只提供了 Lua 脚本、Python 脚本和 Matlab 脚本的编程接口,暂时没有适配 .net 框架的接口。其中只有 Matlab 脚本才能使用 analyze() 函数对评估结果进行分析。

coco 数据集有五种标注类型,分别是“目标检测”、“关键点检测”、“素材分割”、“全景分割”和“图像说明”。标注信息使用 JSON 格式存储。请注意,下载页面上描述的 COCO API 可用于访问和操作所有“标注”。 所有“标注”都具有下面相同的基本数据结构:

接下来只描述“对象检测”的特定格式:

一、对象检测

每个对象实例的标注都包含一系列字段,包括对象的类别ID(category_id)和分段掩码(segmentation)。 分段格式取决于实例是表示单个对象(iscrowd = 0,在这种情况下使用多边形)还是对象集合(iscrowd = 1,在这种情况下使用RLE)。 请注意,单个对象(iscrowd = 0)可能需要多个多边形,例如,如果被遮挡。 人群注释(iscrowd = 1)用于标记大组对象(例如一群人)。 此外,为每个对象提供一个封闭的边界框(框坐标是从左上角的图像角测量的,并且是0索引的)。 最后,标注结构的 categories 字段存储 category id 到 category 和 supercategory 名称的映射。 另请参阅检测任务。

TODO:其它四种格式的说明。

对象检测 JSON 结构总览
其中,info、licenses、images、annotations 和 categories 均为数组。

二、对象检测示例

COCO 数据集提供了应用程序编程接口和使用实例,并托管在了 GitHub 仓库中。

点击此处访问 COCO API 的仓库。

点击此处访问 COCO API 使用示例。

以上使用示例中未曾提到边界框属性(bbox),以下将演示如何使用边界框属性。

以2017年的验证集中编号为174482的图片为例(如果没有2017年的数据集,可以点击下方链接下载完整压缩包,或只单独下载某张图片):

验证集:2017 Val images [5K/1GB] 训练集:2017 Train images [118K/18GB]

标注:2017 Train/Val annotations [241MB]

图片正中央为自行车。

打开 标注压缩包,找到instance_val2017.json文件中第一个图片编号为174482的标注属性,如下所示:

图片编号为174482的第一个标注。
该段内容中 “segmentation” 属性太长,故折叠。

其中“bbox”属性为实例的边界框(bounding box)。这四个数字的含义为左上角横坐标左上角纵坐标宽度高度,单位为像素。这个框为大致画出,因此对实例的标注并非完全精确,如下所示:

使用 bbox 属性画出的边界框。

三、对象检测评估

原文:http://cocodataset.org/#detection-eval

COCO数据集允许将检测结果上传到服务器进行评估。

1. 度量

以下12个度量标准用于表征COCO上对象检测器的性能:

  • 平均精度(Average Precision, AP)
    • AP 平均精度在 IoU=.50:.05:.95 (主要度量挑战)
    • AP^{IoU=.50} 平均精度在 IoU=.50 (PASCAL VOC 度量)
    • AP^{IoU=.75} 平均精度在 IoU=.75 (严格度量)
  • 不同尺度的平均精度(Average Precision Across Scale, APAS)
    • AP^{small} 小型对象平均精度,面积小于 32^2
    • AP^{medium} 中等对象平均精度,面积介于 32^296^2 之间
    • AP^{large} 大型对象平均精度,面积超过 96^2
  • 平均重复调用次数(Average Recall, AR)
    • AR^{max=1} 每张图片检测 1 次
    • AR^{max=10} 每张图片检测 10 次
    • AR^{max=100} 每张图片检测 100 次
  • 不同尺度的平均重复调用次数(Average Recall Across Scale, ARAS)
    • AR^{small} 小型对象平均重复调用次数,面积小于 32^2
    • AR^{medium} 中等对象平均重复调用次数,面积介于 32^296^2 之间
    • AR^{large} 大型对象平均重复调用次数,面积超过 96^2

2. 评估代码

评估代码可在 COCO GitHub 网站上获得。 具体来说,分别在 Matlab 或 Python 代码中查看 CocoEval.m 或 cocoeval.py。 另请参阅 Matlab 或 Python 代码(演示)中的evalDemo。 在运行评估代码之前,请以结果格式页面中描述的格式准备结果。

评估参数如下(括号中的默认值,通常无需更改):

 

通过调用evaluate()函数和accumulate()运行评估代码会生成两个测量检测质量的数据结构。 这两个结构是evalImgs和eval,它们分别测量每个图像的质量并在整个数据集中进行聚合。 evalImgs结构具有KxA个条目,每个评估设置一个,而eval结构将此信息组合到精度和重新调用数组中。下面是两个结构的详细信息(另请参阅CocoEval.mcocoeval.py):

最后,summary() 函数根据eval结构计算前面定义的12个检测指标。

3. 分析代码

除了评估代码之外,我们还提供了一个函数analyze()函数来执行误报的详细分类。 这是受到Derek Hoiem等人在物体探测器中诊断错误的启发,但在实现和细节上有很大不同。 代码生成如下图:

两个图都显示了何恺明(上海交通大学)等人的ResNet(bbox)探测器的分析,该探测器是2015年探测挑战赛的获胜者。 第一个图显示了人员类ResNet错误的细分;第二个图是对所有类别的平均ResNet的整体分析。

每个图是一系列精确的回忆曲线,其中每个PR曲线保证严格高于之前的曲线,因为评估设置变得更加宽松。 曲线如下:

  1. C75: PR at IoU=.75 (AP at strict IoU), area under curve corresponds to APIoU=.75 metric.
  2. C50: PR at IoU=.50 (AP at PASCAL IoU), area under curve corresponds to APIoU=.50 metric.
  3. Loc: PR at IoU=.10 (localization errors ignored, but not duplicate detections). All remaining settings use IoU=.1.
  4. Sim: PR after supercategory false positives (fps) are removed. Specifically, any matches to objects with a different class label but that belong to the same supercategory don’t count as either a fp (or tp). Sim is computed by setting all objects in the same supercategory to have the same class label as the class in question and setting their ignore flag to 1. Note that person is a singleton supercategory so its Sim result is identical to Loc.
  5. Oth: PR after all class confusions are removed. Similar to Sim, except now if a detection matches any other object it is no longer a fp (or tp). Oth is computed by setting all other objects to have the same class label as the class in question and setting their ignore flag to 1.
  6. BG: PR after all background (and class confusion) fps are removed. For a single category, BG is a step function that is 1 until max recall is reached then drops to 0 (the curve is smoother after averaging across categories).
  7. FN: 删除所有剩余错误后的PR(通常AP = 1)。

每条曲线下方的区域显示在图例的括号中。 在ResNet检测器的情况下,IoU = .75的总体AP为.399,完美的本地化将AP增加到.682。 有趣的是,删除所有类混淆(超类别和跨超类别)只会略微提高AP到.713。 删除背景fp会将性能提升到.870 AP,其余的错误都会丢失检测(尽管如果添加更多检测,这也会增加很多fps)。 总之,ResNet的错误主要是不完美的本地化和背景混淆。

对于给定的检测器,代码总共生成372个图! 共有80个类别,12个超类别和1个总体结果,总共93个不同的设置,并且分析以4个等级(所有,小,中,大,所以93 * 4 = 372个图表)进行。 文件命名为[supercategory] – [category] – [size] .pdf,每个类别80 * 4的结果,整体 – [supercategory] – [size] .pdf,每个超类别结果为12 * 4,总体而言 – all- [size] .pdf为1 * 4整体结果。 在所有图中,通常整体和超类别结果是最感兴趣的。

注意:analyze()函数可能需要很长时间才能运行完毕,请耐心等待。因此,我们通常不在评估服务器上运行此代码;您必须使用验证集在本地运行代码。最后,目前analyze()只是Matlab API的一部分;Python代码即将推出。

发表评论

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据