当前位置: 首页 > news >正文

(即插即用模块-Attention部分) 四十四、(ICIP 2022) HWA 半小波注意力

在这里插入图片描述

文章目录

  • 1、Half Wavelet Attention
  • 2、代码实现

paper:HALFWAVELET ATTENTION ON M-NET+ FOR LOW-LIGHT IMAGE ENHANCEMENT

Code:https://github.com/FanChiMao/HWMNet


1、Half Wavelet Attention

传统的图像增强方法主要关注图像在空间域的特征信息,而忽略了时频域上的特征信息。而小波变换能够将图像分解为不同频率的子带,从而在时频域上分析图像特征,捕获图像的细节信息。所以,这篇论文提出一种 半小波注意力(Half Wavelet Attention),旨在利用小波变换的优势,从另一个维度提取图像特征,丰富特征表达,从而提升低光图像增强的效果。

HWA 的核心思想是利用小波变换在时频域的特性,提取图像在另一维度上的特征信息,从而丰富图像的特征表达,提升低光图像增强的效果。HWA 模块通过将输入特征图分为两部分,一部分保持不变,另一部分进行离散小波变换,得到小波域特征图。

对于输入X,HWA 的实现过程:

  1. 特征分割: 将输入特征图沿通道维度分为两部分,一部分保持不变,另一部分进行离散小波变换。
  2. 注意力机制: 对小波域特征图进行通道注意力和空间注意力操作,提取加权特征图。
  3. 逆小波变换: 将加权小波域特征图进行逆小波变换,得到加权空间域特征图。
  4. 特征融合: 将加权空间域特征图与保持不变的特征图进行拼接,并进行残差连接和跳跃连接,得到最终的输出特征图。

HWA 的主要优势:

  1. 丰富特征表达: HWA 模块能够从另一个维度提取图像特征,丰富特征表达,从而提升低光图像增强的效果。
  2. 提升细节信息: 小波变换能够捕获图像的细节信息,HWA 模块能够有效提升图像的细节信息。
  3. 降低计算复杂度: HWA 模块中只有一半的特征图需要进行注意力机制操作,从而降低计算复杂度。

Half Wavelet Attention 结构图:
在这里插入图片描述

2、代码实现

import torch
import torch.nn as nndef dwt_init(x):x01 = x[:, :, 0::2, :] / 2x02 = x[:, :, 1::2, :] / 2x1 = x01[:, :, :, 0::2]x2 = x02[:, :, :, 0::2]x3 = x01[:, :, :, 1::2]x4 = x02[:, :, :, 1::2]x_LL = x1 + x2 + x3 + x4x_HL = -x1 - x2 + x3 + x4x_LH = -x1 + x2 - x3 + x4x_HH = x1 - x2 - x3 + x4# print(x_HH[:, 0, :, :])return torch.cat((x_LL, x_HL, x_LH, x_HH), 1)def iwt_init(x):r = 2in_batch, in_channel, in_height, in_width = x.size()out_batch, out_channel, out_height, out_width = in_batch, int(in_channel / (r ** 2)), r * in_height, r * in_widthx1 = x[:, 0:out_channel, :, :] / 2x2 = x[:, out_channel:out_channel * 2, :, :] / 2x3 = x[:, out_channel * 2:out_channel * 3, :, :] / 2x4 = x[:, out_channel * 3:out_channel * 4, :, :] / 2h = torch.zeros([out_batch, out_channel, out_height, out_width]).cuda() #h[:, :, 0::2, 0::2] = x1 - x2 - x3 + x4h[:, :, 1::2, 0::2] = x1 - x2 + x3 - x4h[:, :, 0::2, 1::2] = x1 + x2 - x3 - x4h[:, :, 1::2, 1::2] = x1 + x2 + x3 + x4return hclass DWT(nn.Module):def __init__(self):super(DWT, self).__init__()self.requires_grad = Truedef forward(self, x):return dwt_init(x)class IWT(nn.Module):def __init__(self):super(IWT, self).__init__()self.requires_grad = Truedef forward(self, x):return iwt_init(x)def conv(in_channels, out_channels, kernel_size, bias=False, stride=1):return nn.Conv2d(in_channels, out_channels, kernel_size,padding=(kernel_size // 2), bias=bias, stride=stride)class SALayer(nn.Module):def __init__(self, kernel_size=5, bias=False):super(SALayer, self).__init__()self.conv_du = nn.Sequential(nn.Conv2d(2, 1, kernel_size=kernel_size, stride=1, padding=(kernel_size - 1) // 2, bias=bias),nn.Sigmoid())def forward(self, x):# torch.max will output 2 things, and we want the 1st onemax_pool, _ = torch.max(x, dim=1, keepdim=True)avg_pool = torch.mean(x, 1, keepdim=True)channel_pool = torch.cat([max_pool, avg_pool], dim=1)  # [N,2,H,W]  could add 1x1 conv -> [N,3,H,W]y = self.conv_du(channel_pool)return x * yclass CALayer(nn.Module):def __init__(self, channel, reduction=16, bias=False):super(CALayer, self).__init__()# global average pooling: feature --> pointself.avg_pool = nn.AdaptiveAvgPool2d(1)# feature channel downscale and upscale --> channel weightself.conv_du = nn.Sequential(nn.Conv2d(channel, channel // reduction, 1, padding=0, bias=bias),nn.ReLU(inplace=True),nn.Conv2d(channel // reduction, channel, 1, padding=0, bias=bias),nn.Sigmoid())def forward(self, x):y = self.avg_pool(x)y = self.conv_du(y)return x * yclass HWB(nn.Module):def __init__(self, n_feat, o_feat, kernel_size=3, reduction=16, bias=False, act=nn.ReLU()):super(HWB, self).__init__()self.dwt = DWT()self.iwt = IWT()modules_body = \[conv(n_feat*2, n_feat, kernel_size, bias=bias),act,conv(n_feat, n_feat*2, kernel_size, bias=bias)]self.body = nn.Sequential(*modules_body)self.WSA = SALayer()self.WCA = CALayer(n_feat*2, reduction, bias=bias)self.conv1x1 = nn.Conv2d(n_feat*4, n_feat*2, kernel_size=1, bias=bias)self.conv3x3 = nn.Conv2d(n_feat, o_feat, kernel_size=3, padding=1, bias=bias)self.activate = actself.conv1x1_final = nn.Conv2d(n_feat, o_feat, kernel_size=1, bias=bias)def forward(self, x):residual = x# Split 2 partwavelet_path_in, identity_path = torch.chunk(x, 2, dim=1)# Wavelet domain (Dual attention)x_dwt = self.dwt(wavelet_path_in)res = self.body(x_dwt)branch_sa = self.WSA(res)branch_ca = self.WCA(res)res = torch.cat([branch_sa, branch_ca], dim=1)res = self.conv1x1(res) + x_dwtwavelet_path = self.iwt(res)out = torch.cat([wavelet_path, identity_path], dim=1)out = self.activate(self.conv3x3(out))out += self.conv1x1_final(residual)return outif __name__ == '__main__':x = torch.randn(1, 64, 128, 128).cuda()model = HWB(64, 64).cuda()output = model(x)print(output.shape)

相关文章:

(即插即用模块-Attention部分) 四十四、(ICIP 2022) HWA 半小波注意力

文章目录 1、Half Wavelet Attention2、代码实现 paper:HALFWAVELET ATTENTION ON M-NET FOR LOW-LIGHT IMAGE ENHANCEMENT Code:https://github.com/FanChiMao/HWMNet 1、Half Wavelet Attention 传统的图像增强方法主要关注图像在空间域的特征信息&am…...

Linux第二课:LinuxC高级 学习记录day04

6、shell中的语句 6.3、结构性语句 6.3.1、if if…then…fi 1、结构 1)基本结构 if 表达式 then 命令表 fi if [ 表达式 ] // 【】两侧有空格 then 命令表 fi 2)分层结构 if 表达式 then 命令表1 else 命令表2 fi 3)嵌套结构 if …...

occ的开发框架

occ的开发框架 1.Introduction This manual explains how to use the Open CASCADE Application Framework (OCAF). It provides basic documentation on using OCAF. 2.Purpose of OCAF OCAF (the Open CASCADE Application Framework) is an easy-to-use platform for ra…...

Redis 如何解决大 key 问题

前言 嗨👋,大家好,我是雪荷。做为一个后端开发,Redis 是我们经常接触到的一个非关系行数据库。其对我们系统开发和优化有着举足轻重的作用,但是随着业务和用户迅速增长,也会滋生许多的问题,而大…...

驱动开发系列33 - Linux Graphics mesa Intel驱动介绍

一:概述 mesa 中的 Intel 驱动体系是为支持 Intel GPU 提供图形 API 的硬件实现部分,主要包括 OpenGL、Vulkan等图形接口,Intel驱动实现整体上分为四层: 第一层:API 层, 实现 OpenGL 和 Vulkan 接口, src/mesa/main、src/vulkan。 第二层:驱动层,实现 OpenGL 和 Vulkan…...

【华为OD-E卷 - 整数编码 100分(python、java、c++、js、c)】

【华为OD-E卷 - 整数编码 100分(python、java、c、js、c)】 题目 实现一种整数编码方法,使得待编码的数字越小,编码后所占用的字节数越小。 编码规则如下: 编码时7位一组,每个字节的低7位用于存储待编码数字的补码 字…...

vue3 uniapp封装一个瀑布流组件

新增组件m-waterfall 这样就可以在页面直接使用 不用在引入了 <template><view class"m-waterfall"><view id"m-left-column" class"m-column"><slot name"left" :leftList"leftList"></slot&…...

Android Room 持久化库的介绍及使用方法

Android Room 是 Android Jetpack 组件之一&#xff0c;是 Google 官方推出的用于简化 SQLite 数据库操作的持久化库。它提供了一个抽象层&#xff0c;允许开发者在 SQLite 数据库上执行常见的 CRUD 操作&#xff0c;同时处理数据库连接、数据迁移和查询优化等底层细节。 Andr…...

Go语言中http.Transport的Keep-Alive配置与性能优化方法

在Go语言中&#xff0c;http.Transport是一个用于发送HTTP或HTTPS请求的客户端工具&#xff0c;它提供了许多可配置的参数以优化性能。其中&#xff0c;Keep-Alive配置是性能优化的关键部分。以下是对http.Transport的Keep-Alive配置与性能优化方法的详细解释&#xff1a; 一、…...

设计模式03:行为型设计模式之策略模式的使用情景及其基础Demo

1.策略模式 好处&#xff1a;动态切换算法或行为场景&#xff1a;实现同一功能用到不同的算法时和简单工厂对比&#xff1a;简单工厂是通过参数创建对象&#xff0c;调用同一个方法&#xff08;实现细节不同&#xff09;&#xff1b;策略模式是上下文切换对象&#xff0c;调用…...

C# 多线程 Task TPL任务并行

先总结一下 之前发展过程的要点 1&#xff1a; 为了保证多线程正确顺序执行 线程同步 2&#xff1a; 为了节省操作系统线程资源 线程池 异步 方式管理 正常来讲 使用这俩个要点 进行使用 多线程可以满足开发使用需求 但是 新的问题产生了 那就是 多个异步操作 需要编写大量的代…...

【matlab】matlab知识点及HTTP、TCP通信

1、矩阵运算 点乘&#xff1a;对于两个同维度的向量&#xff0c;点乘结果是这两个向量对应分量的乘积之和。 点除&#xff1a;是指对两个数组的对应元素进行除法运算。 点幂&#xff1a;表示元素对元素的幂运算。 >> A[1,2,3;4,5,6]; B[1,1,1;2,2,2]>> D1B.*AD…...

kalilinux - msf和永恒之蓝漏洞

Kali最强渗透工具 - metasploit metasploit是什么&#xff1f; msf是一款开源安全漏洞利用和测试工具&#xff0c;集成了各种平台上常见的溢出漏洞和流行的sheelcode&#xff0c;并持续保持更新。 具体操作 1、先切换到root用户&#xff0c;使用msfdb init命令初始化metaspl…...

网络安全测评质量管理与标准解读

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 注意说明 刚开始写过一些比较专业的分享&#xff0c;较多粉丝反应看不懂&#xff0c;本次通过大众的通俗易懂的词汇先了解概念然后再分享规范和详细的技术原理 一、网络安全测评质量管理 网络安全测…...

Cesium根据地图的缩放zoom实现不同级别下geojson行政边界的对应展示

实现效果&#xff1a; 随着地图的缩放&#xff0c;展示对应缩放级别下的行政边界。 准备数据&#xff1a; 1.国家行政边界数据 &#xff08;country.json&#xff09; 2.省级行政边界数据 &#xff08;province.json&#xff09; 3.市级行政边界数据&#xff08;city.json&…...

Linux初识:【shell命令以及运行原理】【Linux权限的概念与权限管理】

目录 一.shell命令以及运行原理 二.Linux权限的概念与权限管理 2.1Linux权限的概念 sudo普通用户提权 2.2Linux权限管理 2.2.1文件访问者的分类&#xff08;人&#xff09; 2.2.2文件类型和访问权限&#xff08;事物属性&#xff09; 2.2.3文件权限值的表示方法 字符…...

深入剖析 Wireshark:网络协议分析的得力工具

在网络技术的广阔领域中&#xff0c;网络协议分析是保障网络正常运行、优化网络性能以及进行网络安全防护的关键环节。而 Wireshark 作为一款开源且功能强大的网络协议分析工具&#xff0c;在网络工程师、安全专家以及网络技术爱好者中广受欢迎。本文将深入介绍 Wireshark 的功…...

【AIGC】SYNCAMMASTER:多视角多像机的视频生成

标题&#xff1a;SYNCAMMASTER: SYNCHRONIZING MULTI-CAMERA VIDEO GENERATION FROM DIVERSE VIEWPOINTS 主页&#xff1a;https://jianhongbai.github.io/SynCamMaster/ 代码&#xff1a;https://github.com/KwaiVGI/SynCamMaster 文章目录 摘要一、引言二、使用步骤2.1 TextT…...

PyTorch框架——基于深度学习YOLOv5神经网络水果蔬菜检测识别系统

基于深度学习YOLOv5神经网络水果蔬菜检测识别系统&#xff0c;其能识别的水果蔬菜有15种&#xff0c;# 水果的种类 names: [黑葡萄, 绿葡萄, 樱桃, 西瓜, 龙眼, 香蕉, 芒果, 菠萝, 柚子, 草莓, 苹果, 柑橘, 火龙果, 梨子, 花生, 黄瓜, 土豆, 大蒜, 茄子, 白萝卜, 辣椒, 胡萝卜,…...

Redisson中红锁(RedLock)的实现

一、什么是红锁 当在单点redis中实现redis锁时&#xff0c;一旦redis服务器宕机&#xff0c;则无法进行锁操作。因此会考虑将redis配置为主从结 构&#xff0c;但在主从结构中&#xff0c;数据复制是异步实现的。假设在主从结构中&#xff0c;master会异步将数据复制到slave中…...

AI图像抠图新体验:cv_unet_image-matting参数调优全解析

AI图像抠图新体验&#xff1a;cv_unet_image-matting参数调优全解析 1. 引言&#xff1a;为什么需要专业抠图工具 在日常工作和生活中&#xff0c;我们经常需要处理图片——制作证件照、设计海报、编辑产品图等等。传统的手动抠图不仅耗时耗力&#xff0c;而且对技术要求高&a…...

DataX限速配置避坑指南:搞懂channel、byte和record参数,让你的数据同步又快又稳

DataX性能调优实战&#xff1a;深度解析限速参数配置与避坑策略 凌晨三点&#xff0c;数据仓库的告警铃声又一次响起——DataX同步任务因超时失败&#xff0c;这已经是本周第三次了。作为团队里负责数据同步的工程师&#xff0c;我盯着监控面板上那条迟迟无法完成的曲线&#x…...

intv_ai_mk11效果惊艳案例:为初创公司1小时生成完整BP商业计划书框架

intv_ai_mk11效果惊艳案例&#xff1a;为初创公司1小时生成完整BP商业计划书框架 1. 商业计划书生成效果展示 1.1 从零到完整的商业计划书 intv_ai_mk11在商业计划书生成方面展现出惊人的效率和质量。我们实测了一个真实案例&#xff1a;一家智能硬件初创公司需要准备融资用…...

从零开始:Gemma-3-12B-IT WebUI在A10/A100/V100上的部署实践

从零开始&#xff1a;Gemma-3-12B-IT WebUI在A10/A100/V100上的部署实践 1. 项目简介&#xff1a;为什么选择Gemma-3-12B-IT&#xff1f; 如果你正在寻找一个性能强劲、部署友好&#xff0c;又不需要天价硬件支持的大语言模型&#xff0c;那么Gemma-3-12B-IT可能就是你的理想选…...

颠覆传统游戏体验:Sunshine云游戏串流平台让你随时随地畅玩PC游戏

颠覆传统游戏体验&#xff1a;Sunshine云游戏串流平台让你随时随地畅玩PC游戏 【免费下载链接】Sunshine Self-hosted game stream host for Moonlight. 项目地址: https://gitcode.com/GitHub_Trending/su/Sunshine 你是否曾梦想过在旅途中用平板继续昨晚未完成的3A大作…...

避坑指南:用高德DistrictSearch获取精准行政边界时遇到的5个典型问题(含最新GeoJson处理技巧)

高德DistrictSearch深度避坑&#xff1a;5个实战难题与GeoJson优化方案 当你在深夜调试地图边界数据时&#xff0c;突然发现某个街道的轮廓出现了诡异的锯齿状变形——这不是恐怖片情节&#xff0c;而是使用高德DistrictSearch时可能遇到的真实场景。作为经历过数十个地图项目…...

终极指南:如何用buger/jsonparser实现10倍性能的Go JSON解析

终极指南&#xff1a;如何用buger/jsonparser实现10倍性能的Go JSON解析 【免费下载链接】jsonparser One of the fastest alternative JSON parser for Go that does not require schema 项目地址: https://gitcode.com/gh_mirrors/js/jsonparser buger/jsonparser是Go…...

比特币钱包密码与助记词恢复工具:从入门到精通

比特币钱包密码与助记词恢复工具&#xff1a;从入门到精通 【免费下载链接】btcrecover An open source Bitcoin wallet password and seed recovery tool designed for the case where you already know most of your password/seed, but need assistance in trying different…...

Phi-3-mini-4k-instruct-gguf开发者案例:为微信小程序后端提供的轻量API服务

Phi-3-mini-4k-instruct-gguf开发者案例&#xff1a;为微信小程序后端提供的轻量API服务 1. 项目背景与需求 在开发微信小程序时&#xff0c;我们经常需要为前端提供智能文本处理能力&#xff0c;比如自动生成商品描述、智能客服回复、内容摘要等。传统方案要么需要调用第三方…...

深入S32K3XX以太网内部:用逻辑分析仪抓取MII时序,图解数据收发全过程

深入S32K3XX以太网内部&#xff1a;用逻辑分析仪抓取MII时序&#xff0c;图解数据收发全过程 在嵌入式系统开发中&#xff0c;以太网通信的底层实现往往像一个黑盒子——我们配置好寄存器&#xff0c;数据就神奇地传输了。但对于真正追求技术深度的开发者来说&#xff0c;理解信…...