共计 2611 个字符,预计需要花费 7 分钟才能阅读完成。
背景与痛点
Cityscapes 数据集是自动驾驶和计算机视觉领域广泛使用的基准数据集,包含 50 个城市的街景图像,涵盖 30 多个类别的高质量标注。但对于初学者来说,从下载到使用的全流程往往充满挑战:

- 下载困难:官方服务器位于国外,下载速度极慢,且大文件(约 70GB)容易中断
- 标注复杂 :包含
gtFine、gtCoarse、leftImg8bit等多种目录结构,新手容易混淆 - 标签困惑 :
instanceIds、labelIds、polygons等不同标注类型的使用场景不明确 - 内存问题:高分辨率图像(2048×1024)直接加载可能导致内存溢出
技术方案详解
1. 高效下载方法
推荐使用国内镜像源加速下载(以清华大学开源镜像站为例):
# 基础包下载(约 5GB)wget https://mirrors.tuna.tsinghua.edu.cn/cityscapes/file.zip
# 完整数据集建议使用 axel 多线程下载
axel -n 10 https://cityscapes-dataset.com/file?param=value
2. 目录结构解析
解压后核心目录如下:
cityscapes
├── gtFine # 精细标注
│ ├── train
│ ├── val
│ └── test
├── leftImg8bit # 原始图像
│ ├── train
│ ├── val
│ └── test
└── gtCoarse # 粗糙标注(可选)
关键文件命名规则:{城市}_{序列号}_{帧号}_xxx.png,例如:munster_000173_000019_gtFine_labelIds.png
3. 标注类型对比
| 文件后缀 | 用途 | 数据格式 |
|---|---|---|
_labelIds.png |
语义分割标签 | 单通道 PNG(0-33) |
_instanceIds.png |
实例分割标签 | 单通道 PNG |
_polygons.json |
多边形坐标和物体属性 | JSON |
特别注意:
– instanceIds中的像素值 = labelId * 1000 + instanceNumber
– caravan(大篷车)和train(火车)等标签出现频率低但评测时重要
代码实战
1. 标注可视化
import matplotlib.pyplot as plt
import numpy as np
from PIL import Image
# 定义官方调色板(RGB 顺序)CITYSCAPES_PALETTE = np.array([[128, 64,128], # 道路
[244, 35,232], # 人行道
[70, 70, 70], # 建筑
# ... 其他 33 个类别的颜色
])
def visualize(img_path, label_path):
img = np.array(Image.open(img_path))
label = np.array(Image.open(label_path))
plt.figure(figsize=(12,6))
plt.subplot(121)
plt.imshow(img)
plt.title('Original Image')
plt.subplot(122)
# 将 labelIds 映射为彩色
colored_label = CITYSCAPES_PALETTE[label]
plt.imshow(colored_label)
plt.title('Semantic Segmentation')
plt.show()
2. JSON 标注解析
import json
def parse_polygons(json_path):
with open(json_path) as f:
data = json.load(f)
for obj in data['objects']:
print(f"Label: {obj['label']}")
print(f"Polygon points: {obj['polygon']}")
if 'group' in obj: # 处理组合物体
print(f"Group ID: {obj['group']}")
避坑指南
- 数据集划分:官方测试集标签不公开,提交结果到评测服务器才能获得分数
- 特殊标签处理:
group字段表示多个物体属于同一实例(如公交车的多个车厢)caravan等稀有类别需在训练时加强采样- 内存优化:
- 使用生成器(Generator)逐张加载图片
- 对图像进行分块处理(Tile Processing)
- 考虑降采样到 1024×512 分辨率进行原型开发
延伸应用
1. 转换为 COCO 格式
from pycocotools.mask import frPyObjects
import cv2
def polygons_to_coco(json_path):
# 将 Cityscapes 的多边形转换为 COCO 的 RLE 格式
with open(json_path) as f:
data = json.load(f)
coco_anns = []
for obj in data['objects']:
mask = cv2.fillPoly(np.zeros((1024,2048), dtype=np.uint8),
[np.array(obj['polygon'], dtype=np.int32)],
1
)
rle = frPyObjects([obj['polygon']], 1024, 2048)
coco_anns.append({
'segmentation': rle,
'category_id': obj['labelId'],
'id': obj['instanceId']
})
return coco_anns
2. 在 MMSegmentation 中使用
# configs/_base_/datasets/cityscapes.py
data = dict(
train=dict(
type='CityscapesDataset',
data_root='data/cityscapes/',
img_dir='leftImg8bit/train',
ann_dir='gtFine/train',
pipeline=train_pipeline
)
)
总结建议
- 首次使用时建议先下载
gtFine_trainvaltest小型数据集(5GB)进行原型验证 - 处理实例分割时注意
instanceIds的编码规则 - 可视化阶段推荐使用官方调色板保证颜色语义一致
- 遇到内存问题可考虑使用
mmcv.imfrombytes替代直接加载
通过本文介绍的方法,应该能够避开 Cityscapes 数据集 80% 的常见陷阱。建议在实际项目中先完成小规模验证,再扩展到全量数据训练。
正文完
发表至: 未分类
近一天内
