本文代码主体来自CVPR2020论文《Closed-loop matters: Dual regression networks for single image super-resolution》,但原作者并未提供论文亮点--如何使用unpair数据进行训练的代码,所以我在其基础上补齐了该过程的代码。
代码仓库:
https://github.com/VitaminyW/Super_Solution
PS:对代码存在问题可以通过私信或评论区提问。
一、数据预处理
为了训练模型实现
8
倍超分,本工作中使用
BICUBIC
算法对高清图像进行下采样
8
倍,从而获得作为网络输入的低分辨率图像。
BICUBIC
算法:双三次插值又称立方卷积插值。三次卷积插值是一种更加复杂的插值方式。该算法利用待采样点周围
16
个点的灰度值作三次插值,不仅考虑到
4
个直接相邻点的灰度影响,而且考虑到各邻点间灰度值变化率的影响。其权重函数如下所示,
其中a=-0.5,x为待插值点与插值点的距离。插值过程可由下式所示,
其中
代表距离待插值点
的像素值。
图1. 0200.png下采图像展示
二、算法原理
图2.DRN网络结构图
2.1 算法目标
在超分辨率问题中,存在着两个问题:
a.
从超分辨率图像到低分辨率图像存在着非常多种下采样方式,即真实世界的低分辨率图像形成的原因多种多样。
b.
深度学习是一种基于数据的学习方式,若数据集的输入是由某种特定下采方式得到的,则模型可能会学习到该特定下采方式的伪逆。
2.2 解决方法以及算法原理
a.
正向过程
网络通过借鉴UNet网络的结构方式,通过多级下采样提取图像特征,并通过concat方式结合原有图像特征与上采特征图进行上采样,从而产生多个高分辨率图像。若网络存在3个层级,则每个层级分别对应1倍、2倍以及4倍分辨率重建网络。最后通过MSE或MAE损失函数可以促使网络学习如何进行正向重建。
b.
对偶过程
正向过程是求解由低分辨率到高分辨率的解,即该问题解空间较大,所以需要较为复杂的网络结构。对偶过程指在学习数据中由高分辨率到低分辨率的下采过程,该过程解空间较小,可以使用较为简单的网络结构进行学习。
c.
半监督学习
由于对偶过程输入的为网络重建出来的高分辨率图像,其学习标签为低分辨率图像,所以该过程不依赖于是否拥有真实超分标签,从而网络可以进行半监督学习。
d.
损失函数
其中
表示第i张低分辨率图像,
表示第
张高分辨率图像,
代表网络重建,
分别代表正向过程和反向过程的评估函数,
代表指示
是否有对应的
的函数,若有为1,否则为0. 由
函数,在编程中易得pair数据与unpair数据分别计算损失函数进行反向传播。
三、代码流程
3.1 详细步骤:
3.1.1 构建数据集,数据集结构如下图所示:
下采样代码位于代码目录的dataProcessing.ipynb
图3. 数据集结构
3.1.2 设置option.py文件
将--data_dir,--data_train,--data_val参数修改为对应数据集路径与名称。也可选择通过命令行输入。
3.1.3 运行训练代码
使用终端打开main.py所在文件目录,输入以下指令进行训练。
python main.py –batch_size 32 –n_GPUs 4 –save ./experiment/training_result --model DRN-S
3.1.4 由于原文作者未提供使用unpaired数据进行网络fine-tune代码,本工作根据论文逻辑,编写了 main_fine_tune.py代码,输入以下指令进行训练
python main.py –batch_size 32 –n_GPUs 4 –save ./experiment/fine_tune_result --pre_train {预训练正向模型的参数保存地址} --pre_train_dual {预训练对偶模型的参数保存地址} --model DRN-S
3.1.5 由于原文作者未提供重建unpaired数据的代码,本工作根据代码逻辑编写了对应main_reconstruction.py代码,输入指令进行预测。
python main_reconstruction.py --no_augment --model DRN-S --test_only --save ./reconstruction --save_results --batch_size 1 --save ./reconstruction --pre_train {fine-turn后正向模型的参数保存地址} --pre_train_dual {fine-turn后对偶模型的参数保存地址}
3.2 过程截图
a. ./experiment/training_result文件夹下:
图4.train输出内容展示
b. ./experiment/fine_tune_result
图5.fine-tune输出内容展示
c. ./reconstruction
图6.reconstrution输出内容展示
四、部分结果展示
超分辨率
图像重建
(Super-resolution Image Reconstruction)
要讨论
超分辨率
图像重建
,首先要弄清楚什么叫
超分辨率重建
,为什么要
超分辨率重建
。我希望能把事情说得比较简单一些。
为了搞明白什么叫
超分辨率
,先来弄清楚什么叫分辨率。分辨率其实有很多种啦,什么光谱分辨率啊,辐射分辨率啊,时间分辨率啊,空间分辨率等等。其实说白了,分辨率就是对细节分
图像超分辨率重建
实现方法
图像超分辨率重建
摘自网络概念:
图像超分辨率重建
是指利用同一场景的不同观测角度,不同观测时间或者不同传感器获取的低分辨率图像序列重建出一副或者多副高空间分辨率图像的技术。
自己理解概念:
图像超分辨率重建
就是指由一副低分辨率图像(LR)或者图像序列恢复出高分辨率图像(HR)的技术。
超分辨率
技术的核心思想就是用时间分辨率(同一场景多帧图像序列)
本帖最后由 derrickrose 于 2012-11-20 09:54 编辑
最近研究
图像超分辨率重建
技术,主要是基于图像序列的
超分辨率重建
算法,分享两篇经典的sci文章,一篇是technique overview一篇是经典的基于MAP的super resolution算法,入门的话看这两篇就够了。
《Super-Resolution Image Reconstruction: A Technical Overview》
《Joint MAP Registration and High-Resolution Image Estimation Using a Sequence of Undersampled Images》
如果有这方面编程需要的,可以联系qq160 8462 879,接这方面编程的任务。
Traceback (most recent call last):
File "main.py", line 13, in <module>
loader = data.Data(args)
File "/home/sponge/data/yjy/Super_Solution-main/data/__init__.py", line 10, in __init__
trainset = getattr(module_train, args.data_train)(args)
File "/home/sponge/data/yjy/Super_Solution-main/data/my_train.py", line 7, in __init__
super(my_train, self).__init__(
File "/home/sponge/data/yjy/Super_Solution-main/data/srdata.py", line 22, in __init__
self._set_dataset_length()
File "/home/sponge/data/yjy/Super_Solution-main/data/srdata.py", line 47, in _set_dataset_length
repeat = self.dataset_length // len(self.images_hr)
ZeroDivisionError: integer division or modulo by zero
图像超分辨率重建(pytorch)
精锐分子:
基于迁移学习的openship长尾数据分类
czh2000frank:
图像超分辨率重建(pytorch)
YmgmY: