【十六】 H.266/VVC | VVC中帧间预测技术详细总结 | 所有帧间预测技术代码汇总

前言

​ 帧间预测是影响视频编码性能的关键环节之一,H.266/VVC帧间预测在传统只能应对简单的平移运动的基础上,采用了仿射运动模型,可以描述更加复杂的缩放、旋转等运动。为了更好的发挥合并模式(Merge)的性能,采用了扩展的合并模式、带运动矢量差的合并模式MMVD、子块合并模式、混合帧内帧间CIIP合并模式、三角划分合并模式以及仿射合并模式等,可以有效去除时空相邻块间的冗余。针对双向预测得到的运动矢量,新增光流法、CU级加权、解码端修正等多种修正方法提升运动矢量的精度,降低编码消耗。通过采用更加复杂的编码技术换取编码性能的提升,但同时也极大的提升了编码的复杂度,而降低复杂度,则是未来研究的重点。


1.1 扩展的合并预测

​ 基于块的混合编码框架中采用基于块划分的方式对图像中不同的区域应用不同的预测模型,能更好的适应图像内容多样化的特征。H.265/HEVCH.266/VVC标准都采用了基于树的迭代划分结构得到不同大小的块,预测时分别对每个块做预测得到运动信息。但这种复杂的划分在预测时可能存在信息冗余,比如对于图像中的某块区域包含不同根节点划分的子块,这些子块之间很有可能拥有相同的运动信息,现有的划分结构无法对这些子块的运动信息进行统一的描述,因此需要耗费更多的编码比特。

​ 为了解决这类问题,H.265/VVC提出了合并模式(Merge)。从空域相邻的5个块中得到4个空间运动矢量预测候选,在时域相邻的2个块中得到1个时域运动矢量预测候选,为了保证候选集有5个候选,还考虑将双向预测候选和零运动矢量作为可选项。预测时从5个候选中选出一个最佳候选,并将该候选的运动信息作为当前块的运动信息,编码时只需要合并模式(Merge)的候选索引进行编码

​ 空域和时域运动矢量预测候选导出的方式和HEVC相同,空域从当前位块5个空间位置相邻块中最多选择出4个候选,相邻块的位置如下图所示,选择的时候,按照A0->B0->B1->A1->B2的顺序依次检该位置的块是否可用、是否包含运动信息、是否存在运动信息冗余,最终确定空域候选集合。时域运动信息导出时,假设当前块帧间预测列表中最近的参考图像为同位图像,对应相同的位置的块为同位块。优先考虑同位块右下方的块C0,如果不可用则使用同位块中C1块,如下图所示
【十六】 H.266/VVC | VVC中帧间预测技术详细总结 | 所有帧间预测技术代码汇总
​ 考虑到当前块的运动信息和前序已经编码块的运动信息有可能一致,H.266/VVC新增了基于历史的运动候选。编码顺序在当前块之前的编码块的运动信息以列表的形式进行存储,并作为当前块的运动矢量估计。基于历史的运动候选最多有6个,采用先进先出的方式,对相同的运动矢量预测去冗余,确保列表中没有重复的运动信息

​ 此外,H.266/VVC还采用了成对的运动矢量均值候选,对于合并候选列表中标号为{(0,1),(0,2),(1,2),(0,3),(1,3),(2,3)},如果成对都存在,则取运动矢量均值;如果只有一个存在,则直接使用;若都不存在,则表示该候选不可用

​ 通过空域运动矢量估计候选、时域运动矢量估计候选、基于历史的运动矢量估计候选和成对的运动矢量均值候选导出后,若候选个数仍然小于合并模式支持的最大候选数量,则在候选列表中添加零运动矢量估计,确保候选个数满足要求。

具体博客链接:

VVC帧间预测中扩展merge模式详解


1.2 带运动矢量差的合并模式MMVD

H.265/HEVC中合并模式候选确定后,从候选列表中选出最佳候选的运动矢量直接作为当前编码块的运动矢量,与实际的运动矢量之间可能会存在一定的误差。H.266/VVC新增了带运动矢量差的合并模式MMVD,在原有的运动矢量基础上增加运动矢量差,使得运动矢量更加精准,以减小预测误差

MMVD模式中,将合并候选列表前两个候选中的一个作为MV基准,并在MV基准周围小范围选取MVD信息。MVD信息通过运动幅度和运动方向来标识,运动幅度给出了与MV基准的水平或垂直方向的距离,运动方向给出了水平和垂直方向上的具体方向。为了降低复杂度,仅在几个固定的运动幅度和运动方向上选取。运动幅度通过距离索引来标识,运动方向则通过方向索引来标识,如下图所示,编码时,需要将列表中实际使用的候选标识、MVD距离索引以及方向索引传输至解码端
【十六】 H.266/VVC | VVC中帧间预测技术详细总结 | 所有帧间预测技术代码汇总
【十六】 H.266/VVC | VVC中帧间预测技术详细总结 | 所有帧间预测技术代码汇总

具体博客链接:

H.266/VVC中带有运动矢量差的融合技术MMVD


1.3 解码端修正技术DMVR

​ 为了进一步提升合并模式中运动矢量的精度,H.266/VVC中新增了基于双边匹配的解码端运动矢量修正DMVR技术

​ 在解码端,根据合并候选列表得到当前块在前向参考列表L0和后向参考列表L1中对应的运动矢量MV0MV1,然后计算得到对应的两个预测块。在MV0MV1周围搜索,计算两个新的预测块,将最小的SAD对应的运动矢量MV0’MV1’作为修正后的运动矢量,并用其计算得到双向预测信号。

​ 具体实现时,以初始MV作为起点,在其周围进行搜索,水平和垂直方向搜索范围的最大值为2个像素。搜索过程包括整像素搜索和分像素搜索。整数像素搜索阶段对包含初始点在内的25个像素进行全搜索,首先计算初始MV对应的两个预测块的SAD,若小于规定的阈值,则不用继续搜索,否则,对剩下的24个点按照扫描顺序依次搜索,SAD最小的点作为该阶段的搜索结果。在分像素搜索阶段,分像素位置(xmin,ymin),通过初始点以及其周围的四个点采用二维抛物线误差面方程计算得到。最后,将整像素搜索得到的结果加上分像素搜索结果得到分像素精度的MV修正量。该过程在解码端实现,因此不需要消耗额外的编码比特

【十六】 H.266/VVC | VVC中帧间预测技术详细总结 | 所有帧间预测技术代码汇总

具体博客链接:

解码端运动向量修正技术DMVR


1.4 对称运动矢量差编码

在普通的帧间预测模式中,需要对单向或者双向预测后的MVD进行编码。为了进一步降低编码码率,在H.266/VVC中,对双向预测的MVD0MVD1编码时采用了对称的MVD编码,编码MVD0,MVD1被设置为-MVD0,如下图所示
【十六】 H.266/VVC | VVC中帧间预测技术详细总结 | 所有帧间预测技术代码汇总
最终的两个运动矢量(MV0,MV1)水平和垂直方向分别为:

{ ( m v x 0 , m v y 0 ) = ( m v p x 0 + m v d x 0 , m v p y 0 + m v p d 0 ) ( m v x 1 , m v y 1 ) = ( m v p x 1 + m v d x 1 , m v p y 1 + m v p d 1 ) \begin{cases} \left( mvx_0,mvy_0 \right) =\left( mvpx_0+mvdx_0,mvpy_0+mvpd_0 \right)\\ \left( mvx_1,mvy_1 \right) =\left( mvpx_1+mvdx_1,mvpy_1+mvpd_1 \right)\\\end{cases} {(mvx0,mvy0)=(mvpx0+mvdx0,mvpy0+mvpd0)(mvx1,mvy1)=(mvpx1+mvdx1,mvpy1+mvpd1)

具体博客链接:

H.266/VVC中对称MVD模式SMVD


1.5 仿射运动补偿预测

​ 自然界的运动包括平移、缩放、旋转、透视等,之前的编码标准基本都是采用简单的平移运动补偿(称之为传统的运动补偿,TMC),只能描述简单的运动,无法描述缩放、旋转等复杂运动。

​ 研究发现仿射运动模型可以很好的刻画自然界视频序列中的非平移运动,H.266/VVCTMC的基础之上,引入了仿射运动补偿(AMC),采用了多模型AMC技术,包含4参数仿射模型和6参数仿射模型,并且两种模型可以在帧级和块级自适应的切换使用

1.5.1 仿射模型

a.四参数仿射模型

4参数仿射模型可以描述旋转和缩放,假设原始位置为(x,y),经过仿射运动后的新位置为(x’,y’),4参数仿射变换的模型为:

{ x ′ = a x − b y + c y ′ = b x + a y + d \begin{cases} x'=ax-by+c\\ y'=bx+ay+d\\ \end{cases} {x=axby+cy=bx+ay+d
{a,b,c,d}是定义仿射变换模型的四个参数,假设当前帧当前的位置为(x,y),是由参考帧对应的位置(x’,y’)运动得到,mv(x,y)=(x’-x,y’-y)为(x,y)的运动矢量。进一步简化之后,水平和垂直轴运动矢量(MVx,MVy)可由下面式子得到:

{ m v x = m v 1 x − m v 0 x W x + m v 1 y − m v 0 y W y + m v 0 x m v y = m v 1 y − m v 0 y W x + m v 1 y − m v 0 x W y + m v 0 y \begin{cases} mv_x=\frac{mv_{1x}-mv_{0x}}{W}x+\frac{mv_{1y}-mv_{0y}}{W}y+mv_{0x}\\ mv_y=\frac{mv_{1y}-mv_{0y}}{W}x+\frac{mv_{1y}-mv_{0x}}{W}y+mv_{0y}\\ \end{cases} {mvx=Wmv1xmv0xx+Wmv1ymv0yy+mv0xmvy=Wmv1ymv0yx+Wmv1ymv0xy+mv0y
W为当前编码块的宽度,MV0MV1位两个控制点(CP0和CP1)对应的运动矢量,两个控制点分别对应当前块左上角位置和右上角位置
【十六】 H.266/VVC | VVC中帧间预测技术详细总结 | 所有帧间预测技术代码汇总

b.六参数仿射模型

6参数的仿射模型可描述二维空间中所有的仿射变换,如剪切等。6参数仿射变换的模型为:

{ x ′ = a x + b y + e y ′ = c x + d y + f \begin{cases} x'=ax+by+e\\ y'=cx+dy+f\\ \end{cases} {x=ax+by+ey=cx+dy+f

{a,b,c,d,e,f}是定义仿射变换模型的四个参数,水平和垂直轴运动矢量(MVx,MVy)可由下面式子得到:

{ m v x = m v 1 x − m v 0 x W x + m v 2 y − m v 0 x H y + m v 0 x m v y = m v 1 y − m v 0 y W x + m v 2 y − m v 0 y H y + m v 0 y \begin{cases} mv_x=\frac{mv_{1x}-mv_{0x}}{W}x+\frac{mv_{2y}-mv_{0x}}{H}y+mv_{0x}\\ mv_y=\frac{mv_{1y}-mv_{0y}}{W}x+\frac{mv_{2y}-mv_{0y}}{H}y+mv_{0y}\\ \end{cases} {mvx=Wmv1xmv0xx+Hmv2ymv0xy+mv0xmvy=Wmv1ymv0yx+Hmv2ymv0yy+mv0y
W为当前块的宽度,H为当前块的高度,MV0、MV1、MV为三个控制点(CP0、CP1、CP2)对应的运动矢量,单个控制点分别对应当前块的左上角、右上角、和右下角位置
【十六】 H.266/VVC | VVC中帧间预测技术详细总结 | 所有帧间预测技术代码汇总
仿射运动补偿的目标就是找到控制点对应的运动矢量,为了简化运动补偿的过程,采用基于块的仿射变换。对于每个 4 * 4亮度子块,根据上述公式计算运动矢量,精度大概是1/16,色度块大小也为 4 * 4,色度块的运动矢量为对应的4个亮度子块运动矢量的均值。

1.5.2 仿射预测模式

仿射运动帧间预测包括两种帧间模式:仿射合并模式AF_MERGE和仿射AMVP模式。仿射AMVP模式中运动失矢量需要从编码端传送至解码端,采用基于梯度的运动估计策略来对运动矢量进行预测;仿射合并模式的运动矢量通过相邻CU的运动矢量直接得到。

a.仿射合并模式

CU的宽和高都大于8时,可以使用仿射合并模式。当前CU的控制点运动矢量CPMV由空间相邻CU的运动信息得到,最多支持5个控制运动矢量预测CPMVP候选,并从中选择一个最佳候选作为最终的运动矢量预测,并将该候选的索引传输至解码端。CPMVP候选列表构建的顺序如下:

  1. 从时域相邻使用仿射模式的CU中继承最多两个CU的CPMV作为当前CU的CPMVP候选。从当前CU左侧的空域相邻CU按照A0->A1顺序,第一个可用CU的CPMV为第一个候选。从当前CU上方相邻的CU按照B0->B1->B2顺序,第一个可用CU的CPMV作为第二个候选

【十六】 H.266/VVC | VVC中帧间预测技术详细总结 | 所有帧间预测技术代码汇总
2. 从时域或者空域相邻使用平移模式的CU的MV重建得到当前CU的CPMVP候选。当前CU时域或者空域相邻CU的位置如下,按照B2->B3->A2的顺序,第一个可用CU的MV作为CPMV1;按照B1->B0的顺序,第一个可用CU的MV作为CPMV2;按照A1->A0的顺序,第一个可用CU的MV作为CPMV3;时域相邻T的MV如果可用作为CPMV4。得到这些MV后,得到如下组合:{CPMV1,CPMV2,CPMV3},{CPMV1,CPMV2,CPMV4},{CPMV1,CPMV3,CPMV4},{CPMV2,CPMV3,CPMV4},{CPMV1,CPMV2},{CPMV1,CPMV3}。6参数仿射合并候选从拥有三个CPMV的组合混合得到,4参数的仿射合并候选从拥有两个CPMV的组合混合得到
【十六】 H.266/VVC | VVC中帧间预测技术详细总结 | 所有帧间预测技术代码汇总
3. 继承仿射合并候选和重建仿射合并候选确定后,如果候选的个数仍然少于5个,则添加零运动矢量来保证候选列表的大小一致(5个)

b.仿射AMVP预测

当CU的宽和高都大于等于16时,可以使用仿射AMVP模式。最多支持2个CPMVP候选,并从中选择一个最佳候选作为最终的运动矢量预测,并将当前CU的CPMV与该CPMVP的差值传送至解码端。CPMVP候选列表构建构成如下:

  1. 从时域相邻使用仿射模式的CU中继承CPMV作为当前CU的CPMVP候选,该过程与仿射合并预测基本一致,差别在于仿射AMVP预测中只考虑与当前CU采用相同参考帧的相邻CU
  2. 从时域或者空域相邻使用平移模式的CU的MV重建得到当前CU的CPMVP候选,该过程也与仿射合并预测基本一致,差别在于仿射AMVP预测中只考虑与当前CU采用相同参考帧的相邻CU。若当前CU采用4参数仿射模式且两个CPMV都存在,将其作为仿射AMVP列表的一个候选。若当前CU采用6参数仿射模式且三个CPMV都存在,将其作为AMVP列表的一个候选。否则,重建AMVP候选列表不存在
  3. 如果候选列表仍然小于2,相邻CU平移模型如果有任意一个运动矢量存在,则将其作为仿射AMVP候选
  4. 添加零运动矢量保证候选列表个数达到2个
具体博客链接:

H.266/VVC中帧间仿射运动补偿预测


1.6 基于子块的时域运动矢量预测SbTMVP

H.265/HEVC中时域运动矢量预测TMVP类似,H.266/VVC中采用了基于子块的时域运动矢量预测SbTMVP技术,==通过时域相邻运动信息对当前子块的运动矢量进行预测。==子块大小固定为8 * 8,当CU的宽和高都大于8时,才可以使用SbTMVP模式。与TMVP不同的是,SbTMVP基于子块进行处理,而且要利用空间相邻块的运动矢量信息。

【十六】 H.266/VVC | VVC中帧间预测技术详细总结 | 所有帧间预测技术代码汇总
SbTMVP空间相邻位置如上图所示,首先检查A1是否使用同位图像作为参考图像得到运动矢量,如果是 ,该运动矢量作为当前块的运动矢量位移(shift),否则将运动矢量位移设置为(0,0)。然后,当前块的坐标加上运动位移在同位图像上子CU级别的运动信息,然后当前CU的每一个子块的运动信息都通过同位图像对应子块的运动信息导出

具体博客链接:

基于子块的时域运动向量预测(SbTMVP)和自适应运动向量分辨率(AMVR)


1.7 自适应运动矢量精度AMVR

最早的编码标准采用整数像素精度描述运动矢量,因此运动估计只能利用位于整数点位置的像素。但实际的物体的运动经常是连续的,采用整像素精度并不能很好的描述运动矢量。H.264/AVCH.265/HEVC都对亮度分量的运动矢量采用1/4像素精度、色度分量的运动矢量采用1/8像素精度。H.266/VVC中运动矢量精度进一步提升,亮度分量的运动矢量采用1/16像素精度、色度分量的运动矢量采用1/32像素精度。随着像素精度的提升,预测精度增长,但随之会带来编码所需比特的大幅度提升。

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

  1. 如果是普通AMVP模式,亮度分量亮度MVD编码精度可在1/4像素精度、1/2像素精度、整数像素精度或者4像素精度根据率失真大小自适应选择
  2. 如果是仿射AMVP模式,亮度分量亮度MVD编码精度可在1/4像素精度、整数像素精度或1/16像素精度中根据率失真大小自适应的选取
具体博客链接:

基于子块的时域运动向量预测(SbTMVP)和自适应运动向量分辨率(AMVR)


1.8 带有编码单元权重的双向预测BCW

对于双向预测块,会得到两个预测信号P0P1,最终的预测值P(bi_pred)一般采用直接平均的方式得到:P(bi_pred)=(P0+P1+1)>>1。实际应用中同一内容随着时间变化有可能会产生光线强弱变化或阴影等现象,导致不同帧之间背景相似度很大,但是明暗差别较大,采用简单的平均方式预测误差较大。

研究表明,同一内容亮度变化一般会导致对应位置像素的整体变化。因此,H.264/AVCH.265/HEVC采用了帧级加权预测WP技术:P(bi_pred)=w*p+o,p为对应参考帧的预测信号,w和o分别为对应的权重和位移。对单向预测信号采用该技术可以应对淡入淡出的情况,对双向预测信号则可以应对整帧光线的变化情况
【十六】 H.266/VVC | VVC中帧间预测技术详细总结 | 所有帧间预测技术代码汇总
考虑到局部内容也会产生光线变化,H.266/VVC提出了带有编码权重的双向预测(BCW),运动补偿时在CU层面对双向预测信号加权:P(bi-pred)=((8-w) * P0+w * P1+4) >> 3, w的范围为{-2,3,4,5,10},它为加权系数。该技术仅在CU宽和高不小于256时采用,低时延应用中最终权重从5个系数中选取,其他应用则从{3,4,5}3个系数中选取。如果当前CU是非合并帧间模式,需要将w的索引值进行传递,如果是合并帧间模式,w值从相邻CU获得。

具体博客链接:

H.266/VVC | 帧间预测技术 | CU级双向预测(BCW)


1.9 双向光流BIOF技术

基于分块的双向预测以块为单位描述运动,但最小划分块内某些像素还有可能存在一些运动,现有帧间预测无法对这些像素实现最佳预测。H.266/VVC对亮度分量采用双向光流BDOF技术,将光流的概念引入到双向预测当中,在传统双向预测运动补偿时,采用BDOF得到的运动修正量进一步修正,实现像素级别的运动补偿,而且不增加额外的划分和运动矢量编码,从而提升编码效率。

假设物体运动是平缓的,且在短时间内像素的亮度保持不变。对于每个4 * 4的子块,通过最小化L0L1预测值的差值来得到BDOF运动修正量(Vx,Vy),具体原理见下面博客链接:

具体博客链接:

H.266/VVC | 帧间预测技术 | 双向光流技术BDOF


1.10 三角划分模式TMP

当CU为8 * 8 或者更大时,可采用三角划分模式TMP,CU通过对角线或者反对角线划分被平均划分为两个三角区域,每个三角区域只能使用单向预测,并各自补偿出该区域的预测值。每个三角区域的单向预测由常规合并模式列表扩展得到,分割线周围区域由两个区域的预测信号加权得到,亮度信号的权重为{7/8,6/8,5/8,4/8,3/8、2/8,1/8},色度信号的权重为{6/8,4/8,2/8}

具体博客链接:

H.266/VVC | 帧间预测技术 | 三角形划分模式(TPM)


1.11 混合帧内帧间预测CIIP

当CU以合并模式编码时,如果CU包含至少64个亮度采样(即CU宽度乘以CU高度大于或等于64),并且CU宽度和C孤傲度均小于128个亮度采样,可以采用混合帧内帧间预测CIIP.

混合帧内帧间预测模式综合考虑帧间预测信号和帧内预测而信号,帧间预测信号Pinter采用普通合并模式帧间预测过程得到,帧内预测信号Pintra采用普通的帧内预测Planar模式预测得到。最后预测结果通过帧间预测信号和帧内预测信号平均加权得到,加权值wt由当前块左边和上边相邻块的编码模式决定:

P C I I P = ( ( 4 − w t I n t r a ) ∗ P i n t e r + w t I n t r a ∗ P i n t r a + 2 ) > > 2 P_{CIIP}=\left( \left( 4-wtIntra \right) *P_{inter}+wtIntra*P_{intra}+2 \right) >>2 PCIIP=((4wtIntra)Pinter+wtIntraPintra+2)>>2

具体博客链接:

VVC/H.266 | 帧内帧间联合预测技术CIIP详解


最后将HEVC和VVC帧间预测技术进行对比:

【十六】 H.266/VVC | VVC中帧间预测技术详细总结 | 所有帧间预测技术代码汇总


更多关于视频编码知识和资源的分享,更精致的文章排版,欢迎关注博主微信公众号,一起交流、学习、进步!!!
【十六】 H.266/VVC | VVC中帧间预测技术详细总结 | 所有帧间预测技术代码汇总

相关文章: