SRCNN:深度学习单图超分开山之作【附代码】

paper:https://arxiv.org/abs/1501.00092

code: Learning a Deep Convolutional Network for Image Super-Resolution

目录

1. 背景及动机

2. 方法

3. 代码

4. 实验结果


1. 背景及动机

        什么是图像超分辨率?

        其目的就是将图像从低分辨率恢复到高分辨率。然而,简单想一下就发现,这个任务本质上是不适定(ill-posed)的,也就是说其是欠定的逆问题,其解不唯一(PS:这就相当于无中生有,凭空想象出高分辨率的细节特征)。所以通常需要较强的先验知识来做一些约束。

        有哪些传统方法?

        要么利用同一图像的内部相似性[5],[13],[16],[19],[47],要么从外部低分辨率和高分辨率样本对中学习映射函数[2],[4],[6],[15],[23],[25],[37],[41],[42],[47],[48],[50],[51]。后者根据提供的训练样本,可以为通用图像超分辨率制定基于外部示例的方法,或者可以根据提供的训练样本设计以适应特定领域的任务,即面部幻觉 [30]、[50]。

        作者提出SRCNN的动机是什么?

        对于上述两种传统方法的后者,也即基于外部样本的方法,基于稀疏编码的方法 [49]、[50] 是具有代表性的方法之一。这种方法在其解决方案管道中涉及几个步骤。首先,从输入图像和预处理(例如,减去均值和归一化)中密集裁剪重叠的补丁。然后,这些补丁由低分辨率字典编码。最后,稀疏系数被传递到高分辨率字典中,用于重建高分辨率补丁。

        那作者就发现了上述三个步骤,可以利用深度学习统一起来,形成一个端到端的框架,可以直接学习低分辨率图像和高分辨率图像之间的端到端映射,而把中间的patch提取、字典映射、patch合并步骤都通过隐藏层来实现。由此,就形成了SRCNN。

2. 方法

        对于一幅低分辨了的原图,先使用bicubic插值得到Y,这个Y同样称为低分辨图,尽管其大小与高分辨率图相等;然后,目的就是使用一个映射函数F得到高分辨结果:F(Y),使其尽可能与真正的高分辨图X相似。所以可以看出,这是个有监督框架,而唯一目标就是通过最小化F(Y)与X的误差来学习一个映射函数F。具体实现见下面描述。

        作者沿用稀疏编码的形式,将图像超分表示为三个步骤:

  • 1)patch提取和表示:将低分辨图像Y分为若干有重叠的patch,并表示为高维向量;
  • 2)非线性映射:将每个patch表示映射到另一个高纬空间,这对应于稀疏编码中低分辨字典到高分辨率字典的映射;
  • 3)重构:将高分辨率patch的表示聚合形成最终的高分辨率图像;这对应于利用高分辨率字典重建高分辨率图像的过程;

        上述三个步骤,可以用三个卷积层来表示:

         网络结构如下:

3. 代码

代码实现【引自:SRCNN-pytorch/models.py at master · yjn870/SRCNN-pytorch · GitHub】也十分之简单,就是三个卷积层+两个激活层:

from torch import nn


class SRCNN(nn.Module):
    def __init__(self, num_channels=1):
        super(SRCNN, self).__init__()
        self.conv1 = nn.Conv2d(num_channels, 64, kernel_size=9, padding=9 // 2)
        self.conv2 = nn.Conv2d(64, 32, kernel_size=5, padding=5 // 2)
        self.conv3 = nn.Conv2d(32, num_channels, kernel_size=5, padding=5 // 2)
        self.relu = nn.ReLU(inplace=True)

    def forward(self, x):
        x = self.relu(self.conv1(x))
        x = self.relu(self.conv2(x))
        x = self.conv3(x)
        return x

4. 实验结果

### SRCNN图像超分辨率中的实现方法 SRCNN(Super-Resolution Convolutional Neural Network)是一种基于卷积神经网络的图像超分辨率技术,其核心目标是通过学习低辨率(LR)到高辨率(HR)映射来恢复高质量的图像细节[^1]。 #### 方法概述 SRCNN的主要流程可以为三个阶段: 1. **图像补采样**:通过对输入的低辨率图像进行双三次插值或其他上采样操,将其尺寸调整为目标高辨率图像大小。此过程是为了使后续模型能够直接处理像素级别的特征匹配[^2]。 2. **特征提取**:利用浅层卷积核提取初始特征。这一部通常采用较小的感受野以捕获局部纹理信息[^3]。 3. **非线性映射与重建**:经过多层卷积运算完成从低维空间向更高维度表示的学习,并最终生成预测结果为输出高片[^4]。 以下是该算法的一个简化版本Python代码示例: ```python import tensorflow as tf from tensorflow.keras.layers import Input, Conv2D from tensorflow.keras.models import Model def srcnn_model(input_shape=(None, None, 1)): inputs = Input(shape=input_shape) # Feature extraction layer (9x9 convolution with 64 filters) conv1 = Conv2D(64, kernel_size=9, activation='relu', padding='same')(inputs) # Non-linear mapping layer (1x1 convolution with 32 filters) conv2 = Conv2D(32, kernel_size=1, activation='relu', padding='same')(conv1) # Reconstruction layer (5x5 convolution to match output channels) outputs = Conv2D(1, kernel_size=5, activation=None, padding='same')(conv2) model = Model(inputs=inputs, outputs=outputs) return model ``` 上述代码定义了一个简SRCNN架构,其中包含了三层主要组件——特征抽取、非线性转换以及最后一步重构。 #### 关于论文和代码资源 原始提出的SRCNN概念最早见诸 Dong Chao等人发表的文章《Image Super-Resolution Using Deep Convolutional Networks》中[^5]。对于希望深入研究的朋友来说,可以从官方GitHub仓库获取开源项目链接或者查阅其他社区贡献者享的相关资料来进行实践探索[^6]。 ---
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AICVHub

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值