基于深度学习神经网络的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.xdnf.cn/news/1420842.html

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

相关文章

人工智能轨道交通行业周刊-第79期(2024.4.22-5.12)

本期关键词:无人机巡检、车机联控、减速顶、Agent、GraphRAG、RAGFlow 1 整理涉及公众号名单 1.1 行业类 RT轨道交通人民铁道世界轨道交通资讯网铁路信号技术交流北京铁路轨道交通网铁路视点ITS World轨道交通联盟VSTR铁路与城市轨道交通RailMetro轨道世界铁路那…

MFC窗口更新与重绘

窗口更新与重绘 窗口或控件更新其外观的情况通常包括以下几种: 窗口大小变化: 当用户调整窗口大小时,窗口的客户区大小会改变,需要重新绘制窗口内容以适应新的大小。 窗口重叠或暴露: 当窗口被其他窗口遮挡部分或完…

作为校招新人,他们如何在字节跳动做 AI 研究并中选 ICLR 的?

校招生和实习生在字节跳动,工作一年就中选 ICLR 2024 ,这是怎样一种体验? 就在 5 月 7 日至 5 月 11 日,2024 年度国际表征学习大会 ICLR 2024 在奥地利维亚纳举办。该活动是深度学习领域最重要的学术活动之一,由深度学…

pycharm 里面安装 codeium 插件的时候,不能够弹出登录界面

pycharm 里面安装 codeium 插件的时候,不能够弹出登录界面 pycharm 里面安装 codeium 插件的时候,不能够弹出登录界面--解决如下A pycharm 里面安装 codeium 插件的时候,不能够弹出登录界面–解决如下 #踩坑/pycharm/codeium插件无法登录 安…

C脚本实现WIncc模拟量趋势窗口弹出

文章目录 前言一、步骤及解析二、运行画面演示三、总结 前言 本文给出了一种基于C脚本实现点击输入输出域对象,弹出对应模拟量趋势窗口的方法。 一、步骤及解析 在Wincc变量管理中,添加两个变量; 示例如下: 将以上两个变量添加到…

pikachu靶场(xss通关教程)

(注:若复制注入代码攻击无效,请手动输入注入语句,在英文输入法下) 反射型xss(get型) 1.打开网站 发现有个框,然后我们在框中输入一个“1”进行测试, 可以看到提交的数据在url处有显示&#xf…

阮怀俊参与五龙乡黄沙村村企联办“强村公司”

为走好海岛县高质量发展共同富裕特色之路,探索村级集体经济发展新路径、扶持新模式、运行新机制,嵊泗县五龙乡黄沙村股份经济合作社与杭州山舍乡建乡村产业发展有限责任公司联办成“强村公司”。 创始人阮怀俊表示,双方就融合乡域发展和文旅产…

【考研数学】汤家凤“免单“数学题被吐槽‘太难’,老汤回应「怎么还有脸笑」,网友:这些题有毒!

我看了汤家凤老师出的几道题,实际上对于考研的同学来说,确实是送分题 第一个是三角函数变换中的万能公式;第二个e^x的泰勒展开公式;第三个是第一类重要极限。只要复习过,那基本上都能正常做出来。 至于汤家凤老师说「…

纯CSS实现步骤条

纯CSS实现纵向Steps步骤条效果 效果图 实现思路 步骤条是一种用于引导用户按照特定流程完成任务的导航条,在各种分步表单交互场景中广泛应用。步骤条通常由编号、名称和引导线三个基本要素组成。本文中要实现的是一个简单的步骤条,包含上述三个基本要素…

AI预测福彩3D采取887定位策略+杀断组+杀和尾+杀和值012缩水测试5月12日预测第1弹

前段时间工作太忙,手头上各种事情较多,没有静下心来对我的AI模型预测结果进行进一步分析筛选,导致最近连续几期与实际开奖结果相差较大。当然,客观来说,搞6码定位的确难度比较大,昨天跟几个常年研究3D的彩友…

2024最新最全【网络安全】逆向工程教学

逆向工程 以设计方法学为指导,以现代设计理论、方法、技术为基础,运用各种专业人员的工程设计经验、知识和创新思维,对已有产品进行解剖、深化和再创造。 逆向工程不仅仅在计算机行业、各行各业都存在逆向工程。 计算机行业逆向工程 计算…

ssm120基于SSM框架的金鱼销售平台的开发和实现+jsp

金鱼销售平台 摘 要 随着科学技术的飞速发展,各行各业都在努力与现代先进技术接轨,通过科技手段提高自身的优势;对于金鱼销售平台当然也不能排除在外,随着网络技术的不断成熟,带动了金鱼销售平台,它彻底改…

【GlobalMapper精品教程】080:WGS84转UTM投影

参考阅读:ArcGIS实验教程——实验十:矢量数据投影变换 文章目录 一、加载实验数据二、设置输出坐标系三、数据导出一、加载实验数据 打开配套案例数据包中的data080.rar中的矢量数据,如下所示: 查看源坐标系:双击图层的,图层投影选项卡,数据的已有坐标系为WGS84地理坐标…

变色龙还是树懒:揭示大型语言模型在知识冲突中的行为

你是知识变色龙还是树懒?我今天在ICLR学到一个很有趣的术语,叫做证据顺序(order of evidence)。 大模型RAG处理知识冲突的探讨: 在检索增强生成(Retrieval-Augmented Generation, RAG)的过程中,技术团队会将检索到的前几名文档作为证据,并提示(prompt)给大型语言模型(Large La…

数据结构:包装类初始泛型

目录 1.包装类1.1 基本数据类型和对应的包装类1.2 装箱和拆箱 2.什么是泛型3.引出泛型3.1 语法3.2 泛型的使用 4.泛型是如何编译的4.1 擦除机制4.2 为什么不能实例化泛型类型数组 5.泛型的上界5.1 语法5.2 示例5.3 复杂示例 6.泛型方法6.1 定义语法6.2 示例6.3 使用示例-可以类…

97. 交错字符串-----回溯、动态规划

题目链接 97. 交错字符串 - 力扣(LeetCode) 解答 递归回溯 题目所述为两个字符串交替组成第三个字符串,之前好像做过相似的题目,直接联想到可以考虑使用递归回溯的做法,让字符串s1和字符串s2分别作为起始字符串&…

SiC MOSFET之寄生电容

1.什么是寄生电容 咱们平常意义上的电容指的是大多给人的印象是两个极板,中间有绝缘介质,加上电压之后有电荷的积累,这可以称得上是电容。经过最近的学习,我对电容有了一些新的认识,可能很简单,浅浅分享一下…

【校园生活小程序_超详细部署】

校园生活小程序 1 完整小程序源码2 运行环境3 初次运行3.1 启动后端程序3.1.1 导入项目,找到项目的pom.xml文件,点击ok进行打开。3.1.2 创建数据库并插入内容 3.1.3 配置项目结构信息3.1.4 配置Tomcat服务器3.1.5 正式启动后端项目3.1.6出现BUG3.1.7 解决…

wordpress增加谷歌分析

wordpress增加谷歌分析 为了更好的浏览体验,欢迎光顾勤奋的凯尔森同学个人博客 http://www.huerpu.cc:7000 一、创建谷歌分析账号与媒体应用 谷歌分析地址:https://analytics.google.com/analytics 创建一个账号,如果你没有的话。 在该账…

Linux提权--定时任务--打包配合 SUID(本地)文件权限配置不当(WEB+本地)

免责声明:本文仅做技术交流与学习... 目录 定时任务 打包配合 SUID-本地 原理: 背景: 操作演示: 分析: 实战发现: 定时任务 文件权限配置不当-WEB&本地 操作演示: 定时任务 打包配合 SUID-本地 原理: 提权通过获取计划任务执行文件信息进行提权 . 1、相对路径和…