1. CityScapes数据集概览第一次接触CityScapes数据集是在2018年做自动驾驶项目时当时为了找一个高质量的城市街景数据集几乎翻遍了所有公开资源。CityScapes的出现确实解决了很多实际问题它比当时流行的KITTI数据集覆盖场景更丰富标注也更精细。这个数据集最吸引我的地方在于它的真实感——采集自50个不同欧洲城市的街景包含春、夏、秋三个季节天气状况也从晴朗到多云都有覆盖。这种多样性对训练鲁棒的视觉模型特别重要。记得有次用其他数据集训练的模型遇到阴天就性能骤降换成CityScapes后这个问题明显改善。数据集包含5000张精细标注的图像train:2975, val:500, test:1525每张分辨率都达到2048×1024。标注采用多边形轮廓对30类物体进行了区分特别在车辆和行人这类动态物体上提供了实例级分割标注。我实测发现这种精细标注让模型在复杂街景中的表现提升约15%的mAP。2. 数据标注深度解析2.1 标注层级体系CityScapes的标注策略很有特色采用三级分类体系8个主类别如vehicle、human19个子类别如car、truck3个特殊标签void、group、dynamic这种层级设计在实际应用中很实用。比如做自动驾驶感知时可以先检测大类的vehicle再细分具体车型。我在项目中就利用这个特性设计了两阶段检测网络推理速度提升了20%。标注文件使用JSON格式存储每个对象包含{ label: car, polygon: [[x1,y1], [x2,y2], ...], objectID: 123 }2.2 CityPersons子集对行人检测任务来说CityPersons是更聚焦的选择。这个子集从CityScapes中提取了所有含行人的帧共2975张训练图像每张平均包含7个行人标注。特别实用的是它提供了两种标注方式全身标注full body可视区域标注visible part在拥挤场景下这两种标注的组合使用能显著改善遮挡情况下的检测效果。我做过对比实验同时使用两种标注时MRMiss Rate能降低8%左右。3. 数据预处理实战3.1 格式转换技巧很多项目需要将数据转为VOC或YOLO格式。这里分享几个实际踩坑后总结的经验VOC格式转换关键点注意CityScapes的坐标原点在左上角多边形标注需要转为矩形框类别ID需要重新映射# 多边形转矩形示例 def poly_to_bbox(points): x_coords [p[0] for p in points] y_coords [p[1] for p in points] return [min(x_coords), min(y_coords), max(x_coords), max(y_coords)]3.2 YOLO格式转换YOLO需要的归一化坐标转换容易出错这里给出经过验证的代码def convert(size, box): Convert CityScapes bbox to YOLO format dw 1./size[0] dh 1./size[1] x (box[0] box[2])/2.0 y (box[1] box[3])/2.0 w box[2] - box[0] h box[3] - box[1] x x*dw w w*dw y y*dh h h*dh return (x,y,w,h)注意CityScapes的标注坐标可能超出图像边界转换时需要做clip操作4. 行人检测专项优化4.1 数据增强策略针对行人检测任务推荐这些增强组合随机裁剪重点保留底部1/3区域色彩抖动模拟不同光照运动模糊处理动态模糊albumentations.Compose([ RandomCrop(height800, width800), HueSaturationValue(hue_shift_limit20), MotionBlur(blur_limit7) ])4.2 处理遮挡问题CityPersons中约35%的行人存在遮挡。实测有效的解决方案RepLoss抑制重复检测OR-CNN引入可见区域分支自适应NMS动态调整IoU阈值在训练数据划分时建议保留原生的train/val划分。因为官方划分已经考虑了城市分布均衡随机划分可能导致跨域性能下降。