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×)。
小波包分解
小波变换(Wavelet transform,WT)能够从不同的level上来描述图像的上下文和纹理
信息。如下图所示的不同level的小波包分解,近似系数(the approximation coefficients)包含图像的全局拓扑信息
,细节系数( detail coefficients)显示了图像的纹理信息
。
Wavelet-SRNet通过小波包分解
将图像解析为一组具有相同大小的小波系数。小波包分解示意图如下:
Wavelet-SRNet选用最简单的小波:haar小波
,此小波足以描述不同频率的人脸信息。另外,使用快速小波变换(2-D fast wavelet transform ,FWT))来计算haar小波。计算过程如下图所示:
网络架构
Wavelet-SRNet分为三个子网: embedding, wavelet prediction and reconstruction networks。
(1)将一张低分辨率的人脸图像输入到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的大小都与输入图像的大小相同,只在深度上有所变化。
小波包分解级数
决定了低分辨率图像到高分辨率图像的放大倍数
和小波系数的数量
:
。
loss函数
full-image loss (MSE loss)
超分辨率方法中最常使用MSE损失函数,MSE损失函数是在图像空间
上的一个限制,MSE几乎不能获取到高频纹理细节信息。
Wavelet-SRNet的full-image loss 一方面是在图像空间
上的限制,另一方面也能在平滑度和纹理细节上达到一个平衡。
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,因此避免了纹理细节的下降。
loss函数
为了得到人脸的全局拓扑信息和局部纹理信息,最终loss函数定义如下:
pytorch实现
先将图片resize得到高分辨率的图像HR,然后再下采样scale倍得到 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)