paper:Wavelet-SRNet
github:A pytorch implementation of Paper Wavelet-srnet
文章目录
摘要
人脸超分辨(Face super-resolution (SR))
指的是从低分辨率(HR)的人脸图像中解析出相应的高分辨率(LR) 人脸图像,当前大多数人脸超分辨方法都是通过CNN来实现。
当处理极低分辨率的图像时,基于CNN的方法性能明显降低;同时这些方法得到的输出过于平滑
,损失了一些细节信息
。
为了解决这个问题,Wavelet-SRNet这篇论文提出了一个基于小波的CNN方法
,此方法可以将16×16甚至更小的低分辨率人脸图像解析为原图像的几倍大小(2×,4×,8×,16×)。
1、小波包分解
小波变换(Wavelet transform,WT)能够从不同的level上来描述图像的上下文和纹理
信息。如下图所示的不同level的小波包分解,近似系数(the approximation coefficients)包含图像的全局拓扑信息
,细节系数( detail coefficients)显示了图像的纹理信息
。
Wavelet-SRNet通过小波包分解
将图像解析为一组具有相同大小的小波系数。小波包分解示意图如下:
Wavelet-SRNet选用最简单的小波:haar小波
,此小波足以描述不同频率的人脸信息。另外,使用快速小波变换(2-D fast wavelet transform ,FWT))来计算haar小波。计算过程如下图所示:
2、网络架构
下图是训练过程
流程图:
训练阶段:高分辨率输入HR经小波分解得到一组小波系数,其中只有一个低频分量。将此低频分量输入网络得到N个小波分量,最后再通过小波重建得到和原高分辨率输入一样大小的图SR。
(loss函数让网络输出的N个小波分量,与最初HR小波分解后的N个小波分量接近)
Wavelet-SRNet分为三个子网: embedding, wavelet prediction and reconstruction networks。
(1)将一张低分辨率的人脸图像(LR Input)输入到embedding net
中得到一组feature map;
(2)将这组embedded features输入到wavelet prediction net
的各个并行的独立子网中得到
N
w
N_{w}
Nw组小波系数。wavelet prediction net中的子网数量
N
w
N_{w}
Nw 可根据需求进行调整;
(3)reconstruction net
根据多组小波系数重建得到高分辨率图像。
以下三个阶段输入输出的关系如下:
embedding net和wavelet prediction net中的卷积层的filter:3×3,sride=1,pad=1
。故这两个子网中feature map的大小都与输入图像的大小相同,只在深度上有所变化。
小波包分解级数
n
n
n 决定了低分辨率图像到高分辨率图像的放大倍数
r
r
r 和小波系数的数量
N
w
N_{w}
Nw:
r
=
2
n
,
N
w
=
4
n
r=2^{n},N_{w}=4^{n}
r=2n,Nw=4n。
3、loss函数
3.1、full-image loss (MSE loss)
超分辨率方法中最常使用MSE损失函数,MSE损失函数是在图像空间
上的一个限制,MSE几乎不能获取到高频纹理细节信息。
Wavelet-SRNet的full-image loss 一方面是在图像空间
上的限制,另一方面也能在平滑度和纹理细节上达到一个平衡。
3.2、 wavelet-based loss
Wavelet-SRNet提出了两个wavelet-based loss
: wavelet prediction loss and texture loss.
(1)wavelet prediction loss
wavelet prediction loss相当于在小波域
上的加权MSE
,定义如下:
W = ( λ 1 , λ 2 , ⋅ ⋅ ⋅ , λ N w ) W=(\lambda_{1},\lambda_{2},···,\lambda_{N_{w}}) W=(λ1,λ2,⋅⋅⋅,λNw)是一个平衡不同组小波系数重要性的权重矩阵; C C C是真实值, C ˉ \bar{C} Cˉ是小波系数。
这个loss函数应该更关注局部纹理信息,故高频系数
的权重应该更大一点。
∣
∣
c
1
ˉ
−
c
1
∣
∣
||\bar{c_{1}}-c1 ||
∣∣c1ˉ−c1∣∣项提取全局拓扑信息,其中
c
1
c_{1}
c1是网络的输入(?)。
(2)texture loss
texture loss是为了避免高频小波系数收敛为0。
α
和
ϵ
\alpha和\epsilon
α和ϵ是 slack values,可以使高频小波系数不为0,因此避免了纹理细节的下降。
3.3、loss函数
为了得到人脸的全局拓扑信息和局部纹理信息,最终loss函数定义如下:
4、pytorch实现
训练阶段,先将图片resize得到高分辨率的图像HR,然后再下采样scale倍得到 LR Input。
注意:只将 LR Input输入到网络中,上图有误导性
# level为小波包分解级数
scale = int(math.pow(2, level))
img = img.resize((output_width, output_height),Image.BICUBIC)
img_lr = img.resize((int(output_width/scale),int(output_height/scale)),Image.BICUBIC)
小波包分解 + 小波重建实现
将HR进行小波包分解,得到低频系数和高频系数。
小波包分解的实现
如下,其中
f
i
l
t
e
r
:
r
×
r
,
s
t
r
i
d
e
=
r
filter:r×r,stride=r
filter:r×r,stride=r,
r
r
r是低分辨图像到高分辨图像的放大倍数,由小波包分解级数
n
n
n 决定,
r
=
2
n
r=2^{n}
r=2n
# 通过分组卷积来实现小波包分解,将groups的值设为3即可。
self.conv = nn.Conv2d(in_channels=3, out_channels=nc, kernel_size=ks, stride=ks, padding=0, groups=3, bias=False)
将LR Input输入到网络中,经过wavelet prediction net后得到一组小波系数。再根据这组小波系数重建得到高分辨的图像。
重建网络的实现
如下,其中
f
i
l
t
e
r
:
r
×
r
,
s
t
r
i
d
e
=
r
filter:r×r,stride=r
filter:r×r,stride=r,
r
r
r是低分辨图像到高分辨图像的放大倍数,由小波包分解级数
n
n
n 决定,
r
=
2
n
r=2^{n}
r=2n
self.conv = nn.ConvTranspose2d(in_channels=nc, out_channels=3, kernel_size=ks, stride=ks, padding=0, groups=3, bias=False)