利用自适应双向对比重建网络与精细通道注意机制实现图像去雾化技术的PyTorch代码解析

news2025/5/18 21:08:29

利用自适应双向对比重建网络与精细通道注意机制实现图像去雾化技术的PyTorch代码解析

漫谈图像去雾化的挑战

在计算机视觉领域,图像复原一直是研究热点。其中,图像去雾化技术尤其具有实际应用价值。然而,复杂的气象条件和多种因素干扰使得这一任务充满挑战。

传统的去雾方法往往难以在保留细节的同时移除雾气。深度学习的兴起为该问题带来了新的解决思路,但现有模型在处理不同光照条件、不同层次雾霾时仍显不足。

论文概述

这篇论文提出了一个创新性的网络结构:Unsupervised Bidirectional Contrastive Reconstruction Network (UB-CRN),结合了自适应Fine-Grained Channel Attention(FCA)机制。该方法在无监督学习框架下,通过双向对比重建和通道注意力调整,有效提升了去雾效果。

核心模块解析

  1. 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 = 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
    

    这个模块的作用是将两个特征图进行加权融合,使得网络能够自适应地决定每个通道的信息贡献程度。

  2. 自适应精细通道注意(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 + 1
            self.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 + 1
        self.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))) + 1
        return 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通道注意力机制的图像去雾化模型。该模型能够自动学习每个通道的重要性,并相应地调整其权重,从而在不同光照条件下有效恢复清晰的图像。

关键步骤解释:

  1. 特征提取:使用卷积层从输入图像中提取初始特征。
  2. 通道注意力计算:通过自适应平均池化和一维卷积等操作,计算通道间的依赖关系,并得到每个通道的权重。
  3. 特征融合:利用Mix模块将原始特征与计算得到的注意力权重进行融合,生成最终的增强特征图。
  4. 目标图像恢复:基于融合后的特征图,通过反卷积或调整因子的方式得到去雾化后的输出。

这种方法克服了传统图像去雾化方法中通道间相互干扰的问题,能够更精准地恢复被雾霾遮蔽的细节信息。

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

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

相关文章

分布式链路跟踪

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

刷leetcodehot100返航版--二叉树

二叉树理论基础 二叉树的种类 满二叉树和完全二叉树,二叉树搜索树 满二叉树 如果一棵二叉树只有度为0的结点和度为2的结点,并且度为0的结点在同一层上,则这棵二叉树为满二叉树。 节点个数2^n-1【n为树的深度】 完全二叉树 在完全二叉树…

双重差分模型学习笔记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 当…

编程错题集系列(一)

编程错题集系列(一) 人生海海,山山而川。 谨以此系列作为自己一路的见证。本期重点:明明已经安装相关库,但在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成员函数返回类对象引用和直接返回类对象的区别 成员函数直接返回类对象&#xff08;返回临时对象&#xff0c;对象拷贝&#xff09; #include <iostream> class MyInt { public:int value;//构造函数explicit MyInt(int v0) : value(v){}//加法操作,返回对象副本&…

数字化转型- 数字化转型路线和推进

数字化转型三个阶段 百度百科给出的企业的数字化转型包括信息化、数字化、数智化三个阶段 信息化是将企业在生产经营过程中产生的业务信息进行记录、储存和管理&#xff0c;通过电子终端呈现&#xff0c;便于信息的传播与沟通。数字化通过打通各个系统的互联互通&#xff0c;…

IP68防水Type-C连接器实测:水下1米浸泡72小时的生存挑战

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

【技术追踪】InverseSR:使用潜在扩散模型进行三维脑部 MRI 超分辨率重建(MICCAI-2023)

LDM 实现三维超分辨率~ 论文&#xff1a;InverseSR: 3D Brain MRI Super-Resolution Using a Latent Diffusion Model 代码&#xff1a;https://github.com/BioMedAI-UCSC/InverseSR 0、摘要 从研究级医疗机构获得的高分辨率&#xff08;HR&#xff09;MRI 扫描能够提供关于成像…

list重点接口及模拟实现

list功能介绍 c中list是使用双向链表实现的一个容器&#xff0c;这个容器可以实现。插入&#xff0c;删除等的操作。与vector相比&#xff0c;vector适合尾插和尾删&#xff08;vector的实现是使用了动态数组的方式。在进行头删和头插的时候后面的数据会进行挪动&#xff0c;时…

Java 框架配置自动化:告别冗长的 XML 与 YAML 文件

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

vue使用Pinia实现不同页面共享token

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

遨游科普:三防平板是什么?有什么功能?

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

spring MVC 至 springboot的发展流程,配置文件变化

spring mvc Spring MVC 是 Spring 框架中的一个重要模块&#xff0c;用于构建基于 Java 的 Web 应用程序。它基于 ​​MVC&#xff08;Model-View-Controller&#xff09;设计模式​​&#xff0c;提供了灵活、可配置的方式来开发动态网页或 RESTful 服务 ssm ​​SSM 框架​…

AI全域智能监控系统重构商业清洁管理范式——从被动响应到主动预防的监控效能革命

一、四维立体监控网络技术架构 1. 人员行为监控 - 融合人脸识别、骨骼追踪与RFID工牌技术&#xff0c;身份识别准确率99.97% - 支持15米超距夜间红外监控&#xff08;精度0.01lux&#xff09; 2. 作业过程监控 - UWB厘米级定位技术&#xff08;误差&#xff1c;0.3米&…

网络编程中的直接内存与零拷贝

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