Correction Filter for Single Image Super-Resolution: Robustifying Off-the-Shelf Deep Super-Resolvers 作为一篇2020年的顶会期刊(CVPR),给出了一种在图像超分辨率领域全新的优化思路,非常新奇且效果很好。
文章切入点:
图像超分辨率,顾名思义,就是将一张或多张低分辨率图像通过某种算法,获得与之相匹配的高分辨率图像。在算法模型训练的过程中,如果我们的训练数据是paried data(既有LR image,又有与之相匹配的HR image)固然是最好的,然而真实情况是我们很难得到足够多的paired data。在应对这种情况时,我们通常的做法是对于HR图像,通过某种特定的下采样核
k
k
k(e.g. bicubic 核) 得到其低分辨率版本,从而得到伪paired data。之后,我们的模型会在这种人造的paried data上面进行训练。以往的文献表明,虽然这样训练出来的模型对于同样是通过
k
k
k 得到的LR图像
测试效果不错,但是如果测试LR图像不是通过
k
k
k 得到的,或是随机采样的真实LR图像,其模型性能便会出现巨大的下降。这其实很好理解:当模型在通过
k
k
k人造的paired data上进行学习时,我们可以表示为
y
=
(
x
k
)
↓
y = (x k)↓
y=(xk)↓
x
^
=
f
(
y
)
\hat{x} = f(y)
x^=f(y)
其中
x
x
x是给定的HR图像,
y
y
y是我们通过某一确定的下采样核
k
k
k人造的LR图像,
x
^
\hat{x}
x^是通过SR模型
f
(
.
)
f(.)
f(.)获得的SR图像。很显然我们训练的模型实际上是模拟了一个
k
k
k的逆映射,那么当
f
(
.
)
f(.)
f(.)可以很好的模拟出这个逆映射时,
x
^
\hat{x}
x^一定是非常接近
x
x
x的。但是问题就是,如果在测试时的LR图像是其它下采样核获得的,那么这个模型性能就会大打折扣。
文章创新点:
以上的这个问题其实很多前者也研究过,常见的方法就是在模型上做文章,通过改变模型的训练数据来使提升模型在多种下采样核上的鲁棒性或是引入辅助网络使得模型可以直接训练于unpaired data,但不得不承认,虽然这样模型在未知核上的性能获得了提升,但是对于专一核上的性能却产生了下降。能不能即提升泛化性,又提升性能,并且不去引入额外的辅助网络呢?这篇文章的作者想了一个很巧妙的方法:作者直接从测试阶段输入的LR图像入手,提出了一种滤波器算法。通过一个特定的图像滤波器,可以将未知下采样核获得的LR图像转换成由某一特定下采样核获得的LR图像,让我们来用
h
h
h表示这一神奇的滤波器:
y
′
=
(
x
k
′
)
↓
y' = (x k')↓
y′=(xk′)↓
x
^
=
f
(
h
y
′
)
=
f
(
h
(
k
′
x
)
↓
)
=
f
(
(
k
x
)
↓
)
\hat{x} = f(h y')=f(h(k' x)↓)=f((k x)↓)
x^=f(hy′)=f(h(k′x)↓)=f((kx)↓)
可以从上式直观的看出滤波器的作用。这里我为什么要将 “测试阶段” 额外注明呢,因为这个滤波器并不是针对网络的,而是针对测试数据的,也就是说,原本的SR模型该怎么训练还是怎么训练(你甚至都可以直接拿出别人训练好的模型来用),然后我们只需要将这个模型固定参数后,就可用来训练滤波器
h
h
h了。
用原文中的一句概括就是:
modify the observations
y
=
S
∗
x
y = S^* x
y=S∗x (S就是k), obtained for an arbitrary downscaling kernel
k
k
k, such that they mimic the (unknown) ”ideal observations”
y
b
i
c
u
b
=
R
∗
x
,
y_{bicub} = R^* x,
ybicub=R∗x, which can be fed into pre-trained DNN models.
并且我们看到,在
h
h
h的训练阶段,我们的数据也是通过在训练阶段人工事先假定的一下采样核获得的。也就是说这个方法与模型本身无关,并且训练数据非常容易获得,可以说可扩展性非常好。
原理:
为了下面的推导更加直观,记
y
=
(
x
k
)
↓
=
S
∗
x
(1)
y = (x k)↓ = S^* x \tag{1}
y=(xk)↓=S∗x(1)首先作者提出一个假定:
x
^
=
R
(
R
∗
R
)
−
1
R
∗
x
(2)
\hat{x} = R(R^* R)^{-1} R^* x \tag{2}
x^=R(R∗R)−1R∗x(2)就是说,对于任意一潜在的HR图像
x
x
x,其下采样
y
=
R
∗
x
y = R^*x
y=R∗x我们都可以通过对其乘上一个
R
(
R
∗
R
)
−
1
R(R^*R)^{-1}
R(R∗R)−1,将其完美恢复为
x
^
≈
x
\hat{x}≈x
x^≈x。其中
R
R
R可以是任一下采样变换,这当然也包括最简单的bicubic变换。
接下来引出我们的主角: 滤波器
H
H
H。我们将其功能表示为
x
^
=
R
H
y
(3)
\hat{x} = RHy \tag{3}
x^=RHy(3),很显然,它执行了一个
R
∗
R^*
R∗的逆变换和
R
R
R的逆变换,也就是
(
R
∗
R
)
−
1
(R^*R)^{-1}
(R∗R)−1。那么对于(3)式,我们就可以将其转化为
x
^
=
R
H
y
=
R
H
S
∗
x
=
R
H
S
∗
R
(
R
∗
R
)
−
1
R
∗
x
(4)
\hat{x} = RHy = RHS^∗x = RHS^*R(R^∗ R)^{−1}R^* x \tag{4}
x^=RHy=RHS∗x=RHS∗R(R∗R)−1R∗x(4)
这里要注意一点,为了保证
H
H
H存在,我们要保证
S
∗
R
S^*R
S∗R是非退化的,也就是作者在(3)式的推导前加了一个条件
n
u
l
l
(
S
∗
)
∩
r
a
n
g
e
(
R
)
=
0
null(S^∗ ) ∩ range(R) = {0}
null(S∗)∩range(R)=0
之后我们将
H
H
H代入(4)式,就可以推导出
x
^
=
x
\hat{x} = x
x^=x的结论。
那么我们现在就可以将超分辨率的过程改为
x
^
=
f
(
h
y
)
=
x
\hat{x}=f(hy)=x
x^=f(hy)=x,此时y可以是由一个任意下采样核得到的LR图像,并且f(.)可以是在任意一个已知下采样核成对数据上训练出的网络。
接下来的问题就是如何实现这个
H
H
H。
具体实现:
我们直接看原文中最终使用的公式:
h
=
I
D
F
T
(
F
n
u
m
e
r
⋅
F
d
e
n
o
m
∗
∣
F
d
e
n
o
m
∣
2
+
ǫ
)
(11)
h = IDFT( F_{numer} ·\frac{F^∗_{denom} }{|F_{denom}|^2 + ǫ} ) \tag{11}
h=IDFT(Fnumer⋅∣Fdenom∣2+ǫFdenom∗)(11)
其中
F
n
u
m
e
r
=
D
F
T
(
k
b
i
c
u
b
∗
f
l
i
p
(
k
b
i
c
u
b
)
)
↓
F_{numer} = DFT{(k_{bicub} ∗ flip(k_{bicub}))↓}
Fnumer=DFT(kbicub∗flip(kbicub))↓,
F
d
e
n
o
m
=
D
F
T
(
k
∗
f
l
i
p
(
k
b
i
c
u
b
)
)
↓
F_{denom}=DFT{(k∗flip(k_{bicub}))↓}
Fdenom=DFT(k∗flip(kbicub))↓,DFT是离散傅里叶变换,IDFT是其逆变换,
ǫ
ǫ
ǫ是一个很小的量(本人对于离散傅里叶变换这里没看懂)。然后我们发现,使用上面的公式后,原本求
h
h
h可以分解为求
k
k
k了,所接下来我们看一下如何求
k
k
k。
这里给出原文的流程伪代码:
从伪代码中我们可以看到,求 k k k的过程就是一个给定初值(随便一个常见的k核),然后不断迭代更新的过程。这里需要说一下,作者是使用一个4层网络来表示 k k k的,这样k才能作为一个模型,依照伪代码中的
进行训练。
实验结果和个人分析:
这里主要说一下,作者为了获得不同k获得的LR图像,使用了各种高斯下采样核来作用于同一HR图像,这个方法在 blind setting,SR模型构造测试集时常常用到。这里要着重提一下作者给出了两种不同的SR倍数下的实验结果
可见在2倍SR下,应用了本文方法优势还是不太大,但是当在4倍SR时,本文的优势就显现出来了。个人猜测,这是因为在2倍SR的情况下,用bicub核和用其他未知核的降采样差别并不显著,甚至某些未知降采样核在低倍SR时所保留的信息非常丰富,强行使用滤波器将其模拟为bicub核LR图像反而会丢失某些信息。但是在高倍SR的情况下,由于模型的泛化性已经不能使得其满足还原未知核LR图像了,所以在面对未知核LR图像时,模型的性能就会急剧下降。 其次,我们知道KernelGAN是一种建模模糊核的算法,我们可以看到低倍SR的过程中,在面对KernelGAN效果较好的未知核时,本文方法通常效果也挺好,反之本文方法效果也不咋滴。这也证明了本文的方法在面对不同的未知核时,其滤波能力是有差别的。