大数据毕设选题 - 深度学习图像超分辨率重建(opencv python cnn)

news2025/7/15 13:13:49

文章目录

  • 0 前言
  • 1 什么是图像超分辨率重建
  • 2 应用场景
  • 3 实现方法
  • 4 SRResNet算法原理
  • 5 SRCNN设计思路
  • 6 代码实现
    • 6.1 代码结构组织
    • 6.2 train_srresnet
    • 6.3 训练效果
  • 7 最后


0 前言

🔥 Hi,大家好,这里是丹成学长的毕设系列文章!

🔥 对毕设有任何疑问都可以问学长哦!

这两年开始,各个学校对毕设的要求越来越高,难度也越来越大… 毕业设计耗费时间,耗费精力,甚至有些题目即使是专业的老师或者硕士生也需要很长时间,所以一旦发现问题,一定要提前准备,避免到后面措手不及,草草了事。

为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天要分享的新项目是

🚩 基于深度学习的图像超分辨率重建

🥇学长这里给一个题目综合评分(每项满分5分)

  • 难度系数:4分
  • 工作量:4分
  • 创新点:3分

🧿 选题指导, 项目分享:

https://gitee.com/yaa-dc/BJH/blob/master/gg/cc/README.md



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'] + 1
        model.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)))
 
    # 定制化的dataloaders
    train_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 最后

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

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

相关文章

读写分离和主从复制

这是只有一个数据库的情形,此时增删改查都是针对这个数据库而言 存在两个问题:所有压力都是由一台数据库承担,数据库压力很大 而且,一旦这个数据库发生故障,数据丢失,拿数据就全都没了 现在有两个数据库&…

总结使人进步,4句真章的理解和实践

在“总结使人进步,遵循事物的客观发展规律;祸福相依,知行合一”这篇文章里,首次全面提出了4句真章。 这么多年,最有感触的4句话。 一、4句真章 1、总结使人进步 2、遵循事物的发展规律 3、祸福相依 4、知行合一 …

muduo库中实现Protbuf编码器与消息分发器

文章目录1. protobuf的type name反射机制2. Protobuf编码器2.1 protbuf传输格式2.2 message转换为Buffer2.3 Buffer转换为message2.4 onMessage和send3. 消息分发器dispatcher3.1 成员变量3.2 onProtobufMessage3.3 registerMessageCallback4. 简单RPC4.1 query.proto4.2 serve…

QT:debug日志—打不开头文件以及qDebug和Q_CLASSINFO的使用

这个是因为链接器在给定路径上搜索不到对应的头文件,而大多数的Qt相关的头文件都集中在一个include文件夹里: 我电脑上的路径是:C:\Qt\Qt5.9.7\5.9.7\msvc2017_64\include 然后我们在项目设置里: 注意,这边要加上\*&…

Linux系统配置及服务管理-06-存储管理

基本分区 磁盘简介 磁盘/硬盘/disk是一个东西,不同于内存的是容量比较大。 类型 从工作原理区分 机械 机械硬盘即是传统普通硬盘,主要由:盘片,磁头,盘片转轴及控制电机,磁头控制器,数据转换…

钢材缺陷检测系统-ui界面

钢材缺陷检测系统-ui界面 之前写过这个博客: 工业缺陷检测项目实战(二)——基于深度学习框架yolov5的钢铁表面缺陷检测 里面介绍了使用yolov5进行训练的步骤。今天我们一起学习利用qt将缺陷检测封装为一个系统。 效果 首先看看效果: 我们运行,先可以看…

26岁月薪从7k到17K,这一切都要从那年失业讲起...

女生,目前在成都做了快4年的测试 先来说说我自己是怎么入行的以及我学到的一些经验分享,希望能帮助到更多的朋友们 我大学学的并不是计算机相关专业,学的市场营销,毕业后大部分同学都去做销售或者商务BD了,奈何自己性…

Redis复习笔记

文章目录Redis一、redis入门1.1、NoSQL的引言1.2、为什么是NoSQL1.3、NoSQL的四大分类1.3.1 键值(Key-Value)存储数据库1.3.2 列存储数据库1.3.3 文档型数据库1.3.4 图形(Graph)数据库1.4 NoSQL应用场景1.5 什么是Redis1.6 Redis特点1.7 Redis 安装二、redis数据库相关指令2.1 …

vue-swiper组件化:解决异步请求数据时swiper过早初始化问题:

最初始的swiper组件封装&#xff1a; <body><div id"box"><swiper></swiper></div><script>Vue.component("swiper", {template: <div class"swiper"><div class"swiper-wrapper">…

PC_磁盘HDD_SSD/存储介质(材料工艺)

文章目录外存磁盘存储器组成磁盘驱动器磁盘控制器盘片platter存储区域磁盘结构磁道track道距位密度扇区sector&#x1f388;/块Block&#x1f386;磁头(Head)圆柱面cylinder磁记录原理磁盘性能指标记录密度磁盘的容量非格式化容量格式化容量数据传输率磁盘转速旋转周期T例平均存…

自学网络安全?一般人我还是劝你算了吧

前言 本人纯屌丝一枚&#xff0c;在学网络安全之前对电脑的认知也就只限于上个网&#xff0c;玩个办公软件。这里不能跑题&#xff0c;我为啥说自学网络安全&#xff0c;一般人我还是劝你算了吧。因为我就是那个一般人。 基础真的很简单&#xff0c;是个人稍微认点真都能懂&a…

SpringBoot 常用配置

SpringBoot的配置文件格式 SpringBoot的配置文件支持properties和yml&#xff0c;甚至他还支持json。 更推荐使用yml文件格式&#xff1a; yml文件&#xff0c;会根据换行和缩进帮助咱们管理配置文件所在位置 yml文件&#xff0c;相比properties更轻量级一些 yml文件的劣势&am…

SpringBoot——自定义start场景启动器

需求分析&#xff1a;为什么要学习场景启动器&#xff1f; SpringBoot要引用外部组件&#xff0c;只需要拿到其场景启动器的依赖&#xff0c;再编写一些配置文件即可。 eg:SpringBoot中要使用redis就需要引入redis的场景启动器依赖 <dependency><groupId>org.spri…

Kafka - 05 Kafka生产者| 消息发送方式 | 序列化器 | 分区器 | 拦截器 |生产者配置参数

文章目录1. Java客户端数据生产流程解析2. 消息发送方式3. 序列化器4. 分区器5. 拦截器6. 发送原理剖析7. Kafka生产者参数配置1. Java客户端数据生产流程解析 首先要构造一个 ProducerRecord 对象&#xff0c;该对象可以声明主题Topic、分区Partition、键 Key以及值 Value&…

刷爆力扣之检查数组对是否可以被 k 整除

刷爆力扣之检查数组对是否可以被 k 整除 HELLO&#xff0c;各位看官大大好啊&#xff0c;我是阿呆 &#x1f648;&#x1f648;&#x1f648; 今天开始阿呆将会记录下力扣刷题过程&#xff0c;收录在专栏算法中 &#x1f61c;&#x1f61c;&#x1f61c; 该专栏按照不同类别标…

CPU调度

目录 1.进程调度 1.1 工作负载简化假设 1.2 调度指标&#xff1a;周转时间 1.3 先进先出&#xff08;FIFO&#xff09; 1.4 最短任务优先&#xff08;SJF&#xff09; 1.5 最短完成时间优先&#xff08;STCF&#xff09; 1.6 新度量指标&#xff1a;响应时间 1.7 轮转 …

【网页设计】基于HTML+CSS+JavaScript制作美食网站舌尖上的美食

&#x1f380; 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

基于因果化评论的可解释推荐方法

ChineseCSCW2022&#xff08;太原&#xff09;会议&#xff0c;汇报来自复旦大学张光平同学&#xff0c;本篇文章为会议记录&#xff0c;如有侵权&#xff0c;请联系我删除‼️ 目录 1.引言 2.背景 3.模型结构 4.方法论 5.预测和训练 6.实验 1.引言 2.背景 共线关系…

[附源码]SSM计算机毕业设计社区医院管理系统JAVA

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

记录报错_linux: su root 报错: su: Authentication failure

记录报错_linux: su root 报错&#xff1a; su: Authentication failure初su: Authentication failure关于 su 用法 &#xff1a;常用下图为使用其他用户进行命令 ls 操作下图为变更用户操作&#xff1a;初 希望能写一些简单的教程和案例分享给需要的人 su: Authentication f…