图像去雾数据集全解析:从RESIDE到NH-HAZE的选择与避坑指南

📅 发布时间:2026/10/2 6:38:09
图像去雾数据集全解析:从RESIDE到NH-HAZE的选择与避坑指南
做图像去雾相关项目的人估计都被同一个问题卡住过论文里报告的 PSNR、SSIM 高得离谱怎么模型一放到自己的数据上就彻底翻车这个问题十有八九出在数据集上。图像去雾数据集不是一个固定答案不同来源、不同场景、不同雾浓度的数据训练出来的模型差距极大。这篇文章基于我这两年整理、筛选、踩坑去雾数据集的实操经验把常见公开数据集的底细、适用范围、内部逻辑一次性讲清楚帮你在选题、对比、复现的时候少走弯路。1. 去雾数据集为什么如此难以建立先说个可能让新人意外的结论真正意义上的真实成对去雾数据集其实非常稀罕。要搞懂这一点得先明白去雾任务对数据的基本要求。1.1 监督训练要求成对数据但成对数据最难标定图像去雾的核心任务是输入一张有雾图像输出一张对应的无雾清晰图。如果走有监督路线就需要同一场景的两张图一张带雾一张不带雾。问题在于真实世界中你几乎不可能在同一个时刻、同一个机位、同一个光照条件下同时拍到带雾和不带雾的画面。雾是流动的、不均匀的不会配合你拍照。常见的解决方案是用造雾设备制造可控雾或者用电脑合成雾。前者成本高、场景受限后者则依赖物理模型存在分布偏差。这就是为什么公开数据集要么是合成的要么规模很小。1.2 大气散射模型是数据生成的底座合成去雾数据几乎都绕不开大气散射模型也就是去雾领域的基础公式I(x) J(x) * t(x) A * (1 - t(x)) 其中 I(x) 是观测到的有雾图像 J(x) 是无雾清晰图像 t(x) 是透射率图取值范围为 [0, 1] A 是全局或局部大气光透射率图一般又由场景深度决定t(x) exp(-β * d(x))β 是散射系数控制雾的浓度d(x) 是场景深度。雾越浓β 越大t(x) 越小远处物体被漂白的程度就越明显。这套公式在 1970 年代由 McCartney 等人提出至今依然是几乎所有去雾模型和数据集的底层依据。实际操作中要生成一张合成雾图你只需要有一张清晰图像 J 和对应的深度图 d然后随机采样 β 和 A带入公式计算即可。看起来简单但真正的坑在于深度图怎么来、β 和 A 的取值范围怎么定以及模型会不会过度拟合这套简化假设。1.3 真实采集去雾数据的三大痛点我自己尝试过真实雾采集也看过别人采集的现场总结下来有三个硬伤第一物理造雾的均匀性极差。用烟雾机或造雾机往场景里喷雾的浓度会随着风向、距离、时间剧烈变化无法精确控制每个位置的透射率。第二像素级对齐很难保证。拍摄无雾图和有雾图之间存在时间差哪怕三脚架纹丝不动树叶、云、光影、行人这些动态物体也会造成错位。对齐软件能缓解全局偏移但局部误匹配在评估指标上会很吃亏。第三真实雾天往往存在空气光污染和反光问题。太阳光、散射光在镜头里的表现不像合成模型里一个全局常数 A 能描述的。所以真实数据集的制作难度和成本往往比数据集本身的名气要大得多。2. 主流公开去雾数据集逐一拆解市面上去雾数据集说多不多说少不少但真正被论文高频引用的就那么几个。下面我从样本构成、获取方式、优劣三个角度逐一展开。2.1 RESIDE 系列几乎所有去雾论文的默认基准RESIDEREalistic Single Image DEhazing是目前使用最广泛的去雾数据集全称很直白——真实感单图去雾基准。2019 年发表在 IJCV 上作者是新加坡国立大学团队。它内部包含多个子集不同子集用途完全不同。核心子集有四个ITSIndoor Training Set室内训练集由 1399 张无雾室内图像合成 13990 张有雾图。合成时随机采样 β 和 A模拟不同雾浓度和光照条件。OTSOutdoor Training Set室外训练集基于 2061 张户外无雾图像通过深度估计获取深度信息合成大约 313950 张有雾图像常见版本约 72 万张也不奇怪不同发布版本数量略有差异。SOTSSynthetic Objective Testing Set综合客观测试集包含 500 张室内测试图和 500 张室外测试图一般用于定量评估。HSTSHybrid Subjective Testing Set混合主观测试集数量少主要用于人工目视评测。RESIDE 最典型的使用方式是用 ITS 或 OTS 做训练集用 SOTS 做测试集。绝大多数经典去雾论文比如 DCP、AOD-Net、DehazeNet、FFA-Net、AOD 等都在 SOTS 上报告 PSNR 和 SSIM。RESIDE 的优点非常突出规模大、场景多、成对数据完整、划分清楚、复现成本低。它最大的争议在于合成雾和真实雾分布不完全一致。室内部分尤其明显β 和 A 随机采样的范围相对有限训练出来的模型很容易对颜色偏移产生偏好。此外RESIDE-β 是一个扩展版本增加了更多场景和更复杂的合成方式。如果你的模型需要更大规模的数据支撑通常用 RESIDE-β 的 OTS 子集做预训练再用目标场景的小数据做微调。2.2 O-HAZE 与 I-HAZE真实雾景的稀缺样本O-HAZE 是室外雾天数据集I-HAZE 是室内雾天数据集两者都由真实拍摄得到。它们出现在 NTIRE 去雾挑战赛的早期阶段后来成为评估模型真实泛化能力的重要指标。O-HAZE 包含 45 对室外场景图像分辨率在 4000×6000 左右每对由同一场景的干净图和人工造雾图组成。采集方式是用造雾机器让整个场景覆盖均匀薄雾场景多为郊区、草地、树木、建筑物整体色调偏绿、偏自然。I-HAZE 包含约 30 对室内场景特点是人造光源复杂、物体表面反光强烈比室外更容易暴露模型对色偏的敏感度。这两个数据集的共同缺点是样本量太小只适合测试和微调不适合从头训练。而且人工造雾和真实自然雾仍有差别造雾机产生的水雾颗粒相对均匀缺少自然界雾气的层次感和远近距离变化。很多研究者在论文里写在 O-HAZE 上验证泛化能力实际上就是评估模型在真实合成雾上的鲁棒性。如果模型在 SOTS 上分数很高在 O-HAZE 上掉得很厉害说明模型大概率过拟合了合成数据。2.3 Dense-Haze 与 NH-HAZE针对浓雾场景的严苛考验Dense-Haze 是 NTIRE 2019 去雾挑战赛使用的数据集特点是浓雾、均匀、高分辨率。它包含 33 对室外图像分辨率为 4000×6000每一对都是浓密均匀的场景。浓雾的透射率 t(x) 非常低几乎在 0.1 到 0.4 之间视觉上物体轮廓几乎被完全淹没。NH-HAZE 则是非均匀雾数据集发布于 2020 年 NTIRE 挑战赛。它包含 55 对室外场景最大的特点是雾在不同空间位置上分布不均匀——有的地方浓、有的地方淡更加贴近真实世界的雾天场景。分辨率和 Dense-Haze 相同都是高分辨率。这两个数据集对现有去雾算法是一个压力测试。大部分基于合成数据训练的模型在 Dense-Haze 上 PSNR 通常只有十几 dB比在 SOTS 上低 5-8 个 dB 是常态。NH-HAZE 的评估难点在于模型必须学会自适应地估计局部透射率而不是全局一个 β。我在实际测试中发现不少先进模型能很好处理低浓度均匀雾到了 NH-HAZE 上会出现局部色偏和伪影。这一类数据集的定位更多是检验算法上限而不是刷榜工具。2.4 HazeRD 与 4KID特定应用场景的补充HazeRD 是一个合成雾数据集规模不大只有 14-15 个场景但它的特殊之处在于作者手动设定了一系列不同天气条件下的散射系数和光学厚度模拟从薄雾到浓雾的连续渐变。HazeRD 通常用于评估算法在不同天气等级下的表现特别是在能见度退化到数十米级别时的稳定性。4KID 是一个 4K 分辨率的去雾数据集主要为高分辨率视频去雾和实时处理设计。它包含的真实场景不多但分辨率高、细节丰富适合测试模型在 4K 输入尺寸下的内存占用和推理速度。另外还有一个很少被单独提及但很有潜力的 HazeWorld。它不是传统成对数据集而是从真实世界雾天视频中构建的。作者通过多视角重建和时域聚合从未知雾天视频里分离出干净背景得到了大量具有真实物理分布的数据样本。这个方向的思路很有意思打破了必须人工合成的限制但重建过程复杂度高所以目前还没有像 RESIDE 那样被广泛采用。2.5 其他值得关注的小众数据集Foggy Cityscapes针对语义分割任务设计的城市街景有雾数据在 Cityscapes 的 3D 场景信息基础上渲染雾效果适合做去雾和分割联合任务。NTIRE 历届挑战赛数据集包括 NTIRE 2018、2019、2020、2023 的多种设置真实、合成、密集、非均匀每年都会发布一些较小但评测标准统一的子集用于赛道比对质量较高。遥感与水下去雾数据集用于特定领域如航拍图像去雾、水下图像恢复。遥感图像的光学特性和普通街景差别很大水下图像则涉及光线吸收和蓝色偏色不能直接用常规数据集替代。如果你做的是通用去雾主力还是离不开 RESIDE O-HAZE / Dense-Haze / NH-HAZE 的组合。3. 合成数据与真实数据的取舍逻辑很多初学者会纠结到底用合成数据还是真实数据答案是看你要解决什么问题。3.1 为什么主流论文仍然用合成数据一句话合成数据能提供可靠的 Ground Truth而且规模可控。即便是最好的真实成对数据集O-HAZE 也只有 45 对Dense-Haze 33 对NH-HAZE 55 对。现代去雾模型动辄上千万参数用几百张图训练会发生什么过拟合严重过拟合。合成数据的优势在于可以生成几乎无限量的成对数据可以精确控制雾浓度、光照方向、大气光值可以生成极端场景比如浓雾、逆光、复杂深度变化评估指标可以精确计算不会因为图像对齐误差污染 PSNR、SSIM。因此绝大多数去雾模型的预训练阶段都依赖合成数据这在工程上是合理选择。3.2 真实数据的价值不在于训而在于验真实数据集的定位更像是试金石。我见过不少团队的做法在 RESIDE-ITS 上训练一个模型在 SOTS 上 PSNR 做到了 32 dB 以上但拿到实际监控画面上一测效果非常一般。这是因为合成雾和真实雾在图像统计特性上存在明显差异真实雾往往伴随着空气颗粒物产生的散射噪声真实雾的透射率不完全符合简单指数衰减模型尤其是近景和远景交界的区域真实雾图像经常伴随光照不均匀、镜头耀斑等视觉退化。真实数据集的意义就是帮你发现模型有没有抓住这些复杂分布。如果模型 O-HAZE / NH-HAZE 上的表现和 SOTS 上差距不大说明模型的泛化能力基本在线如果差距巨大那大概率是过拟合了合成数据。3.3 合成与真实之间的迁移差距怎么缩小目前业界主流做法有几种第一在合成数据上预训练在真实数据上微调。即便真实数据只有几十对也能让模型适应目标域。第二无监督/半监督域自适应。利用真实雾图无需配对无雾图做辅助监督让模型学习真实雾的分布但训练复杂度和不稳定性都比较高。第三数据增强。比如在合成阶段对 β 和 A 的采样范围故意做得比常规情况更大甚至加入随机噪声、模糊、色偏增强模型对分布外情况的鲁棒性。我自己常用的做法是先用 RESIDE 的 OTS 做大规模预训练再用小规模真实数据微调 20-30 个 epoch模型的实测效果往往会有明显提升。4. 用一张对照表快速筛选适合你的去雾数据集搞清楚了每个数据集的底细接下来要做的是根据任务快速锁定目标。我整理了一个对照表包含我最常用到的数据集方便直接参考数据集图像对数量分辨率场景类型雾类型适合用途RESIDE-ITS约 13990 对480×640室内合成均匀雾归回训练快速验证算法稳定性RESIDE-OTS数万到数十万对320×240 起室外合成雾大规模预训练通用去雾模型训练RESIDE-SOTS1000 对左右与 ITS/OTS 一致室内室外合成雾标准定量测试论文横向对比O-HAZE45 对4000×6000室外郊区真实人造雾测试真实泛化能力高分辨率验证I-HAZE约 30 对4000×6000室内真实人造雾室内场景泛化测试Dense-Haze33 对4000×6000室外真实浓雾均匀密集雾场景压力测试NH-HAZE55 对4000×6000室外真实非均匀浓雾非均匀雾压力测试HazeRD约 15 个场景900×600 左右室内室外合成多等级雾多雾浓度定量评估HazeWorld大量真实视频帧视频分辨率各类户外场景自然雾域自适应、无监督训练备选Foggy Cityscapes约 20000 张1024×2048城市街景合成雾带3D信息去雾语义分割联合任务注意这个表里的图像对数量和分辨率不同版本会有些许浮动使用前以官方发布页为准。但规模量级和场景特性是稳定的。4.1 不同下游任务该怎么选择如果你是做论文实验我建议至少保证一个合成数据训练集 一个合成测试集 至少两个真实雾测试集的组合。比如 RESIDE-ITS 训练SOTS 定量测试O-HAZE 和 NH-HAZE 做泛化验证。这样你的实验能比较有说服力。如果你是做落地项目比如安防监控、车载视觉那就不要只盯着 SOTS 的分数。优先找和你的应用场景最接近的数据集做微调哪怕是几十对真实数据也好。车载场景用 Foggy Cityscapes 作为辅助安防场景可以尝试自制目标区域的真实雾数据。如果你是做去雾效果对比评审尽量保持所有模型在完全相同数据划分下训练和测试并且使用官方提供的子集划分避免自己随意裁剪导致测试集混入训练分布。5. 训练实测换数据集踩过的坑与经验这一节是我个人认为最有价值的部分。数据集的坑往往不在下载和解析而在训练过程里的隐性细节。5.1 训练集和测试集千万别混用听起来像废话但实际操作中特别容易踩。RESIDE 的页面提供了多个子集有些版本直接把 ITS 和 SOTS 放在同一个压缩包里。很多人下载完图省事全部解压在一起再统一按比例划分训练和测试结果训练集里混入了测试集的同场景图像神不知鬼不觉指标还特别好看。一旦提交到官方评测分数立刻现原形。正确做法是严格按照官方划分目录操作训练只从训练子集读取测试只从测试子集读取。如果不做官方划分至少要检查测试集和训练集的图像 ID 是否有交集。数据集内部图像 ID 命名太相似很容易忽略建议写个脚本直接比对文件名。5.2 图像尺寸和预处理必须统一不同数据集分辨率差异巨大从 RESIDE 的几百像素到 Dense-Haze 的 4000×6000直接扔进模型会崩。常见做法是训练时随机裁剪成固定尺寸比如 256×256 或 448×448测试时按需缩放。有个容易忽视的细节真实高分辨率数据集 Dense-Haze 和 NH-HAZE 在裁剪之后图像中雾的局部浓度和全局统计会发生变化。如果你在训练时把整张图缩放到 512×512浓雾的透射率分布会被压缩模型学习到的是低分辨率伪浓雾测试时同样缩放效果自然下降。解决办法是优先使用随机裁剪而不是全图缩放保留局部雾浓度信息。另一个坑是像素值范围。RESIDE 一般使用 0-255 整数存储但某些新数据集比如 HazeWorld可能输出范围是 0-1 浮点或 16bit PNG。训练前必须统一归一化方式否则模型前期损失波动会非常大。5.3 评估指标要看得懂、也要会批判去雾领域最常见的指标是 PSNR 和 SSIM这两个指标在同一个数据集上的排名基本能说明问题但它们并不完美。PSNR 对整体像素误差敏感容易被雾没有去除干净但也没完全错的结果骗过去。SSIM 对结构信息敏感但对比度损失和高频细节丢失不一定能被准确反映。表格里多看一眼 CIEDE2000 色差指标能有效补充颜色还原能力的评价。更关键的是测试集和训练集之间的分布差会直接放大指标差距。同一模型在 SOTS 上 PSNR 30 dB在 NH-HAZE 上可能只有 18 dB。不是说模型不行而是 NH-HAZE 的雾浓度和非均匀性远超 RESIDE。横向对比时一定要说明测试集不要拿 SOTS 的指标去和其他模型在 NH-HAZE 上的指标硬比。5.4 我在数据集选择上的常规决策流程我现在做一个去雾项目时数据准备阶段基本固定走三步。第一步评估任务场景。如果主要面向监控/街景就以室外为主面向室内影视修复就偏向 I-HAZE 和室内合成数据。第二步做基线实验。用 RESIDE-ITS 训一个轻量级模型在 SOTS、O-HAZE、NH-HAZE 分别测试建立该任务下的性能基线看模型泛化缺口有多大。第三步定向补数据。如果泛化缺口主要来自浓雾加入 Dense-Haze 或增大合成数据中 β 的范围如果来自非均匀性引入局部区域透射率变化更强的数据增强手段。这三个步骤下来方向基本不会跑偏。6. 找不到合适公开数据时如何自制一份去雾数据集有时候落地项目的场景太特殊比如工厂内部、隧道、水下监测公开数据集根本覆盖不到。这时候不需要慌完全可以自制数据集。下面我分享一套我实际用过的流程。6.1 基于单目深度估计 大气散射模型合成数据如果你只有清晰图像没有深度图可以先通过单目深度估计模型比如 MiDaS、DPT 等生成深度图 d(x)。然后按公式合成有雾图。具体步骤如下准备一批无雾清晰图像 J尽量贴近你的应用场景室内/室外/特定环境。用单目深度估计模型生成深度图归一化到合理范围比如 0.05 到 0.9 之间。随机采样全局大气光 A范围通常设置在 0.7 到 1.0 之间归一化后。随机采样散射系数 β范围根据雾浓度需求设置。薄雾 0.2-0.6中等雾 0.6-1.2浓雾 1.2-2.0极端情况可以更大。计算透射率 t(x) exp(-β * d(x))带入大气散射模型生成 I(x)。可选增强加入高斯噪声、模糊、局部色偏模拟真实成像噪声。这段代码在十几个场景下测试基本一套代码可以批量生成几千对数据。最关键的是 β 和深度图的匹配。如果深度图范围很窄比如所有物体都在 5 米到 10 米之间即使 β 设定很大雾的效果也不会明显。同理如果深度图噪声很大合成雾会出现不自然的条带。6.2 真实拍摄采集流程如果需要真实数据建议按以下流程操作选择静态场景避免车辆、行人、水面波动等动态元素。用三脚架固定相机手动锁死对焦和曝光参数避免两图像之间亮度不一致。先拍摄无雾清晰图再用造雾机向场景喷雾等待雾浓度稳定后快速连续拍摄。每对图像拍摄之间保留 3-5 秒间隔用于后期筛选对齐最好的帧。后期使用简单的平移/仿射对齐工具甚至可以用光流估计做局部微调但不要过度依赖。真实拍摄最大的问题是环境光照变化。太阳从云层出来的那一刻两张图的曝光可能差很多。建议选择阴天或均匀光照环境拍摄能显著降低后期匹配成本。6.3 自制数据集的质量检查清单我每次生成完数据都会跑一遍质量检查避免在错误数据上浪费时间查看透射率图 t(x) 的分布有没有大面积为 0 或全为 1 的异常情况。查看合成雾图的直方图有没有明显的截断或偏色。随机抽取 20-30 对图人工目测有雾图是否自然无雾图和深度图是否对齐。训练一个小模型在验证集上跑 2 个 epoch 观察损失是否正常下降。指标异常、损失爆炸、模型无法收敛90% 都可以溯源到数据集问题。与其反复调参不如先回头审查数据质量。最后分享一个我自己的经验数据集的搜集和整理在项目中的权重比你想象的更高。同样的模型结构在 RESIDE-ITS 上训练 50 epoch 和在一个精心筛选、符合场景分布的自制数据集上训练 30 epoch最终效果可能差出 3-4 个 dB。做去雾研究别把时间全花在调网络结构上多花点时间研究你的数据回报往往来得更快。