Gated Context Aggregation Network for Image Dehazing and Deraining(GCANet)

news2024/11/22 16:41:40

1 总体概述

GCANet是端到端去雾的一篇代表性的文章,它摒弃以往使用手工设计的先验以及大气散射模型的使用,直接通过原始有雾图像估计出无雾图像J与有雾图像I之间的残差,图像恢复阶段直接使用网络输出的残差与输入有雾图像I之间的加和完成去雾过程。

文章本身最大的贡献:
1、借鉴并使用了平滑空洞卷积消除以往空洞卷积存在的网格伪影以及特征相关性不强的问题,提出了一个门限子网络,用于依据不同level的特征的权重进行特征加权融合
2、GCANet达到当前的SOTA,并且使用消融试验对不同模块重要性进行了分析
3、GCANet应用到去雨任务中依然获得了SOTA

2 灵感来源

之前的研究者利用扩张卷积来聚合上下文信息,可以获得更加细腻和准确的结果,主要原因是扩张卷积不损失分辨率,但是他也存在一些问题,比如网格伪影,远距离信息没有相关性。因此也有很多人去尝试改进上述问题,比如使用平滑空洞卷积来消除网格伪影;也有人使用不同level的特征图进行融合获得更好的去雾效果;也有使用使用gated fusion module ,但是它是直接使用原始图的拷贝而非中间所获取的特征图;GCANet借鉴了上述思想,使用了扩张卷积,借鉴了smooth 扩张卷积消除伪影,借鉴了融合特征图的思路,提出了一个门限子网络用于辨析不同level特征图的重要性

3 现有工作分析

去雾分为两种,其一是基于传统先验知识的去雾,其二是基于学习的方式, 区别就是第一种方案通过手工获取的先验知识在第二钟方案是通过学习获取

传统方案去雾
1、基于暗通道先验以及其对应的优化方案
2、最大对比度
3、颜色衰减先验等

深度学习去雾
1、使用端到端的深度学习方式,利用多尺度网络预测透射率图,但是透射率图估计的不准确导致去雾结果较差
2、将全局大气光值A以及透射率参数融合为一个参数,使用轻量级的网络进行预测
3、也有使用两个子网络分别预测全局大气光值A以及透射率参数,并依据大气散射模型进行图像去雾的

4 本文GCANet方法

在这里插入图片描述整体架构是:首先使用编码模块将输入的有雾图像编码为特征;接着通过聚合上下文信息以及融合不同level的特征强化编码特征(主要使用平滑空洞卷积以及特殊设计的门限子网络);最后使用一个解码网络将特征映射回原图空间,并加上原始图就可以获取最终的去雾图像

4.1 Smoothed Dilated Convolution

什么是网格伪影?
在这里插入图片描述
由上图可知,最右边的这一幅特征图中的红蓝绿黄色四种小点来自于之前特征层对应颜色的独立特征,特征之间没有交互,没有融合,导致最终获取的当前层的特征的之间没有相关性可言,造成局部信息丢失,这对于pixel_level的预测来说是极其致命的。

消除网格伪影有两种方式,第一种是在使用空洞卷积之前,使用共享可分离卷积先进行特征之间的融合;另一种方式是在卷积后特征整合之前,使用类似于shuffleNet一样的方式进行特征交互,具体可以参考如下链接:总结-空洞卷积(Dilated/Atrous Convolution)

本文采用第一种方式完成空洞卷积的网格效应消除

class ResidualBlock(nn.Module):
    def __init__(self, channel_num, dilation=1, group=1):
        super(ResidualBlock, self).__init__()
        self.conv1 = nn.Conv2d(channel_num, channel_num, 3, 1, padding=dilation, dilation=dilation, groups=group,
                               bias=False)
        self.norm1 = nn.InstanceNorm2d(channel_num, affine=True)
        self.conv2 = nn.Conv2d(channel_num, channel_num, 3, 1, padding=dilation, dilation=dilation, groups=group,
                               bias=False)
        self.norm2 = nn.InstanceNorm2d(channel_num, affine=True)

    def forward(self, x):
        y = F.relu(self.norm1(self.conv1(x)))
        y = self.norm2(self.conv2(y))
        return F.relu(x + y)

4.2 Gated Fusion Sub-network

其实现过程如下:首先提取低中高三个不同level的特征图,并设计一个gated fusion sub_network ,输出是三个层级的特征的权重,最后将三个不同层级特征图与对应权重线性连接即可。
具体公式如下:
在这里插入图片描述
文中提及Gated Fusion Sub-network 包含一个卷积核大小为3*3的卷积网络,输入是低中高三个level的特征通过通道维度进行连接,输出特征是3个通道
在这里插入图片描述

4.3 网络结构

首先使用三个卷积当作编码模块,对输入图像进行编码,最后一个卷积块特征分辨率减半;其次使用7个残差block对编码的特征进行特征增强;最后使用一个反卷积将特征图上采样两倍,接着使用两个反卷积将特征图映射回图像空间,这样就可以得到原图与无雾图的残差值;其中除了最后一个卷积层以及所设计的共享分离卷积层外,每个卷积后面都跟随一个instance normalization 以及一个ReLU激活函数。

PS:输入的参数除了原始的雾图外,还需要将图像的边缘提取后作为一个辅助信息加到输入信息中;实际操作的时候,可以提前将图片的边缘信息提取出来与原始图在通道上叠加进而送入网络,这样有利于网络学习
具体代码如下:

class GCANet(nn.Module):
    def __init__(self, in_c=4, out_c=3, only_residual=True):
        super(GCANet, self).__init__()
        self.conv1 = nn.Conv2d(in_c, 64, 3, 1, 1, bias=False)
        self.norm1 = nn.InstanceNorm2d(64, affine=True)
        self.conv2 = nn.Conv2d(64, 64, 3, 1, 1, bias=False)
        self.norm2 = nn.InstanceNorm2d(64, affine=True)
        self.conv3 = nn.Conv2d(64, 64, 3, 2, 1, bias=False)
        self.norm3 = nn.InstanceNorm2d(64, affine=True)

        self.res1 = SmoothDilatedResidualBlock(64, dilation=2)
        self.res2 = SmoothDilatedResidualBlock(64, dilation=2)
        self.res3 = SmoothDilatedResidualBlock(64, dilation=2)
        self.res4 = SmoothDilatedResidualBlock(64, dilation=4)
        self.res5 = SmoothDilatedResidualBlock(64, dilation=4)
        self.res6 = SmoothDilatedResidualBlock(64, dilation=4)
        self.res7 = ResidualBlock(64, dilation=1)

        self.gate = nn.Conv2d(64 * 3, 3, 3, 1, 1, bias=True)

        self.deconv3 = nn.ConvTranspose2d(64, 64, 4, 2, 1)
        self.norm4 = nn.InstanceNorm2d(64, affine=True)
        self.deconv2 = nn.Conv2d(64, 64, 3, 1, 1)
        self.norm5 = nn.InstanceNorm2d(64, affine=True)
        self.deconv1 = nn.Conv2d(64, out_c, 1)
        self.only_residual = only_residual

    def forward(self, x):
        y = F.relu(self.norm1(self.conv1(x)))
        y = F.relu(self.norm2(self.conv2(y)))
        y1 = F.relu(self.norm3(self.conv3(y)))

        y = self.res1(y1)
        y = self.res2(y)
        y = self.res3(y)
        y2 = self.res4(y)
        y = self.res5(y2)
        y = self.res6(y)
        y3 = self.res7(y)

        gates = self.gate(torch.cat((y1, y2, y3), dim=1))
        gated_y = y1 * gates[:, [0], :, :] + y2 * gates[:, [1], :, :] + y3 * gates[:, [2], :, :]
        y = F.relu(self.norm4(self.deconv3(gated_y)))
        y = F.relu(self.norm5(self.deconv2(y)))
        if self.only_residual:
            y = self.deconv1(y)
        else:
            y = F.relu(self.deconv1(y))

        return y

4.4 损失函数

损失函数用的MSE Loss,作者提及可以使用其它的损失函数,例如perceptual loss或者GAN loss都可以提升最终的去雾效果,但是即使使用最简单的MSE也能得到SOTA的结果
在这里插入图片描述

  • 后记
    作者的改进重点
    发力在损失函数改进以及视频去雾方面

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

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

相关文章

跨境电商商城源码,支持多语言,开启全球贸易新篇章!

随着全球化的不断深入,跨境电商已经成为越来越多企业的选择。我们为您提供的跨境电商源码产品,具有强大的多语言支持功能,可轻松扩展至多个语言,助您迅速占领全球市场,实现业务的国际化发展。 一、多语言支持&#xff…

uniapp蓝牙搜索设备并列表展示

1.需求:3.0的桩可以值扫码通过蓝牙名字直接绑定,2.0的桩二维码无蓝牙名称则需通过蓝牙列表来绑定 2.碰到问题 1.0 蓝牙列表需要去重(蓝牙列表通过deviceId去重再放进展示列表) 2.0页面会卡顿(调用my.stopBluetoothDevi…

(附源码)基于spring boot 房屋租赁系统小程序-计算机毕设 88306

spring boot 房屋租赁系统小程序 目 录 摘要 1 绪论 1.1选题意义 1.2开发现状 1.3springboot框架介绍 1.4论文结构与章节安排 2 房屋租赁系统小程序系统分析 2.1 可行性分析 2.1.1 技术可行性分析 2.1.2 经济可行性分析 2.1.3 法律可行性分析 2.2 系统功能分析 2.…

【Spring】AOP实现原理

注册AOP代理创建器 在平时开发过程中,如果想开启AOP,一般会使用EnableAspectJAutoProxy注解,这样在启动时,它会向Spring容器注册一个代理创建器用于创建代理对象,AOP使用的是AnnotationAwareAspectJAutoProxyCreator&…

MES系统数据集成系统源码

MES系统数据集成系统源码 1 MES的生产计划管理综述 生产计划的管理在MES系统中是非常重要的。我们知道,一般的情况下,企业的生产计划是由上层管理系统ERP来完成,那么MES中的生产计划和ERP的生产计划的不同点在于: ERP的生产计划…

选择振弦采集仪进行岩土工程监测时,根据不同工况选择合适的种类

选择振弦采集仪进行岩土工程监测时,根据不同工况选择合适的种类 岩土工程监测是保证工程质量和安全的重要手段。振弦采集仪是一种常用的岩土工程监测仪器,可用于对岩土工程场地振动环境的监测。它具有测量精度高、实时性强、易于安装、使用方便等特点。…

唯众技能大赛公开公平公正践行者

​近日,2023一带一路暨金砖国家技能发展与技术创新大赛网络综合布线赛项成功举办。唯众创始人辜渝傧对本次比赛情况就相关问题回答了记者提问。 采访人:第一个问题,咱们这一次“2023一带一路暨金砖国家技能发展与技术创新大赛之网络综合布线赛…

React【异步逻辑createAsyncThunk(一)、createAsyncThunk(二)、性能优化、createSelector】(十二)

文章目录 异步逻辑 createAsyncThunk(一) createAsyncThunk(二) 性能优化 createSelector 异步逻辑 //Product.js const onAdd () > {const name nameRef.current.value// 触发添加商品的事件dispatch(addProduct({name…

基于.NET的强大文件格式开源转换工具

推荐一个非常强大、轻便的强大文件格式转换工具。 01 项目简介 一个基于.NET平台的开源文件格式转换工具,可以支持Windows 7/8/10等操作系统。安装后在右键菜单中出现 “File Converter” 项目,可以方便地通过右键菜单对选中文件进行格式转换&#xff…

HALCON的python下的使用方法(直接开发,不需要调用.hdev文件)

一、环境配置方法 基本要求: Python版本>3.8 ; Halcon版本 >20.11 1)首先创建一个python版本大于3.8的基础环境 2)然后查看自己的halcon的版本,在该环境下安装halcon 如图所示,版本是20110,执行以…

Java,多线程,线程的两种创建方式

首先是多线程的一些相关概念: 相关概念: 程序(program):为完成特定任务,用某种语言编写的一组指令的集合。即指一段静态(指不在执行中)的代码。 进程(process&#xf…

十分钟了解回归测试

1. 什么是回归测试(Regression Testing) 回归测试是一个系统的质量控制过程,用于验证最近对软件的更改或更新是否无意中引入了新错误或对以前的功能方面产生了负面影响(比如你在家中安装了新的空调系统,发现虽然新的空…

34 mysql limit 的实现

前言 这里来看一下 我们常见的 mysql 分页的 limit 的相的处理 这个问题的主要是来自于 之前有一个需要处理 大数据量的数据表的信息, 将数据转移到 es 中 然后就是用了最简单的 “select * from tz_test limit $pageOffset, $pageSize ” 来分页处理 但是由于 数据表的数…

[autojs]逍遥模拟器和vscode对接

第一步:启动autojs服务 第二步:去cmd查看ip地址,输入ipconfig 第三步:打开逍遥模拟器中的sutojs-左上角- 连接电脑,然后输入WLAN或者其他ip也行,根据自己电脑实际情况确认 此时vscode显示连接成功。我们写…

上传ipa到appstore最简单的方法

假如使用原生xcode开发ios的app,可以使用xcode提交打包好的ipa文件到app store,但是假如使用hbuilderx或者apicloud等H5工具开发的app,假如没有mac电脑,是无法将ipa提交到app store的。 因为苹果开发者并不能在线上传ipa到app st…

数据结构-图的应用

最小生成树(最小代价树) 对于一个带权连通无向图G(V,E),生成树不同,每棵树的权(即树中所有边上的权值之和)也可能不同。设R为G的所有生成树的集合,若T为R中边的权值之和最小的生成树,则T称为G的…

SPI简介及FPGA通用MOSI模块实现

简介 SPI(Serial Peripheral Interface,串行外围设备接口)通讯协议,是Motorola公司提出的一种同步串行接口技术。是一种高速、全双工、同步通信总线。在芯片中只占用四根管脚用来控制及数据传输。 优缺点: SPI通讯协…

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

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

linux系统源码安装php5.6手把手教程

linux系统源码安装php5.6实用教程 1、下载php5.6安装包2、开始安装3、安装成功 1、下载php5.6安装包 wget http://mirrors.sohu.com/php/php-5.6.2.tar.gz在安装之前,我们需要安装php5.6编译时所依赖的软件包。如下: yum -y install gcc gcc-c lib2、开…

docker下的nginx代理转发到tomcat

多次尝试失败原因,修改nginx配置文件以后,需要./nginx.sh -s reload 下,之前一直不转发,好像完全没有跳转的意思,后来查了多篇文档,最简单的方法如下 docker 安装 nginx 和tomcat就不多说了,可…