深度学习常见数据集之PASCAL VOC

背景

PASCAL 的全称是 Pattern Analysis, Statistical Modelling and Computational Learning。

VOC 的全称是 Visual Object Classes。

第一届 PASCAL VOC 举办于2005年,然后每年一届,于2012年终止。

本文以PASCAL VOC 2012为基础。

数据标注方式

数据集简介

PASCAL VOC竞赛目标主要是目标识别,其提供的数据集里包含了20类的物体。

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

PASCAL VOC的主要2个任务是(按照其官方网站所述,实际上是5个):

  • 分类: 对于每一个分类,判断该分类是否在测试照片上存在(共20类);
  • 检测:检测目标对象在待测试图片中的位置并给出矩形框坐标(bounding box);
  • Segmentation: 对于待测照片中的任何一个像素,判断哪一个分类包含该像素(如果20个分类没有一个包含该像素,那么该像素属于背景);
  • (在给定矩形框位置的情况下)人体动作识别;
  • Large Scale Recognition(由ImageNet主办)。

另外,PASCAL VOC利用其训练集的一个子集对外提供2个尝鲜性质的任务:

  • (无给定矩形框位置的情况下)人体动作识别;
  • Person Layout: 对于待测照片中的每一个人,预测出这个人的bounding box,以及这个人的头、手、脚的bounding box。

XML标注格式

对于目标检测来说,每一张图片对应一个xml格式的标注文件。所以你会猜到,就像gemfield准备的训练集有8万张照片一样,在存放xml文件的目录里,这里也将会有8万个xml文件。下面是其中一个xml文件的示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<?xml version="1.0" encoding="utf-8"?>
<annotation>
<folder>VOC2007</folder>
<filename>test100.mp4_3380.jpeg</filename>
<size>
<width>1280</width>
<height>720</height>
<depth>3</depth>
</size>
<object>
<name>gemfield</name>
<bndbox>
<xmin>549</xmin>
<xmax>715</xmax>
<ymin>257</ymin>
<ymax>289</ymax>
</bndbox>
<truncated>0</truncated>
<difficult>0</difficult>
</object>
<object>
<name>civilnet</name>
<bndbox>
<xmin>842</xmin>
<xmax>1009</xmax>
<ymin>138</ymin>
<ymax>171</ymax>
</bndbox>
<truncated>0</truncated>
<difficult>0</difficult>
</object>
<segmented>0</segmented>
</annotation>

在这个测试图片上,我们标注了2个object,一个是gemfield,另一个是civilnet。

在这个xml例子中:

  • bndbox是一个轴对齐的矩形,它框住的是目标在照片中的可见部分;
  • truncated表明这个目标因为各种原因没有被框完整(被截断了),比如说一辆车有一部分在画面外;
    occluded是说一个目标的重要部分被遮挡了(不管是被背景的什么东西,还是被另一个待检测目标遮挡);
  • difficult表明这个待检测目标很难识别,有可能是虽然视觉上很清楚,但是没有上下文的话还是很难确认它属于哪个分类;标为difficult的目标在测试成绩的评估中一般会被忽略。

注意:在一个<object/>中,<name/> 标签要放在前面,否则的话,目标检测的一个重要工程实现SSD会出现解析数据集错误(另一个重要工程实现py-faster-rcnn则不会)。

如何评判目标检测的成绩?

先来介绍几个概念

1,IoU

这是关于一个具体预测的Bounding box的准确性评估的数据。对于目标检测任务来说,一个具体的目标预测包括一个bounding box的坐标和它的置信度。通过测量预测的bndbox(bounding box)和ground truth的bndbox之间的重合度,我们来得出此次预测是true positive还是false positive。

一般来说,重合区域的面积(上面公式的分子)和2个bndbox的面积之和的比例(上面公式的分母)如果大于50%,那么认为这是一个成功的预测(true positive),否则认为这是一个失败的预测(false positive)。公式等号的左边就是IoU。50%这个数值的选取是考虑了一些因素的,比方说人有胳膊有腿,有蜷缩有伸展的状态,因此这个数也不能太严格。

如果对于一个目标算法检测出多个目标,比如一个目标上算法给出了5个检测框,那么就算4个检测错误。

2,mAP

对于一个给定的任务和分类:

precision/recall曲线是根据算法的输出计算得到的。

Recall(召回率)说的是所有正样本中被算法预测出来的样本所占的比率;

(Recall is defined as the proportion of all positive examples ranked above a given rank.)

Precision(准确率)说的是预测出来的样本中是正确的比例是多少;

(Precision is the proportion of all examples above that rank which are from the positive class. )

AP的值就某种程度上反映了上述PR曲线(precision/recall)的形状,我们把recall的值从0到1 (0%到100%)划分为11份:0、0.1、0.2、0.3、0.4、0.5、0.6、0.7、0.8、0.9、1.0,在每个recall尺度上我们计算下准确率,然后再计算总和并平均,就是AP值。

因此,一个表现良好的算法应该是在各个recall层面上都有足够好的Precision。

对于给定的任务的所有的分类:

计算每个分类的AP,求和再平均,得到的就是mAP。

PASCAL VOC数据集实例

以 VOC 2007 为例,解压后的文件为:

1
2
3
4
5
6
7
8
9
10
11
12
13
shell
.
├── Annotations 进行 detection 任务时的标签文件,xml 形式,文件名与图片名一一对应
├── ImageSets 包含三个子文件夹 LayoutMainSegmentation,其中 Main 存放的是分类和检测的数据集分割文件
├── JPEGImages 存放 .jpg 格式的图片文件
├── SegmentationClass 存放按照 class 分割的图片
└── SegmentationObject 存放按照 object 分割的图片

├── Main
├── train.txt 写着用于训练的图片名称,共 2501
├── val.txt 写着用于验证的图片名称,共 2510
├── trainval.txt train与val的合集。共 5011
├── test.txt 写着用于测试的图片名称,共 4952

建立自己的数据集

本节仅以目标检测为例,建立一个名为VOC2018的数据集。如下所示:

1
2
3
4
5
6
/bigdata$ mkdir VOC2018
/bigdata$ cd VOC2018/
/bigdata/VOC2018$ ls
/bigdata/VOC2018$ mkdir Annotations
/bigdata/VOC2018$ mkdir JPEGImages
/bigdata/VOC2018$ mkdir -p ImageSets/Main

可以看到,必备的目录只有Annotations、JPEGImages以及ImageSets/Main。

1,把所有的照片放入到JPEGImages目录:

1
2
3
4
5
6
7
8
9
10
/bigdata/VOC2018/JPEGImages$ ls | head
self1.mp4_0.jpg
self1.mp4_10000.jpg
self1.mp4_1000.jpg
self1.mp4_10010.jpg
self1.mp4_10020.jpg
self1.mp4_10030.jpg
self1.mp4_10040.jpg
self1.mp4_10050.jpg
......

2,把所有的xml标注文件放入到Annotations目录:

1
2
3
4
5
6
7
8
9
/bigdata/VOC2018/Annotations$ ls |head
self1.mp4_0.xml
self1.mp4_10000.xml
self1.mp4_10010.xml
self1.mp4_10020.xml
self1.mp4_10030.xml
self1.mp4_10040.xml
self1.mp4_10050.xml
......

3,把划分好的训练集测试集放入到 ImageSets/Main目录下:

1
2
3
4
5
6
7
/bigdata/VOC2018/ImageSets/Main$ ls -l
total 4012
-rw-r--r-- 1 root root 1278209 2月 11 16:53 imageset.txt
-rw-r--r-- 1 root root 127874 2月 11 16:53 test.txt
-rw-r--r-- 1 root root 1278209 2月 11 16:53 train.txt
-rw-r--r-- 1 root root 1278209 2月 11 16:53 trainval.txt
-rw-r--r-- 1 root root 127868 2月 11 16:53 val.txt

以val.txt文件为例,格式如下(这几个文件格式一样):

1
2
3
4
5
6
7
8
9
10
11
/bigdata/VOC2018/ImageSets/Main$ cat val.txt |head
wzry203.mp4_3990
wzry19.mp4_16340
wzry232.mp4_9860
wzry228.mp4_4610
wzry240.mp4_120
wzry49.mp4_1920
wzry222.mp4_8170
wzry219.mp4_10720
wzry250.mp4_4410
wzry249.mp4_7700

VOC 常用组合、数据量统计及组织结构

  • VOC2007 train_val_test & VOC2012 train_val 百度云下载链接,提取码: jz27

  • 目前目标检测常用的是 VOC2007 和 VOC2012 数据集,因为二者是互斥的,论文中的常用组合有以下几种:

    • 07+12: 使用 VOC2007 和 VOC2012 的 train+val(16551) 上训练,然后使用 VOC2007 的 test(4952) 测试
    • 07++12: 使用 VOC2007 的 train+val+test(9963) 和 VOC2012的 train+val(11540) 训练,然后使用 VOC2012 的 test 测试,这种方法需提交到 PASCAL VOC Evaluation Server 上评估结果,因为 VOC2012 test 没有公布
    • 07+12+COCO: 先在 MS COCO 的 trainval 上 预训练,再使用 VOC2007 和 VOC2012 的 train+val 微调训练,然后使用 VOC2007 的 test 测试
    • 07++12+COCO: 先在 MS COCO 的 trainval 上预训练,再使用 VOC2007 的 train+val+test 和 VOC2012 的 train+val微调训练,然后使用 VOC2012 的 test 测试 ,这种方法需提交到 PASCAL VOC Evaluation Server上评估结果,因为VOC2012 test 没有公布
  • VOC2007 和 VOC2012 目标检测任务中的训练、验证和测试数据统计如下表所示,具体每一类的数据分布见 PASCAL VOC2007 Database StatisticsPASCAL VOC2012 Database Statistics

    在这里插入图片描述

提交格式

1、Classification Task

  • 每一类都有一个 txt 文件,里面每一行都是测试集中的一张图片,前面一列是图片名称,后面一列是预测的分数
1
2
3
4
5
6
7
# comp1_cls_test_car.txt, 内容如下

000004 0.702732
000006 0.870849
000008 0.532489
000018 0.477167
000019 0.112426

2、Detection Task

  • 每一类都有一个 txt 文件,里面每一行都是测试集中的一张图片,每行的格式为:<image identifier> <confidence> <left> <top> <right> <bottom>,confidence 用来计算 mAP
1
2
3
4
5
6
7
8
# comp3_det_test_car.txt,内容如下
# comp3:只允许用所给训练数据,comp4:允许使用外部数据

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

评估标准

参考资料

1、The PASCAL Visual Object Classes Homepage
2、目标检测数据集PASCAL VOC简介


深度学习常见数据集之PASCAL VOC
https://flepeng.github.io/ml-深度学习常见数据集之PASCAL-VOC/
作者
Lepeng
发布于
2021年7月16日
许可协议