Cityscapes数据集下载与标注实战指南:从入门到避坑

1次阅读
没有评论

共计 2611 个字符,预计需要花费 7 分钟才能阅读完成。

image.webp

背景与痛点

Cityscapes 数据集是自动驾驶和计算机视觉领域广泛使用的基准数据集,包含 50 个城市的街景图像,涵盖 30 多个类别的高质量标注。但对于初学者来说,从下载到使用的全流程往往充满挑战:

Cityscapes 数据集下载与标注实战指南:从入门到避坑

  • 下载困难:官方服务器位于国外,下载速度极慢,且大文件(约 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']}")

避坑指南

  1. 数据集划分:官方测试集标签不公开,提交结果到评测服务器才能获得分数
  2. 特殊标签处理:
  3. group字段表示多个物体属于同一实例(如公交车的多个车厢)
  4. caravan等稀有类别需在训练时加强采样
  5. 内存优化:
  6. 使用生成器(Generator)逐张加载图片
  7. 对图像进行分块处理(Tile Processing)
  8. 考虑降采样到 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
    )
)

总结建议

  1. 首次使用时建议先下载 gtFine_trainvaltest 小型数据集(5GB)进行原型验证
  2. 处理实例分割时注意 instanceIds 的编码规则
  3. 可视化阶段推荐使用官方调色板保证颜色语义一致
  4. 遇到内存问题可考虑使用 mmcv.imfrombytes 替代直接加载

通过本文介绍的方法,应该能够避开 Cityscapes 数据集 80% 的常见陷阱。建议在实际项目中先完成小规模验证,再扩展到全量数据训练。

正文完
 0
评论(没有评论)