超分辨率第十章-NormalizingFlow&SR
本文介绍标准化流(Normalizing Flow)以及其对应的超分辨率模型SRflow
参考文献: Normalizing Flows: An Introduction and Review of Current Methods
参考博客:SRFlow: Learning the Super-Resolution Space with Normalizing Flow
一.Normalizing Flows(标准化流)
标准化流,与VAE、GAN同属于生成式方法
1.标准化流的概念
①标准化流的方法
通过一系列可逆且可微的变换(invertible and differentiable)将简单(复杂)的概率分布转换为复杂(简单)的概率分布
The density of a sample can be evaluated by transforming it back to the original simple distribution and then computing the product of i) the density of the inverse-transformed sample under this distribution and ii) the associated change in volume induced by the sequence of inverse transformations. The change in volume is the product of the absolute values of the determinants of the Jacobians for each transformation, as required by the change of variables formula.
样本的密度可以通过将其转换回原始简单分布,然后计算以下两者的乘积来评估:i) 该分布下逆变换后样本的密度;ii) 由一系列逆变换引起的相关体积变化。体积的变化是按照变量替换公式的要求,等于每个变换的雅可比行列式的绝对值的乘积。
由此可见,标准化流需要用到:行列式(Determinant)、雅可比矩阵(Jacobi)、变量替换定理(Change of Variable Theorem)
②雅可比行列式(Jacobians)
- 密度计算:在逆变换后的分布中,我们可以计算样本的密度。但是,由于我们进行了变换,所以还需要考虑由变换引起的体积变化(在多维空间中,这通常被称为“雅可比行列式”)。
- 雅可比行列式:在多维空间中,雅可比行列式是一个矩阵,其行列式值表示了从一个空间到另一个空间的体积变化因子。在进行变量替换时,我们需要计算雅可比行列式的绝对值,以确保体积的变化被正确考虑。
由$x=f(z)$的变化后的相关雅可比矩阵:$J_f = \begin{bmatrix} \frac{\partial z_1}{\partial x_1} & \frac{\partial z_1}{\partial x_2} \\ \frac{\partial z_2}{\partial x_1} & \frac{\partial z_2}{\partial x_2} \end{bmatrix}$
③概率密度函数的计算
进行可逆变化后 ,计算Y的概率密度函数的方法
④损失函数-最大似然估计
高-低分辨率图片对,通过可逆神经网络进行编码,将y编码为z
此时可以逆向解码
若需通过$z$分布下的概率密度函数计算y分布下的概率密度函数,需要乘雅可比矩阵的绝对值
此时计算极大似然估计,使用负对数似然的方法,两边取负对数,使负对数似然最小:
⑤关于flow
为了将一个高斯分布 $z0$ 转换为一个复杂的分布 $zK$,normalizing flow 会对初始的分布 $z0$ 进行多次可逆的变换,将其逐渐转换为 $zK$。由于每一次变换都是可逆的,从 $zK$ 出发也能得到高斯分布 $z0$。这样,我们就实现了复杂分布与高斯分布之间的互相转换,从而能从简单的高斯分布建立任意复杂分布。
关键:计算每一层的雅可比行列式
二.SRflow
1.SRflow解决的问题
对于生成式方法GAN,容易出现模式崩溃的问题。
SRFlow:一种基于归一化流的超分辨率方法,能够学习给定低分辨率输入$x$的在高分辨率图像下$y$的条件概率分布。模型使用单一损失(即负对数似然)进行训练,可以生成多幅SR图片,解决了”ill-posed”问题
2.模型架构
本模型基于GLOW
模型由一个可逆流网络 $f_{\theta}$ 组成,以低分辨率图像的编码(绿色)为条件。流网络在多个比例级别(灰色)上运行。输入通过一系列流步骤(蓝色)进行处理,每个流步骤由四个不同的层组成。通过精确的对数似然训练,我们的网络学习将高斯密度 $p_{z}(z)$ 转换为条件 HR 图像分布 $p_{y | x}(y | x, \theta)$。
在训练期间,输入 LR-HR $(x, y)$ 图像对,以计算负对数似然损失。
在推理过程中,网络通过输入 LR 图像和随机变量 $z=(z_{l})_{l=1}^{L} ~ p_{z}$ 来反向运行,该随机变量从学习的分布 $p_{y | x}$ 生成样本 SR 图像。
编码器g0架构基于RRDB,用于提取低分辨率图像的特征。
SRFlow是一种基于归一化流(Normalizing Flow)的超分辨率(Super - Resolution,SR)方法,能够学习到高分辨率图像的分布,并在给定低分辨率图像时生成高分辨率图像。以下是从图中详细介绍SRFlow的训练流程和推理流程:
一、训练流程
- 输入数据
- 训练输入(Training Input):高分辨率图像(High - Resolution)。
- 低分辨率编码器(Low Resolution Encoder $g_{\theta}$)
- 高分辨率图像首先经过下采样得到低分辨率图像。 -
- 低分辨率图像被送入低分辨率编码器($g_{\theta}$),该编码器基于残差密集块(RRDB)架构,用于提取低分辨率图像的特征。
可逆归一化流(Invertible Normalizing Flow ($f_{\theta}$) -
- 低分辨率编码器的输出被送入可逆归一化流$f{\theta}$。
- 可逆归一化流由多个条件流步骤(Conditional Flow Step)和过渡步骤(Transition Step)组成。
- 每个条件流步骤包括仿射耦合层(Affine Coupling)、1x1卷积(1x1 Convolution)、Actnorm和Squeeze操作。
- 过渡步骤用于在不同尺度级别(Scale Level)之间进行转换。
- 可逆归一化流的目标是学习从低分辨率图像到高分辨率图像的映射。
训练目标
- 训练过程中,模型通过最小化负对数似然(Negative Log - Likelihood)来优化参数。
- 模型学习到低分辨率图像和高分辨率图像之间的条件分布。
二、推理流程
输入数据 - 推理输入(Inference Input):低分辨率图像(Low - Resolution)。
低分辨率编码器(Low Resolution Encoder $g_{\theta}$))
- 低分辨率图像被送入低分辨率编码器$g_{\theta}$,提取特征。
- 可逆归一化流(Invertible Normalizing Flow $f_{\theta}$
- 低分辨率编码器的输出被送入可逆归一化流$f_{\theta}$。
- 通过可逆归一化流的正向传播,生成高分辨率图像。
- 输出数据
- 推理输出(Inference Output):高分辨率图像(Super - Resolution)。
3.可逆归一化流结构
分为四块,每块由squeeze(挤压层)、过度步骤,条件流步骤(多个)、split。
①squeeze
将输入图像分辨率减半
②Actnorm
归一化层
③Invertible 1 × 1 Convolution
基于:Glow: Generative Flow with Invertible 1x1 Convolutions
形成块对角结构,减少计算量
④Affine Injector(仿射注入)
其中用于预测缩放因子,用于预测偏差。通过将激活图与基于条件编码预测得到的缩放因子相乘,并加上偏差,得到更新后的激活图$h_n+1$
能够实现从低分辨率图像编码到流分支的直接信息传递,通过这样的缩放和偏差操作,仿射注入层能够有效地将低分辨率图像的信息融入到流网络的处理过程中,使得模型能够更好地学习高分辨率图像的条件分布
⑤Conditional Affine Coupling(条件仿射耦合)
条件仿射耦合层的核心原理基于对激活图在通道维度上的划分,将其分为两部分,对于给定的低分辨率图像,其编码作为条件变量参与到仿射变换中。
神经网络$f_0$被分成 N个可逆层 $ h ^ { n + 1 } = f _ { \theta } ^ { n } ( h ^ { n } ; g _ { \theta } ( x ) )$,$h^0=y,h^N=z$
在通道维度上的特征图被划分成两部分,分别进行以下操作:
u是一个条件变量,即低分辨率图像的编码,$u=g_θ(x)$。
$ f _ { \theta , s } ^ { n }$和$ f _ { \theta , b } ^ { n }$代表产生$ h _ { B } ^ { n }$的scaling和bias的任意神经网络。
此时该层的雅可比矩阵为块三角矩阵,可以简化对行列式的计算,使网络在训练过程中可以高效计算负对数似然损失:
⑥Split
Split 层主要用于将输入数据分成两部分。在 SRFlow 架构中,它将来自条件耦合层(Conditional Coupling Layer)的数据进行分割。
一部分数据被传递到下一个条件流步骤(Conditional Flow Step),而另一部分数据则被分流出去。这有助于模型在不同尺度和层次上提取特征。