针对图像中运动物体的边界部分,VVC采用了几何划分模式进行帧间预测。如下图所示,GPM模式在运动物体的边界处进行了更精细的划分。
使用GPM模式时,通过几何定位的直线将CU划分为两部分(下图所示)。 分割线的位置从数学上是根据特定分区的角度参数φ 和偏移参数ρ 得出的,如下图所示。
VVC标准中的GPM规定将360°不等间隔的量化出24种角度,如上图b所示,每种角度下最多有4种偏移,如上图c所示,总共组合出64种划分模式,如下表所示,根据GPM模式索引选择角度和偏移参数。
CU划分后的每个分区都包含单独的运动信息。 每个分区仅允许单向预测,即每个分区仅具有一个运动矢量和一个参考索引,通过该约束,保证了每个CU与传统双向预测相同,即每个CU仅需要两个运动矢量和参考帧索引。 为了简化运动信息编码,GPM两个分区的运动信息使用Merge模式编码,GPM模式的候选列表是由传统的Merge模式推导而来的。
对于每个可能的CU尺寸 ,GPM模式总共支持64种分区,其中 ,此外,在长宽比大于4:1或小于1:4的CU上禁用GPM,因为窄CU很少包含几何划分的图案如8x64和64x8。
GPM的预测过程如下图所示,当前CU的右侧部分来自参考帧P0的MV0预测,左侧部分来自参考帧P1的MV1预测。
通过使用整数融合矩阵W0和W1执行边缘融合过程来生成最终的GPM预测PG,所述整数融合矩阵W0和W1包含在0到8的值范围内的权重,即
其中
其中,Jw,h 是一个w*h的全1矩阵。融合矩阵的权重取决于样本位置和分割边界之间的位移。下图展示了一组示例混合矩阵。混合矩阵推导的计算复杂度极低,因此这些矩阵可以在解码器端动态生成。
当CU使用GPM模式时,需要进一步用信号指示几何分区的分区模式的几何分区索引(角度和偏移),以及两个Merge索引(每个分区一个)。最大GPM候选大小的数目在SPS中显式表示,并指定GPM Merge索引的语法二值化。在预测完划分后的每个分区后,使用第二节中的具有自适应权重的混合处理来调整沿几何分区边缘的样本值。然后对整个CU进行变换和量化过程。最后,使用几何分区模式预测的CU运动场以第三节描述的方式存储。
单向预测候选列表直接从扩展Merge预测过程构造的Merge候选列表中得出。将GPM单向预测候选列表中的单向预测运动的索引表示为n,将第n个扩展Merge候选的LX运动矢量(X等于n的奇偶校验)作为GPM模式的第n个单向预测运动矢量,即下图中用“ x”标记的运动矢量。如果扩展Merge候选索引n的对应LX运动矢量不存在,则将Merge索引n的L(1- X)运动矢量作为GPM模式的单向预测运动矢量。
GPM单向预测候选列表构建代码及注释如下所示:(基于VTM10.0)
// 获得Geo Merge候选列表
void PU::getGeoMergeCandidates( const PredictionUnit &pu, MergeCtx& geoMrgCtx )
{
MergeCtx tmpMergeCtx;
const uint32_t maxNumMergeCand = pu.cs->sps->getMaxNumMergeCand();
geoMrgCtx.numValidMergeCand = 0;
// 初始化GEO Merge列表
for (int32_t i = 0; i < GEO_MAX_NUM_UNI_CANDS; i++)
{
geoMrgCtx.BcwIdx[i] = BCW_DEFAULT;
geoMrgCtx.interDirNeighbours[i] = 0;
geoMrgCtx.mrgTypeNeighbours[i] = MRG_TYPE_DEFAULT_N;
geoMrgCtx.mvFieldNeighbours[(i << 1)].refIdx = NOT_VALID;
geoMrgCtx.mvFieldNeighbours[(i << 1) + 1].refIdx = NOT_VALID;
geoMrgCtx.mvFieldNeighbours[(i << 1)].mv = Mv();
geoMrgCtx.mvFieldNeighbours[(i << 1) + 1].mv = Mv();
geoMrgCtx.useAltHpelIf[i] = false;
}
PU::getInterMergeCandidates(pu, tmpMergeCtx, 0); //获得Merge候选列表
for (int32_t i = 0; i < maxNumMergeCand; i++) //遍历Merge候选列表
{
int parity = i & 1;// 奇偶检验
if( tmpMergeCtx.interDirNeighbours[i] & (0x01 + parity) )
{
geoMrgCtx.interDirNeighbours[geoMrgCtx.numValidMergeCand] = 1 + parity;
geoMrgCtx.mrgTypeNeighbours[geoMrgCtx.numValidMergeCand] = MRG_TYPE_DEFAULT_N;
geoMrgCtx.mvFieldNeighbours[(geoMrgCtx.numValidMergeCand << 1) + !parity].mv = Mv(0, 0);
geoMrgCtx.mvFieldNeighbours[(geoMrgCtx.numValidMergeCand << 1) + parity].mv = tmpMergeCtx.mvFieldNeighbours[(i << 1) + parity].mv;
geoMrgCtx.mvFieldNeighbours[(geoMrgCtx.numValidMergeCand << 1) + !parity].refIdx = -1;
geoMrgCtx.mvFieldNeighbours[(geoMrgCtx.numValidMergeCand << 1) + parity].refIdx = tmpMergeCtx.mvFieldNeighbours[(i << 1) + parity].refIdx;
geoMrgCtx.numValidMergeCand++;
if (geoMrgCtx.numValidMergeCand == GEO_MAX_NUM_UNI_CANDS) //Geo Merge列表填满
{
return;
}
continue;
}
if (tmpMergeCtx.interDirNeighbours[i] & (0x02 - parity))
{
geoMrgCtx.interDirNeighbours[geoMrgCtx.numValidMergeCand] = 2 - parity;
geoMrgCtx.mrgTypeNeighbours[geoMrgCtx.numValidMergeCand] = MRG_TYPE_DEFAULT_N;
geoMrgCtx.mvFieldNeighbours[(geoMrgCtx.numValidMergeCand << 1) + !parity].mv = tmpMergeCtx.mvFieldNeighbours[(i << 1) + !parity].mv;
geoMrgCtx.mvFieldNeighbours[(geoMrgCtx.numValidMergeCand << 1) + parity].mv = Mv(0, 0);
geoMrgCtx.mvFieldNeighbours[(geoMrgCtx.numValidMergeCand << 1) + !parity].refIdx = tmpMergeCtx.mvFieldNeighbours[(i << 1) + !parity].refIdx;
geoMrgCtx.mvFieldNeighbours[(geoMrgCtx.numValidMergeCand << 1) + parity].refIdx = -1;
geoMrgCtx.numValidMergeCand++;
if (geoMrgCtx.numValidMergeCand == GEO_MAX_NUM_UNI_CANDS)
{
return;
}
}
}
}
在几何划分的两个分区使用各自的运动信息获得预测信号后,需要对两个预测信号进行加权混合,以获得几何划分边缘周围的样本。CU划分边缘的各个位置的混合权重是根据各个位置与划分边缘之间的距离得出的。
位置(x,y)到划分边缘的距离为:
其中i,j是几何分区的角度和偏移的索引,取决于信号通知的几何分区索引。ρx,j 和ρy,j 的符号取决于角度索引i。
几何分区各部分的权重如下:
partIdx取决于角度索引i。下图中说明了一个权重w0 的例子。
GPM是以4×4的子块为基本单位进行运动信息的存储,利用每个4×4子块中心像素点的权重来判断存储MV的类型(双向MV还是单向MV:几何划分的第一分区的Mv1、第二分区的Mv2以及Mv1和Mv2的组合Mv)。
运动场中每个单独位置的存储的运动矢量类型被确定为:
其中motionIdx等于d(4x+2,4y+2)。partIdx取决于角度索引i。
如果sType等于0或1,则在相应的运动场中存储Mv0或Mv1,否则如果sType等于2,则存储Mv0和Mv2的组合Mv。组合Mv使用以下过程生成:
1) 如果Mv1和Mv2来自不同的参考帧列表(一个来自L0,另一个来自L1),则Mv1和Mv2简单地组合以形成双预测运动矢量。
2) 否则,如果Mv1和Mv2来自同一列表,则仅存储单预测运动Mv2。
GPM模式的细节参考论文:Geometric Partitioning Mode in Versatile Video Coding: Algorithm Review and Analysis
GPM在VTM10.0中的模式决策位于xCheckRDCostMergeGeo2Nx2N函数中