cityscapes数据集的理解与使用
前言
Cityscapes数据集是一个广泛用于计算机视觉任务的城市场景分割数据集。它包含来自各个城市街道的高分辨率图像,每个图像都带有像素级别的标签,用于标识不同的物体和场景类别。
一、数据集的下载
数据集官网:https://www.cityscapes-dataset.com/downloads/
首次进入数据集的官网需要注册账号,提供部分身份信息注册完成后,需要等待官方发送账号激活邮件,激活后的账号便可在官网下载相关数据集。
二、数据集的理解
官方解释: 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:用于定性评估的视频序列,这些视频没有标注数据可用。
三、数据集的使用
cityscapes数据集中的网络输入数据(Input Data)一般以“left/rightimg8bitxxxx”名字命名,而目标数据(Target Data)也就是输入数据的真值,一般以“gtxxxx”名字命名,其中“gtFine_trainvaltest”是有着精确标注的5000张数据,而“gtCoarse”则是粗略标注的20000+张数据。
以上为输入数据和目标数据的样例展示,图左即输入数据的路径为
“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)的含义如下图所示
在实际的训练使用中,训练标签值(trainId)为实际计算Loss所用的标签值,通常以训练标签值为255代表背景也就是无需分类的物体。如上图实际需要分类的物体的训练标签值为0到N的自然整数,其所对应的 ignoreInEval 值为False。因此,我们可以根据实际的分类需要自定义数据集的分类数量。具体方法如下:
1. 下载官网的工具包
工具包链接: https://github.com/mcordts/cityscapesScripts
下载完成后将数据集放在工具包内的路径下,如下图
2. 更改labels.py文件中不需要分类物体的 trainId 和 ignoreInEval 值
工具包中 labels.py 文件的路径如下
3. 运行 createTrainIdLabelImgs.py 文件生成 trainid 标签文件
工具包中 createTrainIdLabelImgs.py 文件的路径如下
生成后的标签文件在原数据集路径下,其文件名格式如下
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文件后进行转换,并输出该文件所包含的类别,结果如下
可以看到最终的类别种类是一致的。
Jillian Chen: 这篇才是新手傻瓜式引导
CSDN-Ada助手: 非常棒的博客!你的文章很清晰地介绍了卷积主干网络在深度学习中的重要性和作用。我很期待看到你更多的关于深度学习的博客。除了卷积主干网络,还有一些其他的深度学习主干网络,如残差主干网络、DenseNet、MobileNet等,它们在不同的应用场景下都有着重要的作用。希望你可以在后续的博客中对它们进行探讨。 如何写出更高质量的博客,请看该博主的分享:https://blog.csdn.net/lmy_520/article/details/128686434?utm_source=csdn_ai_ada_blog_reply2 如果您持续创作,完成第三篇博客,并且质量分达到 80 分以上,在评论区就有机会获得红包奖励哦!
CSDN-Ada助手: 恭喜作者再次发表了一篇有价值的博客!通过对cityscapes数据集的理解与使用,读者可以更加深入地了解这一数据集,并为未来的研究提供有用的参考。下一步的创作建议是可以探索其他的数据集,并结合实际应用场景进行研究,这样可以更好地推动深度学习相关领域的发展。再次感谢作者的分享! CSDN 正在通过评论红包奖励优秀博客,请看红包流:https://bbs.csdn.net/?type=4&header=0&utm_source=csdn_ai_ada_blog_reply3,我们会奖励持续创作和学习的博主,请看:https://bbs.csdn.net/forums/csdnnews?typeId=116148&utm_source=csdn_ai_ada_blog_reply3
CSDN-Ada助手: 不知道 Python入门 技能树是否可以帮到你:https://edu.csdn.net/skill/python?utm_source=AI_act_python
CSDN-Ada助手: 恭喜你这篇博客进入【CSDN每天最佳新人】榜单,全部的排名请看 https://bbs.csdn.net/topics/615543795。