基于深度学习神经网络的AI图像PSD去雾系统源码

第一步:PSD介绍

        以往的研究主要集中在具有合成模糊图像的训练模型上,当模型用于真实世界的模糊图像时,会导致性能下降。

        为了解决上述问题,提高去雾的泛化性能,作者提出了一种Principled Synthetic-to-real Dehazing (PSD)框架。

        本文提出的PSD适用于将现有的去雾模型推广到实际领域,包括两个阶段:有监督的预训练无监督的微调

        预训练阶段,作者将选定的去雾模型主干修改为一个基于物理模型的网络,并用合成数据训练该网络。利用设计良好的主干,我们可以得到一个预先训练的模型,在合成域上具有良好的去雾性能。

        微调阶段,作者利用真实的模糊图像以无监督的方式训练模型。

本文的贡献:

  1. 作者将真实世界的去雾任务重新定义为一个合成到真实的泛化框架:首先一个在合成配对数据上预先训练的去雾模型主干,真实的模糊图像随后将被利用以一种无监督的方式微调模型。PSD易于使用,可以以大多数深度去雾模型为骨干。
  2. 由于没有清晰的真实图像作为监督,作者利用几个流行的、有充分根据的物理先验来指导微调。作者将它们合并成一个预先的损失committee,作为具体任务的代理指导,这一部分也是PSD的核心。
  3. 性能达到SOTA

第二步:PSD网络结构

        首先对两个框架大的方向做一个整体概述:

        Pre-training

        首先采用目前性能最好的框架之一作为网络的主干

        然后我们将主干修改为一个基于物理的网络,根据一个单一的雾图同时生成干净的图像 J,传输图 t 和大气光 A,为了共同优化这三个分量,作者加入了一个重建损失,它引导网络输出服从物理散射模型。

        在这个阶段,只使用标记的合成数据进行训练,最终得到一个在合成域上预训练的模型。

        Fine-tuning

        作者利用未标记的真实数据将预训练模型从合成域推广到真实域。受去雾强物理背景的启发,作者认为一个高质量的无雾图像应该遵循一些特定的统计规则,这些规则可以从图像先验中推导出来。此外,单一先验提供的物理知识并不总是可靠的,所以作者的目标是找到多个先验的组合,希望它们能够相互补充。

        基于上述,作者设计了一个先验损失committee来作为任务特定的代理指导,用于训练未标记的真实数据

        此外,作者应用了一种learning without forgetting (LwF)的方法,该方法通过将原始任务的训练数据(即合成的模糊图像)通过网络运转到同真实的模糊数据一起,从而强行使得模型记忆合成领域的知识。

第三步:模型代码展示

import torch
import torch.nn as nn
import torch.nn.functional as Fclass BlockUNet1(nn.Module):def __init__(self, in_channels, out_channels, upsample=False, relu=False, drop=False, bn=True):super(BlockUNet1, self).__init__()self.conv = nn.Conv2d(in_channels, out_channels, 4, 2, 1, bias=False)self.deconv = nn.ConvTranspose2d(in_channels, out_channels, 4, 2, 1, bias=False)self.dropout = nn.Dropout2d(0.5)self.batch = nn.InstanceNorm2d(out_channels)self.upsample = upsampleself.relu = reluself.drop = dropself.bn = bndef forward(self, x):if self.relu == True:y = F.relu(x)elif self.relu == False:y = F.leaky_relu(x, 0.2)if self.upsample == True:y = self.deconv(y)if self.bn == True:y = self.batch(y)if self.drop == True:y = self.dropout(y)elif self.upsample == False:y = self.conv(y)if self.bn == True:y = self.batch(y)if self.drop == True:y = self.dropout(y)return yclass G2(nn.Module):def __init__(self, in_channels, out_channels):super(G2, self).__init__()self.conv = nn.Conv2d(in_channels, 8, 4, 2, 1, bias=False)self.layer1 = BlockUNet1(8, 16)self.layer2 = BlockUNet1(16, 32)self.layer3 = BlockUNet1(32, 64)self.layer4 = BlockUNet1(64, 64)self.layer5 = BlockUNet1(64, 64)self.layer6 = BlockUNet1(64, 64)self.layer7 = BlockUNet1(64, 64)self.dlayer7 = BlockUNet1(64, 64, True, True, True, False)self.dlayer6 = BlockUNet1(128, 64, True, True, True)self.dlayer5 = BlockUNet1(128, 64, True, True, True)self.dlayer4 = BlockUNet1(128, 64, True, True)self.dlayer3 = BlockUNet1(128, 32, True, True)self.dlayer2 = BlockUNet1(64, 16, True, True)self.dlayer1 = BlockUNet1(32, 8, True, True)self.relu = nn.ReLU()self.dconv = nn.ConvTranspose2d(16, out_channels, 4, 2, 1, bias=False)self.lrelu = nn.LeakyReLU(0.2)def forward(self, x):y1 = self.conv(x)y2 = self.layer1(y1)y3 = self.layer2(y2)y4 = self.layer3(y3)y5 = self.layer4(y4)y6 = self.layer5(y5)y7 = self.layer6(y6)y8 = self.layer7(y7)dy8 = self.dlayer7(y8)concat7 = torch.cat([dy8, y7], 1)dy7 = self.dlayer6(concat7)concat6 = torch.cat([dy7, y6], 1)dy6 = self.dlayer5(concat6)concat5 = torch.cat([dy6, y5], 1)dy5 = self.dlayer4(concat5)concat4 = torch.cat([dy5, y4], 1)dy4 = self.dlayer3(concat4)concat3 = torch.cat([dy4, y3], 1)dy3 = self.dlayer2(concat3)concat2 = torch.cat([dy3, y2], 1)dy2 = self.dlayer1(concat2)concat1 = torch.cat([dy2, y1], 1)out = self.relu(concat1)out = self.dconv(out)out = self.lrelu(out)return F.avg_pool2d(out, (out.shape[2], out.shape[3]))def default_conv(in_channels, out_channels, kernel_size, bias=True):return nn.Conv2d(in_channels, out_channels, kernel_size,padding=(kernel_size//2), bias=bias)class PALayer(nn.Module):def __init__(self, channel):super(PALayer, self).__init__()self.pa = nn.Sequential(nn.Conv2d(channel, channel // 8, 1, padding=0, bias=True),nn.ReLU(inplace=True),nn.Conv2d(channel // 8, 1, 1, padding=0, bias=True),nn.Sigmoid())def forward(self, x):y = self.pa(x)return x * yclass CALayer(nn.Module):def __init__(self, channel):super(CALayer, self).__init__()self.avg_pool = nn.AdaptiveAvgPool2d(1)self.ca = nn.Sequential(nn.Conv2d(channel, channel // 8, 1, padding=0, bias=True),nn.ReLU(inplace=True),nn.Conv2d(channel // 8, channel, 1, padding=0, bias=True),nn.Sigmoid())def forward(self, x):y = self.avg_pool(x)y = self.ca(y)return x * yclass Block(nn.Module):def __init__(self, conv, dim, kernel_size,):super(Block, self).__init__()self.conv1=conv(dim, dim, kernel_size, bias=True)self.act1=nn.ReLU(inplace=True)self.conv2=conv(dim,dim,kernel_size,bias=True)self.calayer=CALayer(dim)self.palayer=PALayer(dim)def forward(self, x):res=self.act1(self.conv1(x))res=res+x res=self.conv2(res)res=self.calayer(res)res=self.palayer(res)res += x return res
class Group(nn.Module):def __init__(self, conv, dim, kernel_size, blocks):super(Group, self).__init__()modules = [ Block(conv, dim, kernel_size)  for _ in range(blocks)]modules.append(conv(dim, dim, kernel_size))self.gp = nn.Sequential(*modules)def forward(self, x):res = self.gp(x)res += xreturn resclass FFANet(nn.Module):def __init__(self,gps,blocks,conv=default_conv):super(FFANet, self).__init__()self.gps=gpsself.dim=64kernel_size=3pre_process = [conv(3, self.dim, kernel_size)]assert self.gps==3self.g1= Group(conv, self.dim, kernel_size,blocks=blocks)self.g2= Group(conv, self.dim, kernel_size,blocks=blocks)self.g3= Group(conv, self.dim, kernel_size,blocks=blocks)self.ca=nn.Sequential(*[nn.AdaptiveAvgPool2d(1),nn.Conv2d(self.dim*self.gps,self.dim//16,1,padding=0),nn.ReLU(inplace=True),nn.Conv2d(self.dim//16, self.dim*self.gps, 1, padding=0, bias=True),nn.Sigmoid()])self.palayer=PALayer(self.dim)self.conv_J_1 = nn.Conv2d(64, 64, 3, 1, 1, bias=False)self.conv_J_2 = nn.Conv2d(64, 3, 3, 1, 1, bias=False)self.conv_T_1 = nn.Conv2d(64, 16, 3, 1, 1, bias=False)self.conv_T_2 = nn.Conv2d(16, 1, 3, 1, 1, bias=False)post_precess = [conv(self.dim, self.dim, kernel_size),conv(self.dim, 3, kernel_size)]self.pre = nn.Sequential(*pre_process)self.post = nn.Sequential(*post_precess)self.ANet = G2(3, 3)def forward(self, x1, x2=0, Val=False):x = self.pre(x1)res1=self.g1(x)res2=self.g2(res1)res3=self.g3(res2)w=self.ca(torch.cat([res1,res2,res3],dim=1))w=w.view(-1,self.gps,self.dim)[:,:,:,None,None]out=w[:,0,::]*res1+w[:,1,::]*res2+w[:,2,::]*res3out=self.palayer(out)out_J = self.conv_J_1(out)out_J = self.conv_J_2(out_J)out_J = out_J + x1out_T = self.conv_T_1(out)out_T = self.conv_T_2(out_T)if Val == False:out_A = self.ANet(x1)else:out_A = self.ANet(x2)out_I = out_T * out_J + (1 - out_T) * out_A#x=self.post(out)return out, out_J, out_T, out_A, out_Iif __name__ == "__main__":net=FFA(gps=3,blocks=19)print(net)

第四步:运行

第五步:整个工程的内容

代码的下载路径(新窗口打开链接)基于深度学习神经网络的AI图像PSD去雾系统源码

​​

有问题可以私信或者留言,有问必答

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

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

相关文章

Windows 跨服务器进行 MYSQL备份脚本

Windows 服务器进行 MYSQL备份的脚本,使用该脚本前,请先测试一下 1、新建一个文本文档 2、将下面代码放入文本文档中,保存退出 echo off :: 命令窗口名 title mysql-bak:: 参数定义 set "Y%date:~,4%" set "m%date:~5,2%&qu…

【计算机网络篇】数据链路层(9)使用集线器的共享式以太网

文章目录 🛸使用同轴电缆的共享总线以太网 🎆使用集线器的共享式以太网🥚集线器的特点 🍔10BASE-T星型以太网 🛸使用同轴电缆的共享总线以太网 若总线上的某个机械连接点接触不良或断开,则整个网络通信就不…

Nginx part3 创建一个https的网站

目录 HTTPS 公钥和密钥 加密解密方式: https搭建步骤 强调一下 1、准备环境 2、配置文件 3、制作证书 4、进行设置 HTTPS 啥是https,根据百度:HTTPS (全称:Hypertext Transfer Protocol Secure)&a…

HCIE学习笔记----OSPF详解

OSPF邻居建立的条件 OSPF建立邻居“41”条件总结 4个一致 一个不一致 1.保证接口的前缀 网络信息一致 2.保证ospf区域号和区域类型一致 3.hello包间隔时间和死亡时间一致 4.认证类型和认证认证信息一致 5.路由器的ID不一致 保证唯一性 一-----OSPF 邻接关系建立过程与状…

耦合协调分析模型

耦合协调分析模型(Coupling Coordination Analysis Model)是一种用于评估两个或多个系统之间相互作用和协调性的数学模型。广泛应用于多个领域,包括但不限于社会科学、经济学、环境科学和工程学。耦合协调分析模型的核心在于量化系统间的耦合…

本地项目上传到gitee

1. 新建仓库,不要勾选 2. git init git add . git commit -m "test" git remote add origin 【url】 git push --set-upstream origin master

MySQL·索引

目录 索引的意义 索引的理解 为何IO交互要是 Page 理解Page 其他数据结构为何不行? 聚簇索引 VS 非聚簇索引 索引操作 主键索引操作 唯一键索引操作 普通索引的创建 总结 全文索引 索引的意义 索引:提高数据库的性能,索引是物美…

css backdrop-filter 实现背景滤镜

官方给出的定义是:backdrop-filter属性允许您将图形效果(如模糊或颜色偏移)应用于元素后面的区域。因为它适用于元素后面的所有内容,所以要查看元素或其背景的效果,需要透明或部分透明。 大致分为以下10种&#xff1a…

云计算十三课

centos安装 点击左上角文件 点击新建虚拟机 点击下一步 点击稍后安装操作系统,下一步 选择Linux(l)下一步 设置虚拟机名称 点击浏览选择安装位置 新建文件夹设置名称不能为中文,点击确定 点击下一步 设置磁盘大小点击下一步…

rust开发web服务器框架,github排名对比

Rocket Star最多的框架 github仓库地址:GitHub - rwf2/Rocket: A web framework for Rust. Rocket 是一个针对 Rust 的异步 Web 框架,重点关注可用性、安全性、可扩展性和速度。 Axum 异步运行时 githuh仓库地址:GitHub - tokio-rs/axum: …

高精度原理介绍及代码实现

目录 高精度 引入 使用场景 实现原理 高精度加法 数据存储 加法实现 总代码 高精度减法 与加法的不同点: 总代码 高精度乘法 总代码 高精度除法 总结 总注意点 减法注意点 高精度 引入 所谓高精度并不是很高级难懂的东西,只是对传统的…

【C++】多态(上)超详细

封装,继承,多态不只是C的三大特性,而是面向对象编程的三大特性。 什么是多态: 不同的对象做同一件事情,结果会出现多种形态。 1.满足多态的几个条件 1.父子类完成虚函数重写(需要满足三同:函…

VP Codeforces Round 944 (Div 4)

感受&#xff1a; A~G 其实都不难&#xff0c;都可以试着补起来。 H看到矩阵就放弃了。 A题&#xff1a; 思路&#xff1a; 打开编译器 代码&#xff1a; #include <iostream> #include <vector> #include <algorithm> #define int long long using na…

Windows Docker 使用 httpd 部署静态 Web 站点

一、简介 httpd 是 Apache超文本传输协议&#xff08;HTTP&#xff09;服务器的主程序&#xff0c;是一个独立运行的后台进程&#xff0c;专门负责处理 HTTP 请求。它通过建立子进程或线程的池来高效管理请求&#xff0c;确保服务器能够迅速响应客户端的需求。httpd 因其高效率…

MySQL查询篇-聚合函数-窗口函数

文章目录 distinct 关键字聚合函数常见的聚合函数group by和having 分组过滤 窗口函数with as窗口聚合函数排名窗口函数值窗口函数 distinct 关键字 distinct 去重数据&#xff0c;ps:null值也会查出来 select distinct column from table;聚合函数 常见的聚合函数 select …

[AutoSar]BSW_Diagnostic_002 DCM模块介绍

目录 关键词平台说明背景一、DCM所处架构位置二、DCM 与其他模块的交互三、DCM 的功能四、DCM的内部子模块4.1 Diagnostic Session Layer (DSL)4.1 DSL 与其他模块的交互 4.2 Diagnostic Service Dispatcher (DSD)4.3 Diagnostic Service Processing (DSP)4.4 小结 关键词 嵌入…

莆田市C++专项选拔第二轮题4

题4&#xff1a;变换阵型 【题目描述】 盛隆同学刚学完C的二维数组和函数部分&#xff0c;于是他自己写了2个函数对二维数组进行练习。两个函数如下&#xff1a; int n, a[1005][1005]; // 注意&#xff0c;这里的n和数组a是全局变量 void f1() {for (int i 1; i < n; i)…

47岁古天乐唯一承认女友约「御用阿妈」过母亲节

日前关宝慧在IG晒出一张聚会照&#xff0c;并写道&#xff1a;「预祝各位#母亲节快乐&#x1f339;#dinner #happy #friends #好味」相中所见&#xff0c;前TVB金牌监制潘嘉德、卢宛茵、黄&#x28948;莹、黎萨达姆都有出席饭局。 当中黄&#x28948;莹身穿卡其色西装褛&…

blender 为世界环境添加纹理图像

1、打开世界环境配置项 2、点击颜色右侧的黄色小圆&#xff0c;选择环境纹理 3、打开一张天空图像 4、可以通过调整强度/力度&#xff0c;调整世界环境的亮度

《工具分享-整合功能网页》标星5.3k⭐开发人员的在线工具集:it-tools

IT Tools - 为方便开发人员提供的在线工具 部署自己的it-tools: 有两个版本&#xff0c;目前有中文支持。 直接部署使用docker指令获取出来的是英文的&#xff1a; 英文版&#xff1a; docker run -d --name it-tools --restart unless-stopped -p 8080:80 corentinth/it-…