0x1 AV1的编码复杂性
我们知道AV1的官方参考实现是libaom,由于AV1的编码复杂度高,如果采用libaom编码器来生成AV1的码流离实时编码还有很大的距离。我们知道传统视频编码器中有宏块的概念,宏块是16x16的亮度块 + 2个 8x8的色度快。从HEVC开始,到现在的AV1进一步引入了partiton的概念,也就是树形编码的概念,也就是说把先规定好最大的编码单元,这个最大的编码单元称为super block,在HEVC一般是64x64,在AV1中为128x128。然后进行四叉树划分,AV1中直至划分成4x4,HEVC中直至划分成8x8。而且这种划分进一步扩展到预测单元和变换单元。据统计,AV1编码中的复杂度80%是因为partiton引入的,所以要是能有一个快速方法来加速partiton的判断的话,AV1的编码速度能大幅提升。
AV1中的partiton划分如下图所示。
0x2 AI加速partiton划分
在libaom目前的实现中,AI加速主要用在intra frame的partition划分优化上。
|
|
该函数的输入是图像的像素值,可以理解为图像对应的纹理。并且需要把对应亮度/色度值转换成0~1之间的浮点数。如下代码所示,c为亮度或色度分量的index,这里c为0,为亮度分量。max_val为亮度/色度分量的最大值255(假设为8bit yuv)。
|
|
输出是这几个变量partition_none_allowed,partition_horz_allowed,partition_vert_allowed,do_rectangular_split,do_square_split。用来对后续的partition的划分进行优化,从变量的名称可以看到这些变量会对后续的partition划分进行限制,也就是减少了partition的数目。
推理采用的网络是CNN + DNN的结合。
CNN是5层网络结构,网络定义如下。
|
|
DNN是两层网络结构,网络定义如下。
0x3 推理模型的训练
以上编码过程中采用的CNN + DNN的网络是经过训练的,在libaom的代码中并没有提供这个网络结构的训练过程代码。参考HEVC partition优化可以大体知道其训练过程。应该是设计好网络以后,通过大量样本数据来训练得到该推理网络的。