【学习笔记】图像超分辨

参考文章:2020 图像超分最新综述及上采样技术一览

定义

图像超分辨是将低分辨图像恢复为高分辨图像的方法。 F ( ⋅ ) F(\cdot) F()为超分辨模型, θ \theta θ为模型参数。
I H R = F ( I L R , θ ) I_{HR} = F(I_{LR}, \theta) IHR=F(ILR,θ)

在实际情况下,HR图像会由于压缩伪影、各向异性退化、传感器噪声和散斑噪声等因素的影响退化为LR图像,但是这些因素不可控,通常情况下,我们采用最原始的降采样(downsampling)操作来对退化过程进行建模。最常见的降采样操作是双三次插值(bicubic bicubic interpolation)。

图像质量评估方法

峰值信噪比 PSNR

PSNR是一种常用的客观指标,通常用来衡量有损变换(例如图像压缩image compression, 图像补全image inpainting)的图像质量。假设HR图像 I I I,重建图像 I ^ \hat I I^,像素个数为 N N N,图片最大像素值 L L L,则PSNR(db)的计算公式为:
P S N R = 10 ∗ l o g 10 ( L 2 1 N ∗ ∑ i = 1 N ( I ( i ) − I ^ ( i ) ) 2 ) PSNR = 10*log_{10}(\frac{L^2} {\frac 1 N * \sum^N_{i=1} ( I(i)-\hat I(i) )^2}) PSNR=10log10(N1i=1N(I(i)I^(i))2L2)
PSNR的典型值从20到40不等,越高越好。当 L L L一定时,PSNR只与像素间的均方误差MSE有关。PSNR只关心像素间的差异,不能很好地代表感知质量,在真实场景中效果较差。

结构相似度 SSIM

SSIM衡量图像之间的结构相似性,包括亮度、对比度和结构这三个方面。
假设HR图像 I I I,重建图像 I ^ \hat I I^,图像均值 μ I \mu_I μI μ I ^ \mu_{\hat I} μI^,方差 σ I 2 \sigma_I^2 σI2 σ I ^ 2 \sigma_{\hat I}^2 σI^2,协方差 σ I , I ^ \sigma_{I, \hat I} σI,I^,常量 c 1 , c 2 c_1, c_2 c1,c2

  • 亮度的对比: C l ( I , I ^ ) = 2 μ I μ I ^ + c 1 μ I 2 + μ I ^ 2 + c 1 C_l(I, \hat I) = \frac {2\mu_I \mu_{\hat I}+c_1} {\mu_I^2 + \mu_{\hat I}^2+c_1} Cl(I,I^)=μI2+μI^2+c12μIμI^+c1
  • 对比度的对比: C c ( I , I ^ ) = 2 σ I σ I ^ + c 1 σ I 2 + σ I ^ 2 + c 1 C_c(I, \hat I) = \frac {2\sigma_I \sigma_{\hat I}+c_1} {\sigma_I^2 + \sigma_{\hat I}^2+c_1} Cc(I,I^)=σI2+σI^2+c12σIσI^+c1
  • 结构的对比: C s ( I , I ^ ) = σ I , I ^ + c 2 σ I σ I ^ 2 + c 2 C_s(I, \hat I) = \frac {\sigma_{I, \hat I}+c_2} {\sigma_I \sigma_{\hat I}^2+c_2} Cs(I,I^)=σIσI^2+c2σI,I^+c2

SSIM公式可以表示为亮度、对比度和结构比较的加权乘积。
S S I M ( I , I ^ ) = [ C l ( I , I ^ ) ] α [ C c ( I , I ^ ) ] β [ C s ( I , I ^ ) ] γ \qquad \qquad SSIM(I, \hat I)=[C_l(I, \hat I)]^\alpha [C_c(I, \hat I)]^\beta [C_s(I, \hat I)]^\gamma SSIM(I,I^)=[Cl(I,I^)]α[Cc(I,I^)]β[Cs(I,I^)]γ
其中, α , β , γ \alpha, \beta, \gamma α,β,γ分别为亮度、对比度和结构比较函数的权重。

SSIM能从HVS的角度来评价重建质量,更符合视觉感知。由于图像统计特征可能分布不均或失真,局部评估图像质量比全局更可靠。均值SSIM将图像分割为多个窗口,对每个窗口获得的SSIM进行平均。

平均主观意见分 Mean Opinion Score

直接由人来对恢复的图像进行打分,分数在1-5之间。5优;4良;3尚可;2差;1劣。

插值法

基于插值的超分辨率重建方法是通过使用插值函数来估计待插入的像素点的取值。具体来说,先根据已知点的位置、待插值点的位置以及插值函数来计算各个已知点的权重,然后根据这些已知点的取值和对应的权重来估计待插值点的像素值。

常见的插值函数:

  • 最近邻插值:选取离待插值点最近的点的像素值作为待插值点的像素值。最近邻插值方法直接使用位置最近的像素填充缺失像素,所以会出现小方块(锯齿)效应。
  • 双线性插值:双线性插值是对线性插值在二维直角网格上的扩展,在两个方向分别进行一次线性插值。先在x方向插值,再在y方向插值,若更换插值方向顺序结果不变。双线性插值没有最近邻的锯齿效应,像素基本都是连续的,但比较模糊。
  • 双三次插值:双三次插值通过矩形网络中最近的16个采样点的加权平均得到,需要使用两个多项式插值三次函数,每个方向使用一个。双三次插值方法计算量比较大,但效果相对较好。

在这里插入图片描述

超分网络的4种框架

图像超分辨是个病态问题(ill-posed problem),上采样是超分网络很关键的部分。基于所采用的上采用操作及其在模型中的位置可分为四种模型框架。

Pre-upsamping SR

在这里插入图片描述
这种方法采用传统的上采样方法(不可训练)先将图像直接上采样到高分辨率,再利用深度神经网络进行精调,重建高质量细节。
优点:

  • 将最困难的上采样操作交给传统方法来解决,深度神经网络只需要对粗糙生成的图像进行精调,大大降低了训练的难度;
  • 可以得到任意大小的HR图像,灵魂调节scale factor。

缺点:

  • 传统上采样操作会造成噪声放大或模糊等问题;
  • 增加了不必要的计算成本,并且不提供用于重建高分辨率图像的附加高频信息。

典型的方法有:

  • SRCNN(TPAMI 2015):Image super-resolution using deep convolutional networks
  • SCN(ICCV 2015):Deep networks for image super-resolution with sparse prior
  • VDSR (ICCV 2016):Accurate image super-resolution using very deep convolutional networks
  • DRCN (CVPR 2016):Deeply-recursive convolutional network for image super-resolution
  • DRRN (ICCV 2017):Image super-resolution via deep recursive residual network

Post-upsamping SR

在这里插入图片描述
这种方法把主要的计算任务放在低分辨率的位置,把上采样的操作放在模型的最后,且上采样操作换成可学习的层。
优点:

  • 大量的计算在低分辨率空间进行,提高了计算效率。

缺点:

  • 上采样仅在一个步骤中执行,当放大倍数较大时,学习难度很大;
  • 每一种放大因子都需要训练一个独立的模型,无法满足多尺度超分任务的需求。

典型的方法有:

  • FSRCNN(ECCV 2016): Accelerating the super-resolution convolutional neural network
  • ESPCN(CVPR 2016): Real-time single image and video super-resolution using an efficient sub-pixel convolutional neural network
  • EDSR(CVPR 2017): Enhanced deep residual networks for single image super-resolution

Progressive upsamping SR

在这里插入图片描述
基于深度卷积神经网络的级联,逐步重建高分辨率图像。在每个阶段图像被上采样一次以获得更高的分辨率。
优点:

  • 通过把复杂的上采样任务分解为几步进行,能减少模型学习的困难,尤其是在上采样倍数大的情况下。

缺点:

  • 多阶段上采样导致模型设计复杂,存在多种不同的情况,可能导致训练不稳定;
  • 需要更复杂和先进的训练策略和指导。

典型的方法:

  • LapSRN(TPAMI 2018):Fast and accurate image super-resolution with deep laplacian pyramid networks
  • ProSR(CVPR 2018):A Fully Progressive Approach to Single-Image Super-Resolution

Iterative up-and-down Samping SR

在这里插入图片描述
为了更好地捕捉LR-HR图像对的相互依存性,有些方法使用了back-projection的操作,即迭代地在上采样之后进行back-projection操作并精调 ,通过计算重构误差来调整HR图像。
优点:

  • 能够更好地挖掘LR-HR图像对之间的深层关系,从而提供更高质量的重建结果。

缺点:

  • back-projection的设计标准仍然不清楚,需要进一步探索。

典型的方法:

  • DBPN(CVPR 2018):Deep back-projection networks for super-resolution
  • SRFBN(CVPR 2019):Feedback network for image super-resolution
  • RBPN(CVPR 2019):Recurrent back-projection network for video super-resolution

常见的上采样方法

插值法

  • 最近邻插值(Nearest):每个待插值的位置选择最相邻的像素值。处理速度快,但生成图像质量低,块状化。
  • 双线性插值(Bilinear):先对图像的一个轴(x或y轴)进行线性插值,然后在另一轴上执行。感受野为 2 ∗ 2 2*2 22,且速度较快。
  • 双三次插值(Bicubic):先对图像的一个轴进行三次插值,然后在另一轴上执行。与双线性插值相比,得到的图片质量更平滑,但速度更慢。

基于插值的上采样方法仅基于图像的本身内容提高图像的分辨率,不带来任何更多的信息。但是,还会引入许多的副作用:计算复杂度增加,噪声增强,模糊等等。

可学习的上采样方法

  • 转置卷积层(transpose convolution layer):也叫反卷积 (deconvolution),先对低分辨率图像插入0值,再通过卷积获得输出。然而,容易在每个轴上引起“不均匀重叠”,并且两个轴上的相乘结果进一步创建了大小变化的棋盘状图案,从而损害了SR性能。
    在这里插入图片描述
  • 亚像素层(sub-pixel layer):通过卷积操作产生大量的channel之后,再通过reshape得到最终的输出。要上采样 s s s倍,需先得到 s 2 s^2 s2个不同的channel。设输入的维度是 h × w × c h \times w \times c h×w×c,则输出的维度是 h × w × s 2 c h \times w \times s^2c h×w×s2c。接下来进行一步reshaping的操作把特征最终变为 s h × s w × c sh \times sw \times c sh×sw×c 。与转置卷积层相比,亚像素层具有更大的感受野,它提供了更多的上下文信息以帮助生成更多逼真的细节。然而,由于感受野的分布是不均匀的,并且块状区域实际上共享相同的感受野,因此可能会导致在不同块的边界附近出现一些伪影,也可能会导致不平滑的输出结果。
    在这里插入图片描述
  • Meta upscale module:对于HR图像上的每个目标位置,此模块将其投影到LR特征图上的一个小块( k × k × c i n k \times k \times c_in k×k×cin),根据密集层的projection offsets和scale factor预测卷积权重 (( k × k × c i n × c o u t k \times k \times c_in \times c_out k×k×cin×cout))并执行卷积。使用这种方式,Meta upscale module可以通过单个模型实现连续放大。并且由于有大量的训练数据,该模块在固定放大倍数上可以表现出相当甚至更好的性能。通过动态预测权重,实现了单一模型对输入图片进行任意尺度的上采样。

常见的网络架构设计

Residual Learning

在这里插入图片描述

  • 全局残差学习:只学习两幅图像的残差,这样就避免了学习完整图像到另一个完整图像之间复杂的变换,简化了任务难度。神经网络只需要学习丢失的高频细节信息即可。
  • 局部残差学习:为了解决网络的梯度消失、梯度爆炸的问题,增强网络的学习能力。

Recursive Learning

在这里插入图片描述
将递归引入模型,多次使用相同权重的模块,这些模块之间是参数共享的。能减少网络的参数量以及实现更大的感受野。递归学习在不引入额外参数的情况下学习到更先进的表示,但并没有带来计算量的减少,同时也带来了梯度消失和梯度爆炸的问题。因此通常将残差学习和递归学习结合来缓解这些问题。

Attention Mechanism

在这里插入图片描述

  • 在带有注意力机制的block中,特征图的每个通道通过Global Average Pooling变成一个值,再经过2个FC层变成一个scale factor,与这个特征图相乘。
  • Non-Local Attention:针对超分网络中感受野较小的问题。使用一个主干分支提取特征,和一个non-local的mask分支输出的attention相乘。non-local的mask分支通过Gaussian Function或Embedded Gaussian Function来计算特征图中任意2个位置之间的成对关系来输出权重。
    在这里插入图片描述

Dense Connections

在这里插入图片描述
密集连接有助于缓解梯度消失、增强信号传播和鼓励特征重用。通过 采用小增长率 和 在级联所有输入特征映射后对通道数进行压缩 来极大程度地减少模型的大小。

Multi-path Learning

在这里插入图片描述

  • Global Multi-path Learning:全局多路径学习是指利用多个路径提取图像不同方面的特征。这些路径在传播过程中可以相互交叉,从而大大提高了特征提取的能力;
  • Local Multi-path Learning:采用不同大小的核进行卷积运算同时提取特征,然后将输出拼接起来,再次进行相同的运算。通过这种局部多路径学习,SR模型可以更好地从多个尺度提取图像特征,进一步提高性能。
  • Scale-specific Multi-path Learning:在网络的开始端和结束端分别附加特定尺度的预处理路径和上采样路径。训练时,只启用和更新所选比例对应的路径。通过这种方式,大多数参数可以在不同的尺度上共享。

Advanced Convolution

在这里插入图片描述

  • 空洞卷积(Dilated Convolution):增大感受野,有助于生成逼真的细节。
  • 分组卷积(Group Convolution):可以在性能损失很小的情况下减少大量的参数和运算。

Pyramid Pooling

在这里插入图片描述
Pyramid的思路就是把不同size的特征图直接concat在一起。对于尺寸是 h × w × c h \times w \times c h×w×c的特征图,每个通道被划分成 M × M M \times M M×M块并通过GAP全局池化,生成 M × M × c M \times M \times c M×M×c的结果。再通过 1 × 1 1 \times 1 1×1卷积把输出压缩为单通道。之后,再经过双线性插值把结果进行上采样到原来特征图的维度。当 M M M变化时,模块结合全局和局部的上下文信息以提升性能。

常见的损失函数

Pixel Loss

L p i x e l L 1 = 1 h w c ∑ i , j , k ∣ I ^ i , j , k − I i , j , k ∣ L_{pixel_{L1}} = \frac {1} {hwc} \sum_{i,j,k} |\hat I_{i,j,k} - I_{i,j,k}| LpixelL1=hwc1i,j,kI^i,j,kIi,j,k
L p i x e l L 2 = 1 h w c ∑ i , j , k ( I ^ i , j , k − I i , j , k ) 2 L_{pixel_{L2}} = \frac {1} {hwc} \sum_{i,j,k} (\hat I_{i,j,k} - I_{i,j,k})^2 LpixelL2=hwc1i,j,k(I^i,j,kIi,j,k)2

Content Loss

如果一个网络,生成的图像足够逼真,那么生成图片的特征(度量特征提取网络中提取的)也应该跟真实图片的足够像,因此通过使特征足够相似,对生成图片质量也有促进作用。 ϕ ( ⋅ ) \phi(\cdot) ϕ()为特征提取网络。
L c o n t e n t = ∥ ϕ ( I ^ ) − ϕ ( I ) ∥ 2 L_{content} = \|\phi(\hat I) - \phi(I)\|_2 Lcontent=ϕ(I^)ϕ(I)2

Texture Loss

由于重建后的图像应该与目标图像具有相同的样式(颜色、纹理、对比度),将图像的纹理视为不同特征通道之间的相关性(用矩阵点乘来表示相关性)。
G i j l ( I ) = < ϕ i l ( I ) − ϕ j l ( I ) > G^l_{ij}(I) = \left< \phi_i^l(I) - \phi_j^l(I) \right> Gijl(I)=ϕil(I)ϕjl(I)
L t e x t u a l = ∥ G i j l ( I ^ ) − G i j l ( I ) ∥ 2 L_{textual} = \|G^l_{ij}(\hat I) -G^l_{ij}(I)\|_2 Ltextual=Gijl(I^)Gijl(I)2

Total Variation Loss

TV损失可以抑制生成图像中的噪声,提升图像的空间平滑性。
L T V = ∑ i , j , k ( ( I ^ i + 1 , j , k − I ^ i , j , k ) 2 + ( I ^ i , j + 1 , k − I ^ i , j , k ) 2 ) L_{TV} = \sqrt{\sum_{i,j,k} \left( (\hat I_{i+1,j,k} - \hat I_{i,j,k})^2 + (\hat I_{i,j+1,k} - \hat I_{i,j,k})^2 \right)} LTV=i,j,k((I^i+1,j,kI^i,j,k)2+(I^i,j+1,kI^i,j,k)2)

Adversarial Loss

基于GAN的超分网络的损失函数,我们一般把超分模型作为生成器,并且额外定义一个判别器来评价图像是不是真实的。
L g = ( D ( I ^ ) − 1 ) 2 L_g=(D(\hat I) - 1)^2 Lg=(D(I^)1)2
L d = ( D ( I ) − 1 ) 2 + ( D ( I ^ ) ) 2 L_d=(D(I) - 1)^2 + (D(\hat I))^2 Ld=(D(I)1)2+(D(I^))2

  • 2
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 数字图像分辨率是一种技术,可以通过对图像进行处理来提高其分辨率。您可以使用 Python 实现数字图像分辨率。 这是一个使用 Python 和 TensorFlow 实现数字图像分辨率的示例代码: ``` import tensorflow as tf import numpy as np # 加载图像并将其转换为张量 def preprocess_image(image): image = tf.image.decode_jpeg(image, channels=3) image = tf.image.resize(image, [192, 192]) image /= 255.0 # 归一化 return image # 创建输入数据集 def create_dataset(images): dataset = tf.data.Dataset.from_tensor_slices(images) dataset = dataset.map(preprocess_image) return dataset # 加载低分辨图像 low_res_images = ... # 加载高分辨图像 high_res_images = ... # 创建输入数据集 low_res_dataset = create_dataset(low_res_images) high_res_dataset = create_dataset(high_res_images) # 创建分辨率模型 model = tf.keras.Sequential([ tf.keras.layers.Conv2D(32, 3, activation='relu', padding='same', input_shape=(192, 192, 3)), tf.keras.layers.Conv2D(64, 3, activation='relu', padding='same'), tf.keras.layers.UpSampling2D() ]) # 编译模型 model.compile(optimizer='adam', loss='mean_squared_error') # 训练模型 model.fit(low_res_dataset, high_res_dataset, epochs=10) ``` 希望这些信息能够帮助您。 ### 回答2: 数字图像分辨率是指通过一定算法和技术,将低分辨图像提升为高分辨图像。下面是使用Python实现数字图像分辨率的代码示例: ```python import cv2 import numpy as np def upscale_image(input_image, upscale_factor): # 加载输入图像 img = cv2.imread(input_image) # 定义分辨率算法,此处使用双线性插值 algorithm = cv2.INTER_LINEAR # 计算新的图像尺寸 new_width = img.shape[1] * upscale_factor new_height = img.shape[0] * upscale_factor # 调整图像尺寸并进行分辨率处理 upscaled_img = cv2.resize(img, (new_width, new_height), interpolation=algorithm) return upscaled_img # 调用分辨率函数 input_image = "low_resolution_image.jpg" upscale_factor = 2 result = upscale_image(input_image, upscale_factor) # 保存结果图像 cv2.imwrite("high_resolution_image.jpg", result) ``` 上述代码中,我们首先导入了需要的模块,主要是OpenCV和NumPy。然后定义了一个`upscale_image`函数用于实现图像分辨率。该函数接受两个参数:输入图像和放大倍数。在函数内部,我们使用OpenCV中的`resize`函数来调整图像尺寸,并指定分辨率算法为双线性插值。最后,使用`imwrite`函数将结果图像保存在指定路径。 要运行这段代码,您需要将`low_resolution_image.jpg`替换为您的低分辨图像的路径,并将`upscale_factor`更改为您希望的放大倍数。代码会生成一个高分辨图像,并将其保存在`high_resolution_image.jpg`的文件中。 请注意,分辨率算法有很多种,这里我们只使用了双线性插值作为示例。在实际应用中,您可能需要根据具体情况选择其他算法,如卷积神经网络(CNN)或深度学习模型。 ### 回答3: 数字图像分辨率是一种通过增加图像的细节来提高图像分辨率的技术。在Python中,可以使用OpenCV和scikit-image两个库来实现数字图像分辨率。 首先,导入所需的库: ```python import cv2 import numpy as np from skimage.transform import pyramid_expand ``` 然后,编写一个函数来实现图像分辨率: ```python def super_resolution(image_path, scaling_factor): # 加载图像 image = cv2.imread(image_path) # 放大图像 height, width, _ = image.shape new_height, new_width = height * scaling_factor, width * scaling_factor image = cv2.resize(image, (new_width, new_height), interpolation=cv2.INTER_LINEAR) # 降低图像分辨率,创建低分辨图像 small_image = cv2.resize(image, (width, height), interpolation=cv2.INTER_LINEAR) # 使用双线性插值方法增加图像的细节 large_image = cv2.resize(small_image, (new_width, new_height), interpolation=cv2.INTER_LINEAR) # 使用金字塔展开方法将图像的尺寸还原到原始大小 output_image = pyramid_expand(large_image, upscale=new_height//height) return output_image ``` 最后,调用该函数执行分辨率处理: ```python image_path = "input_image.jpg" scaling_factor = 2 output_image = super_resolution(image_path, scaling_factor) cv2.imshow("Output Image", output_image) cv2.waitKey(0) cv2.destroyAllWindows() ``` 以上就是使用Python实现数字图像分辨率的代码。你可以将需要处理的图像路径传递给`super_resolution`函数,并指定放大倍数来获得分辨率后的图像

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值