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

news2024/11/26 10:17:57

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值。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringCloud - OpenFeign 参数传递和响应处理(全网最详细)

目录 一、OpenFeign 参数传递和响应处理 1.1、feign 客户端参数传递 1.1.1、零散类型参数传递 1. 例如 querystring 方式传参 2. 例如路径方式传参 1.1.2、对象参数传递 1. 对象参数传递案例 1.1.3、数组参数传递 1. 数组传参案例 1.1.4、集合类型的参数传递&#xf…

PHP+MySQL人才招聘小程序系统源码 带完整前端+后端搭建教程

在当今竞争激烈的人才市场中,招聘平台的需求日益增长。传统的招聘平台往往需要投入大量的人力物力进行维护和管理,这对于许多中小企业来说是一个沉重的负担。因此,开发一个简单易用、高效便捷的招聘平台显得尤为重要。 PHP是一种流行的服务器…

通过docker-compose部署elk日志系统,并使用springboot整合

ELK是一种强大的分布式日志管理解决方案,它由三个核心组件组成: Elasticsearch:作为分布式搜索和分析引擎,Elasticsearch能够快速地存储、搜索和分析大量的日志数据,帮助用户轻松地找到所需的信息。 Logstash&#xf…

逐次变分模态分解(Sequential Variational Mode Decomposition,SVMD)(附代码)

代码原理 逐次变分模态分解(Sequential Variational Mode Decomposition,SVMD)是一种用于信号处理和数据分析的方法。它可以将复杂的信号分解为一系列模态函数,每个模态函数代表了信号中的一个特定频率成分。SVMD的主要目标是提取…

【每日一题】咒语和药水的成功对数

文章目录 Tag题目来源解题思路方法一:排序二分 写在最后 Tag 【排序二分】【数组】【2023-11-10】 题目来源 2300. 咒语和药水的成功对数 解题思路 方法一:排序二分 我们首先对 points 进行升序排序,然后枚举 spells 中的 x,需…

持续集成交付CICD:安装Gitlab Runner(从节点)

目录 一、实验 1.选择Gitlab Runner版本 2.安装Gitlab Runner(第一种方式:交互式安装) 3.安装Gitlab Runner(第二种方式:非交互式安装) 二、问题 1.如何查看Gitlab版本 一、实验 1.选择Gitlab Runne…

如何用Excel软件制作最小二乘法①

一、用自带的选项(不推荐),因为感觉只是近似,虽然结果一样 1.在Excel中输入或打开要进行在excel中输入或打开要进行最小二乘法拟合的数据,如图所示。 2.按住“shift”键的同时,用鼠标左键单击以选择数据&a…

android手机平板拓展电脑音频

(1)首先确保电脑上有声卡,就是电脑右下角小喇叭能调音量,不管电脑会不会响,如果小喇叭标记了个错误,说明没有声卡,安装图上的虚拟声卡软件。 (2)图上第一个PC免安装及局…

Code Review最佳实践

Code Review最佳实践 Code Review 我一直认为Code Review(代码审查)是软件开发中的最佳实践之一,可以有效提高整体代码质量,及时发现代码中可能存在的问题。包括像Google、微软这些公司,Code Review都是基本要求&…

07、SpringBoot+微信支付 -->处理超时订单(定时查询、核实微信支付平台的订单、调用微信支付平台查单接口、更新本地订单状态、记录支付日志)

目录 Native 支付处理超时订单定时的讲解需求分析代码定时任务:WxPayTask定时查询的方法:核实订单状态等操作 :WxPayServiceImpl查单接口方法:queryOrder更新本地订单状态:updateStatusByOrderNo记录支付日志&#xff…

tqdm学习

from tqdm import tqdmepochs 10 epoch_bar tqdm(range(epochs)) count 0 for _ in epoch_bar:count count1print("count {}".format(count))print(_)每次就是一个epoch

CSDN每日一题学习训练——Java版(克隆图、最接近的三数之和、求公式的值)

版本说明 当前版本号[20231109]。 版本修改说明20231109初版 目录 文章目录 版本说明目录克隆图题目解题思路代码思路参考代码 最接近的三数之和题目解题思路代码思路参考代码 求公式的值题目解题思路代码思路参考代码 克隆图 题目 给你无向 连通(https://baike.baidu.com…

电商项目之Java8函数式接口落地实践

文章目录 1 问题背景2 前言3 多处重复的重试机制代码4 优化后的代码5 进一步优化 1 问题背景 在电商场景中,会调用很多第三方的云服务,比如发送邮件、发起支付、发送验证码等等。由于网络存在抖动,有时候发起调用后会拿到500的状态码&#xf…

Visual Studio2022安装教程【图文详解】(大一小白)编译软件

工欲善其事,必先利其器。想要学好编程,首先要把手中的工具利用好,今天小编教一下大家如何下载安装并使用史上最强大的编译器--Visual Studio🍗 一.Visual Studio下载及安装 https://visualstudio.microsoft.com/ 打开文件 点击.ex…

Halcon的相机内参外参的标定

halcon标定相机内参只能使用方向标定板和圆点标定板。并且方向标定板可也可用性极高。 1.打开halcon的标定助手,选择标定板的描述文件,填写标定板的厚度,根据相机选择像元的尺寸和镜头的焦距。如果已有相机内参,只标定外参&#…

使用ESP8266构建家庭自动化系统

随着物联网技术的不断发展,家庭自动化系统变得越来越受欢迎。ESP8266是一款非常适合于构建家庭自动化系统的WiFi模块。它小巧、低成本,能够实现与各种传感器和执行器的连接,为家庭带来智能化、便利化的体验。在本篇文章中,我们将向…

kubernetes集群编排(9)

目录 helm 部署helm 封装chart包 上传chart到OCI仓库 部署wordpress博客系统 helm部署storageclass helm部署ingress-nginx helm部署metrics-server kubeapps 更新 helm 部署helm 官网: Helm | 快速入门指南 https://github.com/helm/helm/releases [rootk8s2 ~]# t…

2022年06月 Python(四级)真题解析#中国电子学会#全国青少年软件编程等级考试

Python等级考试(1~6级)全部真题・点这里 一、单选题(共25题,每题2分,共50分) 第1题 有如下Python程序,包含lambda函数,运行该程序后,输出的结果是?( ) g = lambda x,y:x*y print(g(2,3)

理解RNN以及模型搭建代码

RNN结构 这是一张不直观易懂的RNN结构示意图。但也是大家见得最多结构示意图。 RNN模型解释 RNN一文就讲解清楚的博客,看这里:https://zhuanlan.zhihu.com/p/408998328 RNN为什么梯度消失和梯度爆炸,看这里:https://zhuanlan.z…

隧道技术的三种应用场景(IPv6,多播,VPN)

目录 1.IPv6的隧道技术 2.多播路由选择 (1)洪泛 (2)隧道技术 (3)基于核心的发现技术 3.隧道技术实现(VPN)虚拟专用网 1.IPv6的隧道技术 IPv6与IPv4的过渡技术中包含了IPv6的隧道技术: http://t.csdnimg.cn/wuvXY 2.多播路由选择 转发…