Wavelet-SRNet阅读笔记

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/baidu_27643275/article/details/84822286

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的各个并行的独立子网中得到 N w N_{w} 组小波系数。wavelet prediction net中的子网数量 N w N_{w} 可根据需求进行调整;
(3)reconstruction net根据多组小波系数重建得到高分辨率图像。

在这里插入图片描述
embedding net和wavelet prediction net中的卷积层的filter:3×3,sride=1,pad=1。故这两个子网中feature map的大小都与输入图像的大小相同,只在深度上有所变化。

小波包分解级数 n n 决定了低分辨率图像到高分辨率图像的放大倍数 r r 和小波系数的数量 N w N_{w} r = 2 n N w = 4 n r=2^{n},N_{w}=4^{n}

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,定义如下:

W = ( λ 1 , λ 2 , λ N w ) W=(\lambda_{1},\lambda_{2},···,\lambda_{N_{w}}) 是一个平衡不同组小波系数重要性的权重矩阵; C C 是真实值, C ˉ \bar{C} 是小波系数。

这个loss函数应该更关注局部纹理信息,故高频系数的权重应该更大一点。

c 1 ˉ c 1 ||\bar{c_{1}}-c1 || 项提取全局拓扑信息,其中 c 1 c_{1} 是网络的输入(?)。
在这里插入图片描述

(2)texture loss

texture loss是为了避免高频小波系数收敛为0。

α ϵ \alpha和\epsilon 是 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进行小波包分解,得到低频系数和高频系数。

小波包分解的实现如下,其中 f i l t e r r × r s t r i d e = r filter:r×r,stride=r r r 是低分辨图像到高分辨图像的放大倍数,由小波包分解级数 n n 决定, r = 2 n r=2^{n}

# 通过分组卷积来实现小波包分解,将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 r r 是低分辨图像到高分辨图像的放大倍数,由小波包分解级数 n n 决定, r = 2 n r=2^{n}

self.conv = nn.ConvTranspose2d(in_channels=nc, out_channels=3, kernel_size=ks, stride=ks, padding=0, groups=3, bias=False)

猜你喜欢

转载自blog.csdn.net/baidu_27643275/article/details/84822286