深度学习去雾方法调研:2023 年部署实测记录
编写时间:2023-09
把能跑的深度学习去雾方法在真实监控/道路雾天素材上测了一遍。出发点很简单:现有 CUDA 传统算法能实时,但浓雾区生成感强、颜色有失真、边缘有残雾。想看看深度学习能不能补这些。
现有算法的具体问题
传统 CUDA 去雾(基于对比度增强 + 引导滤波)在大多数中轻雾场景表现可以,但在几类典型场景上出问题:
- 浓雾 / 远处信息不足区域:透射率接近 0,反推公式
J = (I-A)/t + A会把噪声和压缩伪影一起放大,出现色块和涂抹。 - 偏色:大气光
A如果被白色物体或过曝区域误导,整张图会偏色。block级别的t估计在 Resize 和引导滤波之后丢了一些细节,导致局部偏色——白色车变蓝、路面偏紫之类。 - 边缘残雾:块级透射率对景深突变(建筑边缘、电线杆)照顾不到,引导滤波只能部分缓解。
这些问题是物理模型 + 估计误差共同造成的,不是调参数能根治的。所以开始看深度学习路线有没有更好的答案。
数据集:为什么论文指标和真实效果差这么多
先看一圈数据集,这是理解后续所有问题的关键:
| 数据集 | 类型 | 规模 | 问题 |
|---|---|---|---|
| RESIDE | 合成配对 | 3w+ 张,最常用 | 室内/室外合成的雾,和真实监控雾差距大 |
| I/O HAZE / NH HAZE | 真实雾配对 | 各几十张 | 规模太小,只能测试不能训练 |
| MDID | 真实采集多雾图 | 小规模 | 无配对,只能定性看 |
| BeDDE | 同场景长时采集+后处理 | 小规模 | 最接近真实但规模太小 |
RESIDE 是几乎所有方法默认的训练集,但它的问题是:合成雾是均匀的、有 ground truth 的、没有压缩损伤的。真实监控里的雾是非均质的(一团一团)、叠加了 H.264 压缩伪影、曝光在变化、远处信息已经物理上丢失了。
这就解释了一个反复出现的现象:论文指标好 ≠ 真实素材好。模型学的是 RESIDE 的雾,碰到的却是完全不同的东西。
四个路线
大致可以把现有方法分成四类:
| 路线 | 代表方法 | 核心思路 | 实际表现 |
|---|---|---|---|
| ① ASM + DL | DehazeNet, AOD-Net, MSCNND | 网络替代传统方法估计 t/A,再用物理模型反推 | 比传统方法没有明显提升,受限于 ASM 本身 |
| ② 端到端 | FFA-Net, DehazeFormer, gUNet, SFNet | 跳过物理模型,CNN/Transformer 直接学映射 | 合成数据上最好,真实浓雾几乎无效 |
| ③ 非配对 | RIDCP, RefineDNet, PSD, ZID | GAN / codebook / 自监督,不依赖配对数据 | 最有希望的路线,但生成幻觉是普遍问题 |
| ④ 知识迁移 | PSD | 合成预训练 backbone → 真实无监督微调 | 思路对,但当前速度太慢 |
模型实测记录
| 方法 | 发表 | 路线 | 部署观感 | 主要问题 |
|---|---|---|---|---|
| RefineDNet | TIP 2021 | 非配对 + GAN | 部署效果最好,颜色自然 | 浓雾/远距离有明显涂抹感,GAN 生成不可靠 |
| MGF-Dehazing | MTAP 2022 | 传统 + GF | 色彩偏差较小 | 部分白色细节丢失,matlab → C++ 成本高 |
| PSD | CVPR 2021 Oral | 知识迁移 | 比 RIDCP 好,去雾中等 | FFA backbone 太慢(4090 也要几秒),偏色明显 |
| CEEF | TMM 2021 | 传统增强 | 效果还行,没深度方法那种诡异色块 | 有过增强、偏色、边缘残雾 |
| RIDCP | CVPR 2023 | 非配对 codebook | 部分浓雾样例有效 | 某些场景负优化,模型偏大 |
| DehazeFormer | TIP 2022 | 端到端 Transformer | RESIDE 上 SOTA | 真实浓雾几乎无效,端到端的通病 |
| SSIF_CEEF | JVCIR 2022 | 传统增强 | 对比度比 CEEF 更强 | 噪点和颗粒感明显增加 |
| gUNet | arXiv 2022 | 端到端 U-Net | 合成数据尚可 | 真实浓雾无效 |
| FFA-Net | AAAI 2020 | 端到端 Attention | 公开数据集上可以 | 真实非均质雾完全不去雾 |
| MSCNND | — | ASM + CNN | 视觉上接近 CUDA | Matlab/CNN 耗时增加太多 |
| SFNet | ICLR 2023 | 端到端 频域 | 基本没效果 | 可能部署有误,未深挖 |
| ZID | — | 零样本 | 想法有趣 | 效果不理想 |
| AECR-Net | — | — | 没深入 | issue 和部署问题多,跳过 |
逐个方法展开
RefineDNet(TIP 2021)
做法是两阶段:先用暗通道先验(DCP)粗去雾,再用 GAN 做非配对真实图像域的精炼。关键洞察是:DCP 保证了一定的物理合理性,GAN 只负责补"看起来更真"的细节。
实测去雾效果确实是这批方法里最好的,颜色也比 PSD/FFA 自然。但问题是——GAN 生成的信息不可靠。浓雾区、远距离建筑边缘、树林和天空交界处有明显的涂抹感,像油画。单帧看还行,视频里连续帧的涂抹位置会漂,闪烁很明显。
MGF-Dehazing(MTAP 2022)
非深度学习,用多尺度引导滤波生成透射图来抑制信息损失。实测色彩偏差比深度方法小,但部分白色细节被抹掉了,整体偏暗。bad case 和现有 CUDA 算法接近,工程迁移(matlab → C++)成本高。
PSD / Principled S2R(CVPR 2021 Oral)
思路是这批方法里比较完整的:合成数据预训练 → 用物理先验做无监督微调。backbone 用 FFA-Net。实测比 RIDCP 好一些,去雾效果中等,但有两个硬伤:FFA backbone 在 4090 上也要几秒一帧,没法实时;偏色仍然明显。
CEEF(TMM 2021)& SSIF_CEEF(JVCIR 2022)
CEEF 是非深度学习方法,把去雾拆成对比度增强 + 曝光融合两步:gamma 校正 + CP-AHE 拉对比度,再通过结构块分解融合。Matlab 实现。效果比预想的好,有过增强和偏色但没有深度方法那种诡异的色块。SSIF_CEEF 是改进版,加了平滑-锐化滤波(SSIF),对比度更强了但噪点也明显加重,颗粒感很强。
RIDCP(CVPR 2023)
思路值得单说:用 VQGAN 从大规模清晰图像(DIV2K, Flickr2K)学一个高清码本,再训练编码器把退化图映射到码本做重建。退化管线考虑了雾、模糊、颜色偏移、JPEG 压缩。想解决的核心问题是"合成数据不够真"。实测:部分浓雾样例有效果,但有些场景是负优化——把正常区域也改了,而且模型偏大。
端到端路线(FFA-Net / DehazeFormer / gUNet / SFNet)
这几个放一起说,因为问题高度一致:在 RESIDE 上指标都很好(DehazeFormer 甚至是 SOTA),但碰到真实浓雾素材基本不去雾。问题不在网络设计,在训练数据和测试数据的域差异太大。端到端路线如果不解决训练数据问题,结构再 fancy 也没用。
阶段判断
深度学习去雾最大的问题不是"论文指标不够好",而是工程输入和论文输入不一致。公开数据集通常是配对、合成或相对规整的雾图,真实监控视频里的雾则是非均质、局部遮挡、压缩损伤、曝光不稳、远处信息缺失一起出现。
本轮实测下来的排序大致是:RefineDNet > MGF > PSD / CEEF > RIDCP(仅指真实监控素材上的观感,不是论文指标)。
但即使效果最好的 RefineDNet,也不能直接替代现有 CUDA 算法。视频去雾不只是单帧问题——GAN 生成的细节在连续帧之间不稳定,闪烁比传统方法的边缘残雾更难接受。更深一层的问题是:不是哪个模型更好,而是整个监督训练范式在真实去雾上很难成立。配对数据无法大规模获取,合成数据又差距太大。
可能方向
- 非配对 / 弱监督 + 物理先验(PSD 路线):用物理模型做约束,不让网络瞎生成。
- GAN / 生成式做精炼而不是做主干(RefineDNet 路线):传统方法保证结构,GAN 只补纹理。但 GAN 幻觉需要更可靠的约束。
- 深度信息参与:如果能有可靠的深度估计,可以修正 airlight mask 和透射图,特别是远景和天空区域。但深度估计本身也有成本。
- 更好的合成数据:UE5 或仿真管线生成可控雾天场景,比 RESIDE 更接近真实非均质雾。
这轮调研的结论不是"深度学习不行",而是当前阶段的工程输入和论文输入差太远。在更可控的合成数据或更强的物理约束出现之前,继续优化传统算法的估计过程和 CUDA 实现是更可靠的路径。