简介本资源是一套基于Vision Transformer架构的图像去雾算法完整研究实现面向计算机视觉方向的研究生、算法工程师及深度学习进阶学习者聚焦真实场景雾霾图像复原这一典型低层视觉任务。压缩包含342个文件总大小156.42MB涵盖204个Python训练/推理脚本、39张可视化结果图PNG/GIF、16份配置与超参定义YAML、12份性能评估CSV报告、9个Jupyter实验笔记IPYNB及8篇说明文档MD支撑从数据加载、ViT模块构建、多数据集联合训练到PSNR/SSIM定量评测的全流程复现。已有121人下载学习资源提供NH-HAZE、NTIRE2019、I-HAZE、O-HAZE四大真实雾霾数据集的统一预处理管道、模型权重、损失曲面分析含losslandscape.csv等、对比实验配置及详细README特别适合开展ViT在图像复原任务中的迁移应用、消融实验设计与工业级去雾方案验证。1. 项目缘起当传统去雾方法遇上真实世界的复杂雾霾几年前我接手过一个安防监控的项目客户部署在沿海工业区的摄像头一到秋冬季节画面就白茫茫一片车牌、人脸这些关键信息完全没法看。当时试遍了各种基于暗通道先验、颜色衰减先验的传统算法在实验室的合成雾图上效果拔群一到现场就“水土不服”。要么去雾不彻底边缘残留大片光晕要么色彩严重失真把傍晚拍成了正午最头疼的是遇到那种不均匀的、带着颗粒感的工业排放物与自然水汽混合的雾霾算法直接“懵圈”输出一堆伪影和噪声。那段经历让我深刻意识到在精心构造的合成数据集上训练出来的模型就像在驾校练车的学员一旦开上真实复杂路况很容易手足无措。这正是“NH-HAZE”、“I-HAZE”、“O-HAZE”这些真实雾霾数据集出现的意义也是我投入研究基于Vision TransformerViT架构进行图像去雾的核心动机。我们不再满足于在“理想国”里调参而是要让算法直面真实世界的挑战自然场景中雾霾浓度在空间上的不均匀分布、雾霾颜色并非总是灰白色、以及雾霾与场景物体边缘的复杂纠缠。传统卷积神经网络CNN在捕捉这种长距离的、全局性的依赖关系上存在天然局限而Transformer架构的核心——自注意力机制恰恰擅长于此。这个项目就是一次将ViT这一在图像分类领域大放异彩的“外来和尚”请来解决图像复原中经典且棘手的去雾问题的实战探索。我将结合NH-HAZE、NTIRE2019、I-HAZE、O-HAZE这四种最具代表性的真实雾霾数据集从头到尾拆解如何构建、训练并评估一个ViT去雾模型。无论你是刚入门深度学习复原领域的新手还是正在寻找传统方法突破口的从业者这篇长文中的代码、配置和踩坑经验都能为你提供一条清晰的路径。2. 理解战场四种真实雾霾数据集的核心差异与选用策略工欲善其事必先利其器。在搭建模型之前我们必须彻底理解我们将要使用的“战场环境”——即四个真实雾霾数据集。它们并非简单的重复而是各有侧重共同构成了对去雾算法鲁棒性的全方位考验。2.1 NH-HAZE非均匀雾霾的终极挑战NH-HAZE数据集是我个人认为挑战性最高的一个也是最能体现真实世界复杂性的数据集。它的全称是“Non-Homogeneous HAZE”顾名思义其雾霾在图像空间中的分布是非均匀的。这源于其采集方式在真实户外场景中通过专业造雾机引入雾霾并使用高精度设备同步拍摄有雾图像和无雾GT图像。核心特点与挑战雾密度空间变化同一张图片中远景的雾可能浓得像牛奶近景的物体却只有薄薄一层纱。这种连续、渐变的雾密度对需要估计全局均匀透射图的传统方法是致命打击。真实的雾物理模型偏离大多数算法基于大气散射模型I J * t A * (1 - t)其中t是透射率。NH-HAZE中的t不再是一个常数或缓慢变化的量而是剧烈波动的这使得模型必须学习更复杂的映射关系。配套的深度信息NH-HAZE提供了部分场景的深度图这为设计基于物理先验的神经网络模块例如将深度信息作为注意力机制的引导提供了绝佳的条件但也增加了模型设计的复杂度。在项目中如何使用NH-HAZE适合作为验证模型处理复杂空间变化能力的终极测试集。在训练时可以将其与其它数据集混合但评估时一定要单独观察其在NH-HAZE上的表现。如果模型在这里表现良好那它的实际部署潜力会非常大。2.2 NTIRE2019推动去雾研究发展的标杆NTIRE2019是CVPR NTIRE图像复原挑战赛2019年去雾赛道的官方数据集。它包含大量户外真实雾霾图像其特点是规模较大、场景多样。这个数据集是推动深度学习去雾方法发展的主要引擎之一。核心特点与挑战数据量优势相对于其他几个数据集NTIRE2019通常提供更多的训练图像对这对于数据饥渴的深度学习模型尤其是ViT这种参数较多的模型是至关重要的。通用性强其雾霾类型相对“标准”介于均匀和非均匀之间涵盖了城市、乡村、森林、建筑等多种场景是检验模型泛化性能的良好基准。竞赛导向该数据集的评估通常紧密围绕PSNR峰值信噪比和SSIM结构相似性这两个指标导致很多研究为了刷分而过度拟合其特性可能损失一些视觉感知质量。在项目中如何使用NTIRE2019是绝佳的主力训练集。可以利用其数据量大的优势让ViT模型充分学习从有雾到无雾图像的基本映射关系。建议将NTIRE2019作为预训练数据集再在其他数据集上进行微调Fine-tuning。2.3 I-HAZE与O-HAZE室内与室外的对照实验I-HAZE室内雾霾和O-HAZE室外雾霾是一对有趣的对照数据集由同一研究团队使用相同设备采集旨在分别研究室内和室外环境下的去雾问题。I-HAZE室内特点雾源单一室内雾通常由加湿器或造雾机产生成分相对纯净水汽颜色接近白色。背景复杂室内场景包含大量纹理细节丰富的物体书籍、织物、木纹、人造光源可能导致非均匀光照和眩光以及玻璃、镜面反射。挑战算法需要区分微弱的纹理细节和覆盖其上的均匀薄雾同时处理可能因雾而放大的镜面高光。O-HAZE室外特点雾成分复杂室外雾可能包含水汽、灰尘、污染物等颜色可能偏灰或褐。光照条件多变受自然阳光影响可能产生大面积天空区域雾的浓度与深度相关性更强。挑战处理广阔的、纹理较少的区域如天空同时恢复远处低对比度的物体轮廓。在项目中如何使用这两个数据集非常适合做消融实验Ablation Study和跨域Cross-Domain性能测试。例如你可以设计实验一个仅在O-HAZE上训练的模型在I-HAZE上测试性能下降多少这能验证模型是仅仅学习了数据集的特定模式还是真正理解了“去雾”的本质。同时它们也是检验模型在不同雾物理属性下鲁棒性的好工具。实操心得数据预处理与混合训练策略直接把这四个数据集扔进一个DataLoader里训练效果往往不好。我的建议是统一与增强将所有图像裁剪或缩放到统一尺寸如256x256或512x512。使用随机水平翻转、旋转小角度、颜色抖动作为基础增强。关键点对于去雾任务避免使用过度改变图像整体亮度和对比度的增强如过强的色彩抖动这可能会干扰模型对雾浓度和大气光的估计。分批次混合Batch Mixing不要简单合并数据集。可以采用每个训练批次Batch来自不同数据集的策略。例如每个Batch中50%的样本来自NTIRE201925%来自NH-HAZE剩下的25%由I-HAZE和O-HAZE平分。这能确保模型在每个训练step都能接触到不同类型的雾提升泛化能力。验证集分离务必从每个数据集中单独划分出一部分作为验证集。监控模型在每个验证集上的表现可以清晰看出模型在哪类数据上过拟合或欠拟合。3. 核心武器Vision Transformer在图像去雾中的架构设计与创新将ViT直接套用到图像去雾上会水土不服。图像分类中的ViT目的是提取一个全局的类别特征而去雾是像素级的回归任务需要恢复高频细节和局部纹理。因此必须对标准ViT进行改造。3.1 基础回顾标准ViT为何需要改造标准ViT的工作流程是将输入图像切割成固定大小的图像块Patches如16x16将这些块线性投影为序列嵌入加上位置编码后送入一系列Transformer编码器层包含多头自注意力MSA和多层感知机MLP最后用一个分类头输出类别概率。对于去雾任务直接应用面临三大问题细节丢失将图像切成块并线性投影这个过程本身是一种下采样会损失高频细节。而去雾恰恰需要恢复这些细节。计算负担自注意力机制的计算复杂度与序列长度的平方成正比。对于高分辨率图像序列长度会非常长导致内存和计算成本爆炸。输出形式需要输出全分辨率的清晰图像而非一个分类向量。3.2 一种可行的ViT去雾网络架构设计下面我提出一个融合了CNN和ViT优势的混合架构这也是当前主流的研究方向之一。我们称之为“多尺度Transformer残差网络”MSTR-Net仅为示例命名。整体架构分为四个部分浅层特征提取CNN编码器目的在进入Transformer之前先用几层浅层CNN例如2-3个卷积层对输入有雾图像进行初步特征提取。这相当于一个“预处理”阶段可以提取底层的边缘、纹理信息并将图像映射到一个更高维的特征空间同时初步降低一些空间分辨率以减少后续Transformer的计算量。为什么不用ViT直接处理像素卷积的局部性和平移不变性在捕捉底层图像模式上效率极高且能保留一定的空间结构为后续的Transformer提供更丰富的上下文特征图而非原始的像素块。多尺度Transformer主干核心模块设计这是网络的核心。我们设计一个类似U-Net的对称结构但其中的下采样和上采样路径中的瓶颈层我们使用Transformer块替代传统的卷积块。具体操作下采样使用步幅卷积或池化层将特征图分辨率逐步降低例如从HxW到H/2xW/2再到H/4xW/4。在每一个分辨率尺度上我们将特征图重塑为一系列特征块输入到一组Transformer编码器层中。这里的创新点在不同尺度上我们可以使用不同深度的Transformer或不同数量的注意力头让网络在粗粒度上捕捉全局雾分布在细粒度上修复局部细节。跳跃连接将下采样路径中每个尺度的Transformer输出通过跳跃连接传递到上采样路径的对应尺度。这有助于恢复在下采样中丢失的空间信息。上采样使用转置卷积或像素洗牌Pixel Shuffle进行上采样。将上采样后的特征与来自跳跃连接的同尺度特征拼接Concatenate再送入该尺度的Transformer块中进行特征融合与精炼。局部-全局注意力机制设计标准的全局自注意力计算成本高。我们可以引入窗口注意力Window Attention如Swin Transformer所示将特征图划分为不重叠的局部窗口只在窗口内计算自注意力。同时为了建立窗口间的联系可以交替使用窗口注意力和移位窗口注意力Shifted Window Attention。对于去雾的意义窗口注意力能高效建模局部区域内雾与纹理的相互作用如物体边缘的雾晕而移位窗口或定期引入的全局注意力层则能捕捉整张图像的大气光分布和远景/近景的雾浓度关联这对于处理NH-HAZE那样的非均匀雾至关重要。图像重建与残差学习目的将Transformer主干输出的深度特征映射回RGB图像空间。实现网络末端使用几个卷积层作为重建模块。更有效的做法是采用残差学习策略。即我们不让网络直接预测清晰图像J而是预测一个残差图像R使得J I R其中I是有雾输入。或者预测透射图t和大气光A的残差。经验表明学习残差比学习完整图像更容易收敛且能更好地保留输入图像的整体结构和颜色信息。# 一个简化的PyTorch风格架构示意关键组件 import torch import torch.nn as nn import torch.nn.functional as F class PatchEmbed(nn.Module): 将图像分割为块并嵌入类似浅层CNN特征提取 def __init__(self, img_size256, patch_size16, in_chans3, embed_dim768): super().__init__() self.proj nn.Conv2d(in_chans, embed_dim, kernel_sizepatch_size, stridepatch_size) # 用卷积实现分块与投影 def forward(self, x): x self.proj(x) # 输出形状: (B, embed_dim, H/patch, W/patch) return x class TransformerBlock(nn.Module): 一个基本的Transformer编码器块可替换为Swin Transformer Block def __init__(self, dim, num_heads, mlp_ratio4.): super().__init__() self.norm1 nn.LayerNorm(dim) self.attn nn.MultiheadAttention(dim, num_heads) # 这里使用标准注意力实际可用窗口注意力 self.norm2 nn.LayerNorm(dim) self.mlp nn.Sequential( nn.Linear(dim, int(dim * mlp_ratio)), nn.GELU(), nn.Linear(int(dim * mlp_ratio), dim) ) def forward(self, x): # x shape: (序列长度, Batch, 特征维度) shortcut x x self.norm1(x) x, _ self.attn(x, x, x) x shortcut x shortcut x x self.norm2(x) x self.mlp(x) x shortcut x return x class MSTRNet(nn.Module): 多尺度Transformer残差网络高度简化示意 def __init__(self): super().__init__() self.shallow_feat nn.Sequential( nn.Conv2d(3, 64, 3, padding1), nn.ReLU(), nn.Conv2d(64, 128, 3, stride2, padding1), # 下采样 nn.ReLU() ) # 假设在此处嵌入一个Transformer层处理某个尺度的特征 self.transformer_scale1 TransformerBlock(dim128, num_heads8) # ... 更多下采样、Transformer块、上采样和跳跃连接 self.reconstruction nn.Conv2d(128, 3, 3, padding1) # 最终重建层 def forward(self, x): feat self.shallow_feat(x) # 需要将feat从(B, C, H, W) reshape为(序列长度, B, C)以适应Transformer b, c, h, w feat.shape feat_seq feat.flatten(2).permute(2, 0, 1) # (H*W, B, C) trans_feat self.transformer_scale1(feat_seq) trans_feat trans_feat.permute(1, 2, 0).view(b, c, h, w) # 恢复空间形状 out self.reconstruction(trans_feat) return x out # 残差连接输出实操心得位置编码与归一化层的选择位置编码在图像复原任务中绝对位置编码或可学习的位置编码通常足够。对于使用窗口注意力的架构相对位置偏置Relative Position Bias被证明非常有效因为它能建模窗口内像素的相对位置关系这对理解局部纹理模式很重要。归一化层Transformer中常用的Layer NormalizationLN在图像任务中有时会导致细节平滑。可以尝试使用Batch NormalizationBN或Instance NormalizationIN或者探索新的归一化方式如RMSNorm。在我的实验中对于去雾任务在CNN部分使用BN在Transformer块内保持LN是一个不错的起点。4. 从零到一模型训练、调参与评估的全链路实战有了数据和模型架构下一步就是让模型真正“学”起来。这个过程充满了“玄学”和“科学”的碰撞。4.1 损失函数设计引导模型学习什么损失函数是模型的“老师”它定义了什么是“好”的去雾结果。单一损失函数往往不够需要组合拳。像素级损失L1/L2 LossL1 Loss (MAE)Loss mean(|J_gt - J_pred|)。相比L2 LossMSEL1对异常值如极端噪声点更不敏感能产生更清晰的边缘是图像复原任务的首选。作用强制预测图像在像素值上接近真实清晰图像是保证基本复原精度的基础。感知损失Perceptual Loss原理利用在ImageNet上预训练好的VGG等分类网络提取预测图像和真实图像在多个特征层上的激活值计算它们之间的差异如L1距离。作用鼓励预测图像在高级语义特征上与真实图像相似有助于恢复更自然、更符合人类视觉感知的纹理和结构避免结果看起来“塑料感”或过于平滑。关键技巧通常使用VGG16的relu2_2或relu3_3层这些层平衡了低级纹理和高级结构信息。对抗损失Adversarial Loss原理引入一个判别器Discriminator试图区分预测的清晰图像和真实的清晰图像。生成器我们的去雾网络的目标是“骗过”判别器。作用能极大地提升结果的视觉真实感使去雾后的图像看起来更像是自然拍摄的无雾照片而不是算法处理的产物。注意对抗训练不稳定需要仔细平衡生成器和判别器的训练节奏否则容易导致模式崩溃或伪影。颜色损失与平滑损失颜色损失计算预测图像与真实图像在颜色空间如Lab空间的差异有助于保持色彩保真度防止去雾后图像发灰或偏色。平滑损失Smoothness Loss对预测的透射图如果网络显式估计施加局部平滑约束如总变分损失TV Loss使其在物体内部平滑在边缘处锐利这符合自然场景中透射率的物理特性。一个典型的复合损失函数配置Total_Loss λ1 * L1_Loss λ2 * Perceptual_Loss λ3 * Adversarial_Loss初始阶段可以设置λ11.0 λ20.1 λ30.01 然后根据验证集上的视觉效果和指标进行微调。4.2 训练策略与超参数调优优化器选择AdamW是目前Transformer模型训练的主流选择。它相比Adam引入了权重衰减的正则化能更好地防止过拟合。初始学习率通常设置在1e-4到5e-4之间。学习率调度使用余弦退火Cosine Annealing或带热重启的余弦退火Cosine Annealing with Warm Restarts策略。这能让学习率在训练过程中平滑下降并在后期进行小幅“重启”有助于模型跳出局部最优。Warmup学习率预热在训练初期非常重要特别是对于ViT这类模型在前几百或几千个迭代步内将学习率从0线性增加到初始值能显著提升训练稳定性。批次大小Batch Size在GPU内存允许的范围内尽可能使用大的Batch Size。大的Batch Size能提供更稳定的梯度估计对于Batch Normalization层也更友好。如果内存不足可以使用梯度累积Gradient Accumulation来模拟大Batch的效果。训练轮数Epochs由于数据集规模不大通常几千对图像模型容易过拟合。需要密切监控验证集损失。当验证集损失在连续多个Epoch不再下降甚至上升时应提前停止Early Stopping。通常100-300个Epoch是常见的范围。4.3 客观评估指标与主观视觉评估模型训练好后我们需要从定量和定性两个角度来评判它。客观指标定量PSNR峰值信噪比最常用的指标计算简单但与人类视觉感知相关性一般。值越高越好通常提升2-3个dB就是非常显著的改进。SSIM结构相似性比PSNR更符合人眼视觉系统它衡量图像在亮度、对比度和结构三方面的相似性。取值范围[0,1]越接近1越好。LPIPS学习感知图像块相似度使用预训练的深度网络如AlexNet、VGG来度量两幅图像之间的感知距离。它比PSNR和SSIM更能反映人类对图像质量的判断值越低表示感知上越相似。主观评估定性这是最终裁判。在计算客观指标的同时必须进行人工视觉检查。将去雾结果、真实清晰图像和有雾输入并排显示关注以下几点去雾彻底性浓雾区域是否被有效移除远景细节是否恢复细节与纹理物体的边缘是否清晰锐利纹理如树叶、砖墙是否自然恢复还是变得模糊或出现伪纹理色彩保真度图像颜色是否自然有无明显的色偏如整体发蓝、发黄伪影与失真天空等平坦区域有无出现块状伪影、振铃效应或奇怪的噪声有无“过去雾”导致暗部细节丢失整体自然度最终图像看起来像一张自然拍摄的照片还是能明显看出是算法处理的结果踩坑实录验证集上的“假象”与过拟合我曾遇到一个情况模型在NTIRE2019验证集上的PSNR和SSIM持续走高但生成的图像看起来越来越模糊细节丢失严重。这就是典型的指标过拟合。模型学会了优化PSNR/SSIM的数学公式比如倾向于输出略微平滑的图像以降低像素误差却牺牲了视觉感知质量。解决方案引入LPIPS作为额外的验证指标它更不容易被“欺骗”。最重要的定期例如每5个Epoch从验证集中抽样查看生成结果。人的眼睛是最可靠的评判官。在损失函数中增加感知损失或对抗损失的权重引导模型向“看起来好”的方向优化而不仅仅是“数字上好”。5. 结果分析与挑战ViT去雾的优势与现存瓶颈经过完整的训练和评估循环我们可以对基于ViT的去雾方法做出一些总结和展望。5.1 ViT架构带来的显著优势强大的长距离依赖建模能力这是ViT最核心的优势。在处理NH-HAZE这类非均匀雾霾时模型能同时“看到”图像中雾浓的区域和雾淡的区域并建立它们之间的联系从而更准确地估计全局大气光和空间变化的透射率。相比之下CNN的感受野受限于卷积核大小即使通过堆叠层数来扩大其效率也不及自注意力机制。对复杂退化模式的更强适应性真实雾霾是多种因素颗粒物大小、浓度、光照角度等的复合函数。Transformer的自注意力机制可以动态地计算图像中所有像素对之间的关系权重理论上能学习到比固定卷积核更复杂的图像退化与复原映射。与物理模型的潜在结合一些研究开始探索将大气散射模型的先验知识嵌入到Transformer架构中。例如可以将估计的透射图t和大气光A作为某些注意力头的查询Query或键Key让网络显式地利用物理约束进行推理这比让CNN隐式学习这些物理量更具可解释性。5.2 当前面临的挑战与应对思路计算复杂度与内存消耗这是ViT应用于高分辨率图像的最大障碍。全局长注意力在分辨率上去到512x512以上时几乎不可行。应对采用分层Hierarchical和窗口Window注意力机制是必由之路。如Swin Transformer在浅层使用小窗口在深层使用大窗口或全局注意力在效率和性能间取得平衡。另外特征图下采样在进入Transformer主干前也是一个实用策略虽然会损失一些细节但可以通过跳跃连接和上采样来弥补。数据饥渴与过拟合风险Transformer通常需要大量数据才能充分训练。而高质量的真实雾霾数据集规模有限。应对预训练在大规模合成雾霾数据集如RESIDE或甚至ImageNet等通用数据集上对模型进行预训练学习通用的图像特征然后在真实小数据集上微调。数据增强的极限利用除了常规的几何和颜色增强可以尝试基于物理模型的增强例如对清晰图像使用随机参数的大气散射模型合成雾图作为额外的训练数据。虽然不如真实数据但能增加数据多样性。正则化技术大量使用Dropout、DropPathStochastic Depth、权重衰减等防止过拟合。细节恢复与局部纹理自注意力机制偏向于全局信息整合有时会平滑掉细微的局部纹理。应对这就是为什么混合架构CNNViT如此重要。让CNN负责捕捉和传递局部细节信息让ViT负责整合全局上下文。在解码器上采样部分使用转置卷积或亚像素卷积Pixel Shuffle等操作也有助于恢复高频信息。模型可解释性虽然ViT的注意力图可以可视化告诉我们模型“关注”了哪些区域但对于它如何得出具体的去雾结果其内部推理过程仍然像一个黑盒不如一些基于物理模型分解的方法直观。应对这是一个开放的研究方向。可以尝试设计一些中间监督信号例如让网络除了输出清晰图像还额外输出一个“注意力权重图”或“透射率估计图”并利用数据集中可能提供的稀疏深度信息或人工先验对其进行弱监督以增加模型的可解释性。这次基于Vision Transformer的真实图像去雾探索就像一场从理论到实践的远征。从理解NH-HAZE等数据集的独特挑战到设计融合CNN与ViT的混合网络再到精心调配损失函数和训练策略每一步都需要在性能、效率和泛化能力之间做权衡。实测下来ViT在处理非均匀、复杂雾霾场景时展现的潜力是令人兴奋的它确实提供了一条超越传统CNN框架的新路径。然而它并非银弹高昂的计算成本和数据依赖仍是落地时需要啃下的硬骨头。我的建议是在实际项目中不妨从一个小型的混合架构开始在NTIRE2019上做预训练然后在特定的真实数据集如你的目标场景数据上做精细微调并始终把主观视觉评估放在和客观指标同等重要的位置。毕竟最终评判算法好坏的是人的眼睛而不是冰冷的数字。本文还有配套的精品资源点击获取