深度学习图像压缩_1-概述:自编码器、量化、熵编码、率失真

目前,基于深度学习的端到端图像压缩效果已经接近或超越了很多传统算法,这里简单总结了几项端到端压缩算法的关键技术,以及个人的一些理解。

1、自编码器Autoencoders

目前端到端的图片压缩大多使用了自编码器结构。这里的自编码器可以理解为是一种神经网络,label与输入相同,目的是让输出接近于输入,可以用于提取特征。例如图1-1,Hidden2层只有150个节点,可以小于输入和输出的784个节点,具有压缩效果。
深度学习图像压缩_1-概述:自编码器、量化、熵编码、率失真_第1张图片
目前主流的的端到端图片压缩大体上可以分为神经网络编码、量化、熵编码、熵解码、神经网络解码几个步骤。熵编码是无损的,因此熵编解码可以不出现在训练中。

2、量化

模型反向传播中通过梯度下降来优化,要求计算过程可导,但是量化是一个不可导的过程。下面几种方法可以用来处理这个问题。

2.1、添加均匀噪声

这种方法的实现过程是,在训练中,使用添加噪声来替代量化的过程。
按照个人的理解,对于通常的量化,例如将0到10量化为5,11到20量化为15,量化前的数和量化后的数字相比,差值类似与一种均匀噪声,因此可以用添加噪声来模拟。论文[3]使用了这种方法。

2.2、软量化

这里主要参考论文[2]关于量化部分的描述。对于z=[z1, z2, z3, …]为了将zj量化为符号cj,需要在c=[c1, c2, c3, …]中选择最接近zj的cj,用来表示zj。因此,量化过程可以认为是:
在这里插入图片描述
在反向传播中,为了使网络可导,量化可以代替为:
深度学习图像压缩_1-概述:自编码器、量化、熵编码、率失真_第2张图片
这样相当于是对c=[c1, c2, c3, …]进行加权平均,约接近zj的权重越高,这种方法被称为软量化。
为了在正向传播使用普通量化,反向传播使用软量化,tensorflow中可以使用tf.stopgradient()函数,函数内部分只在正向传播出现,反向传播中函数返回值为0。
在这里插入图片描述

2.3 线性模型量化

某些网络会进行二值化,将特征值量化为0或1。
在这里插入图片描述
除了使用上述方法,也可以使用线性模型:
深度学习图像压缩_1-概述:自编码器、量化、熵编码、率失真_第3张图片
同样在正向传播使用正常量化,反向传播使用线性模型量化。论文[1]使用了此方法。

3、熵编码

对于量化后的特征值,还需要进行熵编码来进一步压缩。常用的熵编码方法是算术编码,重要的是设计高效的概率模型。

3.1 独立熵编码

由于熵编码部分可以不写到网络中,熵编码可以独立于自编码器单独设计。但是这样可以利用的信息较少,概率模型可能不够准确。

3.2 基于上下文的熵编码

设计一个概率模型网络,使用已经解码的信息作为网络输入,预测概率作为输出,在训练中同时训练概率模型网络和自编码器。论文[2]使用了这种方法。

3.3 基于边信息的熵编码

设计网络提取边信息,用来预测特征量化值的分布,边信息同样写入码流中。论文[3]使用了这种方法。

3.4 基于上下文和边信息的熵编码

可以同时使用两种信息作为概率网络的输入,例如论文[4]。

4、率失真控制

图片压缩的目标有两个,一个是码率R低,一个是失真D小,因此网络loss函数常用这两项,与传统的率失真相一致。
loss = lambda * D + R
失真D可以使用mse,msssim等来衡量。码率R可以概率模型的预测分布衡量。
通过改变lambda的值,可以得到用于压缩不同质量和码率图片的网络。这是一种较为粗糙的控制方式,目前更好的率失真控制算法也在研究中。

[1] Learning Convolutional Networks for Content-weighted Image Compression
[2] Conditional Probability Models for Deep Image Compression Fabian
[3] Variational image compression with a scale hyperprior
[4] Joint Autoregressive and Hierarchical Priors for Learned Image Compression
*

你可能感兴趣的:(图像压缩,视频编码)