深度学习超分辨率综述阅读笔记【Deep Learning for Image Super-resolution: A survey】
这篇综述主要介绍目前深度学习领域超分辨率问题的一些方法。首先介绍了图像超分辨率问题以及问题的评价标准,之后重点介绍了监督学习领域的几大关键,包括上采样方法、网络结构、学习策略、其他优化策略等。并且分析了各种不同方法的优缺点。之后介绍了无监督学习的一些方法,最后给出了一些未来可能的研究方向。
图像超分辨率问题(Image super-resolution, SR)
从低分辨率(LR)的图像中恢复出高分辨率(HR)的图像。
可以应用在医学、监控等领域。
其难点在于,一个LR图像总时对应了多个HR图像,因此他是一个不适定性问题。(解存在、唯一并且稳定的则称该问题是适定的)
通常采用的方法有:基于预测的、基于统计学的、基于边界的、基于块的、基于稀疏表示和深度学习。这篇综述主要介绍深度学习领域的超分辨率方法。
通常认为LR($I_x$)是HR($I_y)$图像的退化,即$I_x=D(I_y;\sigma)$。其中只有$I_x$是已知的,$D$为退化函数。SR问题就是需要根据$I_x$得到HR图像的一个近似$\widehat{I_y}=F(I_x;\theta)$,因此需要估计对退化函数进行估计。
一种估计方式是将其认为是单一的下采样操作,即$D(I_y;\sigma)==(I_y)\downarrow_s,{s}\subset\sigma$, s为缩放因子
另一种估计$D(I_y;\sigma)=(I_y\otimes \kappa)\downarrow_s+n_{\epsilon}, {\kappa,s,\epsilon}\subset\sigma$,其中$I_y\otimes \kappa$是blur kernel与$I_y$的卷积,$n_{\epsilon}$是标准差为$\epsilon$的高斯白噪声。这种估计方式更接近现实,效果更好。
因此SR问题的目标就可以表述成:
$\widehat{\theta}=argmin_{\theta}L(\widehat{I_y},I_y)+\lambda\phi(\theta)$,其中$\lambda$为tradeoff参数,$\phi(\theta)$为regularization term
相关竞赛:
- NTIRE, CVPR
使用DIV2K数据集。超分辨率上有四个赛道,其中一个为使用经典的bicubic降尺度方式作为待重建图像,进行8倍放大重建。这也是目前大部分文献中最常见的设置方式之一。而其余三个赛道均是来自不同程度(Mild、Difficult、Wild)未知退化算子模拟相机采集的待重建图像,进行4倍放大重建。
- PIRM, ECCV
图像质量评估(Image Quality Assessment, IQA)
可以从主观和客观两个角度对图像的质量进行评估,一般以客观角度为主,不同角度可能会导致结果不一致。
客观IQA根据使用参考图像情况不同,主要分为三类:full-reference; reduced-reference; no-reference
下面介绍集中主要的IQA。
峰值信噪比(Peak Signal-to-Noise Ratio, PSNR)
是目前最受欢迎的对有损变换的重建质量评估之一
$PSNR=10log_{10}(\frac{L^2}{\frac{1}{N}\sum_{i=1}^{N}(I(i)-\widehat{I}(i))^2})$,$L$为像素可达到的最大值。
缺点是仅考虑了像素级别的均方差,没有考虑视觉角度。
结构相似度(Structural Similarity, SSIM)
从亮度、对比度和结构三个角度对图像质量进行独立的评估,更接近人眼视觉。
$\mu_I=\frac{1}{N}\sum_{i=1}^{N}I(i)$
$\sigma_I=\frac{1}{N-1}\sum_{i=1}^{N}((I(i)-\mu_I)^2)^\frac{1}{2}$
$C_l(I,\widehat{I})=\frac{2\mu_i\mu_{\widehat{I}}+C_1}{\mu_I^2+\mu_{\widehat{I}}^2+C_1}$
$C_c(I,\widehat{I})=\frac{2\sigma_i\sigma_{\widehat{I}}+C_2}{\sigma_I^2+\sigma_{\widehat{I}}^2+C_2}$
$C_1=(k_1L)^2, C_2=(k_2L)^2$,其中$k_1, k_2\llless1$用于避免不稳定
$\sigma_{I\widehat{I}}=\frac{1}{N-1}\sum_{i=1}^{N}(I(i)-\mu_I)(\widehat{I}(i)-\mu_{\widehat{I}})$
$C_s(I,\widehat{I})=\frac{\sigma_{I\widehat{I}}+C_3}{\sigma_I\sigma_{\widehat{I}}+C_3}$
$SSIM=[C_l(I, \widehat{I})]^\alpha[C_c(I,\widehat{I})]^\beta[C_s(I,\widehat{I}]^\gamma$
平均主观意见分(Mean Opinion Score, MOS)
常用的主观IQA,由人来给图像评分,1~5表示从坏到好,最后取平均。
缺点:评分标准的偏差和方差以及尺度都是非线性感知的【?】
基于学习的感知质量(Learning-based Perceptual Quality)
- No-reference Ma, NIMA:根据主观视觉分数
- DeepAQ:预测视觉相似性
- LPIPS:根据深层特征的差异评估perceptual image patch similarity(LPIPS)
训练网络对图像的质量进行预测,目前的主要问题是我们所需要哪些视觉特征仍未知。
基于任务(Task-based Evaluation)
SR任务可以作为其他任务的基础,提升其他任务的表现。因此可以根据其他任务的表现对SR任务进行评估
其他
MS-SSIM, 多尺度SSIM
FSIM, feature similarity
NIQE, Natural Image Quality Evalutor
基于监督学习超分辨率
模型框架
SR任务需要使用上采用算法得到更高分辨率的图像,在结合深度学习网络优化图像质量。根据上采样的阶段不同划分为四种类型的模型框架。
-
Pre-upsampling
上采样过程在神经网络之前,此时的CNN只需学习如何refine,因此学习难度大大降低。并且可以接收任意大小的输入图片和缩放因子而不需重新训练神经网络。
缺点在于图像中的噪声和模糊会被放大,过程中的大部分操作都在高维空间进行时空复杂度大。
-
Post-upsampling
输入先通过深层神经网络,最后通过端到端可学习上采样层。将操作集中在低维空间,大大减少时空复杂度。但缺点是无法适应多尺度情况,且在缩放尺度较大时,由于只进行了一次上采样因此学习难度较大。
-
Progressive upsampling
不断重复经过神经网络和上采样层,减小学习难度同时也可以适应多尺度问题,且没有过度增大时空复杂度。缺点在于这样的模型多阶段和训练的稳定性难以保证,模型设计比较复杂。未来在这方面需要更多的模型设计值得和更先进的训练策略。
-
Iterative up-and-down sampling
利用重建误差重复应用反向投影进行优化,可以更好地挖掘LR-HR图像之间的深层关系,从而提供更高质量的重建结果。缺点在于目前反向投影模块的设计标准仍不是很明确,这也意味着这还有比较大的研究潜力。
上采样方法
主要分为基于插值和基于深度学习两大类。
基于插值
易于实现,可解释性强,仅根据图像本身信息。比较常用的方法有:
- 最近邻插值,Nearest-neighbor Interpolation
将目标各点的像素值设为源图像中与其最近的点。速度快,但通常会导致低质量的块状图案。
- 双线性插值,Bilinear Interpolation
选取源图像中最近的2$\times$2,先在一个坐标轴上进行一次线性插值,再在另一个坐标轴上进行线性插值。
上图中目标点为P,选取的点为四个Q。先以横坐标进行线性插值,得到两个R点,再用R以纵坐标进行线性插值。
- 双三次插值,Bicubic Interpolation
在两个坐标轴上进行三次插值,考虑的是4$\times$4的范围。得到的结果会更光滑,失真更少,但速度较慢。
基于深度学习
- 反卷积,Transposed Convolution Layer
可以视为与卷积对称的过程。如果我们将卷积的过程表示为矩阵,输入和输出均为列向量。那么卷积可以表示为$Y=CX$, 反卷积可以表示为$X=C^TY$。反卷积过程可以恢复$X$的大小,但不能恢复每个元素值。
缺点:can easily cause "uneven overlapping" on each axis; the multiplied results on both axes further create a checkerboard-like pattern of varying magnitudes【?】
- 子像素层,Sub-pixel Layer
用卷积操作生成$s^2$个channel,再reshape。与反卷积相比感受野更大,可以提供更多的信息。
缺点是感受野分布不平均且块状区域共享相同的感受野会导致不同块的边界处存在失真。独立预测块状区域相邻像素会导致不光滑结果。
- 任意缩放模块,Meta Upscale Module
对HR中每一个目标位置,将其映射到LR特征图中的一小块区域,预测卷积权重。对于任意的缩放因子可以不断缩放。缺点是结果可能不稳定,当遇到较大的缩放因子时效率不高。
网络设计
残差学习 Residual Learning
分为全局和局部的,但都使用shortcut connections和element-wise addition。区别在于全局的直接连接input和output,仅学习输入与target件的残差,只需学到一个residual map 用于存储丢失的高频细节。局部的类似ResNet,在不同层直接进行shortcuts用于减轻-准确率下降问题(degradation problem)。层级大到一定程度时准确率就会饱和,然后迅速下降,这种下降即不是梯度消失引起的也不是overfit造成的,而是由于网络过于复杂,以至于光靠不加约束的放养式的训练很难达到理想的错误率。degradation problem不是网络结构本身的问题,而是现有的训练方式不够理想造成的。
递归学习 Recursive Learning
将某些模块重复多次,从而不会引入大量参数。优点是不需引入大量的新参数,可以学得更advanced representations。缺点是仍不能避免high computational costs,并且会带来梯度消失/爆炸的问题。
多路径学习 Multi-path Learning
利用不同路径(进行不同的操作),从而大幅提升学习能力。分为全局、局部和指定尺度。
全局多路径利用不同路径从不同角度提取图片特征,这些路径可以在propagation过程中进行交叉。指定尺度多路径是共享一些principle component(用于特征提取的中间层),再在前后接上多个与规模相关的预处理路径和上采样路径。在训练时,只有与尺度对应的路径会被激活并更新。
稠密连接 Dense Connections
可以从层级别/块级别进行稠密连接,某一层特征会作为所有后续层的输入。优点是减轻梯度消失,增强信号传播,鼓励特征重用。并通过使用小growth rate,squeezing channels减小模型的大小。
注意力机制 Attention Mechanism
主要有通道注意力和非局部注意力。通道注意力考虑了不同通道特征表示间的相互依赖。
Advanced Convolution
- 空洞卷积 Dilated Convolution
空洞卷积:在卷积核中间填充0,有两种实现方式,第一,卷积核填充0,第二,输入等间隔采样。可以扩大感受野,捕捉多尺度上下文信息,而不引入额外参数。但会造成局部信息的丢失
- 分组卷积 Group Convolution
假设常规卷积的输入尺寸为$C\times H\times W$,卷积核尺寸为$C\times K\times K$,卷积核数量为$N$.现在分成$G$组,每组的输入变为$\frac{C}{G}\times H\times W$,卷积核尺寸也相应的变为$\frac{C}{G}\times K\times K$.则卷积的总参数量变为原来的$\frac{1}{G}$
- 深度可分离卷积 Depthwise Separable Convolution
当分组卷积的分组数等于输入的特征图数,就变为了深度可分离卷积。
区域递归学习【?】
propose pixel recursive learning to perform pixel-by-pixel generation, by employing two networks to capture global contextual information and serial generation dependence, respectively
一种基于概率的模型,引入了像素之间的条件独立性。但预测时需要逐个像素,比较慢
缺点:a long propagation path greatly increases the computational cost and training difficulty
金字塔池化
小波变换
将图像信号分解为包含纹理细节的高频子带核包含全局拓扑信息的低频子带。
逆亚像素 Desubpixel
上采样sub-pixel中shuffle的反操作。将图像像素分开,堆成额外的channel从而避免信息丢失。先将图像desubpixel操作,在低维空间学习,最后上采样至对应尺寸。
xUnit
一种带有可学习参数的激活函数,适合图像恢复类的任务。可以捕捉更复杂的特征从而减少层数和参数。
class Modulecell(nn.Module): def __init__(self,in_channels=1,out_channels=64,kernel_size=3,skernel_size=9): super(Modulecell,self).__init__() self.features = nn.Sequential( nn.Conv2d(in_channels,out_channels,kernel_size=kernel_size,padding=((kernel_size-1)//2))) self.module = nn.Sequential( nn.BatchNorm2d(out_channels), nn.ReLU(), nn.Conv2d(out_channels,out_channels,kernel_size=skernel_size,stride=1,padding=((skernel_size-1)//2),groups=out_channels), nn.BatchNorm2d(out_channels), Gaussian()) def forward(self,x): x1 = self.features(x) x2 = self.module(x1) x = torch.mul(x1,x2) return x
学习策略
损失函数
通常是将多种损失函数通过加权的方式结合在一起。
- 像素级损失
计算图像像素级的差异,主要包含$L_1$loss (mean absolute error)和$L_2$loss (mean square error)
$L_{pixel-l1}(\widehat{I}, I)=\frac{1}{hwc}\sum_{i, j, k}|\widehat{I}_{i, j, k}-I_{i, j, k}|$
$L_{pixel-l2}(\widehat{I}, I)=\frac{1}{hwc}\sum_{i, j, k}(\widehat{I}_{i, j, k}-I_{i, j, k})^2$
$L_1$loss变体Charbonnier loss:
$L_{pixel-Cha}(\widehat{I}, I)=\frac{1}{hwc}\sum_{i, j, k}\sqrt{(\widehat{I}_{i, j, k}-I_{i, j, k})^2+\epsilon^2}$
缺点是不考虑图像质量,可能会丢失高频的细节;可能会导致纹理过于光滑。
- 内容损失
使用预训练的图像分类网络$\phi$计算图像间的语义差别
$L_content(\widehat{I}, I;\phi, l)=\frac{1}{h_lw_lc_l}\sqrt{\sum(\phi_{i, j, k}^{(l)}(\widehat{I})-\phi_{i, j, k}^{(l)}(I))^2}$,其中$l$表示网络的第$l$层
鼓励图像在视觉上相近而不是让像素值一样。
- 纹理损失
$L_texture(\widehat{I}, I;\phi, l)=\frac{1}{c_l^2}\sqrt{\sum(G_{i,j}^{(l)}(\widehat{I})-G_{i,j}^{(l)}(I))^2}$
$G_{i,j}^l(I)=vec(\phi_i^(l)(I))\cdot vec(\phi_j^(l)(I))$,$\phi_i^l(I)$为图像$I$在$l$层的特征图的第$i$个channel
缺点是目前决定需要匹配纹理的patch的大小仍依赖经验
- 对抗损失
将SR模型视为一个generator,再定义一个discriminator,使用GAN的方法。可以提取处潜在的难以学习的特征,使HR图像更加真实。
缺点是目前GAN的训练过程比较困难且不稳定。
- 循环一致性损失
将得到的HR图像$\widehat{I}$通过另一个CNN下采样得到另一个LR图像$I'$,使$I$与$I'$一致。
$L_{cycle}(I', I)=\frac{1}{hwc}\sqrt{\sum_{i,j,k}(I'_{i,j,k}-I_{i,j,k})^2}$
- 全变分损失
$L_{TV}(\widehat{I})=\frac{1}{hwc}\sum_{i,j,k}\sqrt{(\widehat{I}_{i,j+1k}-\widehat{I}_{i,j,k})^2+(\widehat{I}_{i+1,j,k}-\widehat{I}_{i,j,k})^2}$
用于衡量噪声得到更加光滑的图像
- 基于先验损失
引入先验知识,保持结果与先验的一致性。
Batch Normalization
最初是为了解决内部协方差平移(ICS)问题引入的,通过校准内部特征分布减轻梯度消失,使网络可以使用更高的学习率,不需要过分关心初始化。
但一些人认为BN丢失了每个图像的scale信息,gets rid of range flexibility from networks.去除BN,用省下的内容搭建更大规模的网络。
内部协方差平移问题:输入分布经过多次线性非线性变换已经改变,但对应的分类未变。每个神经元的输入数据不再是“独立同分布”,会导致上层网络需要不断适应新的输入数据分布,使学习速率降低。而下层输入的变化可能趋向于变大或变小,导致上层落入了饱和区,使得学习过早停止。并且每一层的更新都会影响到其他层,因此每层的参数更新策略都需要尽可能谨慎。
Curriculum Learning
是指学习时从小任务开始,逐步提升学习难度。针对大缩放任务进行分解,比如将放大8倍的任务分解为,1倍到2倍,2倍到4倍,4倍到8倍的子任务,对这些子任务单独训练并以一定策略拼接优化。可以大幅度减小学习难度,缩短训练的总时间。
多监督
在模型中引入多个监督信号,避免梯度消失/爆炸问题(,可以和递归学习进行结合)。实际操作中通常是在损失函数中添加一些额外的项。
其他改进
Context-wise Network Fusion, CNF
对多个SR网络的预测结果进行融合。
数据增强
图像领域的常用操作,如切割、翻转、缩放、旋转等
多任务学习
通过利用其他相关任务训练数据中包含的指定领域信息提升泛化能力。
网络插值
将具有相同结构的网络参数进行线性组合,通过调整权重可以实现平滑连续的效果。在SR任务中,可以对同一结构但使用不同loss函数的网络参数进行线性组合,可以综合不同loss的优点。
Self-Ensemble
将原图像进行旋转、对称等操作,全部通过SR网络得到HR图像后取平均或是中值作为结果。
目前比较好的监督学习超分辨率模型
无监督学习超分辨率
对于同一个场景通常很少会有多种分辨率的图像,所以一些超分数据集实际上都是对HR的图像进行一些退化处理,这会引入一些人工的退化先验,并且与真实世界的情况有些不同。无监督学习的方法有非常大的研究价值。
Zero-shot SR, ZSSR
在测试时进行训练,对要测试的图像$I$用不同缩放比进行一系列下采样,再进行图像增强得到一组图片。学习这组图片到测试图像$I$之间的映射,用这个映射去获得$I$所对应的HR图像。由于是在测试时对不同图片进行学习,因此预测的耗时长。
弱监督学习SR
- 学习退化函数
先训练一个HR-to-LR的GAN,学到退化函数,用这个退化函数生成HR-LR对。再训练LR-to-HR GAN
- Cycle-in-cycle SR
将LR和HR视为2个不同的域,训练的目标是将映射结果与对应域的分布相同,同时图像又要可恢复。
深层图像先验
利用一个任意初始化的CNN作为先验。训练一个generator,将任意输入向量生成一张HR图像,目标是找到一个HR图像其下采样刚好是LR图像$I_x$
未来研究方向
- 网络设计
- 结合全局和局部信息
- 结合高层和低层信息
- 关注于纹理的注意力机制
- 更高效的结构,减小模型大小提升速度
- 上采样方法,现有的上采样方法都有一些缺点
- 学习策略
- SR问题最佳的损失函数尚不明确
- 有效的规范化的方法
- 评估指标
- 目前SR质量还没有统一公认的度量指标
- Blind IQA Methods。目前的主要评估方法需要LR-HR图像对,但这样的真实图像对是比较难获取的。
- 无监督学习
- 针对现实世界
- 处理多种退化。目前人工处理得到的数据集训练出的网络在真实情况下表现不好。
- 具有领域针对性的应用