文章目录
读论文系列:Image Super-Resolution Using Deep Convolutional Networks(SRCNN)
1️⃣ 资料
- 说明:2015 年TPAMI,何凯明的论文,把深度学习引入了超分辨率重建!到 24 年累计八万余次引用。
- github(一堆SR 的模型都有):https://github.com/qobilidop/srcnn/blob/master/toolbox/models.py
- 大佬复现(推荐!代码很规范!):https://github.com/Lornatang/SRCNN-PyTorch
- 大佬复现:https://github.com/Mirwaisse/SRCNN
- 官方主页:https://mmlab.ie.cuhk.edu.hk/projects/SRCNN.html
- 推荐参考另一篇论文(也是 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️⃣ 我的笔记
- 预处理:bicubic interpolation,为了把低分辨率图像 X X X 放大到合适大小,得到 Y Y Y,这是唯一的预处理。
- 目标:从 Y Y Y 通过学习得到的网络,得到 F ( Y ) F(Y) F(Y),需要让 F ( Y ) F(Y) F(Y) 尽量接近高清版本的 X X X
- 主图(其实就是卷积,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)
- PS:为什么才去这样的网络结构(kernel size 分别为 9-3-5)呢,后边作者也做了消融实验。
- 分别对比了 9-1-5与9-1-1-5, 9-3-5 与9-3-1-5发现区别不大,加了 kernel size 为 1 的反而还会让训练变慢。
- 然后对比了 9-3-5 和 9-1-5,发现 9-3-5 最好
- 作者证明了传统的稀疏表示本身可以被理解成神经网络:(我也不知道对不对,下面⬇️是我自己的理解)
- 我的理解是,字典学习的第一步,学习字典,可以理解成神经网络的第一个卷积+池化。因为他们都是抽取到了部分的特征。
- 神经网络的第二个卷积+池化可以理解成对字典的整理,这个是多出来的。文中说这部分是低分辨率字典变成高分辨率字典。
- 字典学习的第三步,用字典的原子线性组合成输出结果,对应神经网络的第三步。神经网络窗口大小为 3,可以理解成加了一个线性滤波器之后再线性组合。
- 损失函数,用的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=1∑n∣∣F(Yi;Θ)−Xi∣∣2
- 训练:用的 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−η⋅∂Wil∂LWi+1l=Wil+Δi+1l∈{1,2,3}前两层的学习率为 1 0 − 4 10^{-4} 10−4,最后一层为 1 0 − 5 10^{-5} 10−5。我们经验发现,最后一层较小的学习率对于网络收敛很重要 - 指标和结果(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]