超分辨率第十章-SR&NormalizingFlow
本文介绍标准化流(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同属于生成式方法
Normalizing flow 是一种可逆生成模型,用于将一个原始分布通过学习的变换映射到另一个已知的概率分布。它可以将数据从原始分布转换为目标分布,从而实现数据的生成和采样。
•标准化(normalize):它可以将任意的复杂数据分布进行标准化,类似于数据预处理中常用的数据0均值1方差的标准化,但是要精细很多;
•流(Flows):数据的分布可以非常的复杂,需要多个同样的操作组合来达到标准化的效果,这个组合的过程称为流。
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}$
即给出一个 原始概率分布,使用一个可逆变换 f(⋅) 将原始分布变为目标分布,这两个分布之间相差的就是这样一个雅可比行列式。
③概率密度函数的计算
在正则化流中,定义一个变换函数,它将输入样本从原始分布映射到目标分布。这个映射是一个可逆函数,确保转换是可逆的,也就是说,在给定目标分布样本的情况下,可以逆向计算出原始分布的样本。
进行可逆变化后 ,计算Y的概率密度函数的方法:
④损失函数-最大似然估计
高-低分辨率图片对,通过可逆神经网络进行编码,将y编码为z:
此时可以逆向解码:
若需通过$z$分布下的概率密度函数计算y分布下的概率密度函数,需要乘雅可比矩阵的绝对值:
此时计算极大似然估计,使用负对数似然的方法,两边取负对数,使负对数似然最小:
⑤关于flow
为了将一个高斯分布 $z0$ 转换为一个复杂的分布 $zK$,normalizing flow 会对初始的分布 $z0$ 进行多次可逆的变换,将其逐渐转换为 $zK$。由于每一次变换都是可逆的,从 $zK$ 出发也能得到高斯分布 $z0$。这样,我们就实现了复杂分布与高斯分布之间的互相转换,从而能从简单的高斯分布建立任意复杂分布。
注:
- 与扩散模型的对比
- 扩散模型需要逐步去噪(如从),每一步依赖前一步的结果,生成过程是迭代的(多步)。
- 标准化流的生成是单次前向传播,无论模型多深,均一次性输出结果。属于串联计算:
关键:计算每一层的雅可比行列式
二.SRflow
参考文献:SRFlow: Learning the Super-Resolution Space with Normalizing Flow
1.SRflow解决的问题
超分辨率从根本上来说是一个不适定问题。事实上,对于给定的低分辨率(LR)图像,存在无限多个兼容的高分辨率(HR)预测。
对于生成式方法GAN,容易出现模式崩溃的问题。
而标准化流能够在给定低分辨率输入的情况下学习输出的条件分布,直接解释了问题的不适定性质,并学习预测各种逼真的高分辨率图像。且避免了GAN的模式崩溃的问题。<得到LR 图像 x 相对应的自然 HR 图像 y 的完整条件分布 p y|x (y|x, θ)。>
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 图像。
步骤:
在训练期间,输入 LR-HR (x, y) 图像对,以计算负对数似然损失。
编码器g0使用RRDB,提取低分辨率图像特征,之后输入到Affine Injector、 Conditional Affine Coupling
通过精确的对数似然训练,网络可将将高斯密度 p(z) 转换为条件 HR 图像分布 p{y | x}(y | x,θ)。
在推理过程中,网络通过输入 LR 图像和随机变量 z来反向运行,该随机变量从学习的分布 p_{y | x} 生成样本 SR 图像。
编码器g0架构基于RRDB,用于提取低分辨率图像的特征。
SRFlow是一种基于归一化流(Normalizing Flow)的超分辨率(Super - Resolution,SR)方法,能够学习到高分辨率图像的分布,并在给定低分辨率图像时生成高分辨率图像。以下是从图中详细介绍SRFlow的训练流程和推理流程:
一、训练流程
- 输入数据
- 训练输入(Training Input):高低分辨率图像对
低分辨率编码器(Low Resolution Encoder $g_{\theta}$)
提取低分辨率图像特征,生成多尺度特征
之后将将 LR 的全局和局部信息编码为流模型的条件输入。
前向变换:
- HR 图像 y 通过多尺度流模型 f 的正向变换映射到潜在变量 z:
训练目标
- 训练过程中,模型通过最小化负对数似然(Negative Log - Likelihood)来优化参数。
- 模型学习到低分辨率图像和高分辨率图像之间的条件分布。
二、推理流程
- 输入数据 - 推理输入(Inference Input):低分辨率图像(Low - Resolution)。
- 低分辨率编码器(Low Resolution Encoder $g_{\theta}$))
- 低分辨率图像被送入低分辨率编码器$g_{\theta}$,提取特征。
- 从高斯分布采样潜在变量:
- 将 z 通过流模型的逆变换 生成 HR 图像 y:
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),而另一部分数据则被分流出去。这有助于模型在不同尺度和层次上提取特征。