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

基于深度学习的图像去雨去雾

基于深度学习的图像去雨去雾


文末附有源码下载地址
b站视频地址: https://www.bilibili.com/video/BV1Jr421p7cT/

基于深度学习的图像去雨去雾,使用的网络为unet,
网络代码:

import torch
import torch.nn as nn
from torchsummary import summary
from torchvision import models
from torchvision.models.feature_extraction import create_feature_extractor
import torch.nn.functional as F
from torchstat import statclass Resnet18(nn.Module):def __init__(self):super(Resnet18, self).__init__()self.resnet = models.resnet18(pretrained=False)# self.resnet = create_feature_extractor(self.resnet, {'relu': 'feat320', 'layer1': 'feat160', 'layer2': 'feat80',#                                                'layer3': 'feat40'})def forward(self,x):for name,m in self.resnet._modules.items():x=m(x)if name=='relu':x1=xelif name=='layer1':x2=xelif name=='layer2':x3=xelif name=='layer3':x4=xbreak# x=self.resnet(x)return x1,x2,x3,x4
class Linears(nn.Module):def __init__(self,a,b):super(Linears, self).__init__()self.linear1=nn.Linear(a,b)self.relu1=nn.LeakyReLU()self.linear2 = nn.Linear(b, a)self.sigmoid=nn.Sigmoid()def forward(self,x):x=self.linear1(x)x=self.relu1(x)x=self.linear2(x)x=self.sigmoid(x)return x
class DenseNetBlock(nn.Module):def __init__(self,inplanes=1,planes=1,stride=1):super(DenseNetBlock,self).__init__()self.conv1=nn.Conv2d(inplanes,planes,3,stride,1)self.bn1 = nn.BatchNorm2d(planes)self.relu1=nn.LeakyReLU()self.conv2 = nn.Conv2d(inplanes, planes, 3,stride,1)self.bn2 = nn.BatchNorm2d(planes)self.relu2 = nn.LeakyReLU()self.conv3 = nn.Conv2d(inplanes, planes, 3,stride,1)self.bn3 = nn.BatchNorm2d(planes)self.relu3 = nn.LeakyReLU()def forward(self,x):ins=xx=self.conv1(x)x=self.bn1(x)x=self.relu1(x)x = self.conv2(x)x = self.bn2(x)x = self.relu2(x)x=x+insx2=self.conv3(x)x2 = self.bn3(x2)x2=self.relu3(x2)out=ins+x+x2return out
class SEnet(nn.Module):def __init__(self,chs,reduction=4):super(SEnet,self).__init__()self.average_pooling = nn.AdaptiveAvgPool2d(output_size=(1, 1))self.fc = nn.Sequential(# First reduce dimension, then raise dimension.# Add nonlinear processing to fit the correlation between channelsnn.Linear(chs, chs // reduction),nn.LeakyReLU(inplace=True),nn.Linear(chs // reduction, chs))self.activation = nn.Sigmoid()def forward(self,x):ins=xbatch_size, chs, h, w = x.shapex=self.average_pooling(x)x = x.view(batch_size, chs)x=self.fc(x)x = x.view(batch_size,chs,1,1)return x*ins
class UAFM(nn.Module):def __init__(self):super(UAFM, self).__init__()# self.meanPool_C=torch.max()self.attention=nn.Sequential(nn.Conv2d(4, 8, 3, 1,1),nn.LeakyReLU(),nn.Conv2d(8, 1, 1, 1),nn.Sigmoid())def forward(self,x1,x2):x1_mean_pool=torch.mean(x1,dim=1)x1_max_pool,_=torch.max(x1,dim=1)x2_mean_pool = torch.mean(x2, dim=1)x2_max_pool,_ = torch.max(x2, dim=1)x1_mean_pool=torch.unsqueeze(x1_mean_pool,dim=1)x1_max_pool=torch.unsqueeze(x1_max_pool,dim=1)x2_mean_pool=torch.unsqueeze(x2_mean_pool,dim=1)x2_max_pool=torch.unsqueeze(x2_max_pool,dim=1)cat=torch.cat((x1_mean_pool,x1_max_pool,x2_mean_pool,x2_max_pool),dim=1)a=self.attention(cat)out=x1*a+x2*(1-a)return outclass Net(nn.Module):def __init__(self):super(Net, self).__init__()self.resnet18=Resnet18()self.SENet=SEnet(chs=256)self.UAFM=UAFM()self.DenseNet1=DenseNetBlock(inplanes=256,planes=256)self.transConv1=nn.ConvTranspose2d(256,128,3,2,1,output_padding=1)self.DenseNet2 = DenseNetBlock(inplanes=128, planes=128)self.transConv2 = nn.ConvTranspose2d(128, 64, 3, 2, 1, output_padding=1)self.DenseNet3 = DenseNetBlock(inplanes=64, planes=64)self.transConv3 = nn.ConvTranspose2d(64, 64, 3, 2, 1, output_padding=1)self.transConv4 = nn.ConvTranspose2d(64, 32, 3, 2, 1, output_padding=1)self.DenseNet4=DenseNetBlock(inplanes=32,planes=32)self.out=nn.Sequential(nn.Conv2d(32,3,1,1),nn.Sigmoid())def forward(self,x):"""下采样部分"""x1,x2,x3,x4=self.resnet18(x)# feat320=features['feat320']# feat160=features['feat160']# feat80=features['feat80']# feat40=features['feat40']feat320=x1feat160=x2feat80=x3feat40=x4"""上采样部分"""x=self.SENet(feat40)x=self.DenseNet1(x)x=self.transConv1(x)x=self.UAFM(x,feat80)x=self.DenseNet2(x)x=self.transConv2(x)x=self.UAFM(x,feat160)x = self.DenseNet3(x)x = self.transConv3(x)x = self.UAFM(x, feat320)x=self.transConv4(x)x=self.DenseNet4(x)out=self.out(x)# out=torch.concat((out,out,out),dim=1)*255.return outdef freeze_backbone(self):for param in self.resnet18.parameters():param.requires_grad = Falsedef unfreeze_backbone(self):for param in self.resnet18.parameters():param.requires_grad = Trueif __name__ == '__main__':net=Net()print(net)# stat(net,(3,640,640))summary(net,input_size=(3,512,512),device='cpu')aa=torch.ones((6,3,512,512))out=net(aa)print(out.shape)# ii=torch.zeros((1,3,640,640))# outs=net(ii)# print(outs.shape)

主题界面显示及代码:
在这里插入图片描述

from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from untitled import Ui_Form
import sys
import cv2 as cv
from PyQt5.QtCore import QCoreApplication
import numpy as np
from PyQt5 import QtCore,QtGui
from PIL import Image
from predict import *class My(QMainWindow,Ui_Form):def __init__(self):super(My,self).__init__()self.setupUi(self)self.setWindowTitle('图像去雨去雾')self.setIcon()self.pushButton.clicked.connect(self.pic)self.pushButton_2.clicked.connect(self.pre)self.pushButton_3.clicked.connect(self.pre2)def setIcon(self):palette1 = QPalette()# palette1.setColor(self.backgroundRole(), QColor(192,253,123))   # 设置背景颜色palette1.setBrush(self.backgroundRole(), QBrush(QPixmap('back.png')))  # 设置背景图片self.setPalette(palette1)def pre(self):out=pre(self.img,0)out=self.cv_qt(out)self.label_2.setPixmap(QPixmap.fromImage(out).scaled(self.label.width(),self.label.height(),QtCore.Qt.KeepAspectRatio))def pre2(self):out=pre(self.img,1)out=self.cv_qt(out)self.label_2.setPixmap(QPixmap.fromImage(out).scaled(self.label.width(),self.label.height(),QtCore.Qt.KeepAspectRatio))def pic(self):imgName, imgType = QFileDialog.getOpenFileName(self,"打开图片",""," *.png;;*.jpg;;*.jpeg;;*.bmp;;All Files (*)")#KeepAspectRatiopng = QtGui.QPixmap(imgName).scaled(self.label.width(),self.label.height(),QtCore.Qt.KeepAspectRatio)  # 适应设计label时的大小self.label.setPixmap(png)self.img=Image.open(imgName)self.img=np.array(self.img)def cv_qt(self, src):#src必须为bgr格式图像#src必须为bgr格式图像#src必须为bgr格式图像if len(src.shape)==2:src=np.expand_dims(src,axis=-1)src=np.tile(src,(1,1,3))h, w, d = src.shapeelse:h, w, d = src.shapebytesperline = d * w# self.src=cv.cvtColor(self.src,cv.COLOR_BGR2RGB)qt_image = QImage(src.data, w, h, bytesperline, QImage.Format_RGB888).rgbSwapped()return qt_imageif __name__ == '__main__':QCoreApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling)app=QApplication(sys.argv)my=My()my.show()sys.exit(app.exec_())

项目结构:
在这里插入图片描述
直接运行main.py即可弹出交互界面。
项目下载地址:下载地址-列表第19

相关文章:

基于深度学习的图像去雨去雾

基于深度学习的图像去雨去雾 文末附有源码下载地址 b站视频地址: https://www.bilibili.com/video/BV1Jr421p7cT/ 基于深度学习的图像去雨去雾,使用的网络为unet, 网络代码: import torch import torch.nn as nn from torchsumm…...

使用JS的for循环实现九九乘法表

九九乘法表是我们在学习基础数学时经常会遇到的一个概念。在编程中,使用循环结构来实现九九乘法表是一个很好的练习。下面,我将详细介绍如何使用JavaScript的for循环来实现九九乘法表。 首先,我们需要理解for循环的基本结构。在JavaScript中…...

Leetcode 70 爬楼梯

文章目录 1. 题目描述2. 我的尝试 1. 题目描述 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢? 示例 1: 输入:n 2 输出:2 解释:有两种方法可以爬到…...

基于SpringBoot+MYSQL+Vue的校园管理系统

目录 1、前言介绍 2、主要技术 3、系统流程分析 3.1、操作流程 3.2、添加信息流程 3.3、删除信息流程 4、系统设计 4.1 系统体系结构 4.2开发流程设计 4.3 数据库设计原则 4.4 数据表 5、运行截图(部分) 5.1管理员功能模块 5.2用户功能模块 5.3院校管理员功能模块…...

Oracle P6 负浮时和必须完成日期

前言 学习过计划的人大都有这有这样的经历,即无论是Microsoft Project 亦或是P6见过负浮时那么 Primavera P6 计划中的负浮时是从何而来的呢,那么本文可能会有所帮助。 首先,当活动的最晚日期早于最早日期时,就会出现负浮时。 换…...

【C++】STL--String

这一节主要总结string类的常见接口,以及完成了string类的模拟实现。 目录 标准库的String类 string类常见接口 string类对象的常见构造 string析构函数:~string string类对象的容量操作 string类对象的访问及遍历操作 string类对象的修改操作 s…...

深入理解与使用go之中间件--实现

深入理解与使用go之--中间件实现 目录 引子 中间件 定义 原理 简单实现 多个中间件 优化 扩展 gin框架实现 引子 我们在做web开发的时候,经常会遇到下面一些需求: 统计耗时:想程序内部统计某个路由的请求耗时 预处理:接口需要登录鉴权后才能继续进行 错误捕获:当…...

移动端研发技术的进化历程

移动端研发技术 移动端研发技术主要分为原生开发和跨平台开发。本章主要介绍一下移动开发技术的过去、当下和未来,一步一步介绍移动技术的进化历程。 原生开发 原生应用程序是指某一个移动平台(比如iOS或Android)所特有的应用,使…...

ChromeDriver 122 版本为例 国内下载地址及安装教程

ChromeDriver 国内下载地址 https://chromedriver.com/download 靠谱 千千万万别下载错了 先确认 Chrome 浏览器版本 以 win64 版本为例 那我们下载这一个啊,不要下载错了 下载地址贴在这哈 https://storage.googleapis.com/chrome-for-testing-public/122.0.…...

【数据结构】双向链表及LRU缓存的实现

目录 前言 1. 在原有的自定义链表类 Linked 的基础上,添加新的 “节点添加”方法 addNode(Node node) 测试用例 测试结果 2. 在自定义链表类的基础上,使用双重循环“强力” 判断两个节点是否发生相交 测试用例 测试结果 3. 在自定义链表类的基础上…...

2、计划任务不显示UI的问题

计划任务不显示UI的问题 1、原因: 在windows7以上系统,使用system权限启动的进程默认是没有ui界面,这是windows系统出于安全考虑的限制。防止用户在高权限下误删重要的文件。 2、解决方案: 1、降权 解决的办法:降…...

学C还是学C++?

计算机专业学生,大一上学期学习了C语言,下学期学校要学C,请问我寒假继续深入学习C还是提前学C,大佬们有什么建议吗?(个人感觉C学的不是很明白,链表文件什么的还不是很懂…) 这个并没有一个统一的…...

Springboot参数分组校验

Springboot参数分组校验 文章目录 Springboot参数分组校验简介代码准备单个或多个参数的校验非 JSON 格式的对象参数校验JSON 格式的对象参数校验Service 层校验项目地址 简介 Java API规范(JSR303)定义了Bean校验的标准validation-api,但没有提供实现。hibernate …...

无缝集成 MongoDB Relational Migrator,Tapdata 提供关系型到 MongoDB 实时迁移优化方案

在去年的 MongoDB 用户大会纽约站上,MongoDB 正式宣布全面推出新工具 MongoDB Relational Migrator(MongoDB RM),用以简化应用程序迁移和转换——即从传统关系型数据模型到现代的文档数据模型,助力组织快速提升运营效率…...

【C++】每日一题 146 LRU缓存

请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类: LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存 int get(int key) 如果关键字 key 存在于缓存中,则返回关键字的值,否则返回 -1 …...

CentOS搭建NAS服务器并使用

CentOS搭建NAS服务器并使用 文章目录 前言一、配置NAS服务器安装 NFS 服务:启动 NFS 服务:使 NFS 服务在系统启动时自动启动: 二、挂载服务器三、常见错误以及解决方案1、mount.nfs: No route to host2、mount.nfs: access denied by server …...

爬虫入门到精通_框架篇16(Scrapy框架基本使用)_名人名言的抓取

1 目标站点分析 抓取网站:http://quotes.toscrape.com/ 主要显示了一些名人名言,以及作者、标签等等信息: 点击next,page变为2: 2 流程框架 抓取第一页:请求第一页的URL并得到源代码,进行下…...

mac inter 芯片遇到程序无法打开(无法验证开发者)

mac inter 芯片遇到程序无法打开(无法验证开发者) 解决方案 终端运行命令: sudo xattr -r -d com.apple.quarantine 文件路径(直接把文件拖入到终端,可以自动找到文件路径)即可令其获得权限 补充知识: 通过gpt可以…...

科技成果鉴定测试如何进行?第三方检测机构进行鉴定测试的好处

科技成果鉴定测试,作为科技领域中一项重要的质量检验手段,具有广泛的应用范围。旨在为科技成果的研发者和使用者提供客观、科学、权威的鉴定结果,从而评估科技成果的技术水平和市场竞争力。   科技成果鉴定测试是对科技成果进行系统、全面的…...

八、词嵌入语言模型(Word Embedding)

词嵌入(Word Embedding, WE),任务是把不可计算、非结构化的词转换为可以计算、结构化的向量,从而便于进行数学处理。 一个更官方一点的定义是:词嵌入是是指把一个维数为所有词的数量的高维空间(one-hot形式…...

基于Cynthion逆向USB协议,为DP100电源开发Linux控制软件

1. 项目概述:用Cynthion嗅探USB,为DP100电源打造Linux软件作为一名长期在Linux环境下折腾硬件和嵌入式开发的爱好者,我经常遇到一个头疼的问题:很多不错的桌面小设备,比如电源、示波器、逻辑分析仪,它们的官…...

Visual C++运行库一键安装指南:彻底解决Windows应用依赖问题

Visual C运行库一键安装指南:彻底解决Windows应用依赖问题 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 你是否曾经遇到过打开软件时弹出"缺少…...

VideoDownloadHelper终极指南:解锁浏览器视频下载的完整解决方案

VideoDownloadHelper终极指南:解锁浏览器视频下载的完整解决方案 【免费下载链接】VideoDownloadHelper Chrome Extension to Help Download Video for Some Video Sites. 项目地址: https://gitcode.com/gh_mirrors/vi/VideoDownloadHelper 还在为无法保存网…...

市面上有哪些是真正安全的降AIGC网站(轻松压低AI生成疑似率)

最崩溃的不是查重难题,而是查重达标却AI率超标亮红灯!很多工具只会简单同义词替换、浅层改字,根本洗不掉AI专属句式、行文逻辑和高频模板话术,学校AIGC检测一查一个准,论文直接凉凉。 本篇结合全网实测数据&#xff0c…...

HKMG工艺的“阿喀琉斯之踵”:聊聊那个无法移除的SiON界面层与未来0.3nm的挑战

HKMG工艺的隐形枷锁:SiON界面层的物理宿命与亚纳米级突围战 在半导体工艺演进的史诗中,HKMG(高K金属栅)技术曾被寄予厚望——它用金属栅极替代传统多晶硅,搭配高K介质材料HfO₂,一举解决了栅极耗尽和漏电流…...

DeepSeek代码审查配置避坑清单:12个被99%团队忽略的关键参数(含生产环境校验脚本)

更多请点击: https://intelliparadigm.com 第一章:DeepSeek代码审查功能概览 DeepSeek 提供的代码审查(Code Review)能力基于其大语言模型对编程语义、安全规范与工程实践的深度理解,支持多语言静态分析、漏洞识别、可…...

MFCC与可解释机器学习:构建可解释的L2发音AI诊断系统

1. 项目概述:当语音技术遇见二语教学 作为一名在语音技术和教育技术交叉领域摸爬滚打了十多年的从业者,我常常思考一个问题:我们能用算法“听”出一个人说外语时,他的母语口音吗?更进一步,我们能否不仅“听…...

抖音下载器深度解析:零基础轻松批量下载无水印视频

抖音下载器深度解析:零基础轻松批量下载无水印视频 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback support.…...

如何将B站缓存视频从m4s格式无损转换为通用MP4?

如何将B站缓存视频从m4s格式无损转换为通用MP4? 【免费下载链接】m4s-converter 一个跨平台小工具,将bilibili缓存的m4s格式音视频文件合并成mp4 项目地址: https://gitcode.com/gh_mirrors/m4/m4s-converter 你是否曾遇到过这样的情况&#xff1…...

yEd画流程图保姆级避坑指南:从界面解析到高效导出PNG/JPG全流程

yEd流程图高效绘制全攻略:从界面优化到专业导出的进阶技巧第一次打开yEd时,那个布满各种面板和参数的界面确实容易让人望而生畏。但别担心,经过几个月的深度使用,我发现这款工具其实隐藏着许多能极大提升效率的设计细节。本文将带…...