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

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


文末附有源码下载地址
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

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

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

相关文章

Day32:安全开发-JavaEE应用Servlet路由技术JDBCMybatis数据库生命周期

目录 JavaEE-HTTP-Servlet&路由&周期 JavaEE-数据库-JDBC&Mybatis&库 思维导图 Java知识点: 功能:数据库操作,文件操作,序列化数据,身份验证,框架开发,第三方库使用等. 框架…

使用OCC进行旋转扫掠

旋转扫掠是将物体以某一个坐标轴为参照,按照指定的角度旋转生成新的图形的过程 这里使用面的案例,使用线的逻辑处理其实是一样的 //构造旋转轴 gp_Ax1 anAxis; //设置轴的原点 anAxis.SetLocation(0,0,0); //设置轴的方向 anAxis.SetDirection(gp_Dir(0…

如何处理Android悬浮弹窗双击返回事件?

目录 1 前言 1.1 准备知识 1.2 问题概述 2 解决方案 3 代码部分 3.1 动态更新窗口焦点 3.2 窗口监听返回事件 3.3 判断焦点是否在窗口内部 3.4 窗口监听焦点移入/移出 1 前言 1.1 准备知识 1)开发环境: 2D开发环境:所有界面或弹窗…

Vue3+.NET6前后端分离式权限管理系统完整项目实战

1,前景:学习和开发该项目的需要一定的HTMLCSS基础,知道基本的Dom结构和标签使用以及简单的样式,此外如果有后端基础的想学前端的话比较容易上手,项目比较简单! 后续更新主要在微信订阅号更新,手…

APPS数据集分享

来源: AINLPer公众号(每日干货分享!!) 编辑: ShuYini 校稿: ShuYini 时间: 2024-3-13 该数据集由纽约大学的研究者于2022年提出,它是一个创新的多项选择题数据集,旨在提升自然语言理解模型处理长文本的能力…

【2024 R1 版本更新】Ansys Fluent(上)

​​Ansys2024R1来了,小宇赶紧将新功能给大家汇报一下。GPU求解器功能势头最强,pyFluent又开始迭代了,CPU模型中又更新了很多功能,fluent meshing中的thin volume mesh功能也来了。

环保企业应适应行业发展趋势,不断创新和提升竞争力|中联环保圈

《2023年行业评述及2024年发展展望》一文,由中国环保产业协会撰写,全面审视了过去一年我国生态环保产业的发展状况,并对新的一年发展趋势进行了深度预测。该报告以行业主要政策标准为基础,结合报告以及新冠疫情防控转段后的经济恢…

ARMV8-aarch64的虚拟内存(mmutlbcache)介绍-概念扫盲

🔥博客主页: 小羊失眠啦. 🎥系列专栏:《C语言》 《数据结构》 《C》 《Linux》 《Cpolar》 ❤️感谢大家点赞👍收藏⭐评论✍️ 思考: 1、cache的entry里都是有什么? 2、TLB的entry里都是有什么? 3、MMU操作…

Mysql锁与MVCC

文章目录 Mysql锁的类型锁使用MVCC快照读和当前读读视图【Read View】串行化的解决 exlpain字段解析ACID的原理日志引擎整合SpringBoot博客记录 Mysql锁的类型 MySQL中有哪些锁: 乐观锁(Optimistic Locking):假设并发操作时不会发…

微信小程序一次性订阅requestSubscribeMessage授权和操作详解

一次性订阅:用户订阅一次发一次通知 一、授权 — requestSubscribeMessage Taro.requestSubscribeMessage({tmplIds: [], // 需要订阅的消息模板的id的集合success (res) {console.log("同意授权", res)},fail(res) {console.log(拒绝授权, res)}})点击或…

贪心算法(算法竞赛、蓝桥杯)--线段覆盖

1、B站视频链接&#xff1a;A29 贪心算法 P1803 线段覆盖_哔哩哔哩_bilibili 题目链接&#xff1a;凌乱的yyy / 线段覆盖 - 洛谷 #include <bits/stdc.h> using namespace std;struct line{int l,r;bool operator<(line &b){return r<b.r;//重载小于号,按右端…

week07day01(powerbi)

一. Power BI简介 1. 构成部分 power query: 进行简单的数据清洗power pivot : 进行指标计算power view &#xff1a; 进行报表视图 二. Power Query (进行数据清洗) 1. 如何获取数据&#xff1a; 点击获取数据 ——> 选择导入数据的类型——> 会出现 "加载&…