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
# 加载模型
model = YOLO("yolo26n-sem.pt") # 加载预训练模型(推荐用于训练)
# 训练模型
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 # 加载模型 model = YOLO("yolo26n-sem.pt") # 加载预训练模型(推荐用于训练) # 训练模型 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 团队。