GCANet去雾算法

目录

1. 引言

2. 门控上下文注意机制(GCA)

3. 去雾流程

4. 模型代码

5. GCANet的优势

6. 去雾效果


1. 引言

GCANet(Gate-Controlled Attention Network)是一种用于图像去雾的深度学习算法,通过引入注意力机制来改进传统的去雾方法,提升去雾效果,增强图像的清晰度和可见性,并且能够在复杂的雾天场景中提供卓越的去雾效果。其自适应的特征增强机制使其在各种实际应用中表现出色。

GCANet的核心思想是使用门控注意力机制来关注图像中的重要特征,从而更有效地去除雾气。

GCANet包含两个主要部分:

1.特征提取网络(Feature Extraction Network):

该网络用于提取输入雾天图像的特征。它通常由多个卷积层和非线性激活函数组成,能够捕捉图像中的低级和高级特征。

2.门控注意力模块(Gate-Controlled Attention Module):

该模块是GCANet的关键创新。它通过计算不同通道和空间位置的注意力权重来识别重要的图像区域。注意力模块利用这些权重来调整特征图,抑制不重要的信息,增强重要的特征。

2. 门控上下文注意机制(GCA)

注意机制是用来调节学习特征的相对重要性。图1所示的GCA操作分为两个主要阶段:全局上下文池化注意力门控

                                                             门控上下文注意块结构

3. 去雾流程

1.输入雾天图像:首先将雾天图像输入到特征提取网络中,提取出多尺度的特征图。

2.注意力计算:在特征提取过程中,门控注意力模块会计算每个特征图的注意力权重,生成门控注意力图。

3.特征增强:将门控注意力图应用于特征图,以增强有用的特征并抑制噪声。

4.图像重建:通过去雾网络将增强后的特征图还原为清晰的图像。

4. 模型代码

import torch
import torch.nn as nn
import torch.nn.functional as Fclass ShareSepConv(nn.Module):def __init__(self, kernel_size):super(ShareSepConv, self).__init__()assert kernel_size % 2 == 1, 'kernel size should be odd'self.padding = (kernel_size - 1)//2weight_tensor = torch.zeros(1, 1, kernel_size, kernel_size)weight_tensor[0, 0, (kernel_size-1)//2, (kernel_size-1)//2] = 1self.weight = nn.Parameter(weight_tensor)self.kernel_size = kernel_sizedef forward(self, x):inc = x.size(1)expand_weight = self.weight.expand(inc, 1, self.kernel_size, self.kernel_size).contiguous()return F.conv2d(x, expand_weight,None, 1, self.padding, 1, inc)class SmoothDilatedResidualBlock(nn.Module):def __init__(self, channel_num, dilation=1, group=1):super(SmoothDilatedResidualBlock, self).__init__()self.pre_conv1 = ShareSepConv(dilation*2-1)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.pre_conv2 = ShareSepConv(dilation*2-1)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(self.pre_conv1(x))))y = self.norm2(self.conv2(self.pre_conv2(y)))return F.relu(x+y)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)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_residualdef 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

5. GCANet的优势

自适应性强:通过门控注意力机制,GCANet可以自适应地关注不同图像中的重要区域,提高去雾效果。

去雾效果好:相比传统的去雾方法和一些简单的深度学习模型,GCANet在处理复杂的雾天场景时表现更好。

易于训练:GCANet的结构设计合理,训练过程相对简单,适用于各种雾天图像数据集。

6. 去雾效果

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

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

相关文章

C#实现纳秒级的计时器功能

常用的 Windows API 方法 GetTickCount() 返回系统启动后经过的毫秒数。另一方面,GetTickCount() 函数仅有 1ms 的分辨精度,精度也很不好。 我们要另外寻找一种方法来精确测量时间。 Win32 API 使用 QueryPerformanceCounter() 和 QueryPerformanceFre…

大模型场景应用汇总(持续更新)

一、应用场景 1.办公场景 智能办公:文案生成(协助构建大纲优化表达内容生成)、PPT美化(自动排版演讲备注生成PPT)、数据分析(生成公式数据处理表格生成)。 智能会议:会议策划&…

P10442 「MYOI-R3」字符串

「MYOI-R3」字符串 题目描述 给定字符串 s , t s,t s,t。 现在你要在 s , t s,t s,t 中删除一些字符并将它们重新排列使 s t st st。 问操作后的 ∣ s ∣ |s| ∣s∣(即字符串 s s s 的长度)最大是多少? 输入格式 第一行一个字符串…

深入探索 MongoDB:高级索引解析与优化策略

MongoDB 是一种非常流行的 NoSQL 数据库,它支持丰富的索引类型和功能,以提高数据查询的效率和性能。本文将详细介绍 MongoDB 的高级索引,包括基本语法、常用命令、示例、应用场景、注意事项和总结。 基本语法 在 MongoDB 中,可以…

密码学基础概念

加密性 什么是加密? 1.对原有的明文数据,执行某种运算,得到密文数据。 2.密文数据对于未授权人员而言,在一定上程度上加大了解读的难度 3.加密功能用于实现机密性 什么是密钥? 1.如同持有保险柜钥匙才能打开保险柜…

数据结构算法题day05

数据结构算法题day05 题目算法思想代码 题目 从有序表中删除所有其值重复的元素,使表中所有元素的值均不同。算法思想 第一个元素(不重复)依次向后扫描,不重复就保留,重复(不保留)就删除所有重…

排序进阶----插入排序,希尔排序

各位看官们好,接下来鄙人想与大家分享的实现被称为六大排序之一的插入排序。其实关于这六大排序在我们最开始就已经接触过了。我们在最开始学习c语言的时候,我们要学习到其中之一的冒泡排序。虽然现在看起来冒泡排序确实是没有太大的实际效果&#xff0c…

【Xilinx约束】create_generated_clock 约束语法介绍

在 Xilinx Vivado 环境中,使用 create_generated_clock 约束来定义由锁相环(PLL)或时钟管理模块(如 MMCM 或 DCM)生成的时钟。这个约束用于指定生成时钟的属性,例如时钟的源、相位和频率。 基本语法 以下是…

618必买的数码好物有哪些?盘点兼具设计与实用的数码好物分享

随着618购物节的到来,数码爱好者们又开始跃跃欲试,期待在这个年度大促中寻找到自己心仪的数码好物,在这个数字化时代,数码产品不仅是我们日常生活的必需品,更是提升生活品质的重要工具,那么在众多的数码产品…

【MySQL】 1130 -Host ‘14.*.**.*‘ is not allowed to connect to this MySQL server

这个错误表明MySQL服务器拒绝了来自IP地址为14.*.**.*的主机的连接请求。这通常是由于MySQL用户的主机限制引起的。 要解决这个问题,你需要在MySQL中允许指定主机的连接。你可以按照以下步骤操作: 使用具有足够权限的用户(如root用户&#x…

HNU-计算机体系结构-实验1-RISC-V流水线

计算机体系结构 实验1 计科210X 甘晴void 202108010XXX 1 实验目的 参考提供为了更好的理解RISC-V,通过学习RV32I Core的设计图,理解每条指令的数据流和控制信号,为之后指令流水线及乱序发射实验打下基础。 参考资料: RISC-…

Ubuntu20.04升级到22.04之后出现的问题

项目场景: 之前一致使用的是Ubuntu20.04,虽然丑了点,但是用着没什么问题,最近没能按捺住好奇心,升级到了22.04,升级后颜值有所提高,但是也带来了一些问题。 从20.04升级到22.04,起始…

【学习笔记】Axios、Promise

TypeScript 1、Axios 1.1、概述 1.2、axios 的基本使用 1.3、axios 的请求方式及对应的 API 1.4、axios 请求的响应结果结构 1.5、axios 常用配置选项 1.6、axios.create() 1.7、拦截器 1.8、取消请求2、Promise 2.1、封装 fs 读…

sendmail发送邮件配置详解?如何正确设置?

sendmail发送邮件如何保障安全?AokSend有何安全措施? 为了确保sendmail发送邮件的高效性和安全性,正确配置是至关重要的。本文将详细介绍sendmail发送邮件的配置步骤,并探讨如何保障sendmail发送邮件的安全性。同时,我…

界面控件DevExpress WinForms的流程图组件 - 可完美复制Visio功能(一)

DevExpress WinForms的Diagram(流程图)组件允许您复制Microsoft Visio中的许多功能,并能在下一个Windows Forms项目中引入信息丰富的图表、流程图和组织图。 P.S:DevExpress WinForms拥有180组件和UI库,能为Windows F…

Express 静态资源存放

如何在 express 中提供对外可以访问的静态资源?只要利用expres.static这个中间件就可以了。 例如,通过如下代码就可以将 static 目录下的图片、CSS 文件、JavaScript 文件对外开放访问了。 app.use(express.static(static)); 现在可以访问 static 目录…

C++项目(游戏角色仓库管理)

#include<iostream> using namespace std; #include<string> #define MAX 6 //设计游戏角色结构体 struct Hero {string name;int gongji;int fangyu;int tili;int tianfu; }; //设计仓库结构体 struct WareHouse {struct Hero array[MAX];int m_size; };//1.添加全…

2024年中国金融行业网络安全研究报告

网络安全一直是国家安全的核心组成部分&#xff0c;特别是在金融行业&#xff0c;金融机构拥有大量的敏感数据&#xff0c;包括个人信息、交易记录、财务报告等&#xff0c;这些数据的安全直接关系到消费者的利益和金融市场的稳定&#xff0c;因此金融行业在网络安全建设领域一…

测试工具记录

1.ios 弱网 1.xcode打开开发者选项 2.开发者选项 -> Network Link Conditioner 字段解释&#xff1a; In Bandwidth&#xff08;入口带宽&#xff09;&#xff1a;用于模拟网络的入口带宽&#xff0c;即数据从网络进入设备的速度。单位Kbps。 In Packet Loss&#xff08;入…

成都市酷客焕学新媒体科技有限公司:助力品牌打破困境!

在数字化浪潮的推动下&#xff0c;营销策略对品牌的发展愈发关键。成都市酷客焕学新媒体科技有限公司&#xff0c;作为短视频营销领域的佼佼者&#xff0c;凭借其卓越的策略和实力&#xff0c;助力众多品牌在信息海洋中脱颖而出&#xff0c;实现品牌的显著增长。 酷客焕学专注于…