paper:Wavelet-SRNet github:A pytorch implementation of Paper Wavelet-srnet
文章目录
- 摘要
- 1、小波包分解
- 2、网络架构
- 3、loss函数
- 3.1、full-image loss (MSE loss)
- 3.2、 wavelet-based loss
- 3.3、loss函数
- 4、pytorch实现
- 小波包分解 + 小波重建实现
摘要
人脸超分辨(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的各个并行的独立子网中得到组小波系数。wavelet prediction net中的子网数量
可根据需求进行调整; (3)reconstruction net根据多组小波系数重建得到高分辨率图像。
以下三个阶段输入输出的关系如下:

embedding net和wavelet prediction net中的卷积层的filter:3×3,sride=1,pad=1。故这两个子网中feature map的大小都与输入图像的大小相同,只在深度上有所变化。
小波包分解级数 决定了低分辨率图像到高分辨率图像的放大倍数
和小波系数的数量
:
。
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,定义如下:
是一个平衡不同组小波系数重要性的权重矩阵;
是真实值,
是小波系数。
这个loss函数应该更关注局部纹理信息,故高频系数的权重应该更大一点。
项提取全局拓扑信息,其中
是网络的输入(?)。

(2)texture loss
texture loss是为了避免高频小波系数收敛为0。
是 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进行小波包分解,得到低频系数和高频系数。
小波包分解的实现如下,其中 ,
是低分辨图像到高分辨图像的放大倍数,由小波包分解级数
决定,
# 通过分组卷积来实现小波包分解,将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后得到一组小波系数。再根据这组小波系数重建得到高分辨的图像。
重建网络的实现如下,其中 ,
是低分辨图像到高分辨图像的放大倍数,由小波包分解级数
决定,
self.conv = nn.ConvTranspose2d(in_channels=nc, out_channels=3, kernel_size=ks, stride=ks, padding=0, groups=3, bias=False)
















