cityscapes数据集的理解与使用

前言

Cityscapes数据集是一个广泛用于计算机视觉任务的城市场景分割数据集。它包含来自各个城市街道的高分辨率图像,每个图像都带有像素级别的标签,用于标识不同的物体和场景类别。


一、数据集的下载

数据集官网:https://www.cityscapes-dataset.com/downloads/

2cf2650b600042c1b2da02083bda86a7.png

首次进入数据集的官网需要注册账号,提供部分身份信息注册完成后,需要等待官方发送账号激活邮件,激活后的账号便可在官网下载相关数据集。 

二、数据集的理解

官方解释:https://github.com/mcordts/cityscapesScripts

官方对数据集中各路径下的各文件名的含义做出了解释,这里简单翻译一下:

{root}/{type}{video}/{split}/{city}/{city}_{seq:0>6}_{frame:0>6}_{type}{ext}

各个元素的含义如下:

  • root:Cityscapes数据集的根文件夹。
  • type:数据的类型/模态,例如gtFine表示精细的地面真值,leftImg8bit表示左侧的8位图像。
  • split:数据集的划分,即训练集(train)、验证集(val)、测试集(test)、额外的训练集(train_extra)或演示视频(demoVideo)。请注意,并非所有类型的数据都存在于所有划分中,因此偶尔会发现空文件夹。
  • city:数据所属的城市。
  • seq:序列号,由6位数字组成。
  • frame:帧编号,由6位数字组成。请注意,在某些城市中,可能只录制了很少的、非常长的序列,而在某些城市中,可能录制了许多短序列,其中仅有第19帧被注释。
  • ext:文件的扩展名,可选地包含后缀,例如_polygons.json表示地面真值文件。

type的可能取值如下:

  • gtFine:精细的标注数据,包括2975个训练样本、500个验证样本和1525个测试样本。这种类型的标注数据用于验证、测试,并可选择用于训练。标注数据使用包含各个多边形的JSON文件进行编码。此外,我们还提供了像素值编码标签的PNG图像。详细信息请参考helpers/labe ls.py和准备工作中的脚本。
  • gtCoarse:粗略的标注数据,适用于所有的训练和验证图像,以及另外19998个训练图像(train_extra)。这些标注数据可以用于训练,可以与 gtFine 一起使用,也可以单独用于弱监督设置。
  • gtBbox3d:车辆的3D边界框标注。详细信息请参考 Cityscapes 3D (Gählert et al., CVPRW '20)
  • gtBboxCityPersons:行人边界框标注,适用于所有的训练和验证图像。详细信息请参考helpers/labels_cityPersons.py 和 CityPersons (Zhang et al., CVPR '17)。边界框的四个值是(x,y,w,h),其中(x,y)是左上角的坐标,(w,h)是宽度和高度。
  • leftImg8bit:左侧的8位LDR格式图像,这是标准的带有注释的图像。
  • leftImg8bit_blurred:左侧的8位LDR格式图像,人脸和车牌已经模糊处理。请在原始图像上进行结果计算,但在可视化时使用模糊处理后的图像。我们感谢Mapillary对图像进行模糊处理。
  • leftImg16bit:左侧的16位HDR格式图像,每个像素有16位的颜色深度,包含更多信息,特别是在场景的非常暗或非常亮的部分。警告:图像以非标准的16位PNG格式存储,不是所有库都支持。
  • rightImg8bit:右侧的8位LDR格式立体视图。
  • rightImg16bit:右侧的16位HDR格式立体视图。
  • timestamp:记录时间(以纳秒为单位)。每个序列的第一帧的时间戳始终为0。
  • disparity:预计算的视差深度图。要获取视差值,对于每个像素p(p > 0),计算公式为:d = (float(p) - 1.) / 256.,其中p = 0表示无效测量。警告:图像以非标准的16位PNG格式存储,不是所有库都支持。
  • camera:内部和外部相机校准。详细信息请参考csCalibration.pdf。
  • vehicle:车辆测距、GPS坐标和室外温度的车辆测距、GPS坐标和室外温度数据。详细信息请参考csCalibration.pdf。

split的可能取值如下:

  • train:通常用于训练,包含2975个带有精细和粗略标注的图像。
  • val:用于超参数验证,包含500个带有精细和粗略标注的图像。也可以用于训练。
  • test:用于在我们的评估服务器上进行测试。标注数据不公开,但我们提供了方便起见的自车和校正边界的标注。
  • train_extra:可选择用于训练,包含19998个带有粗略标注的图像。
  • demoVideo:用于定性评估的视频序列,这些视频没有标注数据可用。

三、数据集的使用

7a15675b73fe4ec5a4c15c6856c3e2da.png

 cityscapes数据集中的网络输入数据(Input Data)一般以“left/rightimg8bitxxxx”名字命名,而目标数据(Target Data)也就是输入数据的真值,一般以“gtxxxx”名字命名,其中“gtFine_trainvaltest”是有着精确标注的5000张数据,而“gtCoarse”则是粗略标注的20000+张数据。

ada533e22a9f4065ad5953c12604085f.png

 以上为输入数据和目标数据的样例展示,图左即输入数据的路径为

“data\cityscapes\leftImg8bit\train\aachen\aachen_000000_000019_leftImg8bit.png”

图右即目标数据的路径为

“data\cityscapes\gtFine\train\aachen\aachen_000000_000019_gtFine_labelIds.png” 

上述的“xxxx_labelIds.png”文件包含了图像每个像素的标签值,每个标签值(id)的含义如下图所示

a6b33df4f49743df9259ce13a1c13574.png

在实际的训练使用中,训练标签值(trainId)为实际计算Loss所用的标签值,通常以训练标签值为255代表背景也就是无需分类的物体。如上图实际需要分类的物体的训练标签值为0到N的自然整数,其所对应的 ignoreInEval 值为False。因此,我们可以根据实际的分类需要自定义数据集的分类数量。具体方法如下:

1. 下载官网的工具包

工具包链接:https://github.com/mcordts/cityscapesScripts

下载完成后将数据集放在工具包内的路径下,如下图

681b11cb4eda4e0ca3cf1404692dbf36.png

 2. 更改labels.py文件中不需要分类物体的 trainId 和 ignoreInEval 值

工具包中 labels.py 文件的路径如下

f0204a70642e49b286fd4eb43ff10069.png

3. 运行 createTrainIdLabelImgs.py 文件生成 trainid 标签文件

 工具包中 createTrainIdLabelImgs.py 文件的路径如下

a093eba2fc584e8f89bbd7e807ababb9.png

 生成后的标签文件在原数据集路径下,其文件名格式如下

xxxx_gtFine_labelTrainIds.png

除了上述的官方工具方法,还可以直接读取id标签文件“xxxx_gtFine_labelIds.png”,通过id、trainid的对应关系来对读取到的tensor数据进行操作,具体源码如下

ignore_label = 255
label_mapping = {-1: ignore_label, 0: ignore_label, 
                 1: ignore_label, 2: ignore_label, 
                 3: ignore_label, 4: ignore_label, 
                 5: ignore_label, 6: ignore_label, 
                 7: 0, 8: 1, 9: ignore_label, 
                 10: ignore_label, 11: 2, 12: 3, 
                 13: 4, 14: ignore_label, 15: ignore_label, 
                 16: ignore_label, 17: 5, 18: ignore_label, 
                 19: 6, 20: 7, 21: 8, 22: 9, 23: 10, 24: 11,
                 25: 12, 26: 13, 27: 14, 28: 15, 
                 29: ignore_label, 30: ignore_label, 
                 31: 16, 32: 17, 33: 18}

def convert_label(label, inverse=False):
    temp = label.copy()
    if inverse:
        for v, k in label_mapping.items():
            label[temp == k] = v
    else:
        for k, v in label_mapping.items():
            label[temp == k] = v
    return label

以“gtFine/train/aachen/aachen_000000_000019_gtFine_labelIds.png” 为例,粗略地验证两种方法的等效性:先用第一种方法去掉生成labeltrainids文件,并输出该文件所包含的类别;再用第二种方法读取labelids文件后进行转换,并输出该文件所包含的类别,结果如下

5bd9940303da4e45ae80eb7318154765.png

可以看到最终的类别种类是一致的。 

 

 

  • 9
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值