端到端的图像压缩------《End-to-end optimized image compression》笔记

2023-11-19

论文地址:https://arxiv.org/abs/1611.01704

代码地址:https://github.com/tensorflow/compression

Balle  google大神,入门必读。该文章仅供本人笔记用,如果问题欢迎讨论。

简介

整体算法分为三个部分:非线性分析变换(编码器),均匀量化器和非线性合成边变换(解码器),在整个训练框架上联合优化整个模型的率失真性能。在某些条件下,松弛损失函数可以解释为由变分自动编码器实现的生成模型的对数似然,即和变分自编码器的损失函数某种情况下有点像。另外,每一个折衷参数对应一个压缩模型,所以整个R-D曲线是由模型构成的R-D点形成的。

内容

整体算法结构以及流程如下:

!](https://img-blog.csdnimg.cn/20201205140711473.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyMjgxNDI1,size_16,color_FFFFFF,t_70)

在这里插入图片描述
x x x x ^ \hat{x} x^ 分别代表输入的原图和经过编解码器后的重建图片。 g a g_a ga表示编码器提供的非线性分析变换, y y y即由输入图片经过编码器网络后得到的潜在特征,通过量化器 q q q后,得到 量化后结果: y ^ \hat{y} y^,再通过 g s g_s gs解码器重建图片结果.

其中,通过对 y y y的码率估计得到 R R R,计算原图 x x x x ^ \hat{x} x^ 的失真得到 D D D g p g_p gp是指一种失真变换,可以将原图和重建图进行通过 g p g_p gp 转化到感知空间上进行计算,,直观的作用可以理解为失真计算: D = d ( x , x ^ ) D=d(x,\hat{x}) D=d(x,x^),例如PSNR,MS-SSIM,或者其他感知域如 VMAF 等。通过得到的 R R R D D D 进行率失真联合优化,定义损失函数为: L = λ ⋅ D + R L=\lambda\cdot D+R L=λD+R通过 λ \lambda λ 参数进行码率的选择控制, λ \lambda λ 大则训练得到的模型的重建图失真,而压缩后的码流大,反之亦然。

激活层改进:受到生物神经元的启发,在编码器与解码器中,论文使用了GDN(广义除数归一化),该激活层在论文中《Density modeling of image using a generalized normalization transformation》有着详细的描述,该激活层实践中比BN层更适用于图像重建工作。其中与BN层的差别:BN层重新调整网络中线性滤波器的响应,以便将其保持在合理的操作范围内。这种类型的归一化不同于局部增益控制,因为在所有空间位置上重新缩放因子是相同的。此外,一旦训练完成,缩放参数通常是固定的,这将归一化转换为数据的仿射变换,不同于GDN那样,GDN是空间自适应的,并且可能是高度非线性的。

量化问题:传统的图像编码中,量化有着不可微分的问题,为分段函数,且在非边界点的导数为0,截断反向传播,在边界点则不存在导数。作者采用基于概率模型连续松弛的代理损失函数(没理解什么意思),用加性均匀噪声代替量化步骤(就是加了-0.5到0.5区间的均匀噪声)。

前向传播

在非线性分析变换(编码器)中 g a g_a ga 包含有三个阶段:卷积,降采样(就是用的卷积层进行的降采样工作),GDN归一化。以下公式预警:

卷积 v i k ( m , n ) = ∑ j ( h k , i j ∗ u j k ) ( m , n ) + c k , i v_{i}^{k}(m,n)=\sum\limits_{j}(h_{k,i j}*u_j^{k})(m,n)+c_{k,i} vikm,n=j(hk,ijujk)(m,n)+ck,i v i k ( m , n ) v_{i}^{k}(m,n) vikm,n) i i i个输出的通道在第 k k k层的网络的输入,总共有3层,所以k最大为3,其中( m m m, n n n)代表长宽的二维的位置。 ∗ * 是卷积操作,上述公式描述输入在
经过卷积层后的输出。

采样 w i k ( m , n ) = v i k ( s k m , s k n ) w_i^{k}(m,n)=v_{i}^{k}(s_km,s_kn) wik(m,n)=vikskm,skn 上述公式, s k s_k sk是采样因子,即几倍采样。一般采样与卷积运算在代码中统一实现。

GDN u i k + 1 ( m , n ) = w i k ( m , n ) ( β k , i + ∑ j r k , i j ( w j k ( m , n ) ) 2 ) u_i^{k+1}(m,n)= \dfrac{w_i^{k}(m,n)}{\sqrt{(\beta_{k,i}+\sum\limits_jr_{k,ij}(w_j^{k}(m,n))^2)}} uik+1(m,n)=(βk,i+jrk,ij(wjk(m,n))2) wik(m,n)所有的待优化参数 h h h(卷积核权重), c c c(卷积核偏置), r r r(GDN的归一化系数)都在整个端到端中被优化。

后续在解码端中的公式不例举辽,这部分内容说白了就是把神经网络作用给抽象公式化。

变换优化问题

     在传统的图像编码中,对于DCT生成的系数需要进行量化,通常采用了矢量量化的形式并且结合熵编码进行率失真控制。在该论文并没有直接在编码空间进行最优量化(矢量),而是通过一个固定的标量量化器进行量化(四舍五入),试图让分线性变换(编码器)进行自动学习,以学习到的方式扭曲量化空间,从而有效实现矢量量化。整体框架通过以下公式进行优化: L = − E [ l o g 2 P q ] + λ ⋅ E [ d ( z , z ^ ) ] L=-E[log_2P_q]+\lambda\cdot E[d(z,\hat{z})] L=E[log2Pq]+λE[d(z,z^)]通过计算熵与失真进行率失真优化,其中两个期望值通过训练集的平均值进行拟合。并且通过非线性分析学习量化特征即矢量量化结构,则本文采用标准量化: y i ^ = q i = r o u n d ( y i ) \hat{y_i}=q_i=round(y_i) yi^=qi=round(yi) i i i 覆盖了所有的,待编码的数值,并且 y i ^ \hat{y_i} yi^ 的边缘密度一系列离散概率密度质量给出: P q i ( n ) = ∫ n − 1 / 2 n + 1 / 2 p y i ( t ) d t P_{q_i}(n)=\int_{n-1/2}^{n+1/2}p_{y_i}(t)dt Pqi(n)=n1/2n+1/2pyi(t)dt p y i ( t ) p_{y_i}(t) pyi(t) y y y的概率密度函数,由于四舍五入,在某一整数的(-0.5,0.5)区间内都会量化为该整数,则通过积分的形式计算这一区间内的数值的出现概率,得到量化后的整数的出现概率。

     上述公式均涉及到量化问题,但是量化会导致不可微分,阻断反向传播优化的问题。论文中采用了添加(-0.5,0.5)范围的均匀噪声,在训练过程中,即采用这种形式近似可微以用于反向传播的优化,在推理过程中,则依旧使用 r o u n d round round 函数进行四舍五入(因为不用进行优化了),使用均匀噪声有两个优点:

首先, y ~ = y + n o i s e \tilde{y} = y+noise y~=y+noise 的密度函数是 q q q的概率质量函数的连续松弛

y i y_i yi是编码空间的元素,就是需要被编码的值, y i ^ \hat{y_i} yi^ 是四舍五入后的值, y i ~ \tilde{y_i} yi~ 是通过添加噪声后的值,上述是三者的概率密度函数(PDF),离散的 y i ^ \hat{y_i} yi^是概率质量函数(PMF),其中黑点的数值由实线在各自区间内取积分得到的,但是其实不一定等于虚线在区间内的积分,只能是近似关系(论文中说相等,我不信=-=)。即可以通过这种近似关系,合理等于两者的微分熵,换个说法就是加均匀噪声后,不影响码率的估计。

其次,独立的均匀噪声就其边际矩(我也不知道什么是边际矩)而言近似于量化误差,并且经常被用作量化误差的模型(Gray and Neuhoff,1998)。

针对y的宽松概率模型和熵代码在代码空间中假设独立的边际,则通过进行参数建模以减少码率估计模型与实际模型之间的差距,具体使用精细采样的分段线性函数,这些函数与一维直方图的更新类似(请参见附录)即通过神经网络生成编码点的PMF,通过PMF的积分求得每个特征点对应的可导形式的概率值,通过对概率值求自信息得到估计的码率点,在前向传播中,通过训练阶段生成的神经网络生成分位点与CDF,将CDF与待编码点输出range coder进行熵编码。
以用于熵编码。 由于编码数值的概率密度函数被均匀噪声平滑,这部分会导致一定的误差,但是通过减小采样间隔可以使得模型误差任意小。

整个过程可以公式得到: L ( θ , ϕ ) = E x , △ y [ − ∑ i l o g 2 p y i ˉ ( g a ( x ; ϕ ) + △ y ) ; ψ ( i ) + λ d ( g p ( g s ( g a ( x ) ; ϕ ) ) , g p ( x ) ) ] L(\theta,\phi)=E_{x,\triangle y}[-\sum_ilog_2p_{\bar{y_i}}(g_a(x;\phi)+\triangle y);\psi_{(i)}+\lambda d(g_p(g_s(g_a(x); \phi)),g_p(x))] L(θ,ϕ)=Ex,y[ilog2pyiˉ(ga(x;ϕ)+y);ψ(i)+λd(gp(gs(ga(x);ϕ)),gp(x))]量化以及 ψ \psi ψ的分段线性逼近很适合随机优化(我看不出=-=!)

变分推导问题

再论,等下一篇超先验网络结构模型进行推导吧。

实验结果

在这里插入图片描述
左图为量化所引起的误差和均匀噪声引起的误差的关系,右图为离散情况下的熵率以及可微分情况下的熵率的关系,可以得出,本文提出的量化模型以及熵率估计模型与实际中量化引起的误差和待编码值得熵率近似一致。

在这里插入图片描述
以及在实际中,得到得R-D性能,PSNR,MS-SSIM性能指标熵超过了JPEG2000压缩标准。其中在PSNR度量标准上是通过MSE为失真指标进行训练的,而MS-SSIM是在MS-SSIM指标上进行训练到。并不是一种失真模型对应两个失真指标。即MSE训练了六个lambda的模型,MS-SSIM训练了六个lambda的模型。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
通过主观感受可以看出,本文提出的算法优于JPEG以及JPEG2000。

结论

该论文还是着重与量化和熵率估计的问题,论述了添加均匀噪声的量化的合理性以及对于熵率估计的影响,包括提出了如何使得熵率估计模型可微分以及CDF的学习以用于熵编码的情况。并且确定了在图像压缩框架中,标量量化可以通过编码器的非线性分析达到矢量量化的效果(期望这种非线性分析可以学习得到)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

端到端的图像压缩------《End-to-end optimized image compression》笔记 的相关文章

  • Verilog学习记录4——Verilog +: / -:语法

    Verilog 语法 看到这个语法的时候是在分析 IP AXI4 STREAM DATA FIFO的example时碰见的 然后查阅了资料 做出如下理解 变量的定义可以分为大端和小端 由于实际使用中变量常定义成大端 所以这里对小端不进行分析
  • 【华为OD机试】分糖果【2023 B卷

    华为OD机试 真题 点这里 华为OD机试 真题考点分类 点这里 题目描述 小明从糖果盒中随意抓一把糖果 每次小明会取出一半的糖果分给同学们 当糖果不能平均分配时 小明可以选择从糖果盒中 假设盒中糖果足够 取出一个糖果或放回一个糖果 小明最少

随机推荐

  • VS-code出现注释乱码以及VS调试过程中出现汉字乱码问题

    文章目录 VS VS code 1 前言 2 方法 VS Notepad 方法 VS VS code 1 前言 Visual Studio Code 简称VS code 是如今我们常用的一款编辑器 但是可能一些用户会需要其他软件进行调试等
  • 一次线上生产系统内存泄漏排查与优化实践

    今天给大家分享一个我们之前基于dubbo开发一个线上系统时候遇到的内存泄漏生产问题的排查与优化实践经验 相信对于大家多看一些类似的案例 以后对于大家自己在线上系统遇到各种生产问题的时候 进行排查和优化的思路会有很大的启发 内存泄漏问题发生背
  • begin to drop messages due to rate-limiting

    对于syslog保存的日志会有很多重要信息 但是一旦打印的日志数量超过设置的阈值 就会丢掉 imuxsock pid 48 begin to drop messages due to rate limiting 这是在调试时不愿看到的 可以
  • 【论文笔记系列】AutoML:A Survey of State-of-the-art (上)

    之前已经发过一篇文章来介绍我写的AutoML综述 最近把文章内容做了更新 所以这篇稍微细致地介绍一下 由于篇幅有限 下面介绍的方法中涉及到的细节感兴趣的可以移步到论文中查看 论文地址 https arxiv org abs 1908 007
  • yolo 车辆测距+车辆识别+单目测距(双目测距)

    基于yolo目标检测算法实现的车前道路中的车辆和行人检测 并且可以估测出目标与本车之间的距离 一 视频展示 yolo车距1 订阅专栏获得源码 提供完整代码 无需看下文 二 单目测距原理 图中有一个车辆 且车辆在地面上 其接地点Q必定在地面上
  • 用KNN(K近邻算法)和ANN(人工神经网络)建立预测模型

    数据 输入 32 维的向量 输出一个值 有151组这样的数据 目的 用这样一组数据建立一个预测模型 输入32维的向量就能预测一个值 代码部分 1 导入工具包 在import pandas as pd import seaborn as sn
  • 机器学习算法Python实现:tfidf 特征词提取及文本相似度分类

    coding utf 8 本代码主要实现了对于商品名称根据tfidf提取特征词 然后基于已经训练好的word2vec模型 对每行商品的tfidf值大于某一阈值的特征词相似度匹配已经给定的商品类别 import jieba import ji
  • 有趣算法之C++函数模板

    C 函数模板 20200924 原文链接 https www runoob com w3cnote c templates detail html 原文正在慢慢理解中 模板是C 支持参数化多态的工具 使用模板可以使用户为类或者函数声明一种一
  • Qt-信号和槽

    一 Qt信号和槽机制 emit的使用 一 相关概念 1 信号 Signal 就是在特定情况下被发射的事件 例如PushButton 最常见的信号就是鼠标单击时发射的 clicked 信号 一个 ComboBox 最常见的信号是选择的列表项变
  • 【SQLSERVER】 "in"的替换方法

    期望效果 select From Empoylee Where Address1 Address2 in Select Address1 Address2 From EmpoyleeAdresses Where Country Canada
  • iOS架构-组件化(项目框架搭建2)

    静态库引用静态库 如果像上图一样 直接在业务层组件引用数据层组件的文件 则会报错 因为组件之间没有建立引用关系 如下图 静态库如何引用Pods第三方库 拷贝Podfile文件到项目 打开终端执行pad install 直接引用Pod下面的Y
  • VC++6.0调试工具使用初步

    摘要 程序设计初者学会IDE 集成开发环境 中提供的调试工具 是一件非常重要的事 本文在初学者有初步的程序设计体验 只需要掌握到控制结构 为前提 介绍了单步执行 断点设置及观察程序运行情况的方法 并配有练习的建议 方便读者的学习 相关博文
  • HTTP协议头部与Keep-Alive模式详解

    转自 https www byvoid com zhs blog http keep alive header 1 什么是Keep Alive模式 我们知道HTTP协议采用 请求 应答 模式 当使用普通模式 即非KeepAlive模式时 每
  • Bootstrap导航

    Bootstrap 导航 1 定义导航组件 基本结构 ul class nav li class active a href 首页 a li li a href 导航标题1 a li li a href 导航标题2 a li ul 1 1
  • Code39码和Code93码的区别

    条形码可以标示出产品的生产国 制造厂家 图书分类号 邮件起止地点 类别 日期等许多信息 因而在很多领域都得到了广泛的应用 尤其是那些可以同时支持字母 数字 字符这些字符集的条码 比如Code39和Code93 都是可以支持多种字符集的条形码
  • ios游戏开发

    知识系统 英文教程网站 http www csdn net article 2012 12 20 2813035 game dev guide 开发类库 http www csdn net article 2012 11 07 281158
  • Jmeter动态吞吐量实现

    在容量测试时 控量 是非常重要的 JMeter 是根据线程数大小来控制压力强弱的 但我们制定的压测目标中的指标往往是吞吐量 QPS TPS 这就给测试人员带来了不便之处 必须一边调整线程数 一边观察 QPS TPS 达到什么量级了 为了解决
  • 本地视频播放器

    这是一个基于VUE Go做的一个本地视频播放器项目 欢迎fork或star 使用指南 本地开发 安装依赖 npm install 开发模式 npm run dev 打包 npm run build 启动后端 bee run 直接使用 解压
  • “条件递进式编程”技巧两例

    什么是 条件递进式编程 呵呵 这是我自己起的名字 所谓条件递进式编程 就是指需要一系列相关函数组合执行的情况下 后续函数执行的必要性由前面所有函数执行是否成功来决定 比如说 有一系列函数如下DoSomething1 DoSomething2
  • 端到端的图像压缩------《End-to-end optimized image compression》笔记

    End to end optimized image compression 简介 内容 整体算法结构以及流程如下 前向传播 变换优化问题 变分推导问题 实验结果 结论 论文地址 https arxiv org abs 1611 01704