Image Super Resolution.

本文目录:

  1. 问题阐述
  2. 降级模型
  3. 传统方法:基于插值的方法、基于重建的方法、机器学习方法
  4. 深度学习方法:预定义上采样、单次上采样、渐进上采样、循环采样
  5. 评估指标:峰值信噪比PSNR、结构相似度SSIM
  6. Benchmarks

1. 问题阐述

图像超分辨率(Super Resolution,SR)技术是指通过技术手段对图像的分辨率进行放大,从而得到更清晰的图像。

将超分辨率问题看作监督学习任务,将高分辨率(High Resolution, HR)图像作为标签$I_y$;将对应的低分辨率(Low Resolution, LR)图像作为输入$I_x$。

通过训练模型,学习从LRHR的映射$F(\cdot)$。记模型参数为$θ$,则通过模型得到超分辨率图像$\hat{I}_y$:

\[\hat{I}_y = F(I_x;θ)\]

若记损失函数为$L(\cdot)$,正则化函数为$\Phi(\cdot)$,模型的学习目标函数可以表示为:

\[\hat{θ} = \mathop{\arg \max}_{θ} L(\hat{I}_y,I_y) + λΦ(θ)\]

2. 降级模型

通常给定HR图像,通过技术手段将其缩小为LR图像,这个过程称为降级(Degradation)

记降级模型为$D$,其模型参数为$δ$,则这一过程表示为:

\[I_x = D(I_y;δ)\]

在实际问题中,对图像降级往往会引入压缩失真、散焦、传感器噪声等问题,因此会向图像中加入一些模拟噪声。

常用的降级模型包括:

\[I_x = (I_y)↓_S\] \[I_x = (I_y \otimes k)↓_S + n\]

3. 传统方法

在深度学习时代之前,图像超分辨率重建技术主要分为三类:

  1. 基于插值的方法:最邻近插值、双线性插值、双三次插值
  2. 基于重建的方法
  3. 机器学习的方法

(1)基于插值的方法

以放大$2$倍为例,将低分辨率图像插值为对应的高分辨率图像:

⚪最近邻插值 Nearest Neighbor

最近邻插值是指高分辨率图像的像素点选择与其坐标位置最近的低分辨率图像像素值,其几何解释如下:

如上图HR中位置$H5W6$的像素点对应LR中位置$H3W3$像素点的右上区域,则该点对应的像素按照最近邻的原则应该取$1$。

⚪双线性插值 Bilinear Interpolation

双线性插值是指在两个方向分别进行一次线性插值。高分辨率图像的像素点选择与其坐标位置最近的$4$个低分辨率图像像素点的像素值的距离加权平均,其几何解释如下:

如上图HR中位置$H5W6$的像素点对应LR中位置$H3W3$像素点的右上区域。

距离该点最近的四个LR中像素点位置分别是$H2W3$、$H2W4$、$H3W3$、$H3W4$。

双线性插值的计算过程如下:

双线性插值的平滑作用可能使得图像的细节产生退化,这种现象在进行图像放大时尤其明显。

⚪双三次插值 Bicubic Interpolation

双三次插值能创造出比双线性插值更平滑的图像边缘。

在二维空间中,函数$f$在点$(x,y)$的值可以通过矩形网格中最近的$16$个采样点的加权平均得到:

其中$W$为插值函数,根据LR像素点到SR像素点之间的水平距离或垂直距离赋予其不同的权重。

使用python实现双三次插值:

from PIL import Image
im = Image.open(image_path).convert('RGB')
im = im.resize(new_size, resample=Image.BICUBIC)

(2)基于重建的方法

(3)机器学习的方法

4. 深度学习方法

使用卷积神经网络进行超分辨率任务的模型根据上采样的位置不同可以划分成:

  1. 预定义上采样(Predefined upsampling):首先对图像应用预定义的插值方法进行上采样(如Bicubic),再通过卷积网络增加细节,如SRCNN, VDSR
  2. 单次上采样(Single upsampling):先通过卷积网络提取丰富的特征,再通过单次上采样(预定义或可学习)增加分辨率,如FSRCNN, ESPCN, EDSR, RCAN, SAN
  3. 渐进上采样(Progressive upsampling):通过多次上采样逐渐增加分辨率,如LapSRN
  4. 循环采样(Iterative up and downsampling):循环地进行上采样和下采样,增加丰富的特征信息,如DBPN, DRN
  5. 其他结构:如SRGAN, ESRGAN引入生成对抗网络;LIIF学习二维图像的连续表达形式。

SISR问题本质是一个上采样问题。预定义上采样的方法大多是基于插值的,即首先把LR图像通过双三次插值调整为和HR图像具有相同尺寸的中间图像,再通过卷积学习中间图像和HR图像的残差。这类基于插值的方法其实存在许多问题,最重要的是它间接增加了卷积神经网络的学习难度。

我们把一张原始HR图像和它对应的LR图像经过插值后的中间图像展示在下图中。人眼很难区分这两张图像的细微差别。对这两张图像做差后得到残差图像,这是卷积网络要学习的目标。通过离散傅里叶变换将其转变到频率域中,发现残差图像对应的频谱更复杂,这意味着它比原始图像具有更多高频部分,这对卷积网络的学习是非常困难的。

最近SOTASISR方法大多采用基于学习的上采样方法。即采用可学习的插值(如转置卷积或pixel shuffle)代替传统的插值,获得更好的效果。其中转置卷积使用不当会出现棋盘效应,不适合对于图像质量要求较高的场合;pixel shuffle是通过卷积操作把通道维度转换到空间维度,所需的计算量较大。

⚪ 参考文献

5. 评估指标

图像超分辨率的评估指标分为客观指标主观指标。主观指标通常招募志愿者人为地判断超分图像的质量;下面介绍一些客观指标。

(1)峰值信噪比 PSNR

峰值信噪比(Peak signal-to-noise ratio,PSNR),是衡量图像失真水平的客观标准,评价结果以$dB$(分贝)为单位表示。两个图像间PSNR值越大,则越趋于无劣化,劣化程度较大时,PSNR值趋于$0dB$。

大小为$m×n$的噪声图像$\hat{I}_y$和干净图像$I_y$的PSNR可由其均方误差计算:

\[\begin{aligned} MSE &= \frac{1}{mn}\sum_{i=1}^{m} {\sum_{i=1}^{n} {(\hat{I}_y-I_y)^2}} \\ PSNR &= 10·\log_{10}(\frac{L^2}{MSE}) \end{aligned}\]

其中$L$为图像像素的取值范围,如浮点型数据$1.0$或uint8数据$255$。

上面是针对灰度图像的计算方法,如果是彩色图像,通常有三种方法来计算。

  1. 分别计算RGB三个通道的PSNR,然后取平均值。
  2. 计算RGB三通道的MSE,然后再除以$3$。
  3. 将图片转化为YCbCr格式,然后只计算Y分量(亮度分量)的PSNR

使用python实现PSNR

import math
import numpy as np
from skimage.measure import compare_psnr

# 方法一
def psnr(img1, img2):
    assert img1.dtype == img2.dtype == np.uint8, 'np.uint8 is supposed.'
    img1 = img1.astype(np.float64)
    img2 = img2.astype(np.float64)
    mse = np.mean((img1 - img2)**2)
    if mse == 0:
        return float('inf')
    return 20 * math.log10(255.0 / math.sqrt(mse))
	
# 方法二
def psnr(img1, img2):
    assert img1.dtype == img2.dtype == np.uint8, 'np.uint8 is supposed.'
    return psnr = compare_psnr(img1, img2, data_range=255)

PSNR是最普遍和使用最为广泛的一种图像客观评价指标,然而它是基于对应像素点间的误差,即基于误差敏感的图像质量评价。

其并未考虑到人眼的视觉特性(人眼对空间频率较低的对比差异敏感度较高,人眼对亮度对比差异的敏感度较色度高,人眼对一个区域的感知结果会受到其周围邻近区域的影响等),因而经常出现评价结果与人的主观感觉不一致的情况。

(2)结构相似度 SSIM

结构相似度(Structural Similarity,SSIM)亮度(luminance)对比度(contrast)结构(structure)三个角度出发衡量图像之间的差异。

SSIM通过图像的均值、方差和协方差计算:

其中$C_1$、$C_2$、$C_3$是避免分母为零的常数; $α, β, γ$ 设为 $1$。

使用python实现SSIM

from skimage.measure import compare_ssim

def ssim(img1, img2):
    assert img1.dtype == img2.dtype == np.uint8, 'np.uint8 is supposed.'
    return compare_ssim(img1, img2, data_range=255, multichannel=False)

6. Benchmarks

对于常见的图像超分辨率数据集,通常使用一些大型数据集进行训练,使用一些小型数据集进行测试。

训练集包括:

测试集则包括Set5Set14BSDS100Urban100Manga109等。