经典论文复现 | 基于深度学习的图像超分辨率重建

本文是关于经典论文《基于深度学习的图像超分辨率重建》的复现过程,作者通过实验展示了如何利用深度学习模型进行图像超分辨率重建。论文提出了一种基于卷积神经网络(CNN)的框架,该框架与稀疏编码方法等价,但具有端到端训练和更快的运算速度。作者在训练和验证过程中,使用了timofte数据集,并取得了与原论文相似的PSNR值。此外,作者探讨了不同模型结构和训练策略对结果的影响,并强调了数据集大小和模型复杂度对超分辨率重建效果的重要性。
摘要由CSDN通过智能技术生成

640


过去几年发表于各大 AI 顶会论文提出的 400 多种算法中,公开算法代码的仅占 6%,其中三分之一的论文作者分享了测试数据,约 54% 的分享包含“伪代码”。这是今年 AAAI 会议上一个严峻的报告。 人工智能这个蓬勃发展的领域正面临着实验重现的危机,就像实验重现问题过去十年来一直困扰着心理学、医学以及其他领域一样。最根本的问题是研究人员通常不共享他们的源代码。 


可验证的知识是科学的基础,它事关理解。随着人工智能领域的发展,打破不可复现性将是必要的。为此,PaperWeekly 联手百度 PaddlePaddle 共同发起了本次论文有奖复现,我们希望和来自学界、工业界的研究者一起接力,为 AI 行业带来良性循环。


作者丨Molly

学校丨北京航天航空大学

研究方向丨计算机视觉


笔者本次选择复现的是汤晓鸥组 Chao Dong 的作品,这篇论文也是深度学习应用在超分辨率重构上的开山之作


640


论文复现代码: 


http://aistudio.baidu.com/#/projectdetail/23978


超分辨率重构


单图像超分辨率重构(SR)可以从一张较小的图像生成一张高分辨率的图像。显然,这种恢复的结果是不唯一的。可以这样直观地理解:远远看到一个模糊的身影,看不清脸,既可以认为对面走来的是个男生,也可以认为这是个女生。那么,当我想象对面人的长相时,会如何脑补呢?


这就依赖于我们的先验知识。假如我认为,一个穿着裙子的人肯定是个女生,而对面那个人穿着裙子,所以我认为那是个女生,脑补了一张女神脸。然而,如果我知道穿裙子的人不一定是女生,还可能是女装大佬。迎面走来那个人瘦瘦高高,所以我认为十有八九是个男孩子,就会脑补一个……


也就是说,不同的先验知识,会指向不同的结果。我们的任务,就是学习这些先验知识。目前效果最好的办法都是基于样本的(example-based)。


640

 超分辨率重构的结果。SRCNN所示为论文提出的模型的结果,可以看出,边缘更加清晰。


论文提出一种有趣的视角:CNN 所构造的模型和稀疏编码方法(sparse coding based)是等价的。稀疏编码方法的流程如下: 


1. 从原始图片中切割出一个个小块,并进行预处理(归一化)。这种切割是密集的,也就是块与块之间有重叠;


2. 使用低维词典(low-resolution dictionary)编码,得到一个稀疏参数;


3. 使用高维词典(high-resolution dictionary)结合稀疏参数进行重建(换了个密码本);


4. 将多个小块拼接起来,重合部分使用加权和拼接。


640


上图是卷积神经网络对应于稀疏编码的结构。对于一个低分辨率图像 Y,第一个卷积层提取 feature maps。第二个卷积层将 feature maps 进行非线性变换,变换为高分辨率图像的表示。最后一层恢复出高分辨率图像。 


相比于稀疏编码,论文提出的模型是 end-to-end 的,便于优化。并且,不需要求最小二乘的解,运算速度更快。


模型构造和训练


模型的结构 


这是一个 base-line 模型。如下图,f1=9,f2=1,f3=5,n1=64,n2=32,前两层使用 relu 作为激活函数。输入为图像的 Y 通道。


640

超分辨率重建是一种将低分辨率图像转换为高分辨率图像的技术。在深度学习领域,超分辨率重建主要基于卷积神经网络(CNN)实现。 以下是一份基于Python的超分辨率重建代码示例: ```python import tensorflow as tf from tensorflow.keras.layers import Conv2D, Input, Lambda from tensorflow.keras.models import Model import numpy as np import cv2 def build_model(): # 定义输入层 input_layer = Input(shape=(None, None, 3)) # 定义卷积层 conv_layer1 = Conv2D(filters=64, kernel_size=3, strides=1, padding='same', activation='relu')(input_layer) conv_layer2 = Conv2D(filters=64, kernel_size=3, strides=1, padding='same', activation='relu')(conv_layer1) # 定义残差块 residual_layer = conv_layer2 for i in range(16): residual_layer = Conv2D(filters=64, kernel_size=3, strides=1, padding='same', activation='relu')(residual_layer) residual_layer = Conv2D(filters=64, kernel_size=3, strides=1, padding='same')(residual_layer) output_layer = Lambda(lambda x:x*0.1)(residual_layer) # 定义模型 model = Model(inputs=[input_layer], outputs=[output_layer]) return model def load_image(filepath): img = cv2.imread(filepath) img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) img = img / 255.0 return img def save_image(img, filename): img = np.clip(img, 0, 1) img = img * 255.0 img = img.astype(np.uint8) img = cv2.cvtColor(img, cv2.COLOR_RGB2BGR) cv2.imwrite(filename, img) model = build_model() model.load_weights('model_weights.h5') input_image = load_image('input_image.jpg') input_image = np.expand_dims(input_image, axis=0) output_image = model.predict(input_image) output_image = np.squeeze(output_image, axis=0) save_image(output_image, 'output_image.jpg') ``` 这份代码使用了TensorFlow和OpenCV库。首先,我们定义了一个基于CNN的超分辨率重建模型。然后,我们加载预训练好的模型权重,并使用OpenCV库读取输入图像。接着,我们将输入图像传入模型中进行超分辨率重建,并将输出图像保存到本地。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值