计算机毕设 基于深度学习的图像超分辨率重建 - opencv python cnn
文章目录
- 0 前言
- 1 什么是图像超分辨率重建
- 2 应用场景
- 3 实现方法
- 4 SRResNet算法原理
- 5 SRCNN设计思路
- 6 代码实现
- 6.1 代码结构组织
- 6.2 train_srresnet
- 6.3 训练效果
- 7 最后
0 前言
🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。
为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天要分享的是
🚩 基于深度学习的图像超分辨率重建算法研究与实现
🥇学长这里给一个题目综合评分(每项满分5分)
- 难度系数:4分
- 工作量:4分
- 创新点:3分
1 什么是图像超分辨率重建
图像的超分辨率重建技术指的是将给定的低分辨率图像通过特定的算法恢复成相应的高分辨率图像。具体来说,图像超分辨率重建技术指的是利用数字图像处理、计算机视觉等领域的相关知识,借由特定的算法和处理流程,从给定的低分辨率图像中重建出高分辨率图像的过程。其旨在克服或补偿由于图像采集系统或采集环境本身的限制,导致的成像图像模糊、质量低下、感兴趣区域不显著等问题。
简单来理解超分辨率重建就是将小尺寸图像变为大尺寸图像,使图像更加“清晰”。具体效果如下图所示


2 应用场景
图像超分辨率重建技术在多个领域都有着广泛的应用范围和研究意义。主要包括:
(1) 图像压缩领域
在视频会议等实时性要求较高的场合,可以在传输前预先对图片进行压缩,等待传输完毕,再由接收端解码后通过超分辨率重建技术复原出原始图像序列,极大减少存储所需的空间及传输所需的带宽。
(2) 医学成像领域
对医学图像进行超分辨率重建,可以在不增加高分辨率成像技术成本的基础上,降低对成像环境的要求,通过复原出的清晰医学影像,实现对病变细胞的精准探测,有助于医生对患者病情做出更好的诊断。
(3) 遥感成像领域
高分辨率遥感卫星的研制具有耗时长、价格高、流程复杂等特点,由此研究者将图像超分辨率重建技术引入了该领域,试图解决高分辨率的遥感成像难以获取这一挑战,使得能够在不改变探测系统本身的前提下提高观测图像的分辨率。
(4) 公共安防领域
公共场合的监控设备采集到的视频往往受到天气、距离等因素的影响,存在图像模糊、分辨率低等问题。通过对采集到的视频进行超分辨率重建,可以为办案人员恢复出车牌号码、清晰人脸等重要信息,为案件侦破提供必要线索。
(5) 视频感知领域
通过图像超分辨率重建技术,可以起到增强视频画质、改善视频的质量,提升用户的视觉体验的作用。
3 实现方法
首先介绍图像超分辨率重建技术,图像超分辨率重建技术分为两种,一种是从多张低分辨率图像合成一张高分辨率图像,另外一种是从单张低分辨率图像获取高分辨率图像,在本专栏中,我们使用单幅图像超分辨率重建技术(SISR)。
在这些方法中,可以分为三类,基于插值,基于重建,基于学习。基于插值的方法实现简单,已经广泛应用,但是这些线性的模型限制住了它们恢复高频能力的细节。基于稀疏表示的技术[1]通过使用先验知识增强了线性模型的能力。这类技术假设任意的自然图像可以被字典的元素稀疏表示,这种字典可以形成一个数据库且从数据库中学习到低分辨率图像到高分辨率图像的映射,但是这类方法计算复杂,需要大量计算资源。
基于CNN(卷积神经网络)的模型SRCNN[2]首先将CNN引入SISR中,它仅仅使用三层网络,就取得了先进的结果。随后,各种基于深度学习的模型,进入SISR领域,大致分为以下两个大的方向。一种是追求细节的恢复,以PSNR,SSIM等评价标准的算法,其中以SRCNN模型为代表。另外一种以降低感知损失为目标,不注重细节,看重大局观,以SRGAN[3]为代表的一系列算法。两种不同方向的算法,应用的领域也不相同。在医学图像领域,医生需要图像的细节,以致于做出精确的判断,而不是追求图像整体的清晰,因此,本专栏中将研究追求细节恢复的算法,以及在医学上的应用。
追求细节恢复的算法,也分为两个流派,一是使用插值作为预处理的算法,二是不使用插值,将上采样过程融入网络中的算法。
4 SRResNet算法原理
SRCNN的网络结构图如下

三层的作用
在进入网络之前会有将input图像用双三次插值放大至目标尺寸的预处理。
LR 特征提取(Patch extraction and representation),这个阶段主要是对LR进行特征提取,并将其特征表征为一些feature maps;
特征的非线性映射(Non-linear mapping),这个阶段主要是将第一阶段提取的特征映射至HR所需的feature maps;
HR重建(Reconstruction),这个阶段是将第二阶段映射后的特征恢复为HR图像。
网络结构细节
LR特征提取可表征为“卷积层(cf1f1卷积核)+RELU",c是通道数,f1是卷积核的大小。
非线性映射可表征为“全连接层+RELU”,而全连接层又可表征为卷积核为1x1的卷积层,因此,本层最终形式为“卷积层(n111卷积核)+RELU";n1是第一层卷积核的个数。
HR重建可直接表征为“卷积层(n2f3f3)”;n2是第二层卷积核的个数。
5 SRCNN设计思路
这个思路是从稀疏编码得来的,并把上述过程分别表述为:Patch extraction, Non-linear mapping, Reconstruction。
Patch extraction: 提取图像Patch,进行卷积提取特征,类似于稀疏编码中的将图像patch映射到低分辨率字典中。基于样例的算法目的是找到一组可以表达之前预处理后所得到图像块的一组“基”,这些基是沿着不同方向的边缘,稀疏系数就是分配给各个基的权重。作者认为这部分可以转化为用一定数量的滤波器(卷积核)来代替。

Non-linear mapping: 将低分辨率的特征映射为高分辨率特征,类似于字典学习中的找到图像patch对应的高分辨字典。基于样例的算法将第一步得到的表达图像块的高维向量映射到另外一个高维向量中,通过这个高维向量表达高分辨率图像块,用于最后的重建。作者认为这一步骤可以使用1*1的卷积来实现向量维数的变换。

Reconstruction:根据高分辨率特征进行图像重建。类似于字典学习中的根据高分辨率字典进行图像重建。基于样例的算法将最后得到的高分辨率图像块进行聚合(重合的位置取平均)形成最后的高分辨率图像。作者认为这一部分可以看成是一种线性运算,可以构造一个线性函数(不加激活函数)来实现。

从实际操作上来看,整个超分重建分为两步:图像放大和修复。所谓放大就是采用某种方式(SRCNN采用了插值上采样)将图像放大到指定倍数,然后再根据图像修复原理,将放大后的图像映射为目标图像。超分辨率重建不仅能够放大图像尺寸,在某种意义上具备了图像修复的作用,可以在一定程度上削弱图像中的噪声、模糊等。因此,超分辨率重建的很多算法也被学者迁移到图像修复领域中,完成一些诸如jpep压缩去燥、去模糊等任务。

6 代码实现
6.1 代码结构组织

项目根目录下有8个.py文件和2个文件夹,下面对各个文件和文件夹进行简单说明。
- create_data_lists.py:生成数据列表,检查数据集中的图像文件尺寸,并将符合的图像文件名写入JSON文件列表供后续Pytorch调用;
- datasets.py:用于构建数据集加载器,主要沿用Pytorch标准数据加载器格式进行封装;
- models.py:模型结构文件,存储各个模型的结构定义;
- utils.py:工具函数文件,所有项目中涉及到的一些自定义函数均放置在该文件中;
- train_srresnet.py:用于训练SRResNet算法;
- train_srgan.py:用于训练SRGAN算法;
- eval.py:用于模型评估,主要以计算测试集的PSNR和SSIM为主;
- test.py:用于单张样本测试,运用训练好的模型为单张图像进行超分重建;
- data:用于存放训练和测试数据集以及文件列表;
- results:用于存放运行结果,包括训练好的模型以及单张样本测试结果;
整个代码运行顺序如下:
- 运行create_data_lists.py文件用于为数据集生成文件列表;
- 运行train_srresnet.py进行SRResNet算法训练,训练结束后在results文件夹中会生成checkpoint_srresnet.pth模型文件;
- 运行eval.py文件对测试集进行评估,计算每个测试集的平均PSNR、SSIM值;
- 运行test.py文件对results文件夹下名为test.jpg的图像进行超分还原,还原结果存储在results文件夹下面;
- 运行train_srgan.py文件进行SRGAN算法训练,训练结束后在results文件夹中会生成checkpoint_srgan.pth模型文件;
- 修改并运行eval.py文件对测试集进行评估,计算每个测试集的平均PSNR、SSIM值;
- 修改并运行test.py文件对results文件夹下名为test.jpg的图像进行超分还原,还原结果存储在results文件夹下面;
6.2 train_srresnet
代码过多,仅展示关键代码,需要源码的可以call学长
import torch.backends.cudnn as cudnn
import torch
from torch import nn
from torchvision.utils import make_grid
from torch.utils.tensorboard import SummaryWriter
from models import SRResNet
from datasets import SRDataset
from utils import *# 数据集参数
data_folder = './data/' # 数据存放路径
crop_size = 96 # 高分辨率图像裁剪尺寸
scaling_factor = 4 # 放大比例# 模型参数
large_kernel_size = 9 # 第一层卷积和最后一层卷积的核大小
small_kernel_size = 3 # 中间层卷积的核大小
n_channels = 64 # 中间层通道数
n_blocks = 16 # 残差模块数量# 学习参数
checkpoint = None # 预训练模型路径,如果不存在则为None
batch_size = 400 # 批大小
start_epoch = 1 # 轮数起始位置
epochs = 130 # 迭代轮数
workers = 4 # 工作线程数
lr = 1e-4 # 学习率# 设备参数
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
ngpu = 2 # 用来运行的gpu数量cudnn.benchmark = True # 对卷积进行加速writer = SummaryWriter() # 实时监控 使用命令 tensorboard --logdir runs 进行查看def main():"""训练."""global checkpoint,start_epoch,writer# 初始化model = SRResNet(large_kernel_size=large_kernel_size,small_kernel_size=small_kernel_size,n_channels=n_channels,n_blocks=n_blocks,scaling_factor=scaling_factor)# 初始化优化器optimizer = torch.optim.Adam(params=filter(lambda p: p.requires_grad, model.parameters()),lr=lr)# 迁移至默认设备进行训练model = model.to(device)criterion = nn.MSELoss().to(device)# 加载预训练模型if checkpoint is not None:checkpoint = torch.load(checkpoint)start_epoch = checkpoint['epoch'] + 1model.load_state_dict(checkpoint['model'])optimizer.load_state_dict(checkpoint['optimizer'])if torch.cuda.is_available() and ngpu > 1:model = nn.DataParallel(model, device_ids=list(range(ngpu)))# 定制化的dataloaderstrain_dataset = SRDataset(data_folder,split='train',crop_size=crop_size,scaling_factor=scaling_factor,lr_img_type='imagenet-norm',hr_img_type='[-1, 1]')train_loader = torch.utils.data.DataLoader(train_dataset,batch_size=batch_size,shuffle=True,num_workers=workers,pin_memory=True) # 开始逐轮训练for epoch in range(start_epoch, epochs+1):model.train() # 训练模式:允许使用批样本归一化loss_epoch = AverageMeter() # 统计损失函数n_iter = len(train_loader)# 按批处理for i, (lr_imgs, hr_imgs) in enumerate(train_loader):# 数据移至默认设备进行训练lr_imgs = lr_imgs.to(device) # (batch_size (N), 3, 24, 24), imagenet-normed 格式hr_imgs = hr_imgs.to(device) # (batch_size (N), 3, 96, 96), [-1, 1]格式# 前向传播sr_imgs = model(lr_imgs)# 计算损失loss = criterion(sr_imgs, hr_imgs) # 后向传播optimizer.zero_grad()loss.backward()# 更新模型optimizer.step()# 记录损失值loss_epoch.update(loss.item(), lr_imgs.size(0))# 监控图像变化if i==(n_iter-2):writer.add_image('SRResNet/epoch_'+str(epoch)+'_1', make_grid(lr_imgs[:4,:3,:,:].cpu(), nrow=4, normalize=True),epoch)writer.add_image('SRResNet/epoch_'+str(epoch)+'_2', make_grid(sr_imgs[:4,:3,:,:].cpu(), nrow=4, normalize=True),epoch)writer.add_image('SRResNet/epoch_'+str(epoch)+'_3', make_grid(hr_imgs[:4,:3,:,:].cpu(), nrow=4, normalize=True),epoch)# 打印结果print("第 "+str(i)+ " 个batch训练结束")# 手动释放内存 del lr_imgs, hr_imgs, sr_imgs# 监控损失值变化writer.add_scalar('SRResNet/MSE_Loss', loss_epoch.val, epoch) # 保存预训练模型torch.save({'epoch': epoch,'model': model.module.state_dict(),'optimizer': optimizer.state_dict()}, 'results/checkpoint_srresnet.pth')# 训练结束关闭监控writer.close()if __name__ == '__main__':main()
6.3 训练效果
训练共用时15小时19分6秒(没有用显卡),训练完成后保存的模型共17.8M。下图展示了训练过程中的损失函数变化。可以看到,随着训练的进行,损失函数逐渐开始收敛,在结束的时候基本处在收敛平稳点。

倍缩放比率下不同超分辨率方法的结果比对效果

7 最后
相关文章:
计算机毕设 基于深度学习的图像超分辨率重建 - opencv python cnn
文章目录 0 前言1 什么是图像超分辨率重建2 应用场景3 实现方法4 SRResNet算法原理5 SRCNN设计思路6 代码实现6.1 代码结构组织6.2 train_srresnet6.3 训练效果 7 最后 0 前言 🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少…...
基于Java+SpringBoot+Vue前后端分离科研工作量管理系统设计和实现
博主介绍:✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专…...
Java复习-17-Object类
Object 类 功能:可以解决参数的统一问题特点:Java中所有的类型都是 Object 类的子类(包括自定义的类)。运用:如果一个程序的方法要求可以接收所有类的对象的时候就可以利用 Object 实现处理。 toString() 方法 可以…...
数据结构--树4.2.4(树、森林即二叉树的相互转换(仅供参考))
目录 一、树转换成二叉树步骤 二、森林转换成二叉树 三、二叉树到树、森林的转换 一、树转换成二叉树步骤 分两个步骤: 1、在树中所有的兄弟结点之间加一连线。 2、对每个结点,除了保留与其长子(最左边)的连线外,去…...
MyBatis-Plus 总结
MyBatis-Plus简介 官网:https://baomidou.com/ GitHub:https://github.com/baomidou/mybatis-plus Gitee:https://gitee.com/baomidou/mybatis-plus 简介 MyBatis-Plus (简称 MP)是一个 MyBatis的增强工具&#x…...
【CSS】轮播图案例开发 ( 基本设置 | 子绝父相 | 浏览器水平居中 | 圆角设置 | 绝对定位居中设置 )
代码示例 : <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Banner 轮播</title><style>/* 取消浏览器或者其它标签的默认的内外边距 */* {margin: 0;padding: 0;}/* 取消列表样式 主要是…...
leetcode做题笔记111. 二叉树的最小深度
给定一个二叉树,找出其最小深度。 最小深度是从根节点到最近叶子节点的最短路径上的节点数量。 说明:叶子节点是指没有子节点的节点。 思路一:递归 int minDepth(struct TreeNode* root){if(!root)return 0;int leftminDepth(root->le…...
ubuntu安装Google Chrome 浏览器和ChromeDriver
要在Ubuntu上安装Google Chrome浏览器和ChromeDriver,可以按照以下步骤操作: 1. 安装Google Chrome 浏览器 下载Google Chrome 的最新版本。 wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb使用dpkg安装下载的deb包。…...
猫头虎博主赠书一期:《Kubernetes原生微服务开发》
🌷🍁 博主猫头虎 带您 Go to New World.✨🍁 🦄 博客首页——猫头虎的博客🎐 🐳《面试题大全专栏》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 &a…...
QtC++ 设计模式(四)——策略模式
策略模式 序言理解源码 序言 还是参考的菜鸟教程,会C的还是看C的方式来得舒服。 . 理解 使用符合UML规范的便于理解和回忆,接口其实就是普通的基类 . 源码 strategy.h /// 策略 class Strategy { public:virtual ~Strategy();/*** brief 计算* p…...
LVS集群和分布式概念
LVS 一.集群和分布式概念 1.1 集群 在计算机领域,集群早在 1960 年就出现,随着互联网和计算机相关技术的发展,现在 集群这一技术已经在各大互联网公司普及。 1.1.1 集群概念 计算机集群指一组通过计算机网络连接的计算机,它们…...
javafx应用程序线程异常Exception in thread “JavaFx Application Thread“
前几天用javafx做小桌面应用程序出现了一个问题: 反复检查,最终确定报错的原因是UI刷新频率过快导致的 javafx提供了Platform.runLater用于解决该问题: Platform.runLater(new Runnable() {Overridepublic void run(){//用Platform.runLate…...
大漠插件7.2336
工具名称:大漠插件7.2336 更新时间2023-08-28更新内容/v7.23361. YOLO综合工具标记逻辑优化. 更加的方便2. YOLO综合工具增加了默认类. 对于多个同类可以不用每次都进行选择.3. YOLO综合工具增加可以对模型的输入大小进行修改4. YOLO的dmx格式变更.新老版本不混用. 新的dmx格式…...
5年测试,面试结束后被HR发朋友圈怼了..(心塞)
前一阵子向朋友诉苦,我在参加字节跳动面试的时候被面试官怼得哑口无言,场面让我一度十分尴尬。 印象最深的就是下面几个问题: 根据你以前的工作经验和学习到的测试技术,说说你对质量保证的理解? 非关系型数据库和关系型…...
基于相空间重构的混沌背景下微弱信号检测算法matlab仿真,对比SVM,PSO-SVM以及GA-PSO-SVM
目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 SVM 4.2 PSO-SVM 4.3 GA-PSO-SVM 5.算法完整程序工程 1.算法运行效果图预览 SVM: PSO-SVM: GA-PSO-SVM: 以上仿真图参考文献《基于相空间重构的混沌背景下微弱信号检测方法研究》 2.…...
开发者必备:推荐将闲置iPad Pro打造为编程工具,使用VS Code编写代码
文章目录 前言1. 本地环境配置2. 内网穿透2.1 安装cpolar内网穿透(支持一键自动安装脚本)2.2 创建HTTP隧道 3. 测试远程访问4. 配置固定二级子域名4.1 保留二级子域名4.2 配置二级子域名 5. 测试使用固定二级子域名远程访问6. iPad通过软件远程vscode6.1 创建TCP隧道 7. ipad远…...
c++,标准库std中全局函数 _Destroy_in_place(...)的分析
(1)该函数的定义和位置如下: 可见,传入形参为某种类型的引用,该函数会执行形参的析构函数,还可以有效解决数组的连续析构。很强大的函数。 (2)疑问是,若形参是指针类型…...
java:Tomcat
文章目录 背景服务器web 服务器服务资源的分类服务器软件的分类nginx 和 tomact总结 安装Tomcatbrew安装官网压缩包安装IDEA集成IDEA插件 说明 背景 在讲 Tomcat 是啥之前,我们先来了解一些概念。 服务器 可以理解为一个高性能的电脑,但是这个电脑现在…...
US-P2F-R-C双线圈插头式比例阀放大器
US-P2F-R-C型插头式安装比例放大器控制不带电反馈的单或双比例电磁铁的比例阀,如比例插装阀、比例方向阀、比例压力阀、比例流量阀、比例叠加阀等,带数显区显示及当前参数,如指令、电流、上下斜坡、颤振频率等,指令类型兼容0-10V、…...
clickhouse一次异常排查记录
clickhouse中报错 关闭了自启动,删了status,重启了clickhouse还是报错 1,排查定时执行的脚本日志(每小时第5分钟执行) INSERT INTO quality0529.previously_reported_urls (url) SELECT url FROM quality0529.hourly_…...
【Axure高保真原型】引导弹窗
今天和大家中分享引导弹窗的原型模板,载入页面后,会显示引导弹窗,适用于引导用户使用页面,点击完成后,会显示下一个引导弹窗,直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...
C++_核心编程_多态案例二-制作饮品
#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为:煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例,提供抽象制作饮品基类,提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...
基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...
HTML 列表、表格、表单
1 列表标签 作用:布局内容排列整齐的区域 列表分类:无序列表、有序列表、定义列表。 例如: 1.1 无序列表 标签:ul 嵌套 li,ul是无序列表,li是列表条目。 注意事项: ul 标签里面只能包裹 li…...
Mobile ALOHA全身模仿学习
一、题目 Mobile ALOHA:通过低成本全身远程操作学习双手移动操作 传统模仿学习(Imitation Learning)缺点:聚焦与桌面操作,缺乏通用任务所需的移动性和灵活性 本论文优点:(1)在ALOHA…...
用机器学习破解新能源领域的“弃风”难题
音乐发烧友深有体会,玩音乐的本质就是玩电网。火电声音偏暖,水电偏冷,风电偏空旷。至于太阳能发的电,则略显朦胧和单薄。 不知你是否有感觉,近两年家里的音响声音越来越冷,听起来越来越单薄? —…...
安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖
在Vuzix M400 AR智能眼镜的助力下,卢森堡罗伯特舒曼医院(the Robert Schuman Hospitals, HRS)凭借在无菌制剂生产流程中引入增强现实技术(AR)创新项目,荣获了2024年6月7日由卢森堡医院药剂师协会࿰…...
MacOS下Homebrew国内镜像加速指南(2025最新国内镜像加速)
macos brew国内镜像加速方法 brew install 加速formula.jws.json下载慢加速 🍺 最新版brew安装慢到怀疑人生?别怕,教你轻松起飞! 最近Homebrew更新至最新版,每次执行 brew 命令时都会自动从官方地址 https://formulae.…...
MySQL 主从同步异常处理
阅读原文:https://www.xiaozaoshu.top/articles/mysql-m-s-update-pk MySQL 做双主,遇到的这个错误: Could not execute Update_rows event on table ... Error_code: 1032是 MySQL 主从复制时的经典错误之一,通常表示ÿ…...
leetcode_69.x的平方根
题目如下 : 看到题 ,我们最原始的想法就是暴力解决: for(long long i 0;i<INT_MAX;i){if(i*ix){return i;}else if((i*i>x)&&((i-1)*(i-1)<x)){return i-1;}}我们直接开始遍历,我们是整数的平方根,所以我们分两…...
