zoukankan      html  css  js  c++  java
  • Video Compression through Image Interpolation(ECCV 2018)

    用图像插值来重建关键帧以外的帧。但是用普通的U-Net很难正确地消除moving patterns的轨迹的歧义,因此直接把离线光流估计(来自块运动估计或光流)合并到网络中

    新的结构用pre-computed的运动估计来对空间U-net特征进行插值

    Preliminary:
    (I^{(t)}inmathbb{R}^{W imes R imes 3})表示帧,(t in { 0,1,...})

    目标是把帧(I^{(t)})压缩成二进制码(b^{(t)}in {0,1}^{N_t})

    Encoder E: (left{I^{(0)}, I^{(1)}, ldots ight} ightarrowleft{b^{(0)}, b^{(1)}, ldots ight})

    Decoder D: (left{b^{(0)}, b^{(1)}, ldots ight} ightarrowleft{hat{I}^{(0)}, hat{I}^{(1)}, ldots ight})

    Two competing aims:

    1. 最小化total bitrate (sum_t N_t)
    2. 尽可能忠实的重建原视频,用(ell (hat{I},I)=| hat{I}-I |_1)来衡量

    首先考虑Image Compression:
    最简单的Encoder-decoder过程,对每个图像都独立处理,(E_I: I^{(t)} o b^{(t)},;D_I:b^{(t)} o hat{I}^{(t)})

    这里以Full resolution image compression with recurrent neural networks中的model为基础,在逐步的超过K次迭代中编码重建图像

    每次迭代,模型对previous coded image和original frame间的残差(r_k)进行编码

    [r_0:=I \ b_k:=E_I (r_{k-1},g_{k-1}) \ r_k:=r_{k-1}-D_I (b_k,h_{k-1}) \ for;k=1,2,... ]

    (g_k)(h_k)是每次迭代时更新的潜在Conv-LSTM状态

    如果(r_0:=I)表示一帧的话

    (k=1)

    [b_1=E_I (r_0,g_0) ]

    [r_1:=r_0-D_I (b_1,h_0) ]

    理解为(r_1)表示原始帧和经过Encoder-Decoder后的图像的残差

    那当(k=2)

    [b_2=E_I (r_1,g_1) ]

    [r_2:=r_1-D_I (b_2,h_1) ]

    (对残差经过Encoder-Decoder之后和原残差的残差?)

    训练目标是最小化所有步中的失真distortion (sum_{k=1}^{K} | r_k |_{1})

    重建结果为(hat{I}_{K}=sum_{k=1}^{K} D_I (b_k))

    选择不同的(K),就会得到不同的二进制编码

    Encoder和Decoder包含了4个stride=2的Conv-LSTM,bottleneck由一个L通道,空间分辨率为(frac{1}{16})width( imes frac{1}{16})height的二元特征映射(binary feature map)组成的。

    这个结构对image compression来说能达到sota performance,但是它没有利用时间冗余(temporal redundancy),所以用来video compression肯定是不行的

    再说到Video Compression,现在的视频编码先用Encoder (E_I)和Decoder (D_I)处理I帧,在P帧中存储块运动估计(mathcal{T}in mathbb{R}^{W imes H imes 2})(类似于光流场),和残差图像(mathcal{R})。运动估计和残差都用熵编码来联合压缩,对图像中的每个像素(i),原始颜色帧(original color frame)用下面的来代替

    [I_i^{(t)}=I_{i-mathcal{T}_i^{(t)}}^{(t-1)}+mathcal{R}_i^{(t)} ]

    压缩由块结构和运动估计(mathcal{T})唯一定义,残差就是运动插值后的图像和原图像的差。

    本文就是用图像插值来压缩视频,利用运动信息对图像插值网络进行扩充,增加了可压缩的bottleneck层。

    编码解码器首先用Toderici等人的方法(应该指的是这篇?Full resolution image compression with recurrent neural networks,有空再看)来对I帧编码。每隔n帧选一个I帧,剩下的n-1帧通过插值得到,称为R帧。(实际中选n=12)

    先来看最简单版本的编码解码器,所有R帧都从关键帧(I_1)(I_2)中插值得到

    训练一个上下文网络(C:I o {f^{(1)},f^{(2)},...})来从不同空间分辨率中提取一系列的特征映射(f^{(l)}),令(f:={f^{(1)},f^{(2)},...})。实现时用U-net结构中的上卷积特征映射(upconvolutional feature maps)在原始图像上增加了(frac{W}{8} imesfrac{H}{8},frac{W}{4} imesfrac{H}{4},frac{W}{2} imesfrac{H}{2},W imes H)这几个空间分辨率

    通过这个网络得到关键帧(I_1)(I_2)的上下文特征(f_1)(f_2),再训练一个网络D来插值得到帧(hat{I}:=D(f_1,f_2))。C和D是联合训练的

    这个最简单的模型可以得到高压缩率,但是得不到很好的图像质量,因为R帧捕捉不到I帧中不存在的信息。光靠I帧来插值,没有更进一步的信息,怎么可能忠实的重建那一帧?

    据此,提出了运动补偿插值。就是在网络(?)中加入ground truth motion,定义了像素是从哪里运动过来的。用了光流or块运动估计两种。块运动估计更易压缩,光流的细节更好

    也就是说对每个空间位置(i),用运动信息来扭曲每个上下文特征映射

    [ ilde{f}_i^{(l)}=f_{i-mathcal{T}_i}^{(l)} ]

    根据feature map的分辨率来缩放运动估计,并对小数点的位置用双线性插值。这样decoder用的就是扭曲的上下文特征( ilde{f})

    但是还是只能看见参考图像中的内容,而看不到运动信息之外的信息,目标是将这些剩余的信息尽可能的编码压缩

    最终的插值模型称为残差运动补偿插值,结合了运动补偿插值和压缩后的残差信息,这样就又有运动信息,又有插值帧中区别的信息

    联合训练:1.encoder (E_R) 2.context model (C) 3.interpolation network (D_R)(Decoder?)

    encoder和interpolation network的输入相同,遵循Full resolution image compression with recurrent neural networks中的压缩框架

    以扭曲的上下文( ilde{f})作为条件训练一个可变比特率编解码器(variable bitrate encoder and decoder)

    [r_0:=I \ b_k:=E_R(r_{k-1}, ilde{f}_1, ilde{f}_2,g_{k-1}) \ r_k:=r_{k-1}-D_R(b_k, ilde{f}_1, ilde{f}_2,h_{k-1}) \ for;k=1,2,... ]

    插值网络对时间上接近的图像编码需要的比特位较少,较远的需要更多比特位。

    所以有两个极端。第一种,关键帧对插值帧没有提供任何有意义的信号,那么算法就变成图像压缩(不插值,就压一下图像)。第二种,图像内容不变,那就是一个最标准的插值,不用编码。

    (自己的理解:第一种极端就是插值得到的图像和真实图像差了十万八千里,完全木有关系,那就不编码了,就把真实图像压缩一下。第二种极端就是插值得到的图像就是真实图像,一点没变,那就是普通的插值,不用压缩也就不用编码)

    那既然要压缩,肯定希望不用编码只靠插值就能得到的帧越多越好啊,因此文中引出了一个分层插值方案(hierarchical interpolation scheme)

    最简单的想法是这样,先插一些帧出来,再把这些帧当成关键帧插下一层的帧,像图里这样

    那一层一层往下插,误差肯定越来越大(据说超过三层之后误差就会显著降低性能)

    插值模型(mathcal{M}_{a,b}) references a frames into the past and b frames into the future. (这句没看懂什么意思)

    对每个时间偏移((a,b)),需要训练一个不同的插值网络(mathcal{M}_{a,b}),因为不同的插值表现不同,而我们还希望能尽可能多的重复相同的时间偏移,这样就可以最大化的重复使用训练模型。此外,最小化时间偏移减少比特率(Q: 为啥?),所以要最小化插值中时间偏移的和。

    (Q: 这个temporal offsets到底指的是什么?)

    只考虑比特率和插值网络的数量,最优分层方案是二叉树,每层将一个插值范围分成两个。但是这样,因为三层之后误差较大,(n=8)就是极限了

    它说我们最后一层的时候,每两个之间插两帧而不是一帧

    用的是训练的(mathcal{M}_{1,2})插值模型,对连续四帧(I_1,...,I_4)来说,给定(I_1)(I_4),这个模型预测(I_2),然后再把(I_1)(I_4)调换一下,用同样的模型预测(I_3)

    作者说他也试了每一层都这么插,最后(n=27),但是性能变差了

    所以把(N)帧的视频分成(lceil N/n ceil)组图片,每组独立的插值

    比特率优化:第(l)层用(K_l)个比特位来编码一张图像

    目标是最小化总比特率,但保持所有编码帧的低失真

    用基于beam search的启发式比特率选择方法。先列出I帧模型的所有不同的(m)种可能,先用(m)种可能的比特率试试第一个插值模型,得到(m^2)种组合。当然这些组合中不是所有的都能得到好的MS-SSIM per bitrate效果。把那些不在包络线(envelope)上的组合丢掉,发现只剩下(O(m))种组合,对每一层都这样,最后搜索空间为(O(Lm^2)),实际中会产生好的比特率

  • 相关阅读:
    Weblogic_Server与EJB
    EXTJS中的表格控件(一)
    Javascript trim()函数实现
    Ajax技术的基础
    一个Ajax简单实例分析
    jQuery学习之四document ready文档就绪函数
    jQuery学习之八jQuery解析xml文件(摘录)
    jQuery学习之七jQuery效果
    jQuery学习之二css操作
    jQuery学习之六重命名jQuery库
  • 原文地址:https://www.cnblogs.com/hhhhhxh/p/13224453.html
Copyright © 2011-2022 走看看