H.266 JEM7.0 变换之三(信号依赖的变换 SDT)
Signal dependent transform, SDT
考虑到帧内和帧之间存在许多类似的块,依赖于信号的变换探索这样的相关性发现可以通过KLT增强编码性能。这种训练的KLT扮演一种变换的角色,其目的是更有效地集中能量。
对当前编码块C而言,首先,获取包含重构左上模板tb和编码块的预测块p的参考块R。然后,参考块被用来在重构区域中找N个最相似块。最后,计算基于这些块的一维KLT(Karhunen-Loéve transform)和预测块。编码块在解码端的相似候选块中是未知的。预测块和重构模板被用来指导寻找相邻块的操作,而不是使用原始块。这个工具支持4×4, 8×8, 16×16以及32×32的块大小。
KLT为集中能量的最佳变换。通过在重构区域中进行搜索,得到N个与参考块最相相似的块。此处,,D表示向量维度,是变化块大小。如,4x4的编码块,D为16(原提案中写的是N为16,个人觉得是D)。块的预测减去并获得残差块,为,。这些残差块被用为KLT求导零均值的训练样本。这些N个训练样本可以表示为:,是一个DxN的矩阵。考虑协方差矩阵为:。协方差矩阵的维度为DxD。KLT的基是该协方差矩阵的特征向量。对于自然图像/视频内容,候选数N选为100就可获取足够好的性能。
这个特征值分解的计算复杂度为。对于D=16的4x4的块而言,复杂度达到,在可接受范围内。然而对于大块而言,复杂度很高。32x32的块D为1024,时间复杂度将达4x4块的262144倍。基于此,采用一个大块的快速算法。的维度为DxD。然而维度更低,为NxN。计算的特征向量,其满足:
其中是特征矩阵,表示特征值是对角线元素的对角阵。对上公示左右均乘:
从上式可知,的列向量是的特征向量,其对应特征值是矩阵的对角元素。令。表明高维度协方差矩阵的特征向量可以通过乘有特征向量的获得,特征向量是通过低维度协方差矩阵获得的。和的维度均为DxN。所有其余特征值都是零特征向量。可采用施密特正交化来填补个特征向量来得到DxD的特征矩阵。
为了降低矩阵乘法的计算复杂度,可以用获取的N个特征向量进行KLT变化,将其余个变换系数视为零。此操作不会削弱性能,因为第一个N投影可以覆盖大部分信号能量,而基是从与编码块高度相关的样本训练的。
上述的KLT加入块级别的编码过程。为了对图像/视频内容有更高的适应性,支持4x4,8x8,16x16,32x32的编码块的所提KLT。JEM编码端,率失真优化被用来决定使用SDT和AMT中的变换模式。
代码实现
- 帧内:帧内KLT主要通过函数
xRecurIntraCodingLumaQT()
调用的TEncSearch::xIntraCodingTUBlockTM()
实现。该函数的主要步骤为:
a. 通过函数getTargetTemplate()
获取上方及左侧模板;
b. 通过candidateSearchIntra()
查找亮度块的最佳匹配块 ,主要通过函数searchCandidateFromOnePicIntra()
实现,首先在块所在LCU内进行搜索,之后在LCU外搜索;
c. 通过函数generateTMPrediction()
获取模板匹配的预测块
d. 通过函数calcKLTIntra()
中调用的deriveKLT()
完成协方差矩阵的计算,得到特征向量矩阵。
e. 得到残差,进行变换量化及后续操作。变换中若useKLT = true,则会调用xKLTr()
函数进行KLT变换。 - 帧间:帧间KLT主要通过函数
TEncSearch::xEstimateInterResidualQT()
实现。函数中,若采用CrossComponent模式,选择该模式下的变换;否则,若使用KLT,通过函数getTargetPatch()``candidateSearch()``candidateTrain()
进行KLT的相关操作。最后进行变换及量化。