当前位置: 首页 > 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形式…...

YSYX学习记录(八)

C语言&#xff0c;练习0&#xff1a; 先创建一个文件夹&#xff0c;我用的是物理机&#xff1a; 安装build-essential 练习1&#xff1a; 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件&#xff0c;随机修改或删除一部分&#xff0c;之后…...

五年级数学知识边界总结思考-下册

目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解&#xff1a;由来、作用与意义**一、知识点核心内容****二、知识点的由来&#xff1a;从生活实践到数学抽象****三、知识的作用&#xff1a;解决实际问题的工具****四、学习的意义&#xff1a;培养核心素养…...

C++.OpenGL (10/64)基础光照(Basic Lighting)

基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...

CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云

目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...

汇编常见指令

汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX&#xff08;不访问内存&#xff09;XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...

Pinocchio 库详解及其在足式机器人上的应用

Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库&#xff0c;专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性&#xff0c;并提供了一个通用的框架&…...

Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析

Java求职者面试指南&#xff1a;Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问&#xff08;基础概念问题&#xff09; 1. 请解释Spring框架的核心容器是什么&#xff1f;它在Spring中起到什么作用&#xff1f; Spring框架的核心容器是IoC容器&#…...

【SpringBoot自动化部署】

SpringBoot自动化部署方法 使用Jenkins进行持续集成与部署 Jenkins是最常用的自动化部署工具之一&#xff0c;能够实现代码拉取、构建、测试和部署的全流程自动化。 配置Jenkins任务时&#xff0c;需要添加Git仓库地址和凭证&#xff0c;设置构建触发器&#xff08;如GitHub…...

nnUNet V2修改网络——暴力替换网络为UNet++

更换前,要用nnUNet V2跑通所用数据集,证明nnUNet V2、数据集、运行环境等没有问题 阅读nnU-Net V2 的 U-Net结构,初步了解要修改的网络,知己知彼,修改起来才能游刃有余。 U-Net存在两个局限,一是网络的最佳深度因应用场景而异,这取决于任务的难度和可用于训练的标注数…...

论文阅读:LLM4Drive: A Survey of Large Language Models for Autonomous Driving

地址&#xff1a;LLM4Drive: A Survey of Large Language Models for Autonomous Driving 摘要翻译 自动驾驶技术作为推动交通和城市出行变革的催化剂&#xff0c;正从基于规则的系统向数据驱动策略转变。传统的模块化系统受限于级联模块间的累积误差和缺乏灵活性的预设规则。…...