读论文系列:Image Super-Resolution Using Deep Convolutional Networks

读论文系列:Image Super-Resolution Using Deep Convolutional Networks(SRCNN)

1️⃣ 资料

  1. 说明:2015 年TPAMI,何凯明的论文,把深度学习引入了超分辨率重建!到 24 年累计八万余次引用。
  2. github(一堆SR 的模型都有):https://github.com/qobilidop/srcnn/blob/master/toolbox/models.py
  3. 大佬复现(推荐!代码很规范!):https://github.com/Lornatang/SRCNN-PyTorch
  4. 大佬复现:https://github.com/Mirwaisse/SRCNN
  5. 官方主页:https://mmlab.ie.cuhk.edu.hk/projects/SRCNN.html
  6. 推荐参考另一篇论文(也是 He 的):Learning a Deep Convolutional Network for Image Super-Resolution, in Proceedings of European Conference on Computer Vision (ECCV), 2014

2️⃣ AI 一起读论文

1. 🤖帮我梳理一下这个论文

研究问题: 单张图像超分辨率(SR),即从单张低分辨率图像恢复出高分辨率图像。

方法: 提出了一个名为 SRCNN 的深度卷积神经网络,直接学习低分辨率和高分辨率图像之间的端到端映射。

优势

  • 结构轻量级: 简洁的网络结构,但提供了优于现有基于示例的方法的准确性。
  • 速度快: 完全前馈网络,无需在使用时解决任何优化问题,因此速度更快。
  • 性能提升: 使用更大的数据集和更深的模型可以进一步提高网络的重构质量。

核心思想

  • 将传统的基于稀疏编码的 SR 方法视为一种深度卷积网络,并在此基础上进行改进。
  • 将 SR 过程分解为三个操作:补丁提取和表示、非线性映射和重建。
  • 使用卷积层来实现这三个操作,并联合优化所有层。
  • 使用均方误差 (MSE) 作为损失函数,并通过随机梯度下降和反向传播进行训练。

实验结果

  • 与现有基于示例的方法相比,SRCNN 在多个数据集和评估指标上取得了最佳性能。
  • 通过调整网络结构(如过滤器数量、大小和层数),可以找到性能和速度之间的最佳平衡。
  • SRCNN 可以同时处理彩色图像的三个通道,从而进一步提高超分辨率性能。

结论

  • 深度学习在经典计算机视觉问题超分辨率中非常有用,可以取得良好的质量和速度。
  • SRCNN 为其他低级视觉问题(如图像去模糊或同时 SR+去噪)提供了新的思路。

未来方向

  • 探索更多过滤器和使用不同的训练策略以进一步提高性能。
  • 将 SRCNN 应用于其他低级视觉问题。
  • 研究能够处理不同缩放因子的网络。

2. 🤖 这篇论文是怎么把深度学习和稀疏表示联系起来的

这篇论文提出了 SRCNN,一种基于深度学习的单图像超分辨率方法。它将传统的基于稀疏编码的 SR 方法与深度卷积神经网络联系起来,并展示了深度学习在超分辨率任务中的优势。

1. 传统基于稀疏编码的 SR 方法

  • 该方法通常包括以下几个步骤:
    • 从低分辨率图像中提取重叠的补丁。
    • 使用低分辨率字典对补丁进行稀疏编码,得到稀疏系数。
    • 将稀疏系数输入高分辨率字典,重建高分辨率补丁。
    • 对重叠的高分辨率补丁进行聚合,得到最终的高分辨率图像。
  • 该方法将重点放在学习和优化字典上,而补丁提取和聚合步骤通常被视为预处理和后处理。

2. SRCNN 与稀疏编码的联系

  • 论文将上述步骤视为一个深度卷积网络,并指出它们与 SRCNN 的三个操作相对应:
    • 补丁提取和表示: 对应于 SRCNN 的第一个卷积层,使用卷积核提取特征并进行线性变换。
    • 非线性映射: 对应于 SRCNN 的第二个卷积层,使用卷积核将特征进行非线性映射。
    • 重建: 对应于 SRCNN 的第三个卷积层,使用卷积核将特征进行线性变换并重建高分辨率图像。
  • 论文进一步指出,稀疏编码器可以被视为一个特殊的非线性映射算子,其空间支持为 1x1。
  • 与稀疏编码方法相比,SRCNN 优化了整个 SR 过程,包括字典学习、非线性映射和补丁聚合,从而取得了更好的性能。

3. 深度学习的优势

  • SRCNN 可以直接学习低分辨率和高分辨率图像之间的端到端映射,无需手动设计字典或映射函数。
  • SRCNN 可以通过增加网络深度和宽度来提高性能,并适应不同的超分辨率任务。
  • SRCNN 训练完成后,可以快速地进行超分辨率重建,适用于实时应用。

总结:这篇论文将深度学习与稀疏编码联系起来,为超分辨率任务提供了一种新的思路。SRCNN 通过端到端学习的方式,取得了优于传统基于稀疏编码的方法的性能,并展示了深度学习在超分辨率任务中的潜力。

3️⃣ 我的笔记

  1. 预处理:bicubic interpolation,为了把低分辨率图像 X X X 放大到合适大小,得到 Y Y Y,这是唯一的预处理。
  2. 目标:从 Y Y Y 通过学习得到的网络,得到 F ( Y ) F(Y) F(Y),需要让 F ( Y ) F(Y) F(Y) 尽量接近高清版本的 X X X
  3. 主图(其实就是卷积,ReLU,卷积,ReLU,卷积)
    在这里插入图片描述
    网络复现为https://github.com/Lornatang/SRCNN-PyTorch提供(其实复现的不到位,论文中说了,为了避免训练过程中的边界效应,所有卷积层都没有填充!
    # model.py, https://github.com/Lornatang/SRCNN-PyTorch
    import math
    
    import torch
    from torch import nn
    
    
    class SRCNN(nn.Module):
        def __init__(self) -> None:
            super(SRCNN, self).__init__()
            # Feature extraction layer.
            self.features = nn.Sequential(
                nn.Conv2d(1, 64, (9, 9), (1, 1), (4, 4)),
                nn.ReLU(True)
            )
    
            # Non-linear mapping layer.
            self.map = nn.Sequential(
                nn.Conv2d(64, 32, (5, 5), (1, 1), (2, 2)),
                nn.ReLU(True)
            )
    
            # Rebuild the layer.
            self.reconstruction = nn.Conv2d(32, 1, (5, 5), (1, 1), (2, 2))
    
            # Initialize model weights.
            self._initialize_weights()
    
        def forward(self, x: torch.Tensor) -> torch.Tensor:
            return self._forward_impl(x)
    
        # Support torch.script function.
        def _forward_impl(self, x: torch.Tensor) -> torch.Tensor:
            out = self.features(x)
            out = self.map(out)
            out = self.reconstruction(out)
    
            return out
    
        # The filter weight of each layer is a Gaussian distribution with zero mean and
        # standard deviation initialized by random extraction 0.001 (deviation is 0)
        def _initialize_weights(self) -> None:
            for module in self.modules():
                if isinstance(module, nn.Conv2d):
                    nn.init.normal_(module.weight.data, 0.0, math.sqrt(2 / (module.out_channels * module.weight.data[0][0].numel())))
                    nn.init.zeros_(module.bias.data)
    
            nn.init.normal_(self.reconstruction.weight.data, 0.0, 0.001)
            nn.init.zeros_(self.reconstruction.bias.data)
    
  4. PS:为什么才去这样的网络结构(kernel size 分别为 9-3-5)呢,后边作者也做了消融实验。
    1. 分别对比了 9-1-5与9-1-1-5, 9-3-5 与9-3-1-5发现区别不大,加了 kernel size 为 1 的反而还会让训练变慢。
    2. 然后对比了 9-3-5 和 9-1-5,发现 9-3-5 最好
      在这里插入图片描述
  5. 作者证明了传统的稀疏表示本身可以被理解成神经网络:(我也不知道对不对,下面⬇️是我自己的理解)
    1. 我的理解是,字典学习的第一步,学习字典,可以理解成神经网络的第一个卷积+池化。因为他们都是抽取到了部分的特征。
    2. 神经网络的第二个卷积+池化可以理解成对字典的整理,这个是多出来的。文中说这部分是低分辨率字典变成高分辨率字典。
    3. 字典学习的第三步,用字典的原子线性组合成输出结果,对应神经网络的第三步。神经网络窗口大小为 3,可以理解成加了一个线性滤波器之后再线性组合。
      在这里插入图片描述
  6. 损失函数,用的MSE L ( Θ ) = 1 n ∑ i = 1 n ∣ ∣ F ( Y i ; Θ ) − X i ∣ ∣ 2 L(\Theta)=\frac{1}{n}\sum_{i=1}^n||F(\bold Y_i;\Theta)-\bold X_i||^2 L(Θ)=n1i=1n∣∣F(Yi;Θ)Xi2
  7. 训练:用的 SGD,另外权重更新不同层更新的幅度不一样
    Δ i + 1 = − 0.9 ⋅ Δ i − η ⋅ ∂ L ∂ W i l W i + 1 l = W i l + Δ i + 1 l ∈ { 1 , 2 , 3 } \Delta_{i+1}=-0.9\cdot\Delta_i - \eta\cdot\frac{\partial L}{\partial W_i^l}\\ W_{i+1}^l = W_i^l+\Delta_{i+1}\\ l\in \{1,2,3\} Δi+1=0.9ΔiηWilLWi+1l=Wil+Δi+1l{1,2,3}前两层的学习率为 1 0 − 4 10^{-4} 104,最后一层为 1 0 − 5 10^{-5} 105。我们经验发现,最后一层较小的学习率对于网络收敛很重要
  8. 指标和结果(SOTA):Apart from the widely used PSNR and SSIM [43] indices, we also adopt another four evaluation matrices, namely information fidelity criterion (IFC) [38], noise quality measure (NQM) [8], weighted peak signal-to-noise ratio (WPSNR) and multiscale structure similarity index (MSSSIM) [44], which obtain high correlation with the human perceptual scores as reported in [46]
    在这里插入图片描述
    在这里插入图片描述
  • 26
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值