news 2026/10/2 6:38:08

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
图像去雾数据集全解析:从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 系列:几乎所有去雾论文的默认基准

RESIDE(REalistic Single Image DEhazing)是目前使用最广泛的去雾数据集,全称很直白——真实感单图去雾基准。2019 年发表在 IJCV 上,作者是新加坡国立大学团队。它内部包含多个子集,不同子集用途完全不同。

核心子集有四个:

  • ITS(Indoor Training Set):室内训练集,由 1399 张无雾室内图像合成 13990 张有雾图。合成时随机采样 β 和 A,模拟不同雾浓度和光照条件。

  • OTS(Outdoor Training Set):室外训练集,基于 2061 张户外无雾图像,通过深度估计获取深度信息,合成大约 313950 张有雾图像(常见版本约 72 万张也不奇怪,不同发布版本数量略有差异)。

  • SOTS(Synthetic Objective Testing Set):综合客观测试集,包含 500 张室内测试图和 500 张室外测试图,一般用于定量评估。

  • HSTS(Hybrid 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)。然后按公式合成有雾图。

具体步骤如下:

  1. 准备一批无雾清晰图像 J,尽量贴近你的应用场景(室内/室外/特定环境)。

  2. 用单目深度估计模型生成深度图,归一化到合理范围,比如 0.05 到 0.9 之间。

  3. 随机采样全局大气光 A,范围通常设置在 0.7 到 1.0 之间(归一化后)。

  4. 随机采样散射系数 β,范围根据雾浓度需求设置。薄雾 0.2-0.6,中等雾 0.6-1.2,浓雾 1.2-2.0,极端情况可以更大。

  5. 计算透射率 t(x) = exp(-β * d(x)),带入大气散射模型生成 I(x)。

  6. 可选增强:加入高斯噪声、模糊、局部色偏,模拟真实成像噪声。

这段代码在十几个场景下测试,基本一套代码可以批量生成几千对数据。最关键的是 β 和深度图的匹配。如果深度图范围很窄,比如所有物体都在 5 米到 10 米之间,即使 β 设定很大,雾的效果也不会明显。同理,如果深度图噪声很大,合成雾会出现不自然的条带。

6.2 真实拍摄采集流程

如果需要真实数据,建议按以下流程操作:

  • 选择静态场景,避免车辆、行人、水面波动等动态元素。
  • 用三脚架固定相机,手动锁死对焦和曝光参数,避免两图像之间亮度不一致。
  • 先拍摄无雾清晰图,再用造雾机向场景喷雾,等待雾浓度稳定后快速连续拍摄。
  • 每对图像拍摄之间保留 3-5 秒间隔,用于后期筛选对齐最好的帧。
  • 后期使用简单的平移/仿射对齐工具,甚至可以用光流估计做局部微调,但不要过度依赖。

真实拍摄最大的问题是环境光照变化。太阳从云层出来的那一刻,两张图的曝光可能差很多。建议选择阴天或均匀光照环境拍摄,能显著降低后期匹配成本。

6.3 自制数据集的质量检查清单

我每次生成完数据都会跑一遍质量检查,避免在错误数据上浪费时间:

  1. 查看透射率图 t(x) 的分布,有没有大面积为 0 或全为 1 的异常情况。
  2. 查看合成雾图的直方图,有没有明显的截断或偏色。
  3. 随机抽取 20-30 对图,人工目测"有雾图是否自然,无雾图和深度图是否对齐"。
  4. 训练一个小模型,在验证集上跑 2 个 epoch 观察损失是否正常下降。

指标异常、损失爆炸、模型无法收敛,90% 都可以溯源到数据集问题。与其反复调参,不如先回头审查数据质量。


最后分享一个我自己的经验:数据集的搜集和整理,在项目中的权重比你想象的更高。同样的模型结构,在 RESIDE-ITS 上训练 50 epoch 和在一个精心筛选、符合场景分布的自制数据集上训练 30 epoch,最终效果可能差出 3-4 个 dB。做去雾研究,别把时间全花在调网络结构上,多花点时间研究你的数据,回报往往来得更快。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/2 6:38:04

ESP32双分区自动回滚原理与工业级OTA实战

1. 为什么说“ESP32刷坏固件变砖”是个过时的误解?“ESP32刷坏了是不是就彻底变砖了?”——这是我在深圳华强北电子市场帮客户调试开发板时,被问得最多的问题之一。几乎每个刚接触ESP32的新手,在第一次烧录失败、串口无响应、LED不…

作者头像 李华
网站建设 2026/10/2 6:38:01

工业总线从入门到实战:协议选型、物理层调试与故障排查

工业总线这个名词,做设备、做产线、做运维的同行肯定不陌生。刚入行的那会儿,我也被PLC、变频器、传感器之间那一堆乱七八糟的线缆搞得头大,后来真正把工业总线的概念和协议捋清楚,才明白现场控制系统的设计思路完全不是一回事&am…

作者头像 李华
网站建设 2026/10/2 6:37:18

交叉学科研究生学位论文开题方案设计:前沿科学问题凝练与抗风险技术路线规划

交叉学科研究生学位论文开题方案设计:前沿科学问题凝练与抗风险技术路线规划在当代研究生培养体系中,跨学科研究已成为产生原创性科研突破与攻克重大复杂工程瓶颈的核心引擎。无论是在生物信息学、医工交叉,还是在智能新材料与能源互联网领域…

作者头像 李华
网站建设 2026/10/2 6:34:49

VSCode 插件离线安装:用 TaoToken 统一 Key 打通 settings.json 配置

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华