# ADE20K数据集
# 1.背景简介
ADE20K数据集是2016年MIT开放的场景理解的数据集,可用于实例分割,语义分割和零部件分割。利用图像信息进行场景理解 scene understanding
和 scene parsing
。
语义分割 Semantic Segmentation
即最常见的任务,将图像的不同像素按对象类别 object category
进行分类,实例分割Instance Segmentation
不仅要识别不同物体所属的类别,还需识别出同类的不同物体。零部件分割 Part Segmentation
是在识别出的物体上分割出不同部分所属的零部件类别,这对于理解场景帮助机器人与环境交互十分重要,如在某个 scene
中分割出来 chair
或者 cup
,为了坐下或者拿起杯⼦需要找到 objects
中对应的 parts
,如 chair
可以坐的部分, cup
的杯柄, 以实现机器⼈与知行特定的任务。
已有分割公开数据集的现状:
- 类别有限, 且有些数据类别在实际⽣活中并不常⻅如
COCO
和PASCAL
数据集; - 包含的场景过少,如
Cityscapes
仅包含城市街区的场景数据; Pascal-Context
和SUN
还不错, 但Pascal-Context
主要包含其20个对象类的场景, ⽽SUN
在对象级别的标注是不准确的。
# 2.ADE20K
1>ADE20K的官网:https://groups.csail.mit.edu/vision/datasets/ADE20K/index.html (opens new window)
<br/>
2>ECCV 2016举办的Scene Parsing Challenge 2016http://sceneparsing.csail.mit.edu/index_challenge.html (opens new window)<br/>
3>tool kit github repositoryhttps://github.com/CSAILVision/ADE20K (opens new window)
ADE20K由 27000
张图像组成,这些图像来自于SUN
(opens new window)(2010年普林斯顿大学公开的数据集)和Places
(opens new window)(2014年MIT公开的数据集)数据集,ADE20K
中由超过3000个物体类别 category
,其中很多图像组成物体的零部件的类别,以及组成零部件的零部件的类别,如 汽车
的零部件 门
,门
上面的零部件 窗户
。ADE20K
中还标注了实例的 id
,可用于实例分割。数据中的图像都进行了匿名化处理,做了人脸和车牌号的模糊,去除了隐私信息。
ADE20K的数据分布
- 训练集
Training set
包含25574
张完整标注图像 - 验证集
Validation set
包含2000
张完整标注图像 - 测试集
Test set
还没有发布
ADE20K的数据组成
- 共包含
27574
张图像 3688
个类,类名取自WordNet
(opens new window)(WordNet是由普林斯顿大学认识科学实验室在心理学教授乔治·A·米勒的指导下建立和维护一个词与词之间存在各种关系的英语字典)707868
个对象193238
个零部件
数据文件目录结构
.
└── ADE20K_2021_17_01
└── images
└── ADE
└── training
└── urban
└── street
├── ADE_train_00016869
│ ├── instance_000_ADE_train_00016869.png
│ ├── instance_001_ADE_train_00016869.png
│ ├── instance_..._ADE_train_00016869.png
├── ADE_train_00016869.jpg
├── ADE_train_00016869.json
├── ADE_train_00016869_parts_1.png
├── ADE_train_00016869_parts_2.png
├── ADE_train_00016869_seg.png
├── ADE_train_00016964
│ ├── instance_000_ADE_train_00016964.png
│ ├── instance_001_ADE_train_00016964.png
│ ├── instance_..._ADE_train_00016964.png
├── ADE_train_00016964.jpg
├── ADE_train_00016964.json
├── ADE_train_00016964_parts_1.png
└── ADE_train_00016964_seg.png
image_name.jpg
原始图像,如ADE_train_00016869.jpg (opens new window){image_name}_seg.png
图像image_name.jpg
对应的类别和实例的标注信息,存储在其每个像素的RGB
通道中,借助toolkit
中的代码utils_ade20k.py
(opens new window)可以实现标注信息的解析{image_name}_parts_{i}.png
图层i
中包含的零部件,如ADE_train_00016869_parts_1.png (opens new window){image_name}
,以文件名命名的文件夹,其中的每个图像分别是一个实例标注信息对应原图的掩码,由0,1
组成。如ADE_train_00016869 (opens new window){image_name}.json
包含了图像对应的标注信息,如实例和类别标注信息的多边形,标注的时间,标注实例或对象的属性,如ADE_train_00016869.json (opens new window)
数据集相关的统计信息,譬如包括多少个类别,有多少个对象等,保存在一个序列化文件index_ade20k.pkl
(opens new window)中,可以参考ade20k_starter.ipynb
(opens new window)读取其中的信息。
print("File loaded, description of the attributes:")
print('--------------------------------------------')
for attribute_name, desc in index_ade20k['description'].items():
print('* {}: {}'.format(attribute_name, desc))
print('--------------------------------------------\n')
i = 16868 # 16899, 16964
nfiles = len(index_ade20k['filename'])
file_name = index_ade20k['filename'][i]
num_obj = index_ade20k['objectPresence'][:, i].sum()
num_parts = index_ade20k['objectIsPart'][:, i].sum()
count_obj = index_ade20k['objectPresence'][:, i].max()
obj_id = np.where(index_ade20k['objectPresence'][:, i] == count_obj)[0][0]
obj_name = index_ade20k['objectnames'][obj_id]
full_file_name = '{}/{}'.format(index_ade20k['folder'][i], index_ade20k['filename'][i])
print("The dataset has {} images".format(nfiles))
print("The image at index {} is {}".format(i, file_name))
print("It is located at {}".format(full_file_name))
print("It happens in a {}".format(index_ade20k['scene'][i]))
print("It has {} objects, of which {} are parts".format(num_obj, num_parts))
print("The most common object is object {} ({}), which appears {} times".format(obj_name, obj_id, count_obj))
# 3.使用ADE20K
- 语义分割
语义分割中使用的训练和验证数据集多是ADEchallenge 2016
提供的处理好的数据集,包括150
个类,不含背景0
,在训练时需将background 0
设置成ignore_index
。ADEChallengeData2016.zip
的下载地址为
http://data.csail.mit.edu/places/ADEchallenge/ADEChallengeData2016.zip (opens new window)
最近的一些工作,如swin transformer
和segfomer
都在ADEChallengeData2016.zip
数据集上进行了验证,这两个算法在商汤的框架mmsegmentation
(opens new window)中都有实现,感兴趣的同学可以动手验证一下,需要注意的是使用ade20k
数据集时,train_pipeline
中的参数需要设置,如下
train_pipeline = [
dict(type='LoadImageFromFile'),
dict(type='LoadAnnotations', reduce_zero_label=True)]
挖个坑:在实例分割和零部件分割的应用待补充