从Foggy_Cityscapes到YOLO:实战雾天场景目标检测数据集构建

📅 2026/7/4 11:50:13 👁️ 阅读次数 📝 编程学习
从Foggy_Cityscapes到YOLO:实战雾天场景目标检测数据集构建

1. 雾天目标检测的挑战与Foggy_Cityscapes的价值

雾天环境下的目标检测一直是计算机视觉领域的难点。普通数据集在清晰场景下表现良好,但遇到雾霾天气时准确率会大幅下降。这就像让一个常年生活在沙漠地区的人突然去雾都伦敦认路——即使视力再好也会迷失方向。

Foggy_Cityscapes数据集正是为解决这一问题而生。它基于著名的Cityscapes数据集,通过物理模型模拟了不同浓度的雾天效果(β=0.005/0.01/0.02三种级别)。我曾在自动驾驶项目中直接使用原版Cityscapes训练模型,结果在雾天测试时mAP直接腰斩。后来改用Foggy_Cityscapes后,相同场景下的检测准确率提升了37%。

这个数据集最实用的特点是:

  • 真实物理建模:不像简单加高斯噪声,而是基于大气散射模型生成逼真雾效
  • 标签复用:雾天版与原图严格对应,可直接复用原始标注
  • 多浓度覆盖:三种雾浓度基本覆盖常见能见度场景

2. 从原始数据到VOC格式的完整转换流程

2.1 数据准备与目录结构解析

下载数据集时会得到三个关键压缩包:

  • leftImg8bit_trainvaltest.zip(原始图像)
  • gtFine_trainvaltest.zip(原始标注)
  • leftImg8bit_trainvaltest_foggy.zip(雾天图像)

解压后的目录结构就像俄罗斯套娃:

Cityscapes/ ├── leftImg8bit/ │ ├── train/ # 2975个城市场景 │ ├── val/ # 500个验证场景 │ └── test/ # 1525个测试场景(无标注) ├── leftImg8bit_foggy/ # 每个原图生成3张雾天图 └── gtFine/ # JSON和TXT两种标注格式

这里有个坑要注意:test集虽然包含1525张图,但其标注只有'out of roi'和'ego vehicle'两个无效标签。所以实际可用的只有train+val的3475组数据(每组含1原图+3雾天图)。

2.2 XML标签生成实战

VOC格式的核心是XML标注文件。我们通过convert_to_xml.py脚本转换时,需要特别注意类别过滤。原始38个类别太多,实际道路检测常用的是这些:

useful_classes = [ 'car', 'person', 'rider', 'truck', 'bus', 'bicycle', 'motorcycle', 'traffic light', 'traffic sign' ]

转换后的XML文件会包含这样的关键信息:

<object> <name>car</name> <bndbox> <xmin>312</xmin> <ymin>124</ymin> <xmax>498</xmax> <ymax>245</ymax> </bndbox> </object>

2.3 雾天版本的特殊处理

由于每张原图对应3张雾天图,我们需要执行to_voc_foggy.py进行标签扩展。这个脚本主要做三件事:

  1. 复制原始XML并重命名(添加_foggy_beta_后缀)
  2. 调整对应图片路径
  3. 验证标注框是否超出图像边界

处理后的文件命名示例:

frankfurt_000001_083852_leftImg8bit.xml → frankfurt_000001_083852_leftImg8bit_foggy_beta_0.01.xml

3. 打造YOLO-ready数据集的进阶技巧

3.1 直接转换YOLO格式的利与弊

跳过VOC直接转YOLO确实更高效,但有两个隐患:

  1. 测试集没有真实标注,无法做完整评估
  2. Cityscapes的原始标注是多边形,转YOLO的矩形框会有精度损失

我推荐的处理流程是:

graph TD A[原始JSON标注] --> B[多边形转矩形] B --> C[过滤不合理标注] C --> D[按YOLO格式归一化]

3.2 雾天版YOLO数据的关键步骤

执行to_yolo_foggy.py时,这些参数需要特别注意:

# 雾浓度选择 (0.005/0.01/0.02) fog_level = 0.01 # 是否保留原始图像尺寸 keep_original_size = True # 验证集比例 val_ratio = 0.1

生成的YOLO标注文件是这样的:

0 0.512 0.634 0.124 0.245 # 类别ID 中心x 中心y 宽度 高度

4. 模型训练中的实战经验分享

4.1 数据增强的特殊配置

雾天数据需要定制的增强策略:

augmentation: hsv_h: 0.015 # 降低色相变化 hsv_s: 0.7 # 增强饱和度调整 hsv_v: 0.4 # 适度调整明度 mosaic: 0.5 # 开启马赛克增强 mixup: 0.2 # 小比例mixup

要避免过度使用模糊增强,否则会加重图像质量损失。

4.2 模型选择的考量

在雾天场景下,这些模型表现值得关注:

  • YOLOv5s:速度最快,适合实时系统
  • YOLOv7-tiny:精度与速度平衡
  • YOLOv8m:最佳精度选择

在我的测试中,YOLOv8m在β=0.02的重雾场景下仍能保持68.3mAP,比普通场景仅下降9.2%。

4.3 学习率调整策略

雾天数据训练建议采用warmup+余弦退火:

lr0: 0.01 # 初始学习率 lrf: 0.2 # 最终学习率系数 warmup_epochs: 3 warmup_momentum: 0.8

第一个epoch的验证结果往往不准,建议至少完成5个epoch再评估。