共计 2590 个字符,预计需要花费 7 分钟才能阅读完成。
背景介绍
Cityscapes 数据集是计算机视觉领域,尤其是自动驾驶和场景理解任务中最常用的基准数据集之一。它包含了从 50 个不同城市采集的高质量街景图像,涵盖了各种天气条件和季节变化。数据集提供了精细的像素级标注,支持语义分割、实例分割和全景分割等多种任务。对于刚入门计算机视觉的新手来说,掌握 Cityscapes 数据集的使用是迈向实际项目开发的重要一步。

下载指南
官方 vs 镜像源速度对比
直接从 Cityscapes 官网下载数据集可能会遇到速度慢的问题,特别是对于国内用户。这时可以考虑使用镜像源:
- 官方源:https://www.cityscapes-dataset.com/
- 国内镜像:一些高校和云服务提供商可能有镜像
实际测试中,国内用户使用镜像源通常能获得 5 -10 倍的下载速度提升。
断点续传技巧
对于大文件下载,推荐使用支持断点续传的工具:
-
使用 wget 下载(支持断点续传)
wget -c https://example.com/cityscapes.tar.gz -
使用 aria2c(多线程下载,速度更快)
aria2c -x16 -s16 -c https://example.com/cityscapes.tar.gz
文件校验方法
下载完成后,务必验证文件完整性:
-
使用 MD5 校验
md5sum cityscapes.tar.gz -
或者使用 SHA1
sha1sum cityscapes.tar.gz
将输出与官方提供的校验值对比,确保文件完整无误。
数据结构解析
目录树说明
解压后的 Cityscapes 数据集通常包含以下主要目录:
- leftImg8bit:包含原始 RGB 图像
- train
- val
- test
- gtFine:精细标注
- train
- val
- test
- gtCoarse:粗略标注(可选)
标注格式详解
Cityscapes 的标注使用 JSON 格式存储,包含以下关键信息:
- objects:场景中的各种对象
- polygons:对象的边界多边形
- labels:对象的类别标签
实战代码
使用 OpenCV 加载并可视化语义分割标注
import cv2
import numpy as np
from cityscapesscripts.helpers.labels import trainId2label
def visualize_segmentation(img_path, label_path):
# 加载原始图像
img = cv2.imread(img_path)
# 加载标注图像
label = cv2.imread(label_path, cv2.IMREAD_GRAYSCALE)
# 创建彩色标注图像
colored_label = np.zeros((label.shape[0], label.shape[1], 3), dtype=np.uint8)
for train_id, label_info in trainId2label.items():
if label_info.ignoreInEval:
continue
colored_label[label == train_id] = label_info.color
# 混合显示
blended = cv2.addWeighted(img, 0.7, colored_label, 0.3, 0)
cv2.imshow('Segmentation', blended)
cv2.waitKey(0)
cv2.destroyAllWindows()
将 Cityscapes 转换为 COCO 格式
import json
import os
from pathlib import Path
from typing import Dict, List
class CityscapesToCOCOConverter:
def __init__(self, cityscapes_root: str, output_path: str):
self.cityscapes_root = Path(cityscapes_root)
self.output_path = Path(output_path)
self.coco_data = {"images": [],
"annotations": [],
"categories": []}
def convert(self):
try:
self._create_categories()
self._process_images()
self._save_coco()
except Exception as e:
print(f"Conversion failed: {str(e)}")
raise
def _create_categories(self):
# 实现类别转换逻辑
pass
def _process_images(self):
# 实现图像处理逻辑
pass
def _save_coco(self):
with open(self.output_path, 'w') as f:
json.dump(self.coco_data, f)
避坑指南
内存优化技巧
Cityscapes 图像分辨率很高(2048×1024),处理时容易内存溢出:
- 使用生成器 (Generator) 而非一次性加载所有图像
- 适当降低图像分辨率(但要注意保持长宽比)
- 使用内存映射文件处理大数组
常见标签映射错误
- 混淆 trainId 和 id:trainId 用于训练,id 用于可视化
- 忽略 ignoreInEval 标签:这些标签在评估时应被忽略
多 GPU 训练时的数据分片策略
- 使用 DistributedSampler 确保每个 GPU 获取不同数据
- 调整 batch size 时要考虑显存限制
- 验证数据在不同 GPU 间的分布是否均衡
延伸思考
开发自定义数据集
- 收集与 Cityscapes 相似的街景图像
- 使用相同目录结构和标注格式
- 确保标注质量与原始数据集相当
与其他数据集联合使用
Cityscapes 可以与 BDD100K、Mapillary 等数据集结合使用:
- 统一标注格式
- 处理不同数据集的标签差异
- 注意不同数据集间的 domain gap
进一步学习资源
- Cityscapes 官方文档:https://www.cityscapes-dataset.com/
- 相关论文:《The Cityscapes Dataset for Semantic Urban Scene Understanding》
- GitHub 上的开源实现:cityscapesScripts
通过本指南,希望你能快速掌握 Cityscapes 数据集的使用方法,在计算机视觉项目中取得好成绩!
正文完
发表至: 计算机视觉
近一天内
