常见的语义分割数据集有VOC2012, MS COCO以及Cityscapes等。 今天我们先来介绍Cityscapes数据集
Cityscapes是关于城市街道场景的语义理解图片数据集。它主要包含来自50个不同城市的街道场景,拥有5000张在城市环境中驾驶场景的高质量像素级注释图像(其中 2975 for train,500 for val,1525 for test, 共有19个类别);此外,它还有20000张粗糙标注的图像(gt coarse)。
从我目前了解来说, 一般都是拿这5000张精细标注(gt fine)的样本集来进行训练和评估的。当然,还有一个策略就是,先对粗糙标注的样本集进行一个简单的训练,然后再基于精细标注的数据集进行final training。 这里我们只谈gt fine样本集的训练。
精细样本集下载, 可直接从这个百度盘下载:https://pan.baidu.com/s/1w3W_dQBUiHcwkLOtbSJ1Tg 密码:1bln
当然,也可以去其官网注册来获得完整数据集:https://www.cityscapes-dataset.com/
从百度盘下载后,根目录cityscapes的内容如下:
样本数据都在红框里面的两个文件夹内。 preprocess.py主要是用来生成这些txt文件 (比如将相关样本图片的路径和文件名收集起来放到一个对应的txt文件里面),而read_depth.py主要是来确定图片的像素深度是16还是8bit。
红框里面的leftImg8bit文件夹有三个子目录:test, train以及val,分别为测试集,训练集以及验证集图片。这三个子目录的图片又以城市为单元来存放。这里解释下leftImg8bit的含义,因为cityscapes实际上来源于双摄像头拍摄的立体视频序列,所以这里的leftImg就是来自于左摄像头的图片,而8bit意味着该图片集都为每个分量为8bit的24位深度的图片。
train目录的所有子目录如下所示
对样本图片对应的就是标注目录,即gtFine,显然这里的fine就是精细标注的意思。gtFine下面也是分为train, test以及val,然后它们的子目录也是以城市为单位来放置图片。这些都是和leftImg8bit的一一对应。 不同的是,在城市子目录下面,每张样本图片对应有6个标注文件,如下所示:
这里有两个注意点:
1)原始精细标注数据集里面其实每张图片只对应四张标注文件:xxx_gtFine_color.png, xxx_gtFine_instanceIds.png, xxx_gtFine_labelsIds.png以及xxx_gtFine_polygons.json。 xxx_color.png是标注的可视化图片,真正对训练有用的是后面三个文件。xxx_instanceIds.png是用来做实例分割训练用的,而xxx_labelsIds.png是语义分割训练需要的。它们的像素值就是class值。而最后一个文件xxx_polygons.json是用labelme工具标注后所生成的文件,里面主要记录了每个多边形标注框上的点集坐标。
2)至于另外两个xxx_gtFine_instanceTrainIds.png和xxx_gtFine_labelTrainIds.png则是后面使用labels.py (from https://github.com/mcordts/cityscapesScripts/tree/master/cityscapesscripts/helpers)来生成的。因为实际上这5000张精细标注的图片有34类(0~33),但训练时可能只想关心其中19类(0~18)。所以需要做一个映射来将34类中感兴趣的类别映射到19类中,其它不感兴趣的类别就直接设成255,所以这也是为什么xxx_trainIds.png中有白色像素的原因,因为那些白色像素的类别不是我们感兴趣的,变成255白色了。 当然,这个预变换处理也不一定非要先做,因为有的模型,比如deeplabv3+,训练时,本身就会做这个转换。
这个类别映射classmap如下所示。
name | id | trainId | category | categoryId | hasInstances | ignoreInEval| color
--------------------------------------------------------------------------------------------------
unlabeled | 0 | 255 | void | 0 | 0 | 1 | (0, 0, 0)
ego vehicle | 1 | 255 | void | 0 | 0 | 1 | (0, 0, 0)
rectification border | 2 | 255 | void | 0 | 0 | 1 | (0, 0, 0)
out of roi | 3 | 255 | void | 0 | 0 | 1 | (0, 0, 0)
static | 4 | 255 | void | 0 | 0 | 1 | (0, 0, 0)
dynamic | 5 | 255 | void | 0 | 0 | 1 | (111, 74, 0)
ground | 6 | 255 | void | 0 | 0 | 1 | (81, 0, 81)
road | 7 | 0 | flat | 1 | 0 | 0 | (128, 64, 128)
sidewalk | 8 | 1 | flat | 1 | 0 | 0 | (244, 35, 232)
parking | 9 | 255 | flat | 1 | 0 | 1 | (250, 170, 160)
rail track | 10 | 255 | flat | 1 | 0 | 1 | (230, 150, 140)
building | 11 | 2 | construction | 2 | 0 | 0 | (70, 70, 70)
wall | 12 | 3 | construction | 2 | 0 | 0 | (102, 102, 156)
fence | 13 | 4 | construction | 2 | 0 | 0 | (190, 153, 153)
guard rail | 14 | 255 | construction | 2 | 0 | 1 | (180, 165, 180)
bridge | 15 | 255 | construction | 2 | 0 | 1 | (150, 100, 100)
tunnel | 16 | 255 | construction | 2 | 0 | 1 | (150, 120, 90)
pole | 17 | 5 | object | 3 | 0 | 0 | (153, 153, 153)
polegroup | 18 | 255 | object | 3 | 0 | 1 | (153, 153, 153)
traffic light | 19 | 6 | object | 3 | 0 | 0 | (250, 170, 30)
traffic sign | 20 | 7 | object | 3 | 0 | 0 | (220, 220, 0)
vegetation | 21 | 8 | nature | 4 | 0 | 0 | (107, 142, 35)
terrain | 22 | 9 | nature | 4 | 0 | 0 | (152, 251, 152)
sky | 23 | 10 | sky | 5 | 0 | 0 | (70, 130, 180)
person | 24 | 11 | human | 6 | 1 | 0 | (220, 20, 60)
rider | 25 | 12 | human | 6 | 1 | 0 | (255, 0, 0)
car | 26 | 13 | vehicle | 7 | 1 | 0 | (0, 0, 142)
truck | 27 | 14 | vehicle | 7 | 1 | 0 | (0, 0, 70)
bus | 28 | 15 | vehicle | 7 | 1 | 0 | (0, 60, 100)
caravan | 29 | 255 | vehicle | 7 | 1 | 1 | (0, 0, 90)
trailer | 30 | 255 | vehicle | 7 | 1 | 1 | (0, 0, 110)
train | 31 | 16 | vehicle | 7 | 1 | 0 | (0, 80, 100)
motorcycle | 32 | 17 | vehicle | 7 | 1 | 0 | (0, 0, 230)
bicycle | 33 | 18 | vehicle | 7 | 1 | 0 | (119, 11, 32)
license plate | -1 | -1 | vehicle | 7 | 0 | 1 | (0, 0, 142)
Example usages:
ID of label 'car': 26
Category of label with ID '26': vehicle
Name of label with trainID '0': road