DehazeNet: An End-to-End System for Single Image Haze Removal(端到端的去雾模型)

1、论文去雾总体思路

DehazeNet是2016年华南理工大学的研究者提出的一个端到端的深度学习模型,该模型主要通过输入的原始有雾图像拟合出该图所对应的medium transmission map(透射率t值图),并使用引导滤波对t值进行refine,接着通过medium transmission map中前0.1%的值所对应的原始图像的RGB值的均值求取全局大气光值,利用现有的大气散射模型完成图像去雾操作。

文章的主要贡献:
1、通过特殊的网络设计构建了一个端到端的网络,利用原始雾天图像直接拟合对应的透射率图像t,进而达到去雾的目的
2、提出了一个非线性的双边整流线性激活函数模块(BReLu),并验证了它的有效性(减少搜索空间,加速模型收敛)
3、建立了DehazeNet与现有的假设先验之间的联系,并解释了通过自动学习来优化和改善之前的先验假设

2、既有模型简介

2.1 大气散射模型

在这里插入图片描述
由上图可知,阳光在物体表面形成反射光 J(x),反射光在穿过雾霾的过程中发生散射,只有部分能量 J(x)t(x) 能到达摄像头。与此同时,阳光也在悬浮颗粒表面散射形成大气光 α 被摄像头接收。因此,摄像头中的成像 I(x) 可由两部分组成,透射的物体亮度 J(x)t(x)散射的大气光照 α(1-t(x))

大气散射模型是图像去雾的核心公式,由上述描述可知,最终到达镜头呈现出来的图像包含两部分:透射的物体亮度 J(x)t(x)以及散射的大气光照 α(1-t(x)),具体公式如下所示:
在这里插入图片描述

2.2 既有先验模型

(1)暗通道先验
在这里插入图片描述
参考之前的文章:Single Image Haze Removal Using Dark Channel Prior(暗通道先验)
(2)最大对比度方法
雾霾会降低物体成像的对比度:Σx‖ΔI(x)‖=tΣx‖ΔJ(x)‖≤Σx‖ΔJ(x)‖。因此,基于这个推论可利用局部对比度来近似估计雾霾的浓度。同时,也可以通过最大化局部对比度来还原图像的颜色和能见度
在这里插入图片描述
(3)颜色衰减先验
颜色衰减先验(CAP)是一种与暗通道先验(DCP)相似的先验特征。观察发现雾霾会同时导致图像饱和度的降低和亮度的增加,整体上表现为颜色的衰减。根据颜色衰减先验,亮度和饱和度的差值被应用于估计雾霾的浓度
在这里插入图片描述
(4)色调视差
在这里插入图片描述

3、DehazeNet总体概况

在这里插入图片描述
模型的整体架构包含四个大块,分别是特征提取,主要是通过卷积+maxout激活函数;多尺度特征映射,主要借鉴xception网络,使用3、5、7三种不同大小的卷积获取不同感受野的特征并进行通道拼接;局部极值,利用maxpooling完成极值的求解;非线性回归,使用一个6*6的卷积+BReLU完成非线性映射。

3.1 特征提取

传统图像提取特征都会需要一定的假设和先验,但是这些手工设计的或者假设的特征并不是在所有情况下都适用。在观察了暗通道先验、最大对比度先验、颜色衰减先验的实现原理后,作者提出可以使用相对应的卷积核去卷积原始图像并加上非线性激活后的特征等效代替上述先验特征。此处使用maxout激活函数主要是将通道分段,提取不同的通道的最大值,结合不同的卷积核,可以得到类似暗通道先验、最大对比度先验、颜色衰减先验等的效果,并且可以带来更强的拟合性能。
在这里插入图片描述
此处的卷积使用的是5*5的卷积核,输入是3通道输出是原始输入图片的宽(输入数据大小16*16),激活函数是maxout,该激活函数和普通的激活函数不太一样,如下为对比
在这里插入图片描述
对于普通的激活函数,z=w*x+b而言,out=f(z),其中f就是我们常用的激活函数,比如ReLU,Sigmod等

针对maxout不一样的点在于,如果我们设置maxout的组数K为5,则会在每个神经元的前面多出一层,这一层有5个神经元,如下图所示。
在这里插入图片描述
那么maxout的计算公式就变成了:
z1=w1x+b1
z2=w2
x+b2
z3=w3x+b3
z4=w4
x+b4
z5=w5*x+b5
最终的输出为out = max(z1,z2,z3,z4,z5)

差别就在于:常规的激活函数主要针对单个神经元,比如ReLU,输出的max(0,x);而针对maxout这样的激活函数,是将多个神经元分为一组,整体求最大值。maxout相对其它激活拥有更好的拟合效果

3.2 多尺度映射

多尺度特征在图像去雾中应用广泛,原因是它可以获取尺度不变性,使得获取的特征更加鲁棒,受inception模块的启发,作者使用3*3,5*5以及7*7的卷积核去获取不同的特征,并进行聚合,增强特征对多尺度物体的泛化能力。

3.3 局部极值

使用局部极值的原因类似于其它先验算法里面的假定局部透射率不变作用一样,文中使用maxpool去代替之前的局部透射率不变先验操作,这里使用的是7*7的局部区域。

3.4 非线性回归

图像恢复领域,最后一层的输出值一般是上限和下限处于一个小范围的,sigmoid以及relu都不太适合作为激活函数,前者由于梯度爆炸问题,后者由于无上限都不适合,本文提出使用BReLU激活函数,限制激活后的值处于tmin以及tmax之间,实际有点类似Hardtanh函数,作者在实现的时候也是继承这个函数去实现的。
在这里插入图片描述

3.5 网络设计结构

在这里插入图片描述

3.6 存在的问题以及后续改进

1、全局大气光值A不能当作一个常量对待,后续可以像学习透射率转换参数t一样包含在统一的网络中进行学习
2、大气散射模型也可以通过模型直接学习,完全摒弃人工设计

4、参考源码

https://github.com/zlinker/DehazeNet/blob/master/DehazeNet.py
https://github.com/thuBingo/DehazeNet_Pytorch
深度学习(二十三)Maxout网络学习

下述代码是实现DehazeNet的网络结构,总体比较简单,需要引起注意的是maxout以及BReLU的实现。

class BRelu(nn.Hardtanh):
    def __init__(self, inplace=False):
        super(BRelu, self).__init__(0., 1., inplace)

    def extra_repr(self):
        inplace_str = 'inplace=True' if self.inplace else ''
        return inplace_str

class DehazeNet(nn.Module):
    def __init__(self, input=16, groups=4):
        super(DehazeNet, self).__init__()
        self.input = input
        self.groups = groups
        self.conv1 = nn.Conv2d(in_channels=3, out_channels=self.input, kernel_size=5)
        self.conv2 = nn.Conv2d(in_channels=4, out_channels=16, kernel_size=3, padding=1)
        self.conv3 = nn.Conv2d(in_channels=4, out_channels=16, kernel_size=5, padding=2)
        self.conv4 = nn.Conv2d(in_channels=4, out_channels=16, kernel_size=7, padding=3)
        self.maxpool = nn.MaxPool2d(kernel_size=7, stride=1)
        self.conv5 = nn.Conv2d(in_channels=48, out_channels=1, kernel_size=6)
        self.brelu = BRelu()
        for name, m in self.named_modules():
            if isinstance(m, nn.Conv2d):
                nn.init.normal(m.weight, mean=0, std=0.001)
                if m.bias is not None:
                    nn.init.constant_(m.bias, 0)

    def Maxout(self, x, groups):
        x = x.reshape(x.shape[0], groups, x.shape[1] // groups, x.shape[2], x.shape[3])
        x, y = torch.max(x, dim=2, keepdim=True)
        out = x.reshape(x.shape[0], -1, x.shape[3], x.shape[4])
        return out

    def forward(self, x):
        out = self.conv1(x)
        out = self.Maxout(out, self.groups)
        out1 = self.conv2(out)
        out2 = self.conv3(out)
        out3 = self.conv4(out)
        y = torch.cat((out1, out2, out3), dim=1)
        y = self.maxpool(y)
        y = self.conv5(y)
        y = self.brelu(y)
        y = y.reshape(y.shape[0], -1)
        return y

文中生成数据集的小tips:

在这里插入图片描述
由上述文献可知:使用一张无雾的图片J(x),随机设置透射率参数t,并将全局大气光A设置为1,可以直接获取带雾图片,顺带还可以获取相应透射率参数作为训练获取的gt值。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/125661.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

TSINGSEE青犀智能分析网关工服识别算法,如何最大限度保障工人安全?

众所周知,TSINGSEE青犀智能分析网关算法繁多,大多数算法已经和大家讲解过了,今天就和大家聊一聊工服识别算法。工服识别算法一般应用于工地、化工、煤矿等场所,用来监督检测施工人员是否按照要求着工服,最大程度保障人…

【Spring】Spring IOCDI详解

文章目录 1. Spring是什么?2. 认识IOC2.1 传统程序开发1. Main.java2. Car.java3. Framework.java4. Bottom.java5. Tire.java 2.2 分析传统开发2.3 IOC程序开发1. Main.java2. Car.java3. Framework.java4. Bottom.java5. Tire.java 2.4 分析IOC开发2.5 IOC容器优点…

软件测试-根据状态迁移图设计测试用例

测试用例状态迁移图 许多需求用状态机的方式来描述,状态机的测试主要关注状态转移是否正确。对于一个有限状态机,通过测试验证其在给定的条件内是否能够产生需要的状态变化,有没有不可达的状态和非法的状态,是否可能产生非法的状…

探索人工智能领域——30个名词详解

目录 前言 正文 总结​​​​​​​ 🌈嗨!我是Filotimo__🌈。很高兴与大家相识,希望我的博客能对你有所帮助。 💡本文由Filotimo__✍️原创,首发于CSDN📚。 📣如需转载,请…

学习OpenCV(蝴蝶书/C++)相关——2.MacOS下使用LLDB调试cpp程序

文章目录 1. VScode中的调试2. 配置VSCode中C++的调试(以OpenCV为例)2.1 创建适用于C++的.launch文件2.2 常见参数说明2.3 调试OpenCV的.launch文件示例2.3.1 .launch文件demo2.3.2 Debug模式的可执行文件之前在 mac下vscode配置c++环境用过简单的launch.json的配置。 但是不足…

Netty第三部

继续Netty第二部的内容 一、ChannelHandler 1、ChannelHandler接口 ChannelHandler是Netty的主要组件,处理所有的入站和出站数据的应用程序逻辑的容器,可以应用在数据的格式转换、异常处理、数据报文统计等 继承ChannelHandler的两个子接口&#xff…

GPT-4.0网页平台-ChatYY

ChatYY的优势: 1. 支持大部分AI模型,且支持AI绘画: 2. 问答响应速度极快: 3. 代码解析: 4. 支持文档解读: 5. PC、移动端均支持: 访问直达:ChatYY.com

NAND Vpass对读干扰和IO性能有什么影响?

1.SSD基础知识 SSD的存储介质是什么,它就是NAND闪存。那你知道NAND闪存是怎么工作的吗?其实,它就是由很多个晶体管组成的。这些晶体管里面存储着电荷,代表着我们的二进制数据,要么是“0”,要么是“1”。NA…

PTA_乙级_1008

首先&#xff0c;它翻转前部分&#xff08;0 到 N-M-1&#xff09;。 然后&#xff0c;它翻转后部分&#xff08;N-M 到 N-1&#xff09;。 最后&#xff0c;它整体翻转整个数组&#xff08;0 到 N-1&#xff09; #include<iostream> using namespace std;// 反转数组的…

Linux线程同步

文章目录&#xff1a; Linux线程同步条件变量同步概念与竟态条件条件变量函数为什么 pthread_cond_wait 需要互斥量&#xff1f;条件变量使用规范 Linux线程同步 条件变量 当一个线程互斥地访问某个变量时&#xff0c;它可能发现在其它线程改变状态之前&#xff0c;它什么也做…

Unity 实现文字过长显示省略号

为了整体效果&#xff0c;当文字过长时&#xff0c;我们就会把超出范围的文字弄成省略号。 要实现文字过长显示省略号&#xff0c;只需要使用TextMeshPro&#xff0c;并设置Overflow属性为Ellipsis即可。 如下图&#xff1a; 记。

【Proteus仿真】【Arduino单片机】LCD1602-IIC液晶显示

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真Arduino单片机控制器&#xff0c;使用PCF8574、LCD1602液晶等。 主要功能&#xff1a; 系统运行后&#xff0c;LCD1602液晶显示各种效果。 二、软件设计 /* 作者&#xff1a;嗨小…

SpringBootWeb案例——Tlias智能学习辅助系统(2)

前一节已经实现了员工信息的条件分页查询以及删除操作。 这一节继续完成新增员工、文件上传、修改员工、配置文件的功能。 目录 新增员工文件上传简介本地存储阿里云OSS介绍与入门项目集成阿里云(难点) 修改员工查询回显修改员工 配置文件参数配置化(Value)yml配置文件Configur…

Git安装配置保姆级教程和Git创建仓库的基本原理和常用命令

目录 前言 一、Git简介 1.Git 与 SVN 区别点 2.Git的介绍 3.Git 工作流程 4.Git 工作区、暂存区和版本库 二、Git安装配置 1.Linux 平台上安装 2.Windows 平台上安装 三、Git 创建仓库和下载 1、首先需要注册一个gitee账号 2.git初始化并提交到远程仓库 3.另一用户…

蓝桥杯每日一题2023.11.9

包子凑数 - 蓝桥云课 (lanqiao.cn) 题目描述 题目分析 对于此题是一个简单DP的翻版问题&#xff0c;若能凑出当前的包子数&#xff0c;则凑出之前一定为dp[i - a[j]]&#xff0c;若表示出的dp[i]不是0则说明是一定存在数可以被凑出的&#xff0c;由题意&#xff1a;若凑不出的…

汽车工业生产线数字孪生可视化管理平台,赋予工厂车间数字化智慧化管理

在工业4.0 的时代背景下&#xff0c;随着企业数字化进程的推进&#xff0c;数字孪生可视化技术逐渐在汽车行业得到广泛应用&#xff0c;数字孪生智慧工厂的建设也成为了汽车行业数字化转型的趋势之一。汽车制造业属于典型的离散制造行业&#xff0c;汽车生产包含冲压、焊接、涂…

微机原理3

一、单项选择题(本大题共15小题,每小题3分,共45分。在每小题给出的四个备选项中,选出一个正确的答案。 1. 在机器数中&#xff0c;零的表示形式唯一的编码是() A. 原码 B. 补码 C.移码 D. 反码 2,用于定义常数、变量的内存空间分配和定位的是()。 A. 伪指令 B.机器指令…

【Python】数据分析案例:世界杯数据可视化

文章目录 前期数据准备导入数据 分析&#xff1a;世界杯中各队赢得的比赛数分析&#xff1a;先打或后打的比赛获胜次数分析&#xff1a;世界杯中的抛硬币决策分析&#xff1a;2022年T20世界杯的最高得分者分析&#xff1a;世界杯比赛最佳球员奖分析&#xff1a;最适合先击球或追…

VM17虚拟机设置网络,本地使用工具连接虚拟机

VM17虚拟机设置网络&#xff0c;本地使用工具连接虚拟机 下载及安装虚拟机不再说明&#xff0c;网络一堆教程。此处只对VM17设置网路及本地使用工具连接虚拟机操作&#xff0c;进行说明。 我下载的是VM17&#xff0c;网上有说VM16是较稳定的版本。想尝尝鲜&#xff0c;结果耗…

debian 已安装命令找不到 解决方法

前言&#xff1a;安装了debian系统&#xff0c;更新完软件包安装软件之后发现很多命令找不到&#xff0c;查找命令路径发现命令已经安装了&#xff0c;但是没办法直接使用 更新软件包 &#xff08;第一次安装的系统一定要执行&#xff0c;不然可能无法安装软件&#xff09; apt…