文章目录
Decoder side motion vector refinement (DMVR)
在第13次Marrakech会议之后被正式写入标准,前期调研过程中的JEM文档中也介绍过DMVR(解码端运动矢量修正)技术,因为中间好久没有仔细跟过每次会议,发现这两次文档中的DMVR已经发生了很大的变化,下面把JEM和VTM中的做法都进行仔细的总结。
为了增加merge模式中MV的准确度,采用一种基于解码端运动矢量修正的双边匹配(bilateral matching),基本原理是在参考帧list0和参考帧list1中的初始MV附近搜索一个refined MV作为新的MV。
JEM中的做法
双向预测:编解码器首先根据两个MV(list0中的MV0和list1中的MV1)从两个不同的参考帧中获取两个预测块Pred0和Pred1,然后将两者进行加权得到当前CU的预测块。
DMVR:在DMVR中,双向预测中的两个MV(MV0和MV1)通过双向模板匹配(bilateral template matching)过程得到进一步的修正(简单来说就是使得MV更加精准,减小预测误差)。
DMVR用于双向预测的Merge模式,且要求两个参考帧分别为了当前帧的不同方向。它无需传输任何语法元素,在JEM中,当LIC、Affine、FRUC或sub-CU merge候选使用时,DMVR不使用。
步骤
- 生成双边模板: 根据MV0和MV1得到两个预测块Pred0和Pred1,然后将两者加权组合(例如:平均)得到双向模板Pred(bilateral template);注:MV0和MV1从merge候选列表中得到;
- 模板匹配过程:对于每个方向,编解码器在初始预测块(Pred0和Pred1)周边搜索下图所示9个位置点(相当于9个MV候选),包括自身位置和8个周边位置,这8个周边位置相较于自身的偏移MV为一个亮度样点(水平偏移或垂直偏移、或水平垂直都偏移)。分别计算9个MV偏移情况下新生成的预测块 P r e d 0 ’ Pred0^{’} Pred0’和 P r e d 1 ’ Pred1^{’} Pred1’,并将两者加权组合得到当前块的预测块 P r e d ’ Pred^{’} Pred’,计算 P r e d ’ Pred^{’} Pred’与双向模板Pred之间的SAD值。将SAD最小者的MV作为新的MV,得到 M V 0 ’ MV0^{’} MV0’和 M V 1 ’ MV1^{’} MV1’。
VTM中的做法
基本原理还是跟JEM里面的差不多,如下图所示都是在Merge候选MV附近搜索更加精准的MV,但是这里判定最佳位置点的标准是计算图中两个预测块(红色块,相当于JEM中的 P r e d 0 ’ Pred0^{’} Pred0’和 P r e d 1 ’ Pred1^{’} Pred1’)之间的SAD,选取SAD最小的作为refined MV(修正后的MV),并生成最终双向预测块。
在VTM4.0中,DMVR的使用条件如下:
- 带有双向MV的merge模式;
- 两个参考帧在时域上位于当前帧的一前一后;
- 两个参考帧到当前帧的距离相等;
- CU至少有64个亮度样点,CU高度至少8个亮度样点(height>=8);
注1:通过DMVR得到的修正后的MV用来生成预测像素,并用来作为后续编码的时域MV预测;未修正的原始MV用于解码,并用来作为后续编码的空域MV预测。
注2:最大的DMVR搜索单元为16X16,若当前CU的长或宽大于16,则将其划分为子块进行搜索。
1、周边位置搜索方法
初始MV周边的任何一个搜索点(MV offset)都遵守镜像规则,即DMVR中的候选MV对(MV0,MV1)符合如下公式:
M V 0 ′ = M V 0 + M V _ o f f s e t MV0^{'}=MV0+MV\_offset MV0′=MV0+MV_offset
M V 1 ′ = M V 1 − M V _ o f f s e t MV1^{'}=MV1-MV\_offset MV1′=MV1−MV_offset
其中 M V _ o f f s e t MV\_offset MV_o