尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

ViT图像去雾实战:训练配置与损失景观分析

发布时间:2026/9/30 2:23:36

资讯中心
01
ARTICLE

ViT图像去雾实战:训练配置与损失景观分析

ViT图像去雾实战:训练配置与损失景观分析
简介一套基于Vision Transformer的图像去雾算法研究与实现资料内含Python源码、项目介绍及使用说明面向计算机视觉研究者、算法工程师以及有一定深度学习基础的读者。可用于复现去雾模型、开展训练调参并进行鲁棒性对比实验。资源包共340个文件约156.34MB以204个Python脚本和16个YAML配置为主体另含39张PNG示意图、10个GIF动效、12个CSV数据表与9份Jupyter Notebook便于分析训练曲线、查看可视化结果及扩展自定义实验。代码支持加载My_best_model下的预训练权重通过option.py设置--train_ps默认128等关键参数适配不同数据集与显存环境。预览中可见cifar10/cifar100的loss landscape与corrupted数据对比说明包内还包含模型鲁棒性分析数据适合进一步研究。已有468人学习下载。1. 基于 Vision Transformer 的图像去雾算法一份能跑通训练与评估的 Python 实现做图像去雾的同行应该都体会过这种尴尬拿现成的 CNN 去雾模型跑室内合成雾图指标很好看一换到真实雾天场景立刻“翻车”。在 Transformer 架构全面入侵视觉任务的这几年Vision Transformer 在去雾任务上其实已经被证明能比同等参数量的 CNN 拿到更好的全局一致性——因为雾的退化过程是全局相关的近处远处的透射率互相影响纯卷积的局部感受野处理这类问题天然吃亏。这份项目源码正是围绕 ViT 展开的完整去雾训练与评估实现自带 CIFAR10/CIFAR100 数据集上的损失景观loss landscapeCSV 数据、预训练权重、以及一份带参数解释的使用说明。适合的对象很明确想在 ViT 上去雾方向快速跑通 baseline、需要可复现实验配置、或者正在写论文需要损失景观可视化数据做对比的从业者。它能解决的最核心问题就一句话——把模型训练、权重加载、patch 参数调整和结果评估的坑提前替你趟一遍。2. 为什么图像去雾任务会选 Vision Transformer从全局建模到 patch 化输入2.1 CNN 在去雾任务上的瓶颈与 ViT 的建模差异传统去雾方法在深度学习时代被 DehazeNet、AOD-Net 这类 CNN 模型统治了很久。它们的设计逻辑是通过局部卷积核逐步扩大感受野学习从雾图到清晰图的映射。但雾的形成模型是I(x) J(x)·t(x) A·(1−t(x))其中透射率 t(x) 在整幅图像上连续且受场景深度影响远处的雾往往更浓、信息衰减更严重。这意味着模型需要在较远的空间范围内同时推断深度和大气光局部卷积天然受限。实际项目里最常见的问题就是CNN 模型在近景区域还原得不错远景区域出现色偏和雾残留这就是感受野不足导致的全局上下文缺失。ViT 的思路不同它把图像切成一串 patch每个 patch 通过线性投影变成 token然后用自注意力机制计算任意两个 token 之间的关系。这个设计在做去雾时有个直接优势——自注意力让模型天然具备“隔空”交互能力远景 token 可以直接关注近景 token 的清晰纹理和颜色分布从而更好地估计全局透射率。在这份源码的实现里你可以在option.py中通过--train_ps参数控制输入 patch 大小默认是 128含义是“多大尺寸的 patches 输入到模型中”。这个参数直接影响 token 序列长度patch 越小、序列越长、计算量越大但空间细节保留越好patch 越大、序列越短、全局建模效率越高但细节可能丢失。我一般会把 128 作为起点显存足够的情况下降到 64 实验一次对比输出图的边缘保持度。2.2 预训练权重机制为什么 CIFAR 数据集要划分出不同权重这份资源里My_best_model文件夹下的预训练权重是按数据集划分的有 CIFAR100 上训练的 ViT-Ti 权重文件名里能看到cifar100_vit_ti字样也有 CIFAR10/100 上 ResNet、AlexNet 等对照模型的权重。设计逻辑很实际不同数据集有不同的类别分布和图像复杂度直接用 CIFAR100 上训好的权重去跑 CIFAR10 的测试特征分布不匹配指标会明显下降。源码使用说明里专门提到了--pretrain_weights参数用于设置预训练权重路径。这个参数的坑在于如果你的数据集划分和原作者不完全一致直接加载权重会报 shape mismatch。常见的解决方式是加载权重时按层名过滤——只加载 encoder 部分跳过分类头因为去雾任务并不需要原始的分类输出维度。3. 代码结构拆解与训练全流程从 option.py 到最佳权重保存3.1 项目文件清单与各自职责拿到压缩包后解压先别急着跑训练按我的习惯应该先花五分钟确认文件结构。这份资源的核心内容集中在几个部分option.py是训练和推理的全局参数配置入口模型定义文件ViT encoder 结构训练脚本以及一份使用说明文档。数据方面资源里给了多个 CSV 文件分别是 CIFAR100/10 上不同模型ResNet、DNN、ViT-Ti的 loss landscape 数据以及 corrupted 版本的实验数据。这些 CSV 是实验分析的产物不是训练用的原始图像数据集——训练图像数据需要你自己按使用说明准备。这里最容易产生的误解是把 CSV 当成训练数据去加载然后报维度错误。CSV 的用途是后续用 loss landscape 可视化工具画图用的和训练流程是分开的。3.2 训练参数配置照着这份参数表改就不会跑飞训练前最重要的就是核对option.py里的参数。我直接给你提炼成一份参数表这些参数在实际训练中决定模型能不能收敛参数名默认值作用调整建议--train_ps128训练样本 patch 大小输入模型的 patches 尺寸显存 12G 以下保持 128显存富裕可降到 64 提升细节--batch_size16常见配置批大小OOM 时优先从 16 降到 8而不是调 patch 大小--lr1e-4 量级学习率ViT 去雾建议用 AdamW权重衰减设 0.05--epochs100 量级训练轮数CIFAR100 上一般 80 轮后 loss 开始平台期--pretrain_weights无预训练权重路径路径指向My_best_model下的对应数据集权重参数调整的优先级我建议这样排先确认--pretrain_weights是否匹配你的数据集划分再调--train_ps最后动学习率。因为权重不匹配是硬性错误patch 大小影响模型结构输入维度学习率只影响收敛速度改错了还能补救。代码中解析参数那段通常是这样的结构# 常见于 option.py 或 train.py 中 import argparse def parse_args(): parser argparse.ArgumentParser(descriptionViT Dehazing Training) parser.add_argument(--train_ps, typeint, default128, help训练样本的patch大小输入到模型的patches尺寸) parser.add_argument(--pretrain_weights, typestr, default, help预训练权重路径My_best_model文件夹下按数据集划分) parser.add_argument(--dataset, typestr, defaultcifar100, choices[cifar10, cifar100], help评估数据集决定加载哪个预训练权重) parser.add_argument(--save_dir, typestr, default./checkpoints, help模型权重保存目录) return parser.parse_args()这段代码的逻辑不复杂定义一个参数解析器把训练关键参数暴露成命令行参数。--train_ps的默认值 128 对应着源码作者在 CIFAR100 上的标准配置如果你的输入图像本身分辨率不高比如 224×224128 的 patch 意味着图像被切成了若干 128×128 的块每个块独立过 Transformer encoder。--pretrain_weights默认空字符串意味着不加载预训练权重从零训练——如果你在 CIFAR100 上从零训 ViT-Ti通常需要更长的训练轮数才能达到和加载预训练权重相近的收敛水平所以我的建议是不要跳过这个参数。3.3 训练启动流程三步跑通一次完整实验配置好参数后训练流程就相对固定了。第一步是准备数据第二步是启动训练并观察 loss 曲线第三步是保存最佳权重。用命令来表达的话是这样# 标准训练命令按使用说明中的参数格式修改路径 python train.py --train_ps 128 --batch_size 16 \ --dataset cifar100 \ --pretrain_weights ./My_best_model/cifar100_vit_ti_best.pth \ --save_dir ./checkpoints启动后你需要关注两个输出指标训练集上的 PSNR 和 SSIM。PSNR 反映像素级重建误差SSIM 反映结构相似度——去雾任务里 SSIM 比 PSNR 更重要因为去雾追求的是人眼感知的清晰度提升而不是像素完全一致。如果训练初期 PSNR 上升很快但 SSIM 徘徊在 0.8 以下说明模型在学“提亮”而不是“去雾”常见原因就是 patch 切得太碎导致上下文丢失。此时把--train_ps从 128 调到 160 或 192输入范围更大模型能看到更多雾的分布趋势。另外一个容易踩的点是数据加载。去雾任务的标准做法是用成对的雾图/清晰图做监督训练雾图通常由清晰图加合成雾生成。源码里大概率包含了一个数据加载器负责在运行时生成雾图。如果你的 GPU 利用率不达标先查数据加载流程里有没有做数据增强、有没有开多进程加载。这个我在实际项目中反复遇到模型没问题、参数没问题但训练速度上不去最后发现是 DataLoader 的num_workers没有设置CPU 预处理成了瓶颈。4. 损失景观分析数据怎么用把 loss landscape CSV 变成论文级可视化4.1 损失景观 CSV 是什么、为何值得保留资源里的 CSV 文件从命名上能看出结构——cifar100_resnet_dnn_50_losslandscape.csv表示 CIFAR100 数据集上 ResNet-DNN 模型第 50 轮的损失景观采样数据cifar100_vit_ti_losslandscape.csv是对应 ViT-Ti 模型的损失景观数据还有带9857b21357_x1这类随机种子标记的变体以及corrupted版本的实验数据。损失景观是什么简单说就是把高维损失函数投影到两个随机方向平面上观察 loss 在参数空间中的“地形”——平坦的盆地表示模型泛化性好尖锐的峰谷表示模型可能过拟合。这类数据是论文里非常直观的一个证据ViT 模型的损失景观比 CNN 模型更平滑说明 Transformer 的去雾模型在优化难度和泛化能力上更有优势。4.2 读取与可视化操作从 CSV 到论文曲线这些 CSV 是用plot_2D或plot_1D这类标准的 loss landscape 工具生成的。你可以用 pandas 读取后直接用 matplotlib 画等高线图。下面是具体的读取和可视化代码import pandas as pd import matplotlib.pyplot as plt import numpy as np # 加载ViT-Ti在CIFAR100上的损失景观数据 df pd.read_csv(cifar100_vit_ti_losslandscape.csv) # 假设CSV包含三列: x坐标(方向1)、y坐标(方向2)、loss值 x df.iloc[:, 0].values y df.iloc[:, 1].values loss df.iloc[:, 2].values # 将离散点转为网格数据绘制视角1的等高线 xi np.linspace(x.min(), x.max(), 100) yi np.linspace(y.min(), y.max(), 100) zi griddata((x, y), loss, (xi[None, :], yi[:, None]), methodcubic) plt.figure(figsize(6, 5)) plt.contourf(xi, yi, zi, levels20, cmapviridis) plt.colorbar(labelLoss) plt.xlabel(Direction 1) plt.ylabel(Direction 2) plt.title(ViT-Ti Loss Landscape on CIFAR100) plt.savefig(vit_ti_loss_landscape.png, dpi150, bbox_inchestight)代码逻辑说明先用 pandas 把 CSV 读成 DataFrame取前三列分别作为两个随机方向轴和 loss 值。griddata的作用是把散点插值成规则网格因为原始的 loss landscape 采样是在随机方向上做的点与点之间没有固定的坐标步长不插值直接画contourf会报维度不匹配或出现大量空洞。levels20控制等高线的分层密度值越大颜色过渡越细腻。如果你要在论文里用这张图建议关注对比实验——同一数据集上 ResNet 和 ViT-Ti 的两张图并排会直观显示两者的盆地平坦度差异。对比的 CSV 文件在资源里是成套给出的读两份文件、跑同一段可视化代码、并排输出图片即可。4.3 参数说明画图时的干扰噪音过滤还有一个细节loss landscape 数据如果原始 loss 值跨度特别大比如最小值接近 0、最大值到了几十直接画图会导致小 loss 区域的细节全部被压掉。常规做法是对 loss 做 log 变换后再画图# 对loss做log变换抑制极大值干扰 df[log_loss] np.log(df[loss])变换后画面会更均衡。这个操作是否必要取决于原 CSV 的 loss 分布如果你发现画面颜色几乎被最大值覆盖就加上这一行。5. 避坑指南训练过程中的四类典型问题与排查手段5.1 预训练权重加载时报错 shape mismatch现象启动训练时抛出类似size mismatch for encoder.blocks.0.attn.qkv.weight的报错。原因这个资源里的预训练权重是按数据集划分的CIFAR100 的权重加载到 CIFAR10 模型上或者你的模型定义里--train_ps改过导致 patch embedding 层的输入维度与权重不一致。解决按权重层名前缀过滤加载。具体做法是构造一个新的 state dict只加载名字以encoder.开头的参数分类头或其他任务相关层跳过代码如下# 加载与当前模型结构匹配的参数 checkpoint torch.load(pretrained_path, map_locationcpu) filtered {k: v for k, v in checkpoint.items() if k.startswith(encoder.)} model.load_state_dict(filtered, strictFalse)strictFalse允许缺层没有匹配的初始化层会保留随机初始化状态。这是最常用、兼容性最好的解法。5.2 CSV 文件被误当作训练数据加载现象数据加载时报EOFError或维度不匹配或者训练 loss 显示 NaN。原因压缩包里 CSV 文件名带losslandscape字样容易让人误以为是数据集的一部分。实际它是损失景观分析用的离线数据不是训练用的图像数据。解决检查训练脚本里的数据路径指向的是否为图像文件夹而非 CSV 文件。如果你只想快速评估模型效果直接用预训练权重跑推理即可不需要准备训练数据。5.3 CIFAR 数据集做去雾效果评测时的指标虚高现象在 CIFAR10 上测试 PSNR 很高30但拿到真实雾图上一测只剩 18 左右。原因CIFAR 是 32×32 的小图分类数据集原始分辨率极低雾的退化模型在小图上不明显。使用 CIFAR 做去雾评测时合成雾的浓度设置可能偏低模型学到的其实是“小幅提亮和锐化”。解决把--train_ps调大并适当增加合成雾浓度修改数据生成脚本中的散射系数或者干脆在真实雾图集如 RESIDE 的子集上做最终评测。在这个项目里CIFAR 数据集更多承担的是对比实验的角色——用统一的基准说明 ViT 在结构保持上的优势而不是作为最终部署效果的代表。这一点对我来说是这个资源最需要先搞清楚的事情把它当论文实验代码用而不是产品级去雾方案。5.4 训练到一半 loss 突然变成 NaN现象训练 20 轮后 loss 从 0.02 突然跳到 NaN之后无法恢复。原因常见原因是学习率过大导致梯度爆炸或是数据增强中出现了除零操作。ViT 的梯度规范通常比 CNN 偏大特别是早期层。解决在优化器上增加梯度裁剪这是一个标准的防护手段# 每步更新前裁剪梯度范数 torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm5.0) optimizer.step()max_norm5.0是经验值如果裁剪后 loss 仍然不稳定再降到 1.0。这个参数调大不是好事保持较小的裁剪值对 ViT 训练稳定性很有帮助。6. 验证模型效果的三个技巧patch 混叠检查、真实雾图盲测与损失景观对比去雾模型训练完后的验证工作不能只看 PSNR 和 SSIM 数字你还需要三个额外的检查手段这也是我从多次实验中总结出的习惯。第一patch 边界伪影检测。ViT 因为把图像切成了 patch 独立处理容易出现 patch 交界处的亮线或颜色跳变。检查方法很简单对输出图像求横向和纵向的梯度如果梯度在固定间隔等于--train_ps的整数倍处出现规律性峰值说明存在边界伪影。解决方法是推理时把原图重叠切块每次滑动半个 patch 大小然后对重叠区域做平均融合——这个处理能把边界痕迹抹平。第二真实雾图盲测。拿几张手机拍的雾天照片不需要真值图直接看模型输出的对比度恢复和色偏。注意观察天空区域是否出现过饱和——ViT 的自注意力倾向于把高亮区域的特征扩散导致天空过白。如果出现这种情况在推理后处理时对低透射率区域做轻微的 gamma 校正压低过曝。第三用资源里的 loss landscape CSV 做对比验证。把 CIFAR100 上的 ResNet 和 ViT-Ti 两组数据各画一张损失景观图检查 ViT 的盆地是否更平缓、周围是否有更多平坦区域。这个对比结果就是你论文中说明 Transformer 结构优势的直接证据。我当时拿到这批 CSV 数据时第一件事就是把两两模型的文件名整理成对照表免得画图时张冠李戴。从那以后我每次做模型对比实验都强制走一遍“确认数据集划分、核对权重路径、统一 patch 参数、记录 loss landscape 采样配置”这个流程避免在论文返修时被审稿人质疑实验不一致。希望这份源码和上述的使用细节能帮你在 ViT 去雾方向上少走几步弯路。本文还有配套的精品资源点击获取
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。