【超分辨率实验】使用MMEditing进行图像超分辨率

2023-11-10

使用MMEditing进行图像超分辨率

安装MMEditing

# 检查PyTorch版本
!pip list | grep torch

在这里插入图片描述

# 安装对应版本的mmcv-full
!pip install mmcv-full -f https://download.openmmlab.com/mmcv/dist/cu101/torch1.8.0/index.html

在这里插入图片描述

# 源码安装MMEditing(git clone命令)
%cd /content
!rm -rf mmediting
!git clone https://github.com/open-mmlab/mmediting.git

在这里插入图片描述

# 用pip安装
%cd mmediting
!pip install -e .

在这里插入图片描述

# 检查PytorchCheck Pytorch installation
import torch, torchvision
print(torch.__version__,torch.cuda.is_available())

在这里插入图片描述

import mmedit
print(mmedit.__version__)

在这里插入图片描述

使用预训练模型完成推理

查找并下载预训练模型

https://mmediting.readthedocs.io/en/latest/

# 下载SRCNN的预训练模型
!test -d checkpoint || mkdir checkpoint
!wget -c https://openmmlab.oos-accelerate.aliyuncs.com/mmediting/restorers/srcnn/srcnn_x4k915_1x16_1000k_div2k_20200608-4186f232.pth\
    -o ./checkpoint/srcnn_x4k915_1x16_1000k_div2k_20200608-4186f232.pth

# 下载样例数据
!rm -rf data
!git clone https://github.com/kckchan-dev/Datasets.git data

在这里插入图片描述

# 展示图像
import matplotlib.pyplot as plt
import mmcv

img_LR = mmcv.imread('./data/Set5/LR/butterfly.png',channel_order='rgb')
img_HR = mmcv.imread('./data/Set5/GT/butterfly.png',channel_order='rgb')

plt.figure(figsize=(12,8))
plt.subplot(1,2,1)
plt.imshow(img_LR)
plt.subplot(1,2,2)
plt.imshow(img_HR)
plt.show()

在这里插入图片描述

# 设置配置文件和与训练模型的路径
config_file = 'configs/restorers/srcnn/srcnn_x4k915_g1_1000k_div2k.py'
checkpoint_file = 'checkpoint/srcnn_x4k915_1x16_1000k_div2k_20200608-4186f232.pth'

调用API构建模型

# 调用init_model初始化模型
from mmedit.apis import init_model
model = init_model(config_file,checkpoint_file,device='cuda:0')

在这里插入图片描述

# 展示model
model

在这里插入图片描述

在这里插入图片描述

SRCNN 双三次插值上采样 三层卷积 L1损失

调用API进行推理

调用restoration_inference推理
from mmedit.apis import restoration_inference
result = restoration_inference(model, 'data/Set5/LR/butterfly.png')
result

在这里插入图片描述

pytorch的tensor 四维

result = torch.clamp(result,0,1) # 像素值在0,1之间,用clamp进行截断,把小于1的置为0,大于1的置为1
img_SR = result.squeeze(0).permute(1,2,0).numpy()# (n,c,h,w)去掉n这一维度,把(c,h,w)转换为(h,w,c),再转换为numpy数组

分析图像恢复效果

import matplotlib.pyplot as plt

fig = plt.figure(figsize=(15,12))
ax1 = fig.add_subplot(1,3,1)
plt.title('LR',fontsize=16)
ax1.axis('off')
ax2 = fig.add_subplot(1,3,2)
plt.title('SR',fontsize=16)
ax2.axis('off')
ax3 = fig.add_subplot(1,3,3)
plt.title('HR',fontsize=16)
ax3.axis('off')
ax1.imshow(img_LR)
ax2.imshow(img_SR)
ax3.imshow(img_HR)
plt.show()

在这里插入图片描述
从结果可以看到,输出仍然有些模糊,事实上是个正常现象
我们使用的数据再降采样前有高斯模糊滤波,
但预训练模型在训练时所使用的数据没有加入高斯模糊,
训练数据与测试数据的失陪产生了上述问题。

使用自定义的数据集微调模型

使用MMEditing完成模型的微调,需要三个步骤:

  1. 准备训练数据
  2. 修改配置文件
  3. 启动训练

准备训练数据

使用MMEditing训练超分辨率模型,需要将数据整理成如下格式:

  1. 将高分辨率图像和低分辨率图像放置在不同的文件夹下,对应的高低分辨率使用相同的文件名
  2. 生成一个标注文件(annotation file)是一个文件列表,每行包含高分辨率图像文件名,以及对应的高分辨率图像的分辨率

这里使用DIV2K数据集的一个子集,并在生成低分辨率图像时,使用高斯滤波(样例数据中已经处理好)

# 生成图像列表
import glob
gt_paths = sorted(glob.glob('./data/DIV2K/GT/*.png'))
with open('data/training_ann.txt','w')as f:
  for gt_path in gt_paths:
    filename = gt_path.split('/')[-1]
    line = f'{filename} (480,480,3)\n'# 把图像的分辨率写入文件
    f.write(line)

对应修改配置文件

# 加载原始SRCNN的配置文件
from mmcv import Config
cfg = Config.fromfile('configs/restorers/srcnn/srcnn_x4k915_g1_1000k_div2k.py')
print(f'Config:\n{cfg.pretty_text}')
# 原始配置文件基于完整的DIV2K数据集训练,我们需要做出对应修改
from mmcv.runner import set_random_seed
# 指定训练集的目录和标注文件
cfg.data.train.dataset.lq_folder='./data/DIV2K/LR'
cfg.data.train.dataset.gt_folder='./data/DIV2K/GT'
cfg.data.train.dataset.ann_file='./data/training_ann.txt'
# 指定验证集的目录
cfg.data.val.lq_folder='./data/Set5/LR'
cfg.data.val.gt_folder='./data/Set5/GT'
# 指定测试集的目录
cfg.data.test.lq_folder='./data/Set5/LR'
cfg.data.test.gt_folder='./data/Set5/GT'
# 指定预训练模型
cfg.load_from='./checkpoint/srcnn_x4k915_1x16_1000k_div2k_20200608-4186f232.pth'
# 设置工作目录
cfg.work_dir='./tutorial_exps/srcnn'
# 配置batch size
cfg.data.samples_per_gpu=4
cfg.data.workers_per_gpu=0
cfg.data.val_workers_per_gpu=0
# 设置总迭代次数
cfg.total_iters = 200
# 在100次迭代时降低学习率,按步长下降的策略
cfg.lr_config={}
cfg.lr_config.policy='Step'
cfg.lr_config.by_epoch=False
cfg.lr_config.step=[100]
cfg.lr_config.gamma=0.5
# 每20轮进行一次验证,并保存结果
if cfg.evaluation.get('gpu_collect',None):
  cfg.evaluation.pop('gpu_collect')

cfg.evaluation.interval=200
cfg.checkpoint_config.interval=200
# 每N轮迭代打印日志
cfg.log_config.interval=40
# 设置种子,结果可重现
cfg.seed=0
set_random_seed(0,deterministic=False)
cfg.gpus=1

print(f'Configs:\n{cfg.pretty_text}')

启动训练

调用对应的Python API启动训练

import os.path as osp

from mmedit.datasets import build_dataset
from mmedit.models import build_model
from mmedit.apis import train_model
from mmcv.runner import init_dist

import mmcv
import os
# 构建数据集
datasets = [build_dataset(cfg.data.train)]
# 构建模型
model = build_model(cfg.model,train_cfg=cfg.train_cfg,test_cfg=cfg.test_cfg)
# 创建工作路径
mmcv.mkdir_or_exist(osp.abspath(cfg.work_dir))
# 额外信息
meta = dict()
if cfg.get('exp_name',None) is None:
  cfg['exp_name']=osp.splitext(osp.basename(cfg.work_dir))[0]
meta['exp_name']=cfg.exp_name
meta['mmedit Version']=mmedit.__version__
meta['seed']=0
# 启动训练
train_model(model,datasets,cfg,distributed=False,validate=True,meta=meta)

在这里插入图片描述

PSNR和SSIM是像素级别的评估标准,可以看到在训练过程中,Loss下降,两个指标增加,符合预期

使用微调后的模型完成推理

微调模型存储在工作目录下,微调后的模型的恢复效果有所好转

from mmedit.apis import init_model
from mmedit.apis import restoration_inference

model = init_model(config_file, F'{cfg.work_dir}/latest.pth', device='cuda:0')
result = restoration_inference(model,'data/Set5/LR/butterfly.png')

result = torch.clamp(result,0,1)
img_SR_ft = result.squeeze(0).permute(1,2,0).numpy()
# 比较低分辨率超分辨率和高分辨率的结果
fig=plt.figure(figsize=(15,12))
ax1 = fig.add_subplot(1,3,1)
plt.title('Before finetune',fontsize=16)
ax1.axis('off')
ax2 = fig.add_subplot(1,3,2)
plt.title('After finetune',fontsize=16)
ax2.axis('off')
ax3 = fig.add_subplot(1,3,3)
plt.title('HR image',fontsize=16)
ax3.axis('off')
ax1.imshow(img_SR)
ax2.imshow(img_SR_ft)
ax3.imshow(img_HR)
plt.show()

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【超分辨率实验】使用MMEditing进行图像超分辨率 的相关文章

  • 踩坑,发现一个ShardingJdbc读写分离的BUG

    前言 最近公司准备接入ShardingJdbc做读写分离了 老大让我们理一理有没有写完数据立马读的场景 因为主从同步是有延迟的 如果写完读取数据走到从库 而从库正好有延迟 没读取到数据 岂不是造成了生产事故 今天我们来看看 Sharding
  • CUDA和TensorRT入门

    CUDA 官方教程 CUDA C Programming Guide nvidia com 一 基础知识 首先看一下显卡 GPU 和CUDA的关系介绍 显卡 GPU和CUDA简介 吴一奇的博客 CSDN博客 延迟 一条指令返回的时间间隔 吞
  • 【无标题】【Atlas 200DK】YOLOv3和YOLOv5部署

    Atlas 200DK YOLOv3和YOLOv5部署 数据集介绍 开发板环境搭建 YOLOv3的部署 模型训练转换 服务器上的结果 开发板上的结果 python部署 c 部署 YOLOv5的部署 模型训练转换 服务器上的结果 开发板上的结
  • python 开发游戏的库有哪些

    在 Python 中 开发游戏的一些常用库有 Pygame 一个用于制作游戏的开源模块 支持多种图像 声音和输入处理 Pyglet 一个跨平台的游戏引擎 支持 OpenGL 图形渲染 PyOpenGL 一个实现了 OpenGL 功能的库 可
  • G2O

    slam十四讲 g2o代码运次错误 error no matching function for call to g2o BlockSolver
  • python中pd读取csv二进制_python用pd.read_csv()方法来读取csv文件

    importpandas as pdprint 取消第一行作为表头 data2 pd read csv rating csv header None print 为各个字段取名 data3 pd read csv rating csv na
  • vue中不同页面设置title和icon

    路由中增加meta对象 path accounting name accounting component gt import pages accounting Accounting vue 记账 meta title 芒果记账 icon
  • vue.js -- 事件绑定

    目录 绑定事件 定义事件 直接写表达式 获取事件对象event 获取自定义参数 获取参数和事件对象event 事件绑定多个函数 修饰符 事件修饰符 按键修饰符 鼠标修饰符 精确修饰符 绑定事件 定义事件 代码演示
  • Numpy 用 npy/npz 文件保存与载入数据

    Numpy 的数据保存与载入方法比 Python 的 pickle 要方便的多 而且由于目前大多数的复杂数据处理都使用 Numpy 因此相比较而言 npy npz 的 Numpy 数据保存与载入更为常用 函数说明 numpy load fi
  • URDF、Gazebo与Rviz机器人仿真综合应用-autolabor笔记

    URDF Gazebo与Rviz综合应用 6 7 1 1 机器人运动控制 编写机器人my base xacro 编写传动装置以及控制器move xacro文件 搭建环境world文件 将上述整合进一个car xacro文件 加载惯性矩阵xa
  • Pandas基础

    pandas pandas简介 Python Data Analysis Library pandas是基于NumPy 的一种工具 该工具是为了解决数据分析任务而创建的 Pandas 纳入了大量库和一些标准的数据模型 提供了高效地操作大型结
  • Python之保留字

    1 False 表示假 即在if语句中不会执行 注 在Python中可以给False赋值 改变原有是错误的意思 2 True 表示真 3 None None是一个特殊的常量 None和False不同 None不是0 None不是空字符串 N
  • 免密要登录

    ssh keygen t dsa P f ssh id dsa cat ssh id dsa pub gt gt ssh authorized keys t参数就是指定要生成的密钥类型 你这里指定的是dsa P就是你提供的旧密码 表示没有
  • 历届试题 分糖果 【模拟】

    历届试题 分糖果 时间限制 1 0s 内存限制 256 0MB 问题描述 有n个小朋友围坐成一圈 老师给每个小朋友随机发偶数个糖果 然后进行下面的游戏 每个小朋友都把自己的糖果分一半给左手边的孩子 一轮分糖后 拥有奇数颗糖的孩子由老师补给1
  • Linux 环境下Fortran程序连接使用Intel MKLPardiso解对称稀疏矩阵

    Linux 环境下Fortran程序连接使用Intel MKLPardiso解对称稀疏矩阵 pardiso求解线性方程组 A x b 其中 A 是对称稀疏阵 lt 1 gt Pardiso的Fortran接口 call pardiso pt
  • Effective C++学习笔记

    Effective C 1 让自己习惯C 2 构造 析构 赋值运算 命名习惯 lhs left hand side rhs right hand side 指向一个T型对象 的指针命名pt 意思是 pointer to T 尽量以const
  • 一、数据挖掘概述

    数据挖掘介绍 1 数据挖掘的定义 数据挖掘 指从大量的数据中通过算法搜索隐藏于其中信息的过程 数据挖掘在面向用户的互联网产品中发挥着及其重要的作用 2 数据挖掘的对象 常见的数据挖掘对象有以下7大类 关系型数据库 MySQL 非关系系数据库
  • Visual Studio Community 2022(VS2022)安装方法

    直接上步骤 1 首先可以下载安装一个Visual Studio安装器 叫做Visual Studio installer 这个安装文件很小 很快就安装完成了 2 打开Visual Studio installer 小软件 3 按照开发需求选
  • RocketMQ消息幂等(去重)通用解决方案

    消息中间件是分布式系统常用的组件 无论是异步化 解耦 削峰等都有广泛的应用价值 我们通常会认为 消息中间件是一个可靠的组件 这里所谓的可靠是指 只要我把消息成功投递到了消息中间件 消息就不会丢失 即消息肯定会至少保证消息能被消费者成功消费一

随机推荐

  • 实验报告-python文库_python大作业实验报告

    python大作业实验报告 大学计算机基础 理工 大作业 暨南大学南校区生活指南系统 G108 甘颖欣 熊梦娜 翁婉晖 梁绮婷 李嘉顺 2015 1 32 目录 目录 2 暨南大学南校区生活指南系统 选题说明书 3 1 成员分组和任务分工
  • CSS —— 手摸手实现一个文字霓虹灯闪烁特效

    CSS 手摸手实现一个文字霓虹灯闪烁特效 一 了解 text shadow 属性 text shadow 属性应用于阴影文本 属于 CSS3 的属性 默认值为 none text shadow 属性连接一个或更多的阴影文本 属性是阴影 指定
  • 贪婪的非分层灰狼优化算法(G-NHGWO)(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 Matlab代码实现 4 参考文献 1 概述 狼优化 GWO 算法是基于灰狼社会等级及其
  • 织梦网站后台基本设置

    栏目概述 最主要还是说熟悉下网站后台基本设置 然后及我安装文件的常规操作 登陆网站后台 点击系统 基本参数 输入站点根网址 删除文档HTML默认保存路径a 填写下网站版权信息点击确定 小皮面板点击网站管理点开网站根目录删除install文件
  • java 输入_详解Java输入输出数据流模型和Web应用程序开发

    前言 Web应用开发架构技术不断的演化 从基于通用网关接口CGI开发的能够在操作系统上运行的独立组件 到专门的隔离运行的Servlet 一直到到现在我们对复杂应用开发使用Java EE技术或者Spring框架系列 其实其底层的核心逻辑基本上
  • Hystrix使用说明,配置参数说明

    四 配置信息 default或HystrixCommandKey 最常用的几项 超时时间 默认1000ms 单位 ms 1 hystrix command default execution isolation thread timeout
  • 1141:删除单词后缀(C C++)

    题目描述 给定一个单词 如果该单词以er ly或者ing后缀结尾 则删除该后缀 题目保证删除后缀后的单词长度不为0 否则不进行任何操作 输入 输入一行 包含一个单词 单词中间没有空格 每个单词最大长度为32 输出 输出按照题目要求处理后的单
  • BigQuery 如何帮助大规模交付业务型企业提供物联网解决方案

    介绍 Leverege是一家软件公司 它使全球市场领导者能够快速且经济高效地构建企业物联网应用程序 以提供以数据为中心的决策能力 优化运营 改善客户体验 交付客户价值并增加收入 Leverege 的主要 SaaS 产品 Leverege I
  • 不用虚拟机也能在Windows下使用Linux

    不用虚拟机也能在Windows下使用Linux 想学习热门的Linux系统 可是一开始就需要安装虚拟机软件 这样很容易消耗Linux初学者的热情 比如常用的VMWare虚拟机 虽然步骤并不复杂 但是一开始的搭建和配置过程 容易劝退一部分新手
  • 开源CA搭建-基于openssl实现数字证书的生成与分发

    目录 一 前言 二 openssl介绍 三 openssl的常用用法 一 单向加密 二 生成随机数 三 生成公钥 私钥 1 生成私钥 2 提取公钥 四 搭建CA 一 创建根CA私钥 二 生成自签名证书 三 创建数据库以及新颁发证书数字 四
  • Gitee Go代码格式审查、程序编译和冒烟测试

    本文分享自中移OneOS微信公众号 CI CD搭建流程 Gitee篇 作者 Kisann Gitee CI CD能力 Gitee 即码云 是OSCHINA NET推出的代码托管平台 已有超过600 万的开发者选择Gitee Gitee Go
  • ESP8266实现网页交互

    前言 物联网LOT intermet of things 时代 万物互联 wifi芯片是非常重要的 乐鑫的高性价比的ESP8266芯片凭借低功耗低成本高集成度等优势在市场上占有较高的份额 为什么选用这款芯片可以参考之前的调研报告 在之前的资
  • RBF神经网络参数的参数优化(进化算法)+Matlab源码

    RBF神经网络参数的参数优化 进化算法 1 RBF神经网络引入 1985年 Powell提出了多变量插值的径向基函数 RBF 方法 径向基函数是一个取值仅仅依赖于离原点距离的实值函数 也就是 x x 或者还可以是到任意一点c的距离 c点称为
  • aix系统常用的命令

    1 系统性能 1 看 CPU个数 lsdev C grep proc 几条记录就是几个CPU 注意考虑 AIX 5 3的 SMP 2 看每个CPU的大小 lsattr El proc0 3 看 内存条数 lsdev C grep mem 4
  • 借助LVS+Keepalived实现负载均衡

    借助LVS Keepalived实现负载均衡 一 负载均衡 必不可少的基础手段 1 1 找更多的牛来拉车吧 当前大多数的互联网系统都使用了服务器集群技术 集群即将相同服务部署在多台服务器上构成一个集群整体对外提供服务 这些集群可以是Web应
  • ElasticSearch 学习笔记(一):倒排索引(Inverted index)

    分析一个术语 要先从名称入手倒排索引 英文原名Inverted index 大概因为 Invert 有颠倒的意思 就被翻译成了倒排 但是倒排这个名称很容易让人理解为从A Z颠倒成Z A 个人觉得翻译成反向索引更好 倒排索引是区别于正排索引
  • Java中Path环境变量的设置

    第一步 打开文件管理器选择 此电脑 右键 此电脑 选择属性 第二步 再此电脑属性页面找到 高级系统设置 第三步 选择 环境变量 选择最下面的新建 则弹出新建系统变量 变量名为JAVA HOME 一定要大写 变量值为jdk的存储路劲 变量名
  • 小程序首页轮播图设计

    效果图 微信小程序的数据详解 indicator dots 是否显示面板指示点 默认false indicator color 指示点颜色 默认rgba 0 0 0 3 indicator active color 当前选中的指示点颜色 默
  • java如何使用cdn_网站部署使用CDN网络缓存(示例代码)

    CDN原理及为自己的网站部署 CDN是什么 CDN Content Delivery Network or Content Ddistribute Network 内容分发网络 其目的是使用户可就近取得所需内容 解决 Internet网络拥
  • 【超分辨率实验】使用MMEditing进行图像超分辨率

    使用MMEditing进行图像超分辨率 使用MMEditing进行图像超分辨率 安装MMEditing 使用预训练模型完成推理 查找并下载预训练模型 调用API构建模型 调用API进行推理 分析图像恢复效果 使用自定义的数据集微调模型 准备