Cityscapes 数据集#
Cityscapes 数据集是一个大规模语义分割基准,涵盖在 50 个欧洲城市采集的城市街景,包含 2,975 张精细标注的训练图像和 500 张验证图像,分为 19 个类别。它是自动驾驶研究和城市场景理解中最广泛使用的数据集之一,支持 Ultralytics YOLO 模型相关工作。
主要特性#
- Cityscapes 精细标注包含 2,975 张训练图像和 500 张验证图像,分为 19 个类别;该存档还提供 1,525 张测试图像,但其发布的掩码仅标注自车和图像边界——实际类别标注未公开,官方测试集得分需要将预测结果提交到 Cityscapes 评估服务器。
- 该数据集涵盖 19 个评估类别,分属平面、人体、车辆、建筑、物体、自然和天空类别。
- Cityscapes 为语义分割提供了平均交并比 (mIoU) 等标准化评估指标,从而能够有效比较模型性能。
- 在决定下载约 ~11 GB 的手动存档之前,先使用 8 张图像的 Cityscapes8 子集对训练流程进行基本检查。
数据集结构#
准备完成后,Ultralytics 配置要求采用以下目录结构:
cityscapes/
├── images/
│ ├── train/
│ ├── val/
│ └── test/
└── masks/
├── train/
├── val/
└── test/Cityscapes 不支持自动下载存档。在 Cityscapes 网站上创建账户,然后下载 leftImg8bit_trainvaltest.zip 和 gtFine_trainvaltest.zip 存档(合计约 ~11 GB),并将两者解压到 cityscapes 数据集根目录下。首次训练时,Ultralytics 会自动将它们重新整理为上方所示的 images/ 和 masks/ 目录结构。
语义掩码是单通道 PNG 文件。原始 Cityscapes 标签 ID 通过 label_mapping 部分映射到标准的 19 个训练 ID,忽略或无效标签则映射到 255,因此不会参与训练和评估。
公开发布的 gtFine/test 掩码仅标注自车和图像边界区域——所有其他类别均为无效区域。在 val 划分上计算 mIoU 以进行本地评估;官方测试集得分需要将预测结果提交到 Cityscapes 评估服务器。
应用#
Cityscapes 广泛用于训练和评估语义分割领域的深度学习模型,尤其适用于自动驾驶、高级驾驶辅助系统 (ADAS) 和城市机器人研究。
其高分辨率图像和详细标注也使其非常适合实时场景解析、车道与障碍物理解,以及任何需要对复杂城市环境进行密集像素级理解的任务研究。预训练的 YOLO26 语义分割模型在 Cityscapes 验证集上的 mIoU 最高可达 83.6;完整基准测试表请参阅语义分割模型页面。你可以通过 Ultralytics Platform 在整个模型开发流程中整理、可视化和管理 Cityscapes 数据。
数据集 YAML#
数据集 YAML 文件定义了 Cityscapes 的路径、类别、掩码目录和标签映射。cityscapes.yaml 文件维护在 https://github.com/ultralytics/ultralytics/blob/main/ultralytics/cfg/datasets/cityscapes.yaml。
# Ultralytics 🚀 AGPL-3.0 License - https://ultralytics.com/license
# Cityscapes semantic segmentation dataset (19 classes)
# Documentation: https://docs.ultralytics.com/datasets/semantic/cityscapes
# Example usage: yolo semantic train data=cityscapes.yaml model=yolo26n-sem.pt
# parent
# ├── ultralytics
# └── datasets
# └── cityscapes ← downloads here (11 GB)
# └── images
# └── masks
# Dataset root directory
path: cityscapes # dataset root dir
train: images/train # train images (relative to 'path') 2975 images
val: images/val # val images (relative to 'path') 500 images
test: images/test # test images (relative to 'path') 1525 images
masks_dir: masks # semantic mask directory
# Cityscapes 19-class labels
names:
0: road
1: sidewalk
2: building
3: wall
4: fence
5: pole
6: traffic light
7: traffic sign
8: vegetation
9: terrain
10: sky
11: person
12: rider
13: car
14: truck
15: bus
16: train
17: motorcycle
18: bicycle
# Map source label IDs to train IDs; ignore_label is converted to 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
# Preparation script (requires manual Cityscapes download)
download: |
from pathlib import Path
from shutil import copy2
cityscapes_dir = Path(yaml["path"]) # dataset root dir
# Download and extract the official Cityscapes leftImg8bit and gtFine archives into cityscapes_dir first.
leftimg8bit_dir = cityscapes_dir / "leftImg8bit"
gtfine_dir = cityscapes_dir / "gtFine"
for split in ("train", "val", "test"):
print(f"Processing {split} set")
src_image_dir = leftimg8bit_dir / split
dst_image_dir = cityscapes_dir / "images" / split
dst_mask_dir = cityscapes_dir / "masks" / split
dst_image_dir.mkdir(parents=True, exist_ok=True)
dst_mask_dir.mkdir(parents=True, exist_ok=True)
image_paths = sorted(src_image_dir.rglob("*_leftImg8bit.png"))
for image_path in image_paths:
relative_path = image_path.relative_to(src_image_dir)
mask_path = gtfine_dir / split / relative_path.parent / image_path.name.replace(
"_leftImg8bit.png", "_gtFine_labelIds.png"
)
if not mask_path.exists():
raise FileNotFoundError(f"Mask not found for {image_path}: {mask_path}")
image_name = image_path.name.replace("_leftImg8bit", "")
mask_name = mask_path.name.replace("_gtFine_labelIds", "")
copy2(image_path, dst_image_dir / image_name)
copy2(mask_path, dst_mask_dir / mask_name)使用方法#
要在 Cityscapes 数据集上训练 YOLO26n-sem 模型 100 个周期,并将图像尺寸设为 1024,你可以使用以下代码片段。如需查看可用参数的完整列表,请参阅模型的训练页面。
from ultralytics import YOLO
# Load a model
model = YOLO("yolo26n-sem.pt") # load a pretrained model (recommended for training)
# Train the model
results = model.train(data="cityscapes.yaml", epochs=100, imgsz=1024)引用、许可证和致谢#
Cityscapes 采用定制的非商业许可发布——可免费用于学术研究和评估,但商业使用、许可或重新分发数据需要获得 Cityscapes 团队的单独许可。
如果你在研究或开发工作中使用 Cityscapes 数据集,请引用以下论文:
@inproceedings{Cordts2016Cityscapes,
title={The Cityscapes Dataset for Semantic Urban Scene Understanding},
author={Cordts, Marius and Omran, Mohamed and Ramos, Sebastian and Rehfeld, Timo and Enzweiler, Markus and Benenson, Rodrigo and Franke, Uwe and Roth, Stefan and Schiele, Bernt},
booktitle={Proc. of the IEEE Conference on Computer Vision and Pattern Recognition (CVPR)},
year={2016}
}我们感谢 Cityscapes 团队为自动驾驶和计算机视觉社区创建并维护这一宝贵资源。有关 Cityscapes 数据集及其创建者的更多信息,请访问 Cityscapes 数据集网站。
常见问题#
Cityscapes 数据集是一个大规模语义分割基准,涵盖 50 个欧洲城市的城市街景,广泛用作自动驾驶和 ADAS 研究的标准参考。其 19 个精细标注的评估类别、高分辨率图像以及标准化的平均交并比 (mIoU) 指标,使其成为密集场景理解模型最常引用的基准之一。
要在 Cityscapes 数据集上训练 YOLO26n-sem 模型 100 个周期,并将图像尺寸设为 1024,你可以使用以下代码片段。如需查看可用参数的详细列表,请参阅模型的训练页面。
训练示例from ultralytics import YOLO # Load a model model = YOLO("yolo26n-sem.pt") # load a pretrained model (recommended for training) # Train the model results = model.train(data="cityscapes.yaml", epochs=100, imgsz=1024)准备完成后,数据集会整理为
images/{train,val,test}/和masks/{train,val,test}/目录,其中每张图像都对应一个单通道 PNG 掩码。Ultralytics YAML 文件通过masks_dir: masks字段将每张图像与其掩码配对,并使用label_mapping将原始 Cityscapes 标签 ID 转换为标准的 19 个连续训练 ID,同时将忽略和无效标签映射到255。test划分中的掩码仅标注自车和边界区域,因此请使用val进行本地 mIoU 检查。是的。在 Cityscapes 网站上创建账户并下载
leftImg8bit_trainvaltest.zip和gtFine_trainvaltest.zip存档(合计约 ~11 GB)。将两者解压到cityscapes数据集根目录下——首次训练时,Ultralytics 会自动将它们重新整理为预期的images/和masks/目录结构。Cityscapes 源掩码存储的原始标签 ID 与评估所使用的 19 个训练 ID 不同。
label_mapping部分会将有效标签转换为连续的类别 ID0–18,并将255分配给忽略和无效标签,使其在训练和验证期间不会计入损失和指标。不可以。Cityscapes 采用非商业许可发布,允许用于学术研究、教学和评估,但禁止将该数据集或其衍生作品用于商业用途、许可或销售。如需商业许可选项,请直接联系 Cityscapes 团队。