文章简介
本文回顾了端到端图像压缩的文章,并进行了较为全面的分析。文章从网络结构、熵模型和码率控制等方面展开论述。不仅描述了基于学习的图像的里程碑,也揭露了现存的一些问题和有待解决的挑战,还介绍了一种自己提出的模型。
原文链接
一、介绍
有损图像压缩有两个基本原则:
1)尽可能的让信号去相关性,提高熵编码效率
2)对于被丢掉的信息,应该尽可能的不影响到重构质量,即选择丢掉最不重要的信息
端到端框架主要考虑两个问题:
1)让变换后的潜在表示的系数尽可能的去相关性,这样就能节省比特率
2)系数的概率分布如果能被尽可能的准确建模出来,那么熵编码的时候也更有效率
本文的主要贡献
1)全面总结现有的端到端压缩方法
2)进一步探索了现有框架,提出了一种从粗到细的超先验框架
3)进行了全面的基准分析,比较了现有方法的性能
二、问题的公式化
这部分对变换和反变换的公式表达作者写的很直观,我们只需要知道一点,对于变换后的潜在表示,它的分布
是不容易计算出来的,所以采用熵模型拟合的分布
来作为
的估计,因此率失真中的速率可以表示
和
的交叉熵,说白了,就是去计算
的熵。
(这里其实和变分自编码器有些关系,感兴趣的可以去看一些VAE的推导,其实也挺有意思的)
从变分编码、信息瓶颈到正态分布:论遗忘的重要性-CSDN博客
三、近些年的研究总结
端到端网络要具有可训练性,就需要解决量化不可微的问题,即需要通过可微分的方式来近似量化,目前主要的方法有:添加均匀噪声替代噪声、直接舍入并反向传播梯度、用从软到硬的矢量量化代替直接标量量化使其平滑以及设计一个额外学习量化参数的模型。
解决了量化的问题后,下一个问题是如何减少空间冗余。变换通常是减少冗余的关键步骤,主要的方法有:CNN形式:GDN等具有增强的非线性残差块。先进卷积架构:注意力机制、非局部网络、可逆结构也能提高建模能力。递归神经网络:通过迭代逐步推断潜在表示。
变换后,就需要用熵编码对潜在表示来编码实现进一步压缩。熵编码的基本思想就是概率大的用更少的比特编码。早期方法是用元素独立的熵模型估计潜在表示的概率分布再算术编码。后来又拓展到超先验、预测模型以及其他学习参数模型中来估计熵。
这些都是以变换编码为框架的方法,作者还介绍了一些基于GAN的方法,也表现出了较好的性能。(但我目前还没阅读过GAN相关的,以后有时间多读读)
四、图像压缩的框架对比
目前的压缩框架有两种:一次前馈框架和多级递归框架。一次前馈的框架如果要压缩图像到多个比特率下,就需要训练多个模型。多级递归由于每次都是迭代的对原始信号和残差信号压缩,来通过迭代次数控制率失真权衡,因此可以实现可变比特率的压缩。
(一)一次前馈框架
毫无疑问,最经典的仍然是Balle提出的端到端CNN模型结合GDN网络层的框架,并且后期还提出了超先验网络来单独对每个像素建模,通过边信息的提取来改善熵估计。另一种就是Theis等人提出的利用残差块拓展网络深度的方法。还有一种采用多尺度结构的方法。
图1:Balle的框架
图2:Theis的框架
图3:多尺度的框架
GDN层的引入能提升压缩性能,但它作为BN层的替代,提升并不是非常的大(至少和超先验比起来不算大)。作者在这里还说明了一个观点:通常来说更深层的网络会带来性能增益,但对图像压缩则不明显,更深的网络还存在难训练的问题,尤其是要通过信息瓶颈。
(二)多级前馈框架
多级前馈的过程可以根据图来理解,经过一次编解码迭代后,将重构图像和原始图像的残差送入第二次迭代作为输入,它经过一次编解码迭代后也会得到一个残差,这种方法通过逐步压缩残差和残差的残差来达到较大的质量。而重构的时候则需要将残差加在一起形成解码图像。同时网络还加入了LSTM来提高多残差建模的效果,图4中的(b)可以看出这个过程,将当前处理的残差和前一阶段的状态都作为输入在迭代中更新和传播。
还有论文提出了多种聚合方案,(c)中的第一个方法就是基本增量迭代,将所有输出相加形成解码图像,每一次输出去近似前一次残差。(d)跳连结构,将多级结构作为剩余网络处理(不是很懂,就是对第一个方法的反着来?)。(e)状态传播,每次残差都直接去预测原始图像。
图4:多次前馈的网络框架
(三)比较分析
对比一下它们的性能
1)多次递归可以直接实现可变比特率
2)单次前馈反向传播路径较短,而且由于网络较浅,训练不会很耗时
3)残差信号和图像信号在本质上不同,递归模型训练更有挑战性
4)递归模型在编解码上需要花更多时间
根据目前的研究来看,单次迭代的性能更好,但可变比特率又更贴近实际需求。
五、熵模型
熵模型是非常重要的组成部分,从信息论来看,编码信号所需的比特率由信息熵确定,而信息熵对应到符号的概率分布。所以会将熵编码直接嵌入端到端模型中,并用于估计潜在表示的概率分布,而且还要对熵施加约束来降低比特率。
显然对于理想的一个熵模型,它应该能最精确的估计出元素的联合分布。早期工作是将元素假设为独立分布来简化设计,但并不能很好的去冗余,所以后面提出了各种的方法来进一步处理冗余。包括:给定数据集的统计分析、上下文预测分析、超先验等进行熵建模。熵模型会对元素的似然进行估计,对数似然期望是编码这些元素的比特率界限(结合率失真联合优化的损失函数理解)。绝大多数的论文会采用算术编码进行实际有损编码。
具体的各种熵模型可以看这张表,概况的很准确:
六、作者提出的由粗到细的模型
(一)由粗到细的超先验模型
端到端模型的非线性分析变换和合成变换已经老生常谈了,这里直接通过公式看熵模型,是熵模型,
是将潜在表示量化为离散向量后的结果。熵模型目的有两个:第一,用
来拟合真实
的分布
。第二,通过估计熵来最小化率失真函数。而上述公式则表明联合概率分布可以分解为顺序条件概率的乘积。这里的
就是超先验。
这里和之前的超先验模型没区别,作者提出了两个问题:首先,要保证压缩效果则必然不能存在较多的维度和比特率。但这就导致超先验无法提供足够多的信息来对条件概率准确建模,尤其是更高比特率和分辨率的情况下(因为超先验是接在第一个变换后的,具体可以阅读Balle的超先验相关论文)。其次,上下文模型是能提高准确率,但它是顺序执行的,而且很难大规模并行计算加速。所以这个模型的问题在于对不同大小的输入图像可伸缩性较低。
所以作者在这里采用了多层条件框架,提高对不同大小图像的拓展性。
这是原本的拟合分布等式(是由
生成的,所以第一个等号成立没有问题),如果
比较复杂,
就需要更多信息来进行准确条件重建,所以作者的做法是,再加一个附加层:
这就是由粗到细的超先验模型(超超先验模型?)
那也可以表示出了:
那么通过神经网络建模这些条件分布就可以了:
作者采用了与现有上下文模型不同的地方,现有模型是根据块条件来指导上下文模型的(就是Balle,2018年的那篇),而本文中每个元素的概率估计都利用了由粗到细的更大区域的信息。这有助于探索图像的长期相关性。尤其是对于高分辨率图像而言。(就是超超先验吧)
《Joint autoregressive and hierarchical priors for learned image compression》 上下文模型
这是作者使用到的概率估计模型:
(二)网络框架
看过先前的端到端框架就很容易理解了,先给出这里的框架图:
对每个元素的建模还是一样建模为非零均值的高斯分布,由于的潜在是需要
的信息得出的,所以最后的建模可以这样写,
是标准正态的累积分布函数,均值和方差由
算出:
由于在对的建模是近似因式分解的,如上面
的概率公式 ,所以直接用零均值高斯建模其中的每个元素即可。
还需要注意的是,所谓的每个元素建模中,其实每个是每个通道中的方差独立,而同一个通道中的元素方差
仍然是相同的。
对于最后拟合出来的的分布,它的损失函数也类似之前,比特率一样的计算:
有意思的是,作者为了保证让尽可能的保留下
的关键信息,引入了一个额外的信息保真度损失,来看它的公式:
其中是一个没有非线性激活的卷积层,就是用它处理一下
,并计算两者的最小二乘法,来指导
的生成。
(三)信号保持超变换
这里作者提出了一个观点,为了尽可能进行由粗到细的建模,就需要在后续超层中在变换后同时又要保留信息。为了这个目的作者提出了这个信号保持超变换框架。
什么意思?经过第一次非线性变换得出后,其实潜在分布中的像素相关性已经被剔除了很大一部分,所以它的局部相关性其实很弱了,那么再用超变换层对其再生成进一步的潜在分布并不合适,因为大卷积核本身就是要依赖局部相关性实现特征提取。(不能直接一步就把图像的相关性榨干),那怎么办,限制卷积的维度来让它能逐步因式分解,但这又导致第一步变换处理的时候会丢失大量信息。
就是存在两个问题:
1)第一步变换会固定通道数量而且要下采样,就降低了潜在表示的维度。
2)将大卷积核组合激活函数就会丢失未变换的信息
所以对于超变换层,作者提出了用小核来且部分没有采用非线性激活层。而且在后续层进行1*1卷积。总的来说,在前几层中进行了Space to Depth的操作来拓展维度,通过拓展保留原始表示信息,让它过完一些非线性层(去冗余)后,再1*1卷积核进行降维使其表示的更为紧凑,整体的超变换详细框架如表:
(四)面向重构的信息聚合
重建问题,因为解码需要充分利用比特流提供的信息才能保证高质量的重构,由于这里我们采用了超先验提供的边信息来融合信息。(就是如何让超先验和超-超先验来指导原始潜在分布进行图像重建)。信息聚合解码框架如图:
根据框架来阐述:首先将主潜在表示和高阶潜在表示都上采样到图像大小的一半,然后将两种潜在表示级联融合,融合后由残差块进一步处理恢复到输出图像。将主表示和超表示融合有助于解码重建,高阶表示会提供全局信息,而其他表示保留细节。
(五)一些实现细节
1)使用不同的指标,MSE和SSIM都各自测试。
2)数据集采用DIV2K数据集,都是2K图像,不过处理的时候将图像分辨率将一半
3)在每次迭代中随机抽256*256的小块(?)
4)多步训练,先迭代20000次训练主变换部分,固定主变换后训练20,000次超变换(两个超变换各20,000次应该)。最后对整个框架再训练400,000次。
七、结果展示
在这里,作者对比多种端到端的方案,并且用结果图直观的看出它们的性能对比,还对自己提出的由粗到细的框架和信息融合方法分别进行了消融实验,都取得了较好的效果。
各种压缩方案的对比
不同数据集适用的bpp和PSNR范围
以BPG444为标准的相同失真水平下的性能超越程度 (-7%代表相比于标准节省7%的比特)
一些有趣的结果:
1)不同MSE下训练出来的模型在MS-SSIM上会表现出不同的性能,但通常来说,MSE优化出来的PSNR结果更好的模型在MS-SSIM中会表现得更好。但如果用MS-SSIM训练,在给定比特率范围内可能会显示出较低的PSNR值。所以有关客观度量和主观度量的研究还有待进步。
2)采用VGG L4损失来度量原始图像和重建图像的损失,并给出了结果,可以用于结合第一条的结果来看
总结一下:
这篇文章的作者对端到端的图像压缩文章了解的很透彻,而且所提出的由粗到细的超先验模型更是达到了超过Balle的那篇非零均值高斯的那篇文章结果,所以这篇文章可能是目前效果最好的端到端压缩方案之一?不管怎么说,还是很值得学习的。
本人初学深度学习图像压缩不久,对相关知识很多也是一知半解,如有错误,欢迎各位读者批评指正,感谢各位阅读。