H.266/VVC代码学习41:VTM6.0变换算法小结(译自O2002)

感谢博主翻译,原博客链接在这里

高频调零

VTM6中允许最大为64x64的大尺寸变换,适用于更高分辨率的视频处理,例如1080P和4K序列。对于大小(宽度或高度,或宽度和高度)等于64的变换块,将高频变换系数归零,仅保留低频系数。例如,对于一个尺寸为MxN的变换块,其中M是宽度,N是高度,当M等于64,仅保留左边32列的变换系数。类似地,当N等于64,只保留上边的32行变换系数。如果大尺寸块使用了transform skip模式,则保留所有的变换系数。VTM还支持在SPS里设置最大变换尺寸,因此编码器可以根据实际需求灵活地选择最大变换尺寸为16,32或64。

多变换选择(MTS)

除了HEVC里采用的DCT-II变换,VTM还支持对帧内或帧间残差编码使用多变换选择方法。它支持来自DCT8和DST7的多个可选变换。表3-10中给出了DCT2, DCT8和DST7的函数表达式。
在这里插入图片描述
为了保证变换矩阵的正交性,变换矩阵的精度比HEVC中的精度更高。为保证变换系数中间值的精度在16bit范围内,在水平变换和垂直变换后,所有的系数的精度均调整为10bit。
在SPS级上,分别给帧内和帧间设置了独立的使能标志位,以更好地控制MTS方法。当SPS级使能MST时,CU级会有标志位指示当前CU是否使用MTS. 此处的MTS仅适用于亮度分量。CU级的MTS标志位仅在下列条件满足时存在:
1.当CU的宽度和高度均小于等于32时;
2.CBF标志位等于1.
如果CU级的MTS标志位等于0,则在水平和垂直变换方向均采用DCT2变换公式。反之,若CU级的MTS标志位等于1,那么对水平和垂直方向分别需要增加两个标志位来指示变换类型。表3-11中给出了变换类型和标志位的匹配情况。通过消除对帧内预测模式和变换块形状的依赖性,统一了ISP(帧内子划分,下略)的变换选择和隐式MTS的用法。如果当前变换块是ISP模式或当前块是帧内块且帧内和帧间的显式MTS都打开时,水平和垂直变换核都是DST7. 关于变换矩阵的精度,使用8bit主变换核。因此,HEVC中使用的变换核均保持不变,包括4点DCT2和DST7,8点、16点和32点的DCT2。此外,新增了一些变换核,包括64点DCT2,4点DCT8,8点、16点和32点的DST7和DCT8,使用8bit主变换核。
在这里插入图片描述
为了减少大尺寸DST7和DCT8的复杂度,对大小(宽度或高度,或宽度和高度)等于32的DST7和DCT8变换块采用高频调零技术。只有残差系数在16x16的低频区域范围内的系数才会保留。
在HEVC中,变换块的残差信息可以用transform skip模式编码。为了避免语法元素的编码冗余,当CU级的MTS_CU_flag不等于0时,无需编码transform skip标志位。Transform skip的尺寸限制和JEM4中的MTS一样,即当块的宽度和高度均等于或小于32时才适用transform skip模式。注意,当前CU使用LFNST或MIP时,隐式MTS变换均设为DCT2。此外,当对帧间编码块启用MTS时,仍然可以启用MTS。

低频不可分变换(LFNST)

VVC里,LFNST(低频不可分变换)被称为减少的二次变换,如图40所示,用于前向主变换和量化(编码端)之间以及反量化和逆主变换(解码端)之间。LFNST里,根据块尺寸适用4x4不可分变换核8x8不可分变换。例如,对于小尺寸变换块(如宽和高的较小值小于8)适用4x4 LFNST,对于较大尺寸的块(如宽和高的较小值大于4)适用8x8 LFNST.
在这里插入图片描述

下面举例说明不可分变换在LFNST中的应用。对于4x4 LFNST,输入为如下的4x4输入块X:
在这里插入图片描述
首先将其表示成向量形式:
在这里插入图片描述

减少的不可分变换

LFNST(低频不可分变换)是基于直接的矩阵乘法的不可分变换,因此它只需通过一次计算实现而不需要多次迭代。然而,不可分变换矩阵的维度需要减少以最小化计算复杂度和变换系数的存储空间。因此,在LFNST里采用了减少的不可分变换(或RST)。减少的不可分变换法主要思想是将N维向量(N通常等于64或8x8 NSST)映射为不同空间中的R维向量,其中N/R(R<N)是减少因子。因此,RST矩阵变成了如下所示的RxN矩阵,而不是NxN矩阵:
在这里插入图片描述
其中变换矩阵中的R行表示N维空间中的R个基。RT的逆变换矩阵是它的正变换的转置矩阵。对于8x8 LFNST,采用减少因子4,则可将64x64的直接矩阵(传统的8x8不可分变换矩阵尺寸)减少为16x48直接矩阵。因此,在解码端使用48x16逆RST矩阵在左上8x8区域中生成核(主)变换系数。当使用16x48矩阵而不是16x64矩阵时,使用相同的变换集配置,每个变换集从左上8x8块(不包括右下4x4块)的三个4x4块获取48个输入数据。借助于降维,在合理的性能下降情况下,LFNST矩阵的内存使用从10KB减少到8KB。为了减少复杂度,LFNST仅在第一子组系数之外的系数都不显著时使用。因此,当使用LFNST时,所有的仅主变换系数必须为零(不太理解?除了左上8x8块之外的系数都得为零?)。这允许在最后一个显著位置上给LFNST索引信号提供判断条件(只需要在特定位置上检查显著系数),因此可避免在当前LFNST设计中进行额外的系数扫描。 LFNST的最坏情况(就每个像素的乘法而言)是将4x4和8x8的块分别限制为8x16和8x48变换。在这些情况下,对于其他尺寸小于16的块应用LFNST时,最后一个显著系数的扫描位置必须小于8.对于形状为4xN和Nx4且N>8的块,提议的限制意味着LFNST只能用一次,且只在左上4x4区域用。由于使用LFNST时,所有仅主变换的系数都为零,因而减少了主变换所需的运算次数。从编码端角度看,测试LFNST变换时,量化系数明显简化。必须对前面16个系数(按扫描顺序)进行最大率失真优化量化,其余系数则被强制为0. ### LFNST变换选择
LFNST共有4个变换集,每个变换集使用两个不可分变换矩阵(核)。如表3-11所示,帧内预测模式和变换集的对应关系是预先确定的。如果当前块(81<=predModeIntra<=83)使用三个CCLM模式(INTRA_LT_CCLM, INTRA_T_CCLM或INTRA_L_CCLM)中的一种,则选择变换集0. 对于每个变换集,选择的不可分二次变换集候选值进一步由显示信号LFNST索引确定。在变换系数之后,每个帧内cu在比特流中发送一次索引信号。
在这里插入图片描述

LFNST索引信号及与其他工具的交互

由于LFNST仅限于第一个系数子组以外的系数均不显著时才使用,故LFNST索引值的编码依赖于最后一个显著系数的位置。此外,LFNST索引的上下文编码不依赖于帧内预测模式,且只有第一个bin是上下文编码的。而且,LFNST适用于帧内和帧间slice里的帧内CU块,且对亮度和色度分量矩适用。如果允许双树,则亮度和色度的LFNST索引值分别编码。对于帧间slice(禁用双树),只编码单个LFNST索引,为亮度和色度分量所共用。
当选择ISP模式时,禁用LFNST且不用将RST索引信号写入码流,因为即使对所有可能的分块使用RST,性能的提升仍然微不足道。此外,对ISP预测残差模式禁用RST可以减少编码复杂度。当选择MIP模式时,LFNST也被禁用,不需传输索引值。
考虑到当前最大变换尺寸存在限制(64x64), 尺寸大于64x64的CU块存在隐式划分(TU tiling),LFNST的索引值搜索可能在一些数量的解码流水级上引起四倍数据缓存量的增加。因此,LFNST的最大适用尺寸为64x64。注意,LFNST仅在DCT2为主变换时可用。

一些LFNST相关:
1、转置:将一次变换系数航变成列,列变成行
2、kernel的选择:在最外层(xCheckRdCostIntra),要传flag,即Lfnst_idx:0是不做,1是第一个矩阵,2是第二个矩阵,都是竞争的。
3、set的选择:不传flag,根据帧内模式号直接确定。
4、根据尺寸确定使用多大的矩阵(类似MIPsizeId),每个尺寸的有两个kernel,此外还根据set选。

子块变换(SBT)

VTM里,子块变换被引入到帧间预测块的变换中。这种变换方法仅对CU的子块残差进行变换。当帧间预测CU块的cu_cbf等于1时,可以编码cu_sbt_flag,用于指示是否对整个残差块或残差块的子块进行编码。在前种情况里,需要进一步解析帧间MTS信息以决定当前CU的变换类型。在后种情况里,利用推断出的自适应变换对残差块的一部分进行编码,将残差块的另一部分归零。
当对帧间编码CU使用SBT时,需要将SBT类型和SBT位置信息编入码流。由图41所示,有两种SBT类型和SBT位置。对于SBT-V(或SBT-H),TU的宽度(或高度)可等于CU宽度(或高度)的一半或1/4,使得CU按2:2或1:3/3:1分块。2:2划分类似二叉树(BT)划分,而1:3/3:1类似非对称的二叉树(ABT)划分。在ABT划分中,只有较小的区域包含非零残差。如果CU亮度分量的一个维度为8,则不允许沿该维度的1:3/3:1拆分。CU最多有8个SBT划分模式。
在SBT-V和SBT-H(色度TB总是使用DCT2)中,亮度变换块采用位置相关的变换核选择方法。SBT-H和SBT-V的两个位置和不同的核变换相关。更具体地,图41中给出了每个SBT位置的水平和垂直变换。例如,当残差TU的一边大于32时,两个维度上的变换均设为DCT2。因此,子块变换可联合确定残差块的TU tiling,cbf,水平和垂直核变换类型。
SPS里的变量maxSbtSize可确定能使用SBT的最大CU尺寸。在VTM6里,maxSbitSize的值在编码器端设置,分辨率为HD和4K序列的maxSbtSize通常设为64,而其他较小分辨率的序列则设为32.
SBT不适用于采用组合帧间-帧内模式或TPM(三角划分模式)编码的CU块。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_42979679/article/details/102654395