【Super Resolution】超分辨率——SRCNN

SRCNN

01 闲聊——图像的超分辨率

在一切开始之前,先整体的介绍一下超分辨率(Super Resolution,SR)。超分辨率是一项底层的图像处理任务,将低分辨率映射到高分辨率,图像的超分辨率希望可以达到增强图像细节的作用。图像的模糊(Image blurring)有很多的原因,比如说噪声、压缩损失、采集失误等等。图像的超分辨率是计算机视觉的一个经典应用,通过各种手段,从低分辨率的图像重构为高分辨率的图像,在监控设备、卫星图像、自然场景识别和检测等方面都有很重要的应用价值。
图像的超分辨率从图像角度可以分为单张图像的超分辨率(Single Image Super Resolution,SISR)多帧图像的超分辨率(Multi-frame Super Resolution,VSR)。我们从单张图像的超分辩开始学习。单张图像超分问题实际上是一个逆问题,一张低分辨率的图像有很多张的高分辨率的图像与其对应,所以我们要有一个准确的高分辨率图像作为先验知识进行规范化约束。我们的后续关于超分的博客也会不断的分享,我们也是刚刚涉猎到超分领域,不足之处还希望大家多多指教!


02 SRCNN——超分和DL的结合

我们开始关注将卷积神经网络用于超分辨率的第一个算法——SRCNN。SRCNN是首个使用CNN结构(即基于深度学习)的端到端的超分辨率算法, SRCNN流程如下:

  1. 输入预处理:对输入的低分辨率lr图像使用bicubic算法进行放大,放大为目标尺寸。
  2. 将输入的比较模糊的lr图像,经过卷积网络的处理,得到超分辨率sr的图像,使它尽可能与原图的高分辨率hr图像相似。
02-1 双三次插值

双三次插值(Bicubic interpolation) 是二维空间中最常用的插值方法。在这种方法中,函数f在点 (x,y) 的值可以通过矩形网格中最近的十六个采样点的加权平均得到,在这里需要使用两个多项式插值三次函数,每个方向使用一个。
W ( x ) = { ( a + 2 ) ∣ x ∣ 3 − ( a + 3 ) ∣ x ∣ 2 + 1 for |x|&lt;=1 a ∣ x ∣ 3 − 5 a ∣ x ∣ 2 + 8 a ∣ x ∣ − 4 a for 1&lt;|x|&lt;2 0 otherwise W(x)= \begin{cases} (a+2)|x|^3-(a+3)|x|^2+1 &amp; \text {for |x|&lt;=1} \\ a|x|^3-5a|x|^2+8a|x|-4a &amp; \text{for 1&lt;|x|&lt;2} \\0&amp; \text{otherwise} \end{cases} W(x)=(a+2)x3(a+3)x2+1ax35ax2+8ax4a0for |x|<=1for 1<|x|<2otherwise

其中a=0.5;
∑ i = 0 3 ∑ j = 0 3 a i j x i y j \sum^3_{i=0}\sum^3_{j=0} a_{ij}x^iy^j i=03j=03aijxiyj

其中 x i x_i xi y j y_j yj就是分别指的(i,j)点在水平方向和垂直方向上的两个多项式插值三次函数的值即 W ( i ) W(i) Wi W ( j ) W(j) Wj

02-2 SRCNN的网络结构

下面是SRCNN的结构图:
在这里插入图片描述
SRCNN的结构较简单,整个卷积网络包括三个卷积层,甚至没有池化和全连接层,但都通过Relu函数三个卷积层使用的卷积核的大小分为为9x9,,1x1和5x5,前两个的输出特征个数分别为64和32。:

  1. 对低分辨率的图进行卷积操作,生成 n 1 n_1 n1维的feature maps
    F 1 ( Y ) = m a x ( 0 , W 1 ∗ Y + B 1 ) F_1(Y)=max(0,W_1∗ Y+B_1) F1(Y)=max(0,W1Y+B1)
  2. n 1 n_1 n1维的feature map进行卷积操作生成 n 2 n_2 n2维 feature maps
    F 2 ( Y ) = m a x ( 0 , W 2 ∗ F 1 ( Y ) + B 2 ) F_2(Y)=max(0,W_2∗ F_1(Y)+B_2) F2(Y)=max(0,W2F1(Y)+B2)
  3. n 2 n_2 n2维的feature maps进行卷积生成超分辨的图像(反卷积)
    F ( Y ) = W 3 ∗ F 2 ( Y ) + B 3 F(Y)=W_3∗F_2(Y)+B_3 F(Y)=W3F2(Y)+B3

分别对应三个处理流程:

  1. 提取图像特征: 从低分辨率图像中提取多个patch图像块,每个块被卷积操作表示为多维的向量(维数等于filter的数量),所有的特征向量组成特征矩阵(feature maps)
  2. 非线性映射: n 1 n_1 n1维特征矩阵,通过卷积操作实现非线性映射,变成另一n2维特征矩阵。
  3. 重构图像: 等于是个反卷积的过程,将n2的特征矩阵还原为超分辨图像
    想特别提出的一点:所谓非线性映射指的是地位的LR图像的特征向高维图像HR的特征的映射,而所应用的函数是Relu非线性函数,所以为非线性映射。

个人对这个网络理解为对于一个传统超分方法(双三次插值)的应用CNN的优化方案。而其精髓则在于将SC的超分方法用卷积神经的方法表达出来。并最终实现对LR图像的特征提取,非线性映射和重构过程。

02-3 Training 训练阶段

从GroundTruth里选择图片并对其进行剪裁从而生成子图片。并对这些字图片应用升尺度因子进行子采样,最后再用双三次插值将其放大到相同大小。损失函数为MSE,通过从具有零均值和标准偏差0.001(和偏差为0)的高斯分布中随机绘制来初始化每个层的滤波器权重。前两层的学习率为 1 0 − 4 10^{−4} 104,最后一层的学习率为 1 0 − 5 10^{−5} 105

03 EXPERIMENTS 实验阶段

1.对比卷积核大小(filter size)、卷积核数量(filter numbers)对复原效果的影响的实验
经过实验后的结论:卷积核数量越多,即特征向量维数越高,实验效果越好,但是会影响算法速度,故需要综合考虑;另外三层卷积层的卷积核大小越大,实验效果也会略微更好,同样会影响算法速度。
2.对比网络层数(layer numbers)对复原效果的影响的实验
经过实验后的结论:并非网络越深,效果越好,结果恰恰相反。作者也给出了解释:因为SRCNN没有池化层和全连接层,导致网络对初始参数和学习率非常敏感,结果即网络训练的时候非常难以收敛,即使收敛了也可能停在了坏的局部最小值(bad local minimum)处,并且即使训练了足够的时间,学习到的filter参数的分散度也不够好。
3.与最前沿的其他超分算法对比速度与性能的实验
数据集选择的是ImageNet上的Set14、Set5(指14幅图像和5幅图像),对比对象是Bicubic、SC、NE+LLE、KK、ANR与SRCNN。
4.算法速度
通过实验可以看出提出的SRCNN实现了最先进的超分辨率质量,同时与现有的基于实例的方法相比保持了高的和竞争的速度。
5.在更大训练数据下的表现
结果表明,使用更大、更多样化的图像训练集可以进一步提高SRCNN的性能。

04 对于一些名词的理解

  1. PSNR是"Peak Signal to Noise Ratio"的缩写,即峰值信噪比,是一种评价图像的客观标准,它具有局限性,一般是用于最大值信号和背景噪音之间的一个工程项目。具体的可以参见我们的博客【Super Resolution】超分辨率的总结——评价指标
  2. NE+:一组邻域嵌入方法,利用最近邻搜索(nearest neighbor search)在字典中选择若干LR候选patch,并利用它们的HR版本重构HR输出patch,重构方法可能是最小二乘(NE+LS)、局部线性嵌入(NE+LLE)、非负最小二乘(NE+NNLS)。
  3. SC或SrSC:找到稀疏表示来稀疏近似输入的LR patch,然后利用得到的系数稀疏生成相应的HR输出patch。
  4. KK:采用核匹配跟踪和梯度下降相结合的稀疏方法,基于核脊回归(kernel ridge regression,KRR),直接从输入LR图像学习到目标HR图像的映射。
  5. A+,ANR和GR:锚定邻域回归(Anchored Neighborhood Regression,ANR)是一种改进K-SVD和SC的方法,它引入脊回归(可离线求解,每个字典原子/锚都可存储)。一个不太精确但更有效的变异是采用了全局回归,因此,GR. A+ (advanced ANR)这个名称是后来改进的方法,与ANR不同,它不仅从字典原子中学习,还学习了局部邻域锚(anchor)的所有训练patch。虽然具有类似的时间复杂性,但已经证明A+的性能优于ANR和GR。

感谢其他博客大大们的分享,我们引用了下述博客,再次表示感谢!!!
https://blog.csdn.net/PPLLO_o/article/details/90040801
https://blog.csdn.net/qq_34885184/article/details/79163991
https://blog.csdn.net/clover_my/article/details/90481015

  • 7
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
srcnn超分辨率pytorch代码是用于实现图像超分辨率Super Resolution)的一种深度学习模型。下面我将逐行讲解这个代码。 首先,代码导入了需要的库和模块,包括torch、torchvision等,以及一些辅助函数。 接下来,定义了一个名为SRCNN的类。这个类继承自nn.Module类,用来构建SRCNN模型。在这个类的构造函数中,首先调用父类的构造函数初始化模型;然后定义了三个卷积层,分别是nn.Conv2d,并且设置输入通道数、输出通道数、卷积核大小和步长;接着定义了ReLU激活函数;最后定义了一个反卷积层nn.ConvTranspose2d,用于得到最终的超分辨率图像。 在类的前面还定义了两个辅助函数,即adjust_scale和normalize,分别用于将图像缩放到指定尺寸和对图像进行归一化处理。 接下来,定义了一个名为train的函数,该函数用于训练模型。在函数中,首先根据指定的超参数设置模型的训练参数,如学习率、损失函数、优化器等;然后加载训练数据集和验证数据集,采用DataLoader进行批量加载和预处理;随后,利用模型进行迭代训练,通过计算输出图像与标签图像之间的损失来更新模型参数;最后将训练得到的模型保存到指定路径。 最后,定义了一个名为test的函数,用于测试模型。在函数中,首先加载测试图像,并通过模型进行超分辨率处理;然后将超分辨率图像与原始图像进行比较,计算并打印出PSNR指标,评估超分辨率效果。 总结一下,这个SRCNN的pytorch代码包括了模型的构建、训练和测试三个主要部分,通过迭代训练和测试来实现图像的超分辨率。通过调整超参数、数据集和函数的调用,可以适应不同的超分辨率任务。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值