目录

一、PASCAL VOC

1、Challenge and tasks

2、Dataset

3、Detection Ground Truth

4、Evaluation

二、ImageNet

1、ImageNet数据集简介

2、数据集下载

3、包含项目

三、COCO

1、COCO中的类

2、安装COCO api

3、COCO api介绍

4、主要使用方法


一、PASCAL VOC

1、Challenge and tasks

给定自然图片, 从中识别出特定物体。 
待识别的物体有20类:

  • person
  • bird, cat, cow, dog, horse, sheep
  • aeroplane, bicycle, boat, bus, car, motorbike, train 
  • bottle, chair, dining table, potted plant, sofa, tv/monitor

2、Dataset

所有的标注图片都有Detection需要的label, 但只有部分数据有Segmentation Label。
VOC2007中包含9963张标注过的图片, 由train/val/test三部分组成, 共标注出24,640个物体。
VOC2007的test数据label已经公布, 之后的没有公布(只有图片,没有label)。
对于检测任务,VOC2012的trainval/test包含08-11年的所有对应图片。 trainval有11540张图片共27450个物体。
对于分割任务, VOC2012的trainval包含07-11年的所有对应图片, test只包含08-11。trainval有 2913张图片共6929个物体。

3、Detection Ground Truth

Ground truth

<annotation>

<folder>VOC2007</folder>

<filename>009961.jpg</filename>

<source>

<database>The VOC2007 Database</database>

<annotation>PASCAL VOC2007</annotation>

<image>flickr</image>

<flickrid>334575803</flickrid>

</source>

<owner>

<flickrid>dictioncanary</flickrid>

<name>Lucy</name>

</owner>

<size><!--image shape-->

<width>500</width>

<height>374</height>

<depth>3</depth>

</size>

<segmented>0</segmented><!--是否有分割label-->

<object>

<name>dog</name> <!--类别-->

<pose>Unspecified</pose><!--物体的姿态-->

<truncated>0</truncated><!--物体是否被部分遮挡(>15%)-->

<difficult>0</difficult><!--是否为难以辨识的物体, 主要指要结体背景才能判断出类别的物体。虽有标注, 但一般忽略这类物体-->

<bndbox><!--bounding box-->

<xmin>69</xmin>

<ymin>4</ymin>

<xmax>392</xmax>

<ymax>345</ymax>

</bndbox>

</object>

</annotation>

4、Evaluation

提交的结果存储在一个文件中, 每行的格式为:

<image identifier> <confidence> <left> <top> <right> <bottom>

例如:

comp3_det_test_car.txt:

000004 0.702732 89 112 516 466

000006 0.870849 373 168 488 229

000006 0.852346 407 157 500 213

000006 0.914587 2 161 55 221

000008 0.532489 175 184 232 201

confidence会被用于计算mean average precision(mAP). 简要流程如下, 详细可参考

https://sanchom.wordpress.com/tag/average-precision/ 

根据confidence对结果排序,计算top-1, 2, …N对应的precision和recall

  • 将recall划分为n个区间t in [t1, ..., tn]
  • 找出满足recall>=t的最大presicision 
  • 最后得到n个最大precision, 求它们的平均值
aps = []

for t in np.arange(0., 1.1, 0.1):#将recall分为多个区间

# 在所有 recall > t对应的precision中找出最大值

mask = tf.greater_equal(recall, t)

v = tf.reduce_max(tf.boolean_mask(precision, mask))

aps.append(v / 11.)

# 得到其平均值

ap = tf.add_n(aps)

return ap

代码给出的是voc07的计算方式, voc2010在recall区间区分上有变化: 假如有M个正样例,则将recall划分为[1/M, 1/(M - 1), 1/(M - 2), ... 1]。其余步骤不变。

  • 如输出的bbox与一个ground truth bbox的 IOU大于0.5, 且类别相同,则为True Positive, 否则为False Positive
  • 对于一个ground truth bbox, 只会有一个 true positive, 其余都为false positive.
二、ImageNet

1、ImageNet数据集简介

IMAGENET Large Scale Visual Recognition Challenge(ILSVRC),从2010年开始,每年举办的ILSVRC图像分类和目标检测大赛,Imagenet数据集是目前深度学习图像领域应用得非常多的一个领域,关于图像分类、定位、检测等研究工作大多基于此数据集展开。Imagenet数据集文档详细,有专门的团队维护,使用非常方便,在计算机视觉领域研究论文中应用非常广,几乎成为了目前深度学习图像领域算法性能检验的“标准”数据集。Imagenet数据集有1400多万幅图片,涵盖2万多个类别;其中有超过百万的图片有明确的类别标注和图像中物体位置的标注。

具体信息如下:

  • Total number of non-empty synsets: 21841
  • Total number of images: 14,197,122
  • Number of images with bounding box annotations: 1,034,908
  • Number of synsets with SIFT features: 1000
  • Number of images with SIFT features: 1.2million

Imagenet数据集是一个非常优秀的数据集,但是标注难免会有错误,几乎每年都会对错误的数据进行修正或是删除,建议下载最新数据集并关注数据集更新。

                          自然图像目标检测数据集汇总_ide

2、数据集下载

数据集大小:~1TB(ILSVRC2016比赛全部数据);

下载地址:http://image-net.org/download-images

3、包含项目

与Imagenet数据集对应的有一个享誉全球的“ImageNet国际计算机视觉挑战赛(ILSVRC)”,以往一般是google、MSRA等大公司夺得冠军,今年(2016)ILSVRC2016中国团队包揽全部项目的冠军,目前包含的比赛项目有:

  • 目标定位

给定一幅图像,算法需要生成5个带有置信度的类别标签及其分别对应的目标物边框信息。算法准确率的评估是基于与标注的类别标签最匹配的预测标签,图片中可能存在多个物体及其对应的标注信息和与标注的边框信息重叠的预测边框图片中可能存在多个同类物体。为什么这样做呢?因为这样就允许算法识别图像中的多个目标物,并且当其中一个目标物确实存在于图像中但没有被标注出来时算法不会受到惩罚。可能说的有不清楚或不正确的地方,大家可以看下官方的评估规则。

  • 目标检测

给定一幅图像,算法需要生成多组(ci,si,bi)形式的预测信息,其中ci为类别标签、si为置信度、bi为边框信息。需要注意的是,算法必须检测出图像中出现的每一个训练过的目标物,漏检和重复检测都会受到惩罚。

  • 视频序列的目标检测

这一项和上一项目标检测类似。

  • 场景分类

这个比赛使用了Places2 dataset,比赛规则是对于给定图像,允许算法产生5个场景分类,并挑选匹配度最高的作为评估结果,详看他们的评估规则吧。为什么这么做呢?因为同一幅图片可以包含有多个场景类别,事实上同一幅图片本来就是用多个类别标注的。

  • 场景分析

这个比赛的目标是将图像分割成与语义类别相关联的不同图像区域,如天空,道路,人和床。具体规则见官网。

三、COCO

1、COCO中的类

[‘person’, ‘bicycle’, ‘car’, ‘motorcycle’, ‘airplane’, ‘bus’, ‘train’, ‘truck’, ‘boat’, ‘traffic light’, ‘fire hydrant’, ‘stop sign’, ‘parking meter’, ‘bench’, ‘bird’, ‘cat’, ‘dog’, ‘horse’, ‘sheep’, ‘cow’, ‘elephant’, ‘bear’, ‘zebra’, ‘giraffe’, ‘backpack’, ‘umbrella’, ‘handbag’, ‘tie’, ‘suitcase’, ‘frisbee’, ‘skis’, ‘snowboard’, ‘sports ball’, ‘kite’, ‘baseball bat’, ‘baseball glove’, ‘skateboard’, ‘surfboard’, ‘tennis racket’, ‘bottle’, ‘wine glass’, ‘cup’, ‘fork’, ‘knife’, ‘spoon’, ‘bowl’, ‘banana’, ‘apple’, ‘sandwich’, ‘orange’, ‘broccoli’, ‘carrot’, ‘hot dog’, ‘pizza’, ‘donut’, ‘cake’, ‘chair’, ‘couch’, ‘potted plant’, ‘bed’, ‘dining table’, ‘toilet’, ‘tv’, ‘laptop’, ‘mouse’, ‘remote’, ‘keyboard’, ‘cell phone’, ‘microwave’, ‘oven’, ‘toaster’, ‘sink’, ‘refrigerator’, ‘book’, ‘clock’, ‘vase’, ‘scissors’, ‘teddy bear’, ‘hair drier’, ‘toothbrush’]

大类12个,分别为

[‘appliance’, ‘food’, ‘indoor’, ‘accessory’, ‘electronic’, ‘furniture’, ‘vehicle’, ‘sports’, ‘animal’, ‘kitchen’, ‘person’, ‘outdoor’]

2、安装COCO api

COCO api来自于github, 从github上clone即可,https://github.com/pdollar/coco.git,clone下来后在命令行中把路径切换到该路径,输入

python setup.py install

即可,如果遇到错误,参考这两篇博主写的博客即可
https://blog.csdn.net/gxiaoyaya/article/details/78363391
https://blog.csdn.net/qq_32768743/article/details/80202429
安装完成后,打开pycharm就会在左侧外部库中看到pycocotools的库

3、COCO api介绍

使用COCO api,需要首先import COCO的类,然后根据任务实例化

from pycocotools.coco import COCO
coco = COCO(annfile)

不同任务使用不同的annfile,为下载的数据集中的json文件,如

E:/Dataset/COCO2017/annotations/instances_train2017.json

4、主要使用方法

getCatIds(catNms=[], supNms=[], catIds=[])
通过输入类别的名字、大类的名字或是种类的id,来筛选得到图片所属类别的id,比如,我们想知道dog类的id是多少。

catIds = coco.getCatIds(catNms=['dog'])

当然catNms可以包含多个类别名字,如

catIds = coco.getCatIds(catNms=['dog',‘person', 'bicycle'])

getImgIds(imgIds=[], catIds=[])
通过图片的id或是所属种类的id得到图片的id,上一步得到了catIds包含了dog、person、bicycle三个类别的id,我们就可以查询到那些包含有这些类别的图片的id

imgIds = coco.getImgIds(catIds=catIds)

最终得到一个长度为112的list,包含了图片的id信息

loadImgs(ids=[])
得到图片的id信息后,就可以用loadImgs得到图片的信息了
在这里我们随机选取之前list中的一张图片

img = coco.loadImgs(imgIds[np.random.randint(0, len(imgIds))])[0]

最终得到的img并不是一张numpy格式或是PIL格式的图片,而是一个字典,包含了我们找到的这个id所代表的图片的信息
                          自然图像目标检测数据集汇总_数据集_02
有了图片的file_name,就可以把这张图片通过matplotlib画出来

                          自然图像目标检测数据集汇总_目标检测_03

可以看到通过查询得到的图片确实包含了dog、person与bicycle

getAnnIds(imgIds=[], catIds=[], areaRng=[], iscrowd=None)
通过输入图片的id、类别的id、实例的面积、是否是人群来得到图片的注释id
我们想要在之前的图片中画出对之前给定的三个种类进行实例分割的结果,就需要找到这张图片的注释信息的id

annIds = coco.getAnnIds(imgIds=img['id'], catIds=catIds, iscrowd=None)

这里我们得到了一个list

    [6971, 192383, 218386, 240733]

loadAnns(ids=[])
通过输入图片的id、类别的id、实例的面积、是否是人群来得到图片的注释id
我们想要在之前的图片中画出对之前给定的三个种类进行实例分割的结果,就需要找到这张图片的注释信息的id

anns = coco.loadAnns(annIds)

得到一个list,包含了4个注释的形状位置信息

showAnns(anns)


使用标注的信息画出来分割的结果

coco.showAnns(anns)

                          自然图像目标检测数据集汇总_json_04

如果我们重新定义一个coco的类,使用的是keypoints的json文件,就可以画出keypoints的图

 

annFile = '%s/annotations/person_keypoints_%s.json' % (dataDir, dataType)

coco_kps = COCO(annFile)

plt.imshow(I)

plt.axis('off')

annIds = coco_kps.getAnnIds(imgIds=img['id'], catIds=catIds, iscrowd=None)

anns = coco_kps.loadAnns(annIds)

coco_kps.showAnns(anns)

 

附:

将COCO数据集转化为PASCAL VOC格式的数据集:https://blog.csdn.net/ouyangfushu/article/details/79543575