H.266/VVC帧间预测总结

一、帧间预测基本原理 

帧间预测是利用视频帧与帧之间的相关性,去除视频帧间的时间冗余信息。统计表明,帧间差绝对值超过3的像素平均不到一帧像素的4%,因此,采用高效的帧间编码方式,可以很大程度上提高视频压缩效率。

目前,主流视频编码标准中采用的基于块的帧间编码方式,基本原理是通过运动估计(Motion Estimate)从相邻参考重建帧中寻找和当前块差别最小的参考块,将其重建值作为当前块的预测块。其中参考块到当前块的位移称为运动矢量(Motion Vector),将重建值作为预测值的过程称为运动补偿(Motion Compensation)

在这里插入图片描述

运动估计

由于视频中通常存在很多运动物体,因此简单地将相邻帧的同位像素作为预测值的预测精度并不高,因此,通常使用运动估计来掌握运动物体的运动情况。通过运动估计,可以在参考帧中找到一个最佳匹配块,最佳匹配块到当前块的位移即为运动矢量,得到运动矢量之后,就可以通过运动补偿得到当前块的预测值。

 运动估计要求当前块在参考帧中某一范围内,找出最佳的匹配块,目前主流标准中常用的匹配准则是SAD准则和SATD准则,即

J=SAD(s,p) + \lambda _{motion} \cdot R_{motion}

 SAD(s,p)表示的是原始块s和匹配块p的绝对误差和,\lambda _{motion}表示编码运动信息(如MV、参考图像索引)等所需的比特数,\lambda _{motion}为运动估计过程中的拉格朗日因子。

由于运动搜索算法复杂度非常高,所以编码器里常用的是快速运动搜索算法,如TZ Search搜索算法

在自然界中,物体的运动具有一定的连续性,所以相邻的两幅图像之间的物体运动可能并不是以整数像素为单位的,而有可能是1/2 像素,1/4 像素等等分像素单位。此时若依然使用整数像素进行搜索,则会出现匹配不准确的问题,导致最终的预测值和实际值之间的残差过大,影响编码性能。因此,近年来视频标准中常采用分像素运动估计,即首先对参考帧的行和列方向进行插值,对插值后的图像中进行搜索。HEVC采用1/4像素精度进行运动估计,VVC中采用1/16像素精度运动估计。

运动矢量MV预测技术

在自然图像中,一个运动物体可能会覆盖多个编码块,这些编码块可能会存在相似的运动信息。通过使用相邻块的运动信息,直接将相邻块的MV用于当前块(不再需要对MV进行编码,Merge技术),或者将相邻块的MV作为当前块的预测MV(仅需要编码原始MV和预测MV之间的差值MVD,AMVP技术),可以大大减少编码需要的比特数,提高编码效率。同时,由于物体运动的连续性,运动矢量在时间域相邻帧之间也存在较强相关性。因此,与图像像素的预测编码一样,当前块的运动矢量可以根据先前已编码的空间相邻块或者时间邻近块的运动矢量进行预测。

1.空域MV预测

空域MV预测技术就是利用与当前块在空间域相邻的编码块的MV作为当前编码块的预测MV。空间相邻块通常包括左上(B1)、上(B0)、右上(B2)、左(A0)和左下(A1)块。

 2.时域MV预测

时域MV预测通常是使用相邻重建帧中与当前待编码块同位置块的运动矢量预测MV。

 二、H.266/VVC中的帧间预测技术

H.266/VVC在HEVC的基础上,增加了许多的编码工具,主要在以下几个方面提升帧间编码性能:

1. Merge/Skip模式

Merge模式可用看作是一种编码模式,该模式是直接将空域相邻MV或者时域相邻MV作为当前编码块的最终MV,不需要进行运动估计(即不存在MVD)。编解码端会使用相同的方式构造Merge候选列表(候选列表中包含相邻块的运动信息,如MV、参考帧列表、参考帧索引等),编码端通过RDO选出最佳的候选MV,并将其在Merge List中的索引传给解码端,解码端通过解码候选索引并使用和编码端相同的方法构建Merge List,可以得到MV。

Skip模式是一种特殊的Merge模式,该模式下跳过了预测残差的变换和量化等,编码端仅需要编码MV在候选列表中的索引,不需要编码量化后的残差。在解码端仅需要解码出相应的运动信息,通过运动补偿得到预测值即作为最终的重建值。该模式下可以大大减少编码比特数。

(1)扩展的Merge模式(Extended merge prediction)

VVC在HEVC的基础上,扩展了Merge模式构造Merge List的方法,Merge List最多可以包含6个候选MV,构造方法如下:

  • 基于空间相邻块的空域MVP(最多提供4个候选MV)
  • 基于同位块的时域MVP(最多提供1个候选MV)
  • 基于历史信息的MVP(不限个数,直到填充到Merge List包含5个候选MV)
  • 成对平均MVP(由Merge List中前两个候选MV平均得到)
  • 零MV

具体细节和代码参考:H.266/VVC帧间预测技术学习:扩展的Merge模式(Extended merge prediction)

(2)带有运动矢量差的Merge模式(Merge mode with MVD)

为了进一步提高Merge/Skip模式下预测MV的准确性,VVC在常规Merge模式基础上,增加了“运动矢量差的”Merge模式。该模式是将常规Merge模式构建得到的Merge列表中的前两个候选MV作为初始MV,在上下左右四个方向上,进行8种步长的搜索,即在初始MV基础上加上一定的偏移MVD得到2x4x8=64个MV,并从中选出率失真代价最小的MV作为最终的细化MV。在编码端,将初始MV在Merge List中的索引、搜索方向索引和搜素步长索引传给解码端。

 搜索步长和方向索引的定义:

Distance IDX

0

1

2

3

4

5

6

7

Offset (in unit of luma sample)

1/4

1/2

1

2

4

8

16

32

Direction IDX

00

01

10

11

x-axis

+

N/A

N/A

y-axis

N/A

N/A

+

具体细节和代码参考:H.266/VVC帧间预测技术学习:带有运动矢量差的Merge技术(Merge mode with MVD)

(3)帧间和帧内联合预测(Combined inter and intra prediction,CIIP)

VVC对于Merge模式编码的CU,加入了帧内和帧间联合预测技术,即使用常规Merge模式通过运动补偿得到帧间预测信号Pinter ; 通过planar模式得到帧内预测信号Pintra 。 然后,使用加权平均对帧内和帧间预测信号进行组合,计算公式如下所示:

其中权重取决于上相邻块和左相邻块的编码模式。

CIIP使用条件:

  • Merge模式编码的CU
  • CU包含至少64个亮度像素(即CU宽度乘以CU高度等于或大于64),并且CU宽度和CU高度均小于128, 

 具体细节和代码参考:H.266/VVC帧间预测技术学习:帧间和帧内联合预测(Combined inter and intra prediction)

在VTM中,Merge/Skip模式的最佳预测MV的选择是在xCheckRDCostMerge2Nx2N函数中实现的。

(4)几何划分模式(Geometric partitioning mode,GPM)

针对运动物体的边缘部分,VVC引入了一种几何划分模式,该模式可以将图像中运动物体的边缘部分,采用更灵活的表示方法。具体地,对于图像中运动物体的边缘CU,可以将其划分为两个非矩形的子CU分别进行单向预测,并进行加权融合,得到整个CU的预测值。

使用GPM模式时,通过几何定位的直线将CU划分为两部分(下图所示)。

 CU划分后的子分区中包含单独的运动信息,每个子分区仅允许单向预测,如下图所示,当前CU的右侧部分来自参考帧P0的MV0预测,左侧部分来自参考帧P1的MV1预测。最终通过使用整数融合矩阵W0和W1进行边缘融合生成最终的GPM预测PG。

为了简化运动信息编码,GPM两个分区的运动信息使用Merge模式编码,GPM模式的候选列表是由常规Merge模式推导而来的。 

 具体细节和代码参考:H.266/VVC帧间预测技术学习:几何划分模式(Geometric partitioning mode)

2. AMVP(inter)模式

与Merge模式不同,AMVP模式更像是一种预测技术。首先通过空域相邻块和时域相邻块构造MV候选列表,并从其中选出最佳的MV得到作为当前块的运动矢量预测值MVP,之后以MVP为搜索起点,进行运动搜索,得到最佳MV,之后将搜索得到的MV与MVP的差值MVD进行编码。解码端通过相同的构建方法构造候选MV列表,通过编码端传来的MV索引和MVD即可得到最终的预测值。

AMVP的候选列表长度为2,构造方法如下所示:

候选MV总共有4种类型:

  • 基于空间相邻块的空域MVP(最多允许两个)
  • 基于时域同位块的时域MVP(和Merge模式时域MV的推导相同)
  • 基于历史信息构建的HMVP
  • 零MV

运动估计:VVC中采用全搜索和TZSearch搜索算法。

具体细节和代码参考:H.266/VVC帧间预测技术学习:高级运动矢量预测(Advanced Motion Vector Prediction)

(1)对称MVD编码(Symmetric MVD coding,SMVD)

对于包含双向运动信息的AMVP模式,可以使用对称MVD编码模式。具体的,在编码时,仅需要编码前向MVD0,后向的MVD1可由MVD1=(-MVD0)推导得到。

 使用条件:

  • AMVP候选包含双向运动信息
  • 当前CU的前向参考帧列表List0中距离最近的参考图像和后向参考帧列表List1中距离最近的参考图像正好处于当前图像的两侧

 具体细节和代码参考:H.266/VVC帧间预测技术学习:高级运动矢量预测(Advanced Motion Vector Prediction)

(2)自适应运动矢量精度(Adaptive motion vector resolution,AMVR)

由于实际运动通常是连续的,因此整像素精度通常不能很好地表示物体的运动。在HEVC中,亮度分量的运动矢量使用1/4像素精度,色度分量的运动矢量使用1/8像素精度;在VVC中,进一步提高了像素精度,亮度分量的运动矢量使用1/16像素精度,色度分量的运动矢量使用1/32像素精度。随着像素精度的增长,预测精度增长,但随之需要大量的编码比特。

综合考虑预测精度和编码比特消耗,VVC提出了自适应运动矢量精度AMVR技术,在CU级对亮度分量MVD采用不同的像素精度进行编码。根据当前CU帧间预测模式的不同,亮度分量MVD编码精度有不同的选取策略:

  1. 常规AMVP模式:1/4亮度像素精度,1/2亮度像素精度,整数亮度像素精度或四倍亮度像素精度。
  2. 仿射AMVP模式:1/4亮度像素精度,整数亮度像素精度或1/16亮度像素精度。

在编码端,需要比较各个精度下的率失真代价并选出代价最小的编码精度作为当前CU的最优精度。为了降低编码端复杂度,避免对每个MVD精度进行四次(Affine AMVP为三次)CU级的率失真代价的比较,在VVC中使用一些快速算法来跳过除了1/4精度以外某些MVD精度的率失真代价检查。

具体细节和代码参考:H.266/VVC帧间预测技术学习:自适应运动矢量精度(Adaptive motion vector resolution)

3. 基于子块的帧间预测技术

之前的帧间预测的运动估计仅考虑了简单的平移运动,但在自然界中还存在缩放、旋转、透视等运动,如果仅使用之前的平移运动模型,无法有效表示缩放等运动。

研究发现,仿射(Affine)运动模型能够很好地描述自然界中的非平移运动,VVC中引入了基于块的放射运动补偿技术,包括四参数模型和六参数模型。具体地,利用块中的两个控制点(四参数模型)或者三个控制点(六参数模型)的MV,来推导出整个块中每个4x4子块的MV,之后分别根据每个子块的MV通过运动补偿得到每个子块的预测值。

 和传统的帧间预测模式类似,Affine模式也分为Affine Merge模式和Affine AMVP模式,Affine Merge模式是通过空间相邻的CU运动信息得到控制点的MV;Affine AMVP模式是根据空间相邻的CU运动信息预测控制点的MV,再以预测的CPMV作为搜索起点进行运动估计,得到最佳的CPMV,并将二者的差值和预测CPMV在候选列表中的索引传给解码端。

(1)Affine Merge模式

对于宽度和高度大于等于8的CU, 可以使用Affine Merge模式。Affine Merge模式中,控制点的运动矢量CPMV是根据空域相邻CU的运动信息生成的,最多有五个候选项,有以下五种方式生成CPMV的候选:

  1. 继承Affine Merge候选项:直接继承其相邻CU的CPMV候选项(最多有两个候选项,上相邻CU最多一个,左相邻CU最多一个)
  2. 构造Affine Merge候选项:使用相邻CU的平移运动的MVs构造CPMVPs候选项(不限个数,直至填充够5个)
  3. 零MV(若不足5,则填充)

(2)Affine AMVP模式

Affine AMVP模式可应用于宽度和高度均大于或等于16的CU。在Affine AMVP模式下,需要传输其预测CPMV在候选列表中的索引以及它和运动搜索得到的实际CPMV的残差Affine AVMP候选列表大小为2,它是通过依次使用以下5种CPMV候选类型生成的:

  1. 继承AMVP候选项:继承其相邻CU的CPMV候选项
  2. 构造Affine AMVP候选项:使用相邻CU的平移运动的MVs构造CPMVPs候选项
  3. 直接使用相邻CU的平移MV
  4. 同位块的时域MV
  5. 零MV

具体细节及代码参考:H.266/VVC帧间预测技术学习:仿射运动补偿预测(Affine motion compensated prediction)

(3)基于子块的时间运动矢量预测(Subblock-based temporal motion vector prediction,SbtMVP)

与HEVC中的时间运动矢量预测(temporal motion vector prediction, TMVP)类似,SbTMVP使用同位图片中的运动场来改善当前图片中CU的运动矢量预测和Merge模式。不同的是,sbTMVP预测的是子CU级的运动。

SbTMVP中使用的子CU大小固定为8x8,SbTMVP模式仅适用于宽度和高度都大于或等于8的CU。

在VVC中,SbTMVP和Affine Merge的候选是共存的,将SbTVMP得到的候选和仿射Merge候选共同组成基于子块的Merge候选列表。 通过序列参数集(SPS)标志启用/禁用SbTVMP模式。 如果启用了SbTMVP模式,则将SbTMVP预测变量添加为基于子块的Merge候选列表的第一项,然后是仿射Merge候选项。

将sbTMVP和Affine Merge共同的候选列表称为基于子块的Merge列表,其大小在SPS中用信号通知,并且基于子块的Merge列表的最大允许大小为5。

具体细节及代码参考:H.266/VVC帧间预测技术学习:基于子块的时间运动矢量预测(Subblock-based temporal motion vector prediction)

4. 帧间预测后处理技术

为了进一步提高帧间预测的准确性,VVC采用了多种帧间预测后处理技术值,以修正帧间预测的预测像素,提高预测性能。主要包含三个技术:

  • DMVR技术:用于修正常规Merge模式双向预测MV,以Merge列表中的双向MV为初始MV,在一定范围内进行镜像搜索,以获得更精确的MV。
  • BDOF技术:使用双向光流技术来修正双向预测的预测值。
  • PROF技术:使用光流技术来细化基于子块的Affine运动补偿预测。

(1)解码端运动矢量细化(Decoder side motion vector refinement,DMVR)

对于常规Merge模式的双向预测,分别在list0和list1中分别找一个运动向量MV0和MV1,然后将MV0和MV1所指向的预测块进行加权得到最终的预测块。DMVR是在进行双向预测时,以MV0和MV1作为初始MV,分别在MV0和MV1附近搜索更精确的MV0’和MV1’。使用双边匹配的方法进行搜索,如下图所示,在初始MV基础上进行搜索获得MV0’和MV1’,计算红色块之间的SAD, 具有最低SAD的MV将成为最终修正的MV,并用于生成双向预测信号。

在VVC中,DMVR仅适用于满足以下条件的CU:

  • CU级Merge模式,且是双向预测
  • 两个参考帧分别位于当前帧之前和之后
  • 前向和后向参考帧到当前帧的距离(即POC差)相同
  • 两张参考帧均为短期参考帧
  • CU至少有64个亮度像素(宽度乘以高度大于等于64)
  • CU高度和CU宽度均大于或等于8
  • BCW使用相等的权重
  • 当前块未启用WP
  • 当前块不使用CIIP模式

 具体细节及代码参考:H.266/VVC帧间预测技术学习:解码端运动矢量细化(Decoder side motion vector refinement )

(2)双向光流技术(Bi-directional optical flow,BDOF)

双向光流技术基于光流概念,将光流的概念引入到双向预测当中,在传统双向预测运动补偿时,采用BDOF得到的运动修正量进一步修正,实现像素级别的运动补偿,而且不增加额外的划分和运动矢量编码,从而提升编码效率。

BDOF仅应用于亮度分量。对于CU中每个4×4子块,通过最小化L0和L1预测像素之间的差异来计算运动修正(V_x,V_y)。 然后,将运动修正值用于调整4x4子块中的双向预测像素。

应用条件:

  • 使用“true”双向预测模式对CU进行编码,即按显示顺序,两个参考帧一个在当前帧之前,另一个参考帧在当前帧之后
  • 从两个参考帧到当前帧的距离(即POC差)相同
  • 两个参考帧均为短期参考帧。
  • CU未使用仿射模式或SbTMVP Merge模式
  • CU有超过64个亮度像素
  • CU高度和CU宽度均大于或等于8个亮度像素
  • BCW权重相等
  • 当前CU未启用WP
  • 当前CU不使用CIIP模式

 具体细节及代码参考:H.266/VVC帧间预测技术学习:双向光流技术(Bi-directional optical flow )

注意:DMVR和BDOF技术的条件非常接近,但两者不是互斥的,即同时满足二者的条件下,会先进行DMVR,DMVR完成后,当满足 dmvrSad > 2 * subWidth * subHeight 条件时,才会进一步进行BDOF。

(3)仿射模式的光流预测细化(Prediction refinement with optical flow for affine mode,PROF)

与基于像素的Affine运动补偿相比,基于子块的Affine运动补偿可以节省内存并降低计算复杂度,但会降低预测精度。 为了获得更好的运动补偿精度,使用具有光流的预测细化(PROF)来细化基于子块的Affine运动补偿预测,而无需增加用于运动补偿的内存。

在VVC中,在基于子块的Affine运动补偿之后,通过添加由光流方程推导出的差来细化亮度预测像素。 

 具体细节及代码参考:H.266/VVC帧间预测技术学习:仿射运动补偿预测(Affine motion compensated prediction)

5. 帧间加权预测技术

在HEVC中,通过对从两个不同参考帧获得的两个预测信号求平均和/或使用两个不同运动矢量来生成双向预测信号。但实际中,同一内容随着时间的变化有可能会产生光线强弱变化或阴影等现象,导致不同帧之间背景相似度很大,但是明暗差别较大,采用简单的平均方式预测误差较大。

研究表明,同一内容亮度变化一般会导致对应位置像素的整体变化。HEVC中使用了帧级加权预测WP技术,VVC在此基础上,引入了CU级双向加权预测技术。

(1)CU级双向加权预测(Bi-prediction with CU-level weight,BCW)

在VVC中,双向预测模式可以对两个预测信号进行加权平均。

 其中w为权重,总共包含5个权重,w∈{-2,3,4,5,10}。权重由预测模式确定。

BCW仅适用于具有256个或更多亮度像素的CU(即CU宽度乘以CU高度大于或等于256)。

(2)加权预测(WP)

加权预测用于修正P Slice或B Slice中的运动补偿预测像素,加权预测表示预测像素可以用一个(适用于P Slice情况)或者两个(适用于B Slice情况)参考图像中的像素通过与加权系数相乘得出,如下:

 加权预测适用于两图像之间像素值整体变化且有相同变化规律的情形,如淡入、淡出等效果。

加权预测(WP)用于帧级加权,双向加权预测(BCW)用于CU级。加权预测WP既可用在双向预测,也可用在单向预测;双向加权预测BCW仅可用在双向预测。

具体细节和代码参考:H.266/VVC帧间预测技术学习:CU级双向加权预测(Bi-prediction with CU-level weight)

三、VTM代码实现

1. 帧间模式的RDO过程

常规Merge模式的RDO:xCheckRDCostMerge2Nx2N函数

Affine Merge模式的RDO:xCheckRDCostAffineMerge2Nx2N函数

Inter模式的RDO(包括AMVP、Affine AMVP):xCheckRDCostInter函数

GPM模式的RDO:待补充 

2、运动估计

运动估计入口函数:xMotionEstimation函数

xTZSearch搜索:xTZSearch函数

亚像素运动估计:xPatternSearchFracDIF函数

3、运动补偿

运动补偿:motionCompensation函数

运动补偿函数实现较为复杂,包括了单向预测、双向预测、以及光流补偿等:

 

 在看编码端代码时候需要注意 motionCompensation 函数的调用逻辑。

  • 13
    点赞
  • 81
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值