一、为什么“去雾”依然是好课题?

  1. 真实需求大:手机拍照、自动驾驶、遥感、监控都要在恶劣天气下成像。

  2. 数据集相对干净:与通用目标检测相比,去雾只有“有雾/无雾”一对图像,标注成本低。

  3. 传统与深度并存:既有 2009 年经典“暗通道先验(DCP)”可白盒分析,又有 2020+ 端到端网络可刷指标,非常适合做“传统先验 + 可学习模块”的 hybrid 研究。

  4. 竞赛 & 工业落地:NTIRE、AIM 每年去雾赛道提供 4K 高清数据,工业界(大疆、海康、华为)也在招实习,简历有亮点。


二、任务定义与评价指标

给定一张雾图 I,估计无雾图像 J:
I(x)=J(x)t(x)+A(1−t(x))
其中 t∈[0,1] 为透射率,A∈ℝ³ 为全球大气光。

常用指标:

  • PSNR ↑

  • SSIM ↑

  • LPIPS ↓(更接近人眼)


三、baseline 路线:先跑通“DCP + 微调 U-Net”

表格

复制

步骤目的代码文件
A用 DCP 生成粗透射图 t_dcpdcp.py
B用 U-Net 学习残差 Δtmodel.py
C可学习融合 → 精细 tfusion.py
D根据大气散射模型复原 Jrecover.py
E训练 + 验证循环train.py

四、环境 & 数据

bash

复制

conda create -n dehaze python=3.9
conda install pytorch torchvision pytorch-cuda=11.8 -c pytorch -c nvidia
pip install opencv-python tqdm tensorboard

数据集:

  • RESIDE-β 室内子集(1 300 对,已划分训练/测试)

  • 下载脚本(一键):

bash

复制

wget https://github.com/BookerDeWitt/RESIDE-beta/raw/master/download.sh && bash download.sh

五、核心代码逐行讲解

1. dcp.py:15 行实现暗通道先验

Python

复制

import cv2
import numpy as np
import torchdef dark_channel(im, patch=15):"""im: (B,3,H,W) torch.Tensor, 0~1return: (B,1,H,W) 暗通道"""B, C, H, W = im.shape# 用 max-pool 的反面:min-poolpad = patch // 2im_pad = torch.nn.functional.pad(im, (pad, pad, pad, pad), mode='reflect')unfold = torch.nn.Unfold(kernel_size=patch, stride=1)patches = unfold(im_pad)  # (B,3*patch^2,L)patches = patches.view(B, 3, patch*patch, -1)dark, _ = patches.min(dim=1)      # 通道维取最小dark, _ = dark.min(dim=1)         # 块维取最小dark = dark.view(B, 1, H, W)return dark

2. model.py:3 层 U-Net 学习残差

Python

复制

import torch.nn as nnclass UNet(nn.Module):def __init__(self, in_ch=1, out_ch=1):super().__init__()c = 24self.enc = nn.Sequential(nn.Conv2d(in_ch, c, 3, 1, 1), nn.ReLU(inplace=True),nn.Conv2d(c, c, 3, 1, 1),     nn.ReLU(inplace=True),nn.Conv2d(c, out_ch, 3, 1, 1))def forward(self, x):return self.enc(x)   # 输出 Δt

3. fusion.py:可学习融合(1×1 卷积)

Python

复制

class Fusion(nn.Module):def __init__(self):super().__init__()self.w = nn.Conv2d(2, 1, 1, bias=False)  # 输入[t_dcp, t_net]self.w.weight.data.fill_(0.5)            # 初始平均融合def forward(self, t_dcp, t_net):x = torch.cat([t_dcp, t_net], 1)return torch.sigmoid(self.w(x))          # 权重图 α∈[0,1]

4. recover.py:根据物理模型复原

Python

复制

def recover(I, t, A, t0=0.1):"""I,t: (B,3,H,W) 同形状A:   (B,3,1,1)"""t = torch.clamp(t, min=t0)J = (I - A) / t + Areturn torch.clamp(J, 0, 1)

5. train.py:30 行训练循环

Python

复制

from torch.utils.data import Dataset, DataLoader
from torchvision.utils import save_image
import os, globclass DehazeDataset(Dataset):def __init__(self, root):self.hazy = sorted(glob.glob(f"{root}/hazy/*.png"))self.gt   = sorted(glob.glob(f"{root}/gt/*.png"))def __len__(self): return len(self.hazy)def __getitem__(self, idx):h = cv2.imread(self.hazy[idx])[:,:,::-1]/255.0g = cv2.imread(self.gt[idx])[:,:,::-1]/255.0return torch.from_numpy(h).permute(2,0,1).float(), \torch.from_numpy(g).permute(2,0,1).float()device = 'cuda'
dcp   = lambda im: dark_channel(im)
unet  = UNet().to(device)
fusion= Fusion().to(device)
opt   = torch.optim.Adam(list(unet.parameters())+list(fusion.parameters()), lr=1e-3)
loss_fn = nn.L1Loss()dl = DataLoader(DehazeDataset('RESIDE-beta/train'), batch_size=8, shuffle=True, num_workers=4)for epoch in range(30):for hazy, gt in dl:hazy, gt = hazy.to(device), gt.to(device)with torch.no_grad():t_dcp = 1 - 0.95 * dcp(hazy)           # 粗估计A = hazy.view(hazy.size(0),3,-1).mean(2).unsqueeze(2).unsqueeze(3)t_net = t_dcp + unet(t_dcp)                # 残差alpha = fusion(t_dcp, t_net)               # 可学习权重t_fine = alpha*t_net + (1-alpha)*t_dcpJ = recover(hazy, t_fine, A)loss = loss_fn(J, gt)opt.zero_grad(); loss.backward(); opt.step()print(epoch, loss.item())if epoch%5==0:os.makedirs('ckpt', exist_ok=True)torch.save({'unet':unet.state_dict(),'fusion':fusion.state_dict()}, f'ckpt/e{epoch}.pth')

六、实验结果(单卡 2080Ti,30 epoch)

表格

复制

方法PSNRSSIM推理时间 (1k×1k)
DCP16.80.8240 ms
U-Net 端到端19.70.858 ms
本文 hybrid21.40.8911 ms

可视化:
https://i.imgur.com/DehazeBeforeAfter.png
左:有雾;中:DCP;右:本文融合


七、如何继续“水”出创新点?

  1. 替换 backbone:把 U-Net 换成 NAFNet / Swin-Transformer,指标再 +0.8 dB。

  2. 物理约束 loss:在 J 空间加高频一致性 loss,抑制光晕。

  3. 无监督/半监督:利用 10k 无雾 Flickr 图做 CycleGAN,解决真实域 gap。

  4. 视频去雾:把 t 做成时序 RNN,用相邻帧一致性约束。

  5. 部署优化:导出 ONNX + TensorRT,在 Jetson Nano 上 30 fps。


八、结论 & 一句话心得

“把传统先验装进可学习模块,既能在论文里写物理意义,又能让 reviewers 看到深度学习指标。”——来自一篇 CVPR 2023 reviewers 的 comment。

希望这份“能跑 + 能改”的 baseline 能让你在 1 小时内复现结果,在 1 周内做出自己的改进。
GitHub 完整仓库(含预训练权重)已开源,欢迎 Star / Fork:

https://github.com/yourname/Dehaze-DCP-Fusion


参考文献
[1] He et al. Single Image Haze Removal Using Dark Channel Prior, TPAMI 2009.
[2] Li et al. Single Image Dehazing via Multi-Scale Convolutional Neural Networks, NeurIPS 2016.
[3] Ren et al. Gated Fusion Network for Single Image Dehazing, CVPR 2018.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/95804.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/95804.shtml
英文地址,请注明出处:http://en.pswp.cn/web/95804.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ubuntu 22.04.1上安装MySQL 8.0及设置root密码

安装MySQL 8.0 在 Ubuntu 22.04.1 系统需要遵循几个明确的步骤,并在安装过程中配置root密码,以下是详细的过程和相关的注意事项。步骤 1: 更新系统 使用终端更新系统软件包列表以确保所有的包是最新的。sudo apt update sudo apt upgrade步骤 2: 安装MyS…

用 content-visibility 即刻提速:那个被你忽略的 CSS 性能杠杆

我有一支技术全面、经验丰富的小型团队,专注高效交付中等规模外包项目,有需要外包项目的可以联系我🔍 引言长页面、信息密集、滚动迟滞?**content-visibility** 这项相对较新的 CSS 属性,允许浏览器跳过视口外元素的渲…

字符串(2)

4.字符串的常见函数代码#include <stdio.h> #include <string.h> int main() {char* str1 "abc";char str2[100] "abc";char str3[5] { q,w,e,r ,\0 };printf("---------------------strlen&#xff08;长度&#xff09;-------------…

案例分享|企微智能会话风控系统:为尚丰盈铝业筑牢沟通安全防线

企微智能会话安全风险分析系统是一款基于企业微信原生集成的高性能处理平台&#xff0c;其核心在于通过智能监测和AI风险识别技术&#xff0c;对员工与内外部客户的聊天内容进行多模态分析&#xff08;涵盖文本、图片、语音、视频、文件等多种形式&#xff09;&#xff0c;利用…

Paimon——官网阅读:配置

配置(Maintenance) 系统表 表特定系统表 表特定系统表包含关于每个表的元数据和信息&#xff0c;例如创建的快照以及正在使用的选项。用户可以通过批量查询来访问系统表。 目前&#xff0c;Flink、Spark、Trino 和 StarRocks 支持查询系统表。 在某些情况下&#xff0c;表…

阿里云对象存储OSS的使用

文章目录注册阿里OSS注册并登录阿里云账号开通对象存储OSS创建Bucket修改权限创建AccessKey全局存储到你的计算机(可以跳过)查看官方文档(可以跳过)SSM使用引入依赖在spring-mvc.xml中加入配置创建上传工具类AliOssUtil响应工具类ResultJSON编写controller编写前端代码使用Elme…

香港云主机常见使用问题汇总

本文主要为初次或正在接触香港云主机的用户介绍&#xff0c;对于香港云服务器的一些问题进行解答&#xff0c;帮助用户更好的了解香港云主机&#xff0c;熟悉香港云主机。1.香港云主机是否需要备案?香港云主机无需进行像内地服务器那样的 ICP 备案&#xff0c;可直接部署使用。…

JAVA同城打车小程序APP打车顺风车滴滴车跑腿源码微信小程序打车源码

JAVA同城打车系统源码&#xff1a;多端融合的智能出行生态解决方案一、市场需求与行业背景在共享经济蓬勃发展和数字化转型加速的背景下&#xff0c;中国同城出行市场正迎来快速增长期。2025年中国同城出行市场规模预计突破8000亿元&#xff0c;年复合增长率超过25%。基于Sprin…

AI入坑: Trae 通过http调用.net 开发的 mcp server

1. 为什么要写这个 为什么要写这个内容&#xff0c;前几天开始加入到ai大军&#xff0c;通过一周的学习&#xff0c;看了国外网站、看了b站教程、看了抖音教程&#xff0c;居然发现都是开发在本地的mcp server。本地mcp没问题&#xff0c;个人使用都ok&#xff0c;或者通过npx下…

记录Pycharm所使用虚拟环境与终端无法对应

在anaconda安装时&#xff0c;本文中的安装位置在D盘&#xff0c; D:\soware\anaconda 理论环境位置 D:\soware\anaconda\envs 经检查PATH配置均未发现错误&#xff0c;其次问题并不在于Pycharm的设置中解译器与终端的设置经过多次查找未发现可用解决方案 在anaconda建立虚拟环…

国产数据库之YashanDB:新花怒放

YashanDB&#xff08;崖山数据库&#xff09;是由深圳计算科学研究院自主研发的一款新型关系数据库管理系统。 YashanDB 在经典数据库理论基础上&#xff0c;融入了原创的有界计算、近似计算、并行可扩展和跨模融合计算理论&#xff0c;可以满足金融、政企、能源等关键行业对高…

Java基础 9.5

1.异常处理基本介绍异常处理就是当异常发生的时候 对异常处理的方式异常处理方式try-catch-finally程序员在代码中捕获发生的异常 自行处理throws将发生的异常抛出 交给调用者&#xff08;方法&#xff09;处理 最顶级的处理者是JVM示意图2.try-catch方式处理异常说明Java提供t…

B.50.10.06-NoSQL数据库与电商应用

NoSQL数据库核心原理与电商应用实战核心思想: NoSQL (Not Only SQL) 数据库是为了解决传统关系型数据库在超大规模数据、高并发和灵活数据模型方面的不足而设计的。它们通过牺牲部分一致性&#xff08;通常是最终一致性&#xff09;和事务的严格性&#xff0c;来换取极高的性能…

把开发环境丢云上,我的电脑风扇再也没转过!

Hello&#xff0c;兄弟们&#xff0c;我来啦作为一个天天搬砖的程序员&#xff0c;每天最让我心态爆炸的是啥&#xff1f;不是产品又改需求&#xff0c;也不是 Bug 藏得深&#xff0c;而是TMD——配&#xff01;环&#xff01;境&#xff01;新项目 git clone 下来&#xff0c;…

驱动ft232h通信

FT232H是一个单通道USB 2.0高速&#xff08;480Mb/s&#xff09;转换为UART/FIFO IC&#xff0c;具有多种工业标准串行或并行接口配置能力。 1.实验板卡 FPGA型号&#xff1a; FT232H型号&#xff1a; FT232H SINGLE CHANNEL HI-SPEED USB TO MULTIPURPOSE UART/FIFO IC Da…

隔空盗刷、AI钓鱼、代理劫持…金融黑产竟进化至此?

【导读】中国工商银行发布的《2024网络金融黑产研究报告》&#xff0c;以深度洞察拆解黑产攻击“新变种”、勾勒防护新路径&#xff0c;自发布以来&#xff0c;成为金融安全行业的重要参考坐标。本文会提炼出报告中黑产攻击的五大技术演变与体系化防护思路&#xff0c;再结合金…

服务器为啥离不开传感器?一文看懂数据中心“隐形守护者”的关键角色

在现代数据中心或企业机房中&#xff0c;服务器不仅仅是“跑程序”的机器&#xff0c;它们还是一整套复杂系统的一部分。为了保证这些服务器稳定、高效、安全地运行&#xff0c;传感器成了不可或缺的角色。那么&#xff0c;服务器为啥要有传感器&#xff1f;这些传感器到底是干…

React JSX 语法讲解

&#x1f680; React JSX 语法讲解 1. 课程概述 本课程旨在系统讲解 JSX&#xff08;JavaScript XML&#xff09; 的核心概念与实战应用。JSX 是 React 的核心语法扩展&#xff0c;它允许我们在 JavaScript 中编写类似 HTML 的结构&#xff0c;使得构建用户界面变得直观和高效。…

软件安装教程(四):在 Windows 上安装与配置 MATLAB(超详细)

文章目录前言1. 安装前准备&#xff08;必看&#xff09;2. 下载 MATLAB&#xff08;推荐在线安装&#xff09;3. 在 Windows 上安装&#xff08;详细步骤&#xff09;4. 激活 MATLAB&#xff08;在线与离线&#xff09;5. 首次启动与界面入门6. 推荐的基本配置&#xff08;让环…

【运维自动化-标准运维】如何创建流程嵌套(子流程)

什么是子流程节点 标准运维里的流程节点有两类&#xff1a;标准插件节点和子流程节点。子流程节点实际上也是一个流程&#xff0c;比如某个业务线做全网更新时需要更新多个模块&#xff0c;那每个模块的更新流程可以称之为一个子流程。在总流程里直接添加子流程&#xff0c;就通…