4. 数据集构建:真实恶劣天气数据采集方案与注意事项

好,咱们进入第四章。这一章聊的是「地基」——数据采集。

说实话,很多团队在恶劣天气感知上栽跟头,不是因为算法不行,而是数据没搞对。你想想看,模型再强,喂进去的都是「假雨」或者「假雾」,那到了真路上肯定露馅。我个人习惯是,先把采集方案想清楚,再动手。不然几十万花出去,回来一堆废片,那才叫心疼。

4.1 真实数据 vs 合成数据:别迷信任何一方

先解决一个核心问题:到底用真实采集还是用合成数据?

我的答案是:都要,但主次分明。

  • 真实数据:不可替代。雨滴的物理形态、雾气的散射特性、路面反光的随机性,这些合成数据很难完美模拟。我在项目中遇到过,用GAN生成的雨景训练模型,到了真实雨天,检测框直接飘走。为什么?因为合成雨滴的折射角度太「完美」了,真实世界的雨滴是歪的、脏的、带气泡的。
  • 合成数据:用来补长尾。比如「暴雨+夜间+对向远光灯」这种组合,你等一年可能都拍不到几段。这时候用合成数据做数据增强,能快速补齐短板。

我的建议比例:真实数据占70%,合成数据占30%。合成数据只用来做「极端场景」的补充,不要喧宾夺主。

4.2 采集设备选型:别省钱,但别乱花钱

设备选型这块,我踩过不少坑。简单说说几个关键点。

4.2.1 相机:全局快门是底线

为什么?因为雨天雨滴运动速度快,卷帘快门会导致雨滴变形,变成一条条「拉丝」。你想想看,模型看到这种拉丝,它学到的到底是雨滴还是某种奇怪的条纹?

我个人习惯用全局快门CMOS,帧率至少30fps,分辨率不低于1920x1080。如果预算允许,上2MP或5MP的工业相机,动态范围要大于120dB。为什么?因为雨雾天气下,场景的动态范围会急剧增大——天空很亮,路面很暗,普通相机直接过曝或欠曝。

小技巧:如果只能用卷帘快门,那就把曝光时间控制在1ms以内,能减轻雨滴变形。但说实话,治标不治本。

4.2.2 激光雷达:多线束是王道

雨雾天气下,激光雷达的衰减很严重。我测试过几种主流方案:

激光雷达类型 雨雾穿透能力 我的评价
905nm(常规) 中等 小雨还行,中雨以上点云稀疏
1550nm(光纤) 较强 穿透力好,但贵,功耗高
固态激光雷达 较弱 视场角小,雨雾天基本废一半

我的建议是:如果做L4级自动驾驶,至少上64线以上的1550nm激光雷达。别心疼钱,你想想看,高速上遇到团雾,激光雷达失效了,那后果...嗯,你懂的。

4.3 采集场景设计:覆盖「坏天气」的完整维度

数据采集不是随便找个下雨天出去跑一圈就完事了。你需要设计一个场景矩阵

我个人习惯把恶劣天气拆成三个维度:

  1. 天气类型:雨(小雨/中雨/暴雨)、雾(薄雾/浓雾/团雾)、雪(小雪/大雪/暴雪)、冰雹、沙尘
  2. 光照条件:白天、黄昏、夜间、黎明、隧道出入口(光照突变)
  3. 道路环境:城市道路、高速公路、乡村道路、隧道、桥梁、环岛

这三个维度组合起来,理论上会有几十种场景。但实际采集时,你不可能全部覆盖。我的做法是:优先覆盖「高影响+高频率」的组合。比如「暴雨+夜间+城市道路」这个组合,对感知影响极大,而且实际中经常遇到,必须优先采集。

注意:千万别忽略「天气过渡场景」。比如雨刚停、路面还湿的时候,反光特别严重。这种场景比暴雨本身更容易导致误检。我曾经吃过这个亏,模型在暴雨中表现很好,结果在「雨后初晴」的路面上疯狂误检水坑为障碍物。

4.4 采集流程与质量控制

采集流程这块,我总结了一套「三检制」:

  • 采集前检查:设备是否清洁?镜头有没有水渍?激光雷达窗口有没有泥点?这些细节直接影响数据质量。我见过有人采集了一整天,回来发现镜头上有指纹,整批数据全废。
  • 采集中监控:安排专人实时查看采集画面。如果发现数据异常(比如相机过曝、激光雷达点云稀疏),立即停车调整。别想着「回去再处理」,回去就晚了。
  • 采集后复核:每天采集结束后,随机抽检10%的数据。重点看:时间戳是否对齐?传感器之间是否有时间偏移?GPS轨迹是否连续?

我的习惯:每次采集前,先拍一段「标定板」视频。这样后期如果发现数据有问题,可以快速定位是设备问题还是环境问题。

4.5 数据标注:恶劣天气下的特殊处理

标注这块,常规的2D框、3D框我就不多说了。重点说说恶劣天气下的特殊标注规则。

4.5.1 雨滴/雾气区域标注

很多团队只标注目标物体(车、人、路标),不标注天气本身。这是个误区。我建议把雨滴遮挡区域雾气浓度区域也标注出来。为什么?因为后续做去雨/去雾算法时,你需要知道哪些区域被遮挡了,哪些区域是干净的。

标注格式可以这样:

{
  "image": "frame_001.jpg",
  "objects": [
    {"class": "car", "bbox": [100, 200, 300, 400]},
    {"class": "pedestrian", "bbox": [500, 300, 600, 450]}
  ],
  "weather_mask": {
    "rain_region": [[0, 0, 200, 1080], [800, 0, 1920, 1080]],
    "fog_density": 0.7  // 0-1,1为最浓
  }
}

4.5.2 模糊目标的标注策略

雨雾天气下,远处的目标会变得模糊。这时候要不要标注?我的答案是:标注,但加一个「置信度」标签

比如:

  • 清晰可见的目标:置信度1.0
  • 部分遮挡/模糊的目标:置信度0.7
  • 几乎看不清但确实存在的目标:置信度0.4

这样训练时,模型可以学习到「模糊目标也是目标」,但权重会低一些。我曾经试过把所有模糊目标都标成「忽略」,结果模型在雨雾天直接无视了远处的车辆——那太危险了。

4.6 数据清洗:别让脏数据毁了你的模型

数据采集回来,别急着训练。先做一轮清洗。

我常用的清洗规则:

  • 剔除模糊帧:运动模糊严重的帧,直接扔掉。可以用拉普拉斯算子计算图像清晰度,低于阈值的剔除。
  • 剔除重复帧:车辆静止时,连续帧几乎一样。保留一帧即可,避免数据冗余。
  • 剔除异常帧:比如激光雷达点云突然消失、相机画面出现黑块。这些通常是设备故障,不是天气现象。

避坑指南:我曾经因为偷懒,没有清洗数据,直接把采集到的5000帧扔进训练集。结果模型学到的不是雨雾特征,而是某个相机镜头的污点位置。那段时间模型在某个固定区域总是误检,排查了三天才发现是数据问题。

4.7 数据存储与管理:别等要用时找不到

最后说一句数据管理。恶劣天气数据采集成本高,别丢了。

我的管理方案:

  • 按场景分类存储:文件夹命名规则为「天气_光照_道路_日期」,比如「rain_heavy_night_highway_20241001」
  • 建立元数据数据库:用SQLite或CSV记录每条数据的天气参数、采集时间、设备参数、GPS坐标
  • 定期备份:至少双备份,一份本地,一份云端。我见过硬盘坏了,半年数据全丢的惨案。

嗯,数据采集这块就聊这么多。说白了,数据质量决定了算法上限。你算法再牛,数据不行,那就是「巧妇难为无米之炊」。下一章咱们聊聊数据增强——怎么用有限的数据,变出无限的可能。