论文链接: https://arxiv.org/pdf/1501.00092v3.pdf 代码链接: https://github.com/CVHuber/Super-Resolution/blob/main/SRCNN.py
图像超分辨率(Super-Resolution,SR)是计算机视觉领域一个经典的问题,研究的是如何将低分辨率图像(Low Resolution,LR)转化为高分辨率图像(High Resolution,HR)。对比传统SR算法,本文介绍的基于CNN的超分辨率算法—SRCNN模型结构简单、推理速度快以及重建质量高。
与传统方法对比
上图展示了SRCNN与传统方法的性能对比。可以发现SRCNN在峰值信噪比(Peak Signal to Noise Ratio,PSNR)指标以及重建图像质量均优于双三次插值(Bicubic)与稀疏编码(Sparse Coding,SC)。
SRCNN结构图
如上图所示,SRCNN计算过程主要分为三步:区域特征的提取与表示、非线性映射以及重建。此外,本文将SRCNN的损失函数作为方法的第四步进行简单介绍。值得注意的是,LR先通过双三次插值扩展至HR的尺寸,再作为网络的输入。
通过一个常规卷积与ReLU激活函数对输入图像的区域特征的进行编码,其中f1(卷积核大小)为9,n1(卷积核数量)为64。
利用常规卷积+ReLU激活函数对第一层卷积的输出进行非线性映射,其中卷积核大小为1×1,n2为32。在这里1×1卷积的作用是压缩特征通道并减少神经元连接数量,有效低降低网络的复杂度,相应地也提升了网络的运行速度。
最后对特征图进行常规卷积操作,完成LR到HR的重建。其中f3为5。
SRCNN使用均方误差(Mean Square Error,MSE)作为损失函数来评估网络输出与真实标签之间的差异。
SRCNN提出了利用常规卷积搭配激活函数来模拟传统SR方法的特征编码过程,从特征的提取到最后的重建使用的都利用卷积操作进行的,非常的简洁且高效。
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
作者通过大量的对比实验来验证SRCNN的有效性,主要包括:模型在不同数据集的表现、卷积核尺度对模型性能的影响、不同层特征的可视化分析以及与传统SR方法的比较。
作者分别在91images和ImageNet两个数据集上进行了对比实验,随着迭代次数的增加,SRCNN在ImageNet上获得了更高的PSNR,这表明数据量的增加能提高网络的性能。
上图展示了多种不同尺度的卷积核组合对网络性能的影响,可以发现通过搭配更大尺度的卷积核,网络能获得更高的PSNR,这表明了更大尺度的卷积核能增强模型的拟合能力。
上图展示了不同层特征的可视化结果,第一层特征表现出结构的不同,第二层则是强度的不同。
SRCNN与传统SR方法在Set5数据集的对比实验。随着迭代次数的增加,SRCNN的性能超越了所有的传统SR方法。
上图展示的是所有方法在Set5数据集中的蝴蝶图像样本对比结果,SRCNN获得最高的PSNR值并且重建的高分辨率蝴蝶图像也更接近真实标签。
SRCNN首次提出利用一系列的常规卷积搭配激活函数来模拟传统SR方法的特征编码过程。对比传统SR方法,SRCNN是一种结构简洁的端对端学习方法,无论是网络性能还是推理速度均表现更优。随着SRCNN的出现,超分辨率领域正式进入大深度学习时代。
如果觉得有用,就请分享到朋友圈吧!
△点击卡片关注AIWalker,获取最新CV爽文