本博客追踪VTM-5.0中对帧内预测的改进。在VTM-5.0中,主要变化是增加了MIP预测技术;同时对帧内各种预测工具统一了MPM列表。
1.矩阵加权帧内预测(MIP)
Tracking route: N0217 -> M0043 -> L0199 -> K0196 -> J0037
VTM 5.0版本更新的帧内预测技术MIP,其最初的思想来源于基于神经网络的帧内预测技术(JVET-J0037
),即利用多层神经网络基于相邻已重建像素预测当前pu像素值。但是这种预测方式复杂度太高,经过权衡,发展出最后采纳的基于线性仿射变换的帧内预测技术。其主要流程如下
首先,要预测一个尺寸为WxH的PU,其预测参考为上方W个、左侧H个已重建像素,重建像素的获取和传统帧内预测相同。然后利用这(W+H)个像素,经过平均、仿射变换和上采样三个步骤得到最终预测值。
1.1 参考像素预处理:平均
此步骤的主要目的是对参考像素尺寸进行归一化,对于
4
×
4
4\times4
4×4的PU归一化为4个像素,其他情况归一化为8个像素,即对输入的长参考边界像素
b
d
r
y
t
o
p
bdry^{top}
bdrytop和
b
d
r
y
l
e
f
t
bdry^{left}
bdryleft依据编码单元尺寸转化为短边界参考像素
b
d
r
y
r
e
d
t
o
p
bdry_{red}^{top}
bdryredtop和
b
d
r
y
r
e
d
l
e
f
t
bdry_{red}^{left}
bdryredleft,以减少预测过程中的计算量和模型参数存储空间。然后将平均转化后的左、上短参考concat成一个向量
b
d
r
y
r
e
d
bdry_{red}
bdryred,连接的方式如下:
f
(
n
)
=
{
[
b
d
r
y
r
e
d
t
o
p
,
b
d
r
y
r
e
d
l
e
f
t
]
,
if
W
=
H
=
4
&
m
o
d
e
<
18
[
b
d
r
y
r
e
d
l
e
f
t
,
b
d
r
y
r
e
d
t
o
p
]
,
if
W
=
H
=
4
&
m
o
d
e
≥
18
[
b
d
r
y
r
e
d
t
o
p
,
b
d
r
y
r
e
d
l
e
f
t
]
,
if
m
a
x
(
W
,
H
)
=
8
&
m
o
d
e
<
10
[
b
d
r
y
r
e
d
l
e
f
t
,
b
d
r
y
r
e
d
t
o
p
]
,
if
m
a
x
(
W
,
H
)
=
8
&
m
o
d
e
≥
10
[
b
d
r
y
r
e
d
t
o
p
,
b
d
r
y
r
e
d
l
e
f
t
]
,
if
m
a
x
(
W
,
H
)
>
8
&
m
o
d
e
<
6
[
b
d
r
y
r
e
d
l
e
f
t
,
b
d
r
y
r
e
d
t
o
p
]
,
if
m
a
x
(
W
,
H
)
>
8
&
m
o
d
e
≥
6
f(n) = \begin{cases} [bdry_{red}^{top}, bdry_{red}^{left}], & \text{if $W=H=4$ \& $mode<18$} \\ [bdry_{red}^{left} , bdry_{red}^{top}], & \text{if $W=H=4$ \& $mode \geq 18$} \\ [bdry_{red}^{top}, bdry_{red}^{left}], & \text{if $max(W,H)=8$ \& $mode<10$} \\ [bdry_{red}^{left} , bdry_{red}^{top}], & \text{if $max(W,H)=8$ \& $mode \geq 10$} \\ [bdry_{red}^{top}, bdry_{red}^{left}], & \text{if $max(W,H)>8$ \& $mode<6$} \\ [bdry_{red}^{left} , bdry_{red}^{top}], & \text{if $max(W,H)>8$ \& $mode \geq 6$} \end{cases}
f(n)=⎩⎪⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎪⎧[bdryredtop,bdryredleft],[bdryredleft,bdryredtop],[bdryredtop,bdryredleft],[bdryredleft,bdryredtop],[bdryredtop,bdryredleft],[bdryredleft,bdryredtop],if W=H=4 & mode<18if W=H=4 & mode≥18if max(W,H)=8 & mode<10if max(W,H)=8 & mode≥10if max(W,H)>8 & mode<6if max(W,H)>8 & mode≥6
1.2 矩阵加权预测:仿射变换
仿射变换即对信号进行一个线性变换接上一个平移。
MIP预测像素的生成是对平均后的参考像素进行矩阵加权,然后加上偏移,即线性仿射变换。预测值为目标预测值的下采样信号 p r e d r e d pred_{red} predred,其尺寸为 W r e d × H r e d W_{red}\times H_{red} Wred×Hred,其中 W r e d W_{red} Wred和 H r e d H_{red} Hred定义如下
W
r
e
d
=
{
4
,
if
m
a
x
(
W
,
H
)
≤
8
m
i
n
(
W
,
8
)
,
if
m
a
x
(
W
,
H
)
>
8
W_{red}= \begin{cases} 4, & \text {if $max(W,H)≤8$ } \\ min(W,8), & \text{if $max(W,H)>8$ } \end{cases}
Wred={4,min(W,8),if max(W,H)≤8 if max(W,H)>8
H
r
e
d
=
{
4
,
if
m
a
x
(
W
,
H
)
≤
8
m
i
n
(
H
,
8
)
,
if
m
a
x
(
W
,
H
)
>
8
H_{red}= \begin{cases} 4, & \text {if $max(W,H)≤8$ } \\ min(H,8), & \text{if $max(W,H)>8$ } \end{cases}
Hred={4,min(H,8),if max(W,H)≤8 if max(W,H)>8
仿射变换生成预测信号的过程可以表示为
p
r
e
d
r
e
d
=
A
⋅
b
d
r
y
r
e
d
+
b
pred_{red} = A \cdot bdry_{red}+b
predred=A⋅bdryred+b
其中
A
A
A是一个
(
W
r
e
d
⋅
H
r
e
d
)
×
(
W
=
=
4
&
H
=
=
4
?
4
:
8
)
(W_{red}\cdot H_{red})\times (W==4\&H==4 ? 4 : 8)
(Wred⋅Hred)×(W==4&H==4?4:8)的矩阵,
b
b
b为尺寸为
(
W
r
e
d
⋅
H
r
e
d
)
(W_{red}\cdot H_{red})
(Wred⋅Hred)的向量。实际应用时,
A
A
A和
b
b
b已依据单元尺寸预先设定好,存储在三个参数集中
S
0
,
S
1
,
S
2
S_0, S_1, S_2
S0,S1,S2,索引与PU尺寸相关,如下
i
d
x
(
W
,
H
)
=
{
0
,
if
W
=
H
=
4
1
,
if
m
a
x
(
W
,
H
)
=
8
2
,
if
m
a
x
(
W
,
H
)
>
8
idx(W,H) = \begin{cases} 0, & \text{if $W=H=4$ } \\ 1, & \text{if $max(W,H)=8$ } \\ 2, & \text{if $max(W,H)>8$} \\ \end{cases}
idx(W,H)=⎩⎪⎨⎪⎧0,1,2,if W=H=4 if max(W,H)=8 if max(W,H)>8
S
0
,
S
1
,
S
2
S_0, S_1, S_2
S0,S1,S2分别有18、10和6组参数。
1.3 上采样
1.2中产生的是目标预测信号的下采样信号,目标预测信号的剩余值,通过简单的单步线性插值得到。根据PU单元尺寸,可能需要进行水平差值、垂直插值或者两个方向都需要插值,如果两个方向都需要插值,对于W<H的块首先进行水平差值,否则首先进行垂直插值。
以垂直插值为例,首先定义上采样因子
U
v
e
r
=
H
/
H
r
e
d
U_{ver} = H/H_{red}
Uver=H/Hred,其中
U
v
e
r
=
2
u
v
e
r
>
1
U_{ver} = 2^{u_{ver}}>1
Uver=2uver>1。然后对参考信号进行扩展,向上扩展一行,扩展参考像素取值如下
p
r
e
d
r
e
d
[
x
]
[
−
1
]
=
{
b
d
r
y
r
e
d
t
o
p
[
x
]
,
if
W
=
8
b
d
r
y
r
e
d
I
I
t
o
p
[
x
]
,
if
W
>
8
pred_{red}[x][-1]= \begin{cases} bdry_{red}^{top}[x], & \text{if $W=8$ } \\ bdry_{redII}^{top}[x], & \text{if $W>8$ } \end{cases}
predred[x][−1]={bdryredtop[x],bdryredIItop[x],if W=8 if W>8
这里$ bdry_{redII}^{top}[x]$是因为大尺寸单元需要进行两次下采样,两次下采样之后的信号。最终插值信号通过下式计算
P
r
e
d
r
e
d
u
p
s
,
v
e
r
[
x
]
[
U
v
e
r
⋅
y
+
k
]
=
(
(
U
v
e
r
−
k
−
1
)
⋅
p
r
e
d
r
e
d
[
x
]
[
y
−
1
]
+
(
k
+
1
)
⋅
p
r
e
d
r
e
d
[
x
]
[
y
]
+
U
v
e
r
2
)
>
>
u
v
e
r
Pred_{red}^{ups,ver}[x][U_{ver} \cdot y + k] = ((U_{ver} - k - 1) \cdot pred_{red}[x][y-1] + (k+1)\cdot pred_{red}[x][y] + \frac {U_{ver}}{2}) >> u_{ver}
Predredups,ver[x][Uver⋅y+k]=((Uver−k−1)⋅predred[x][y−1]+(k+1)⋅predred[x][y]+2Uver)>>uver
其中
0
≤
x
<
W
r
e
d
0≤x<W_{red}
0≤x<Wred,
0
≤
y
<
H
r
e
d
0≤y<H_{red}
0≤y<Hred,
0
≤
k
<
U
v
e
r
0≤k<U_{ver}
0≤k<Uver。
插值改进- 只用移位操作 :
对于垂直方向的线性插值,首先对上下预测值进行加权,计算方式如下
p
r
e
d
r
e
d
a
b
o
v
e
[
x
]
[
y
]
[
k
]
=
{
p
r
e
d
r
e
d
[
x
]
[
y
−
1
]
<
<
u
v
e
r
−
p
r
e
d
r
e
d
[
x
]
[
y
−
1
]
,
if
k
=
0
p
r
e
d
r
e
d
t
o
p
[
x
]
[
y
]
[
k
−
1
]
−
p
r
e
d
r
e
d
[
x
]
[
y
−
1
]
,
if
k
>
0
pred_{red}^{above}[x][y][k] = \begin{cases} pred_{red}[x][y-1]<<u_{ver} - pred_{red}[x][y-1], & \text{if $k=0$ } \\ pred_{red}^{top}[x][y][k-1] - pred_{red}[x][y-1], & \text{if $k>0$ } \end{cases}
predredabove[x][y][k]={predred[x][y−1]<<uver−predred[x][y−1],predredtop[x][y][k−1]−predred[x][y−1],if k=0 if k>0
p
r
e
d
r
e
d
b
e
l
o
w
[
x
]
[
y
]
[
k
]
=
{
p
r
e
d
r
e
d
[
x
]
[
y
]
,
if
k
=
0
p
r
e
d
r
e
d
b
e
l
o
w
[
x
]
[
y
]
[
k
−
1
]
−
p
r
e
d
r
e
d
[
x
]
[
y
]
,
if
k
>
0
pred_{red}^{below}[x][y][k] = \begin{cases} pred_{red}[x][y], & \text{if $k=0$ } \\ pred_{red}^{below}[x][y][k-1] - pred_{red}[x][y], & \text{if $k>0$ } \end{cases}
predredbelow[x][y][k]={predred[x][y],predredbelow[x][y][k−1]−predred[x][y],if k=0 if k>0
使用相邻的加权参考,于是垂直上采样可以写成以下形式:
P
r
e
d
r
e
d
u
p
s
,
v
e
r
[
x
]
[
y
<
<
U
v
e
r
+
k
]
=
(
p
r
e
d
r
e
d
a
b
o
v
e
[
x
]
[
y
]
[
k
]
+
p
r
e
d
r
e
d
b
e
l
o
w
[
x
]
[
y
]
[
k
]
+
(
1
<
<
(
u
v
e
r
−
1
)
)
)
>
>
2
Pred_{red}^{ups,ver}[x][y<<U_{ver} + k] = ( pred_{red}^{above}[x][y][k] + pred_{red}^{below}[x][y][k] + (1 << (u_{ver} - 1))) >> 2
Predredups,ver[x][y<<Uver+k]=(predredabove[x][y][k]+predredbelow[x][y][k]+(1<<(uver−1)))>>2
水平方向插值可用相同的方式得出。
1.4 MIP模式和预测模式传输
VTM中根据CU尺寸,最多支持35中MIP预测模式。具体来说,对于
m
a
x
(
W
,
H
)
<
=
8
&
W
∗
H
<
32
max(W,H)<=8 \& W*H < 32
max(W,H)<=8&W∗H<32尺寸的CU支持35种预测模式,
m
a
x
(
W
,
H
)
=
8
max(W,H)=8
max(W,H)=8和
m
a
x
(
W
,
H
)
>
8
max(W,H)>8
max(W,H)>8分别有19和11种预测模式。为了减少不同模式存储时的内存占用,两种模式可能会共用Metrix和offset,具体共用模式情况如下
m
=
{
m
o
d
e
,
if
W
=
H
=
4
&
m
o
d
e
<
18
m
o
d
e
−
17
,
if
W
=
H
=
4
&
m
o
d
e
≥
18
m
o
d
e
,
if
m
a
x
(
W
,
H
)
=
8
&
m
o
d
e
<
10
m
o
d
e
−
9
,
if
m
a
x
(
W
,
H
)
=
8
&
m
o
d
e
≥
10
m
o
d
e
,
if
m
a
x
(
W
,
H
)
>
8
&
m
o
d
e
<
6
m
o
d
e
−
5
,
if
m
a
x
(
W
,
H
)
>
8
&
m
o
d
e
≥
6
m = \begin{cases} mode, & \text{if $W=H=4$ \& $mode<18$} \\ mode-17 , & \text{if $W=H=4$ \& $mode \geq 18$} \\ mode, & \text{if $max(W,H)=8$ \& $mode<10$} \\ mode-9 , & \text{if $max(W,H)=8$ \& $mode \geq 10$} \\ mode, & \text{if $max(W,H)>8$ \& $mode<6$} \\ mode-5, & \text{if $max(W,H)>8$ \& $mode \geq 6$} \end{cases}
m=⎩⎪⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎪⎧mode,mode−17,mode,mode−9,mode,mode−5,if W=H=4 & mode<18if W=H=4 & mode≥18if max(W,H)=8 & mode<10if max(W,H)=8 & mode≥10if max(W,H)>8 & mode<6if max(W,H)>8 & mode≥6
不同模式的模型参数即存储在上文
S
0
,
S
1
,
S
2
S_0, S_1, S_2
S0,S1,S2中,参数集由尺寸决定,m由码流中标识。最终实际使用模型参数为
A
=
A
i
d
x
m
A=A_{idx}^m
A=Aidxm和
b
=
b
i
d
x
m
b=b_{idx}^m
b=bidxm。
为降低模式传输消耗带宽资源,具体模式编码策略如下:
对于帧内编码CU,首先需要1bit标志位表明是否采用MIP模式,如果采用,额外1bit标识模式是否在MPM中,MIP支持3个MPM模式。MPM模式采用上下文截断二进制编码,非MPM模式采用定长编码。MPM的生成和传统帧内保持一致,MIP模式的获取通过预定义的映射表由传统帧内模式映射得出,如下。
[ p r e d m o d e ] A n g u l a r = m a p _ a l w i p _ t o _ a n g u l a r i d x [ p r e d m o d e A n g u l a r ] [predmode]_{Angular}= map\_alwip\_to\_angular_{idx}[predmode_{Angular}] [predmode]Angular=map_alwip_to_angularidx[predmodeAngular]
[ p r e d m o d e ] A n g u l a r = m a p _ a l w i p _ t o _ a n g u l a r i d x [ p r e d m o d e A n g u l a r ] [predmode]_{Angular}= map\_alwip\_to\_angular_{idx}[predmode_{Angular}] [predmode]Angular=map_alwip_to_angularidx[predmodeAngular]
const uint8_t g_mapMipToAngular65[3][MAX_NUM_MIP_MODE] =
{
{ 0, 18, 18, 0, 18, 0, 12, 0, 18, 2, 18, 12, 18, 18, 1, 18, 18, 0, 0, 50, 0, 50, 0, 56, 0, 50, 66, 50, 56, 50, 50, 1, 50, 50, 50 },
{ 0, 1, 0, 1, 0, 22, 18, 18, 1, 0, 1, 0, 1, 0, 44, 0, 50, 1, 0 },
{ 1, 1, 1, 1, 18, 0, 1, 0, 1, 50, 0 },
};
const uint8_t g_mapAngular33ToMip[3][35] =
{
{ 17, 17, 17, 9, 9, 9, 9, 17, 17, 17, 17, 17, 17, 17, 5, 5, 5, 5, 34, 22, 22, 22, 22, 34, 34, 34, 34, 34, 34, 34, 26, 26, 26, 26, 26 },
{ 0, 0, 10, 10, 10, 10, 10, 4, 6, 7, 7, 7, 5, 5, 0, 0, 3, 3, 12, 12, 12, 12, 14, 14, 14, 16, 16, 16, 15, 13, 1, 1, 1, 1, 1 },
{ 5, 1, 3, 3, 3, 3, 0, 0, 0, 4, 4, 4, 5, 1, 1, 1, 1, 1, 6, 6, 6, 6, 6, 10, 10, 9, 9, 9, 9, 9, 8, 8, 8, 8, 8 },
};