利用自适应双向对比重建网络与精细通道注意机制实现图像去雾化技术的PyTorch代码解析
利用自适应双向对比重建网络与精细通道注意机制实现图像去雾化技术的PyTorch代码解析
漫谈图像去雾化的挑战
在计算机视觉领域,图像复原一直是研究热点。其中,图像去雾化技术尤其具有实际应用价值。然而,复杂的气象条件和多种因素干扰使得这一任务充满挑战。
传统的去雾方法往往难以在保留细节的同时移除雾气。深度学习的兴起为该问题带来了新的解决思路,但现有模型在处理不同光照条件、不同层次雾霾时仍显不足。
论文概述
这篇论文提出了一个创新性的网络结构:Unsupervised Bidirectional Contrastive Reconstruction Network (UB-CRN),结合了自适应Fine-Grained Channel Attention(FCA)机制。该方法在无监督学习框架下,通过双向对比重建和通道注意力调整,有效提升了去雾效果。
核心模块解析
-
Mix混合模块
代码中定义了一个
Mix
类,用于融合特征通道的信息:class Mix(nn.Module):def __init__(self, m=-0.80):super(Mix, self).__init__()w = torch.nn.Parameter(torch.FloatTensor([m]), requires_grad=True)w = torch.nn.Parameter(w, requires_grad=True)self.w = wself.mix_block = nn.Sigmoid()def forward(self, fea1, fea2):mix_factor = self.mix_block(self.w)out = fea1 * mix_factor.expand_as(fea1) + fea2 * (1 - mix_factor.expand_as(fea2))return out
这个模块的作用是将两个特征图进行加权融合,使得网络能够自适应地决定每个通道的信息贡献程度。
-
自适应精细通道注意(FCA)
class FCAttention(nn.Module):def __init__(self, channel, b=1, gamma=2):super(FCAttention, self).__init__()self.avg_pool = nn.AdaptiveAvgPool2d(1)t = int(abs((math.log(channel, 2) + b) / gamma))k = t if t % 2 else t + 1self.conv1 = nn.Conv1d(1, 1, kernel_size=k, padding=int(k / 2), bias=False)self.fc = nn.Conv2d(channel, channel, 1, padding=0, bias=True)self.sigmoid = nn.Sigmoid()self.mix = Mix()def forward(self, x):b, c, _, _ = x.size()x_avg = self.avg_pool(x).view(b, c)x1 = self.conv1(x_avg.unsqueeze(2)).squeeze(-2)x2 = self.fc(x_avg.unsqueeze(-1).unsqueeze(-1))out1 = torch.sum(torch.matmul(x1, x2), dim=1, keepdim=True)out1 = self.sigmoid(out1)out2 = torch.sum(torch.matmul(x2.transpose(-2, -1), x1.transpose(-2, -1)), dim=-2, keepdim=True)out2 = self.sigmoid(out2)out = self.mix(out1.permute(0, 2, 1).contiguous(), out2.permute(0, 2, 1).contiguous())out = self.conv1(out.squeeze(-2).unsqueeze(-3)).permute(0, 1, -1)return x * out
这个模块通过自适应地计算通道间的依赖关系,赋予每个通道不同的权重,从而提升网络对特征的捕捉能力。
完整模型实现
以下是整个图像去雾化网络的代码框架:
import torch
import torch.nn as nn
import torch.nn.functional as F
from torch.utils.data import Dataset, DataLoader
import math# 实现Mix模块
class Mix(nn.Module):def __init__(self, m=-0.80):super(Mix, self).__init__()w = torch.nn.Parameter(torch.FloatTensor([m]), requires_grad=True)self.w = nn.Parameter(w)self.mix_block = nn.Sigmoid()def forward(self, fea1, fea2):mix_factor = self.mix_block(self.w)out = fea1 * mix_factor.expand_as(fea1) + fea2 * (1 - mix_factor.expand_as(fea2))return out# 实现自适应Fine-Grained Channel Attention
class FCAttention(nn.Module):def __init__(self, channel, b=1, gamma=2):super(FCAttention, self).__init__()self.avg_pool = nn.AdaptiveAvgPool2d(1)t = int(abs((math.log(channel, 2) + b) / gamma))k = t if t % 2 else t + 1self.conv1 = nn.Conv1d(1, 1, kernel_size=k, padding=int(k/2), bias=False)self.fc_layer = nn.Conv2d(channel, channel, kernel_size=1, padding=0, bias=True)self.sigmoid = nn.Sigmoid()self.mix = Mix()def forward(self, x):b, c, h, w = x.size()features = x.view(b * c, -1)# 特征聚合avg_features = self.avg_pool(x).view(b, c)avg_features.unsqueeze_(-1) # (b, c, 1)# 使用一维卷积处理每个特征通道x1 = self.conv1(avg_features.transpose(1,2)) # (b, 1, c)x1 = x1.squeeze(dim=-2).transpose(0,1) # 调整维度,变为(c, b)# 全连接层处理x2 = self.fc_layer(avg_features.unsqueeze(-1).unsqueeze(-1))x2 = x2.view(b, c) # (b, c)# 计算通道间的注意力权重out1 = torch.matmul(x1, x2.permute(0,1).contiguous())out1 = self.sigmoid(out1.unsqueeze(-1).unsqueeze(-1)) out2 = torch.matmul(x2.permute(0,1), x1.contiguous()) out2 = self.sigmoid(out2.unsqueeze(-1).unsqueeze(-1))# Mix模块融合out3 = self.mix(out1.permute(0, 2, 1), out2.permute(0, 2, 1))# 将混合特征调整形状并应用sigmoid函数attention = F.conv1d(out3.unsqueeze(-1), self.conv1.weight.data[:, 0:1, :]) attention = attention.squeeze().transpose(1, 0).contiguous()return x * (attention.view(b, c, 1, 1) )# 初始化网络
def init_weights(m):if isinstance(m, nn.Conv2d):m.weight.data.normal_(0.0, 0.01)if m.bias is not None:m.bias.data.fill_(0.0)# 定义整个图像去雾化网络
class Dehazer(nn.Module):def __init__(self, feature_size=3):super(Dehazer, self).__init__()# 初始特征提取模块,这里简要处理,实际可根据需要增加其他结构self.conv_init = nn.Conv2d(feature_size, 64, kernel_size=3, padding=1)# 多尺度特征融合self.attention = FCAttention(64, b=0.8, gamma=2)# 后处理模块,可增加其他恢复网络结构如DRC等self.conv_final = nn.Conv2d(64, 3, kernel_size=1, padding=0)def forward(self, x):x1 = F.relu(self.conv_init(x)) out = self.attention(x1) out = (torch.tanh(self.conv_final(out))) + 1return out * x # 加载模型并初始化参数
model = Dehazer(3).cuda()
model.apply(init_weights)# 定义优化器和损失函数
optimizer = torch.optim.Adam(model.parameters(), lr=1e-4)
criterion = nn.MSELoss()# 训练数据准备和训练循环
# 这里的Dataset和DataLoader需要根据实际数据集定制
...# 每个epoch进行迭代
for epoch in range(20):for batch, (inputs, targets) in enumerate(train_loader):inputs = inputs.cuda()targets = targets.cuda()outputs = model(inputs)loss = criterion(outputs, targets)optimizer.zero_grad()loss.backward()optimizer.step()# 模型保存
torch.save(model.state_dict(), 'dehazer.pth')
总结
通过上述代码,我们实现了一个基于自适应Fine-Grained通道注意力机制的图像去雾化模型。该模型能够自动学习每个通道的重要性,并相应地调整其权重,从而在不同光照条件下有效恢复清晰的图像。
关键步骤解释:
- 特征提取:使用卷积层从输入图像中提取初始特征。
- 通道注意力计算:通过自适应平均池化和一维卷积等操作,计算通道间的依赖关系,并得到每个通道的权重。
- 特征融合:利用Mix模块将原始特征与计算得到的注意力权重进行融合,生成最终的增强特征图。
- 目标图像恢复:基于融合后的特征图,通过反卷积或调整因子的方式得到去雾化后的输出。
这种方法克服了传统图像去雾化方法中通道间相互干扰的问题,能够更精准地恢复被雾霾遮蔽的细节信息。
相关文章:
利用自适应双向对比重建网络与精细通道注意机制实现图像去雾化技术的PyTorch代码解析
利用自适应双向对比重建网络与精细通道注意机制实现图像去雾化技术的PyTorch代码解析 漫谈图像去雾化的挑战 在计算机视觉领域,图像复原一直是研究热点。其中,图像去雾化技术尤其具有实际应用价值。然而,复杂的气象条件和多种因素干扰使得这…...

分布式链路跟踪
目录 链路追踪简介 基本概念 基于代理(Agent)的链路跟踪 基于 SDK 的链路跟踪 基于日志的链路跟踪 SkyWalking Sleuth ZipKin 链路追踪简介 分布式链路追踪是一种监控和分析分布式系统中请求流动的方法。它能够记录和分析一个请求在系统中经历的每…...

刷leetcodehot100返航版--二叉树
二叉树理论基础 二叉树的种类 满二叉树和完全二叉树,二叉树搜索树 满二叉树 如果一棵二叉树只有度为0的结点和度为2的结点,并且度为0的结点在同一层上,则这棵二叉树为满二叉树。 节点个数2^n-1【n为树的深度】 完全二叉树 在完全二叉树…...
chmod 777含义:
1.chmod 777 的含义及其在文件权限中的作用 chmod 777 是一种用于修改 Unix 和 Linux 系统中文件或目录权限的命令。它赋予指定文件或目录的所有用户(文件所有者、所属组成员以及其他用户)完全的访问权限,即 读取 (Read)、写入 (Write) 和 执…...
AGI大模型(21):混合检索之混合搜索
为了执行混合搜索,我们结合了 BM25 和密集检索的结果。每种方法的分数均经过标准化和加权以获得最佳总体结果 1 代码 先编写 BM25搜索的代码,再编写密集检索的代码,最后进行混合。 from rank_bm25 import BM25Okapi from nltk.tokenize import word_tokenize import jieb…...

双重差分模型学习笔记4(理论)
【DID最全总结】90分钟带你速通双重差分!_哔哩哔哩_bilibili 目录 总结:双重差分法(DID)在社会科学中的应用:理论、发展与前沿分析 一、DID的基本原理与核心思想 二、经典DID:标准模型与应用案例 三、…...

Mysql 8.0.32 union all 创建视图后中文模糊查询失效
记录问题,最近在使用union all聚合了三张表的数据,创建视图作为查询主表,发现字段值为中文的筛选无法生效.......... sql示例: CREATE OR REPLACE VIEW test_view AS SELECTid,name,location_address AS address,type,"1" AS data_type,COALESCE ( update_time, cr…...

Jenkins 执行器(Executor)如何调整限制?
目录 现象原因解决 现象 Jenkins 构建时,提示如下: 此刻的心情正如上图中的小老头,火冒三丈,但是不要急,因为每一次错误,都是系统中某个环节在说‘我撑不住了’。 原因 其实是上图的提示表示 Jenkins 当…...
Android 中 权限分类及申请方式
在 Android 中,权限被分为几个不同的类别,每个类别有不同的申请和管理方式。 一、 普通权限(Normal Permissions) 普通权限通常不会对用户隐私或设备安全造成太大风险。这些权限在应用安装时自动授予,无需用户在运行时手动授权。 android.permission.INTERNETandroid.pe…...

编程错题集系列(一)
编程错题集系列(一) 人生海海,山山而川。 谨以此系列作为自己一路的见证。本期重点:明明已经安装相关库,但在PyCharm中无法调用 最大的概率是未配置合适的解释器,也就是你的书放在B房间,你在A…...

【原创】基于视觉大模型gemma-3-4b实现短视频自动识别内容并生成解说文案
📦 一、整体功能定位 这是一个用于从原始视频自动生成短视频解说内容的自动化工具,包含: 视频抽帧(可基于画面变化提取关键帧) 多模态图像识别(每帧图片理解) 文案生成(大模型生成…...

Spark(32)SparkSQL操作Mysql
(一)准备mysql环境 我们计划在hadoop001这台设备上安装mysql服务器,(当然也可以重新使用一台全新的虚拟机)。 以下是具体步骤: 使用finalshell连接hadoop001.查看是否已安装MySQL。命令是: rpm -qa|grep ma…...

基于 Python 的界面程序复现:标准干涉槽型设计计算及仿真
基于 Python 的界面程序复现:标准干涉槽型设计计算及仿真 在工业设计与制造领域,刀具的设计与优化是提高生产效率和产品质量的关键环节之一。本文将介绍如何使用 Python 复现一个用于标准干涉槽型设计计算及仿真的界面程序,旨在帮助工程师和…...

c++成员函数返回类对象引用和直接返回类对象的区别
c成员函数返回类对象引用和直接返回类对象的区别 成员函数直接返回类对象(返回临时对象,对象拷贝) #include <iostream> class MyInt { public:int value;//构造函数explicit MyInt(int v0) : value(v){}//加法操作,返回对象副本&…...
AGI大模型(20):混合检索之rank_bm25库来实现词法搜索
1 混合检索简介 混合搜索结合了两种检索信息的方法 词法搜索 (BM25) :这种传统方法根据精确的关键字匹配来检索文档。例如,如果您搜索“cat on the mat”,它将找到包含这些确切单词的文档。 基于嵌入的搜索(密集检索) :这种较新的方法通过比较文档的语义来检索文档。查…...

数字化转型- 数字化转型路线和推进
数字化转型三个阶段 百度百科给出的企业的数字化转型包括信息化、数字化、数智化三个阶段 信息化是将企业在生产经营过程中产生的业务信息进行记录、储存和管理,通过电子终端呈现,便于信息的传播与沟通。数字化通过打通各个系统的互联互通,…...
字体样式集合
根据您提供的字体样式列表,以下是分类整理后的完整字体样式名称(不含数量统计): 基础样式 • Regular • Normal • Plain • Medium • Bold • Black • Light • Thin • Heavy • Ultra • Extra • Semi • Hai…...

IP68防水Type-C连接器实测:水下1米浸泡72小时的生存挑战
IP68防水Type-C连接器正成为户外设备、水下仪器和高端消费电子的核心组件。其宣称的“1米水深防护”是否真能抵御长时间浸泡?我们通过极限实测,将三款主流品牌IP68防水Type-C连接器沉入1米盐水(模拟海水浓度)中持续72小时…...

【技术追踪】InverseSR:使用潜在扩散模型进行三维脑部 MRI 超分辨率重建(MICCAI-2023)
LDM 实现三维超分辨率~ 论文:InverseSR: 3D Brain MRI Super-Resolution Using a Latent Diffusion Model 代码:https://github.com/BioMedAI-UCSC/InverseSR 0、摘要 从研究级医疗机构获得的高分辨率(HR)MRI 扫描能够提供关于成像…...
React学习(二)-变量
也是很无聊,竟然写这玩意,毕竟不是学术研究,普通工作没那么多概念性东西,会用就行╮(╯▽╰)╭ 在React中,变量是用于存储和管理数据的基本单位。根据其用途和生命周期,React中的变量可以分为以下几类: 1. 状态变量(State) 用途:用于存储组件的内部状态,状态变化会触…...

list重点接口及模拟实现
list功能介绍 c中list是使用双向链表实现的一个容器,这个容器可以实现。插入,删除等的操作。与vector相比,vector适合尾插和尾删(vector的实现是使用了动态数组的方式。在进行头删和头插的时候后面的数据会进行挪动,时…...
【自然语言处理与大模型】大模型(LLM)基础知识④
(1)微调主要用来干什么? 微调目前最主要用在定制模型的自我认知和改变模型对话风格。模型能力的适配与强化只是辅助。 定制模型的自我认知:通过微调可以调整模型对自我身份、角色功能的重新认知,使其回答更加符合自定义…...
系统架构设计(九):分布式架构与微服务
基础定义 架构类型定义分布式架构指将系统部署在多个服务器节点上,通过网络协作完成整体功能。强调物理上的分布与任务协作。微服务架构一种分布式架构模式,将系统按照业务维度拆分为多个小型自治服务,每个服务可独立开发、部署、伸缩。 核…...

Java 框架配置自动化:告别冗长的 XML 与 YAML 文件
在 Java 开发领域,框架的使用极大地提升了开发效率和系统的稳定性。然而,传统框架配置中冗长的 XML 与 YAML 文件,却成为开发者的一大困扰。这些配置文件不仅书写繁琐,容易出现语法错误,而且在项目规模扩大时ÿ…...

vue使用Pinia实现不同页面共享token
文章目录 一、概述二、使用步骤安装pinia在vue应用实例中使用pinia在src/stores/token.js中定义store在组件中使用store登录成功后,将token保存pinia中向后端API发起请求时,携带从pinia中获取的token 三、参考资料 一、概述 Pinia是Vue的专属状态管理库…...

遨游科普:三防平板是什么?有什么功能?
清晨的露珠还挂在帐篷边缘,背包里的三防平板却已开机导航;工地的尘土飞扬中,工程师正通过它查看施工图纸;暴雨倾盆的救援现场,应急队员用它实时回传灾情数据……这些看似科幻的场景,正因三防平板的普及成为…...

spring MVC 至 springboot的发展流程,配置文件变化
spring mvc Spring MVC 是 Spring 框架中的一个重要模块,用于构建基于 Java 的 Web 应用程序。它基于 MVC(Model-View-Controller)设计模式,提供了灵活、可配置的方式来开发动态网页或 RESTful 服务 ssm SSM 框架…...
深入解析Spring Boot与JUnit 5的集成测试实践
深入解析Spring Boot与JUnit 5的集成测试实践 引言 在现代软件开发中,测试是确保代码质量和功能正确性的关键环节。Spring Boot作为目前最流行的Java Web框架之一,提供了强大的支持来简化测试流程。而JUnit 5作为最新的JUnit版本,引入了许多…...

AI全域智能监控系统重构商业清洁管理范式——从被动响应到主动预防的监控效能革命
一、四维立体监控网络技术架构 1. 人员行为监控 - 融合人脸识别、骨骼追踪与RFID工牌技术,身份识别准确率99.97% - 支持15米超距夜间红外监控(精度0.01lux) 2. 作业过程监控 - UWB厘米级定位技术(误差<0.3米&…...

网络编程中的直接内存与零拷贝
本篇文章会介绍 JDK 与 Linux 网络编程中的直接内存与零拷贝的相关知识,最后还会介绍一下 Linux 系统与 JDK 对网络通信的实现。 1、直接内存 所有的网络通信和应用程序中(任何语言),每个 TCP Socket 的内核中都有一个发送缓冲区…...