AV1基于机器学习的快速变换模式选择

2023-10-24 22:30

本文主要是介绍AV1基于机器学习的快速变换模式选择,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

AV1基于机器学习的快速变换模式选择

1)变换块分区:AV1无需像VP9中那样强制固定变换单元大小,而是允许亮度间编码块划分为多种大小的变换单元,这些递归分区最多可递减2级。为了合并AV的扩展编码块分区,我们支持从4×4到64×64的正方形,2:1/1:2和4:1/1:4比例也都可以。此外,色度转换单元总是要尽可能地大。

所以支持的变化尺寸如下:

static const TX_SIZE txsize_sqr_map[TX_SIZES_ALL] = {TX_4X4,    // TX_4X4TX_8X8,    // TX_8X8TX_16X16,  // TX_16X16TX_32X32,  // TX_32X32TX_64X64,  // TX_64X64TX_4X4,    // TX_4X8TX_4X4,    // TX_8X4TX_8X8,    // TX_8X16TX_8X8,    // TX_16X8TX_16X16,  // TX_16X32TX_16X16,  // TX_32X16TX_32X32,  // TX_32X64TX_32X32,  // TX_64X32TX_4X4,    // TX_4X16TX_4X4,    // TX_16X4TX_8X8,    // TX_8X32TX_8X8,    // TX_32X8TX_16X16,  // TX_16X64TX_16X16,  // TX_64X16
};

其中矩形块的变换是通过更小的正方形变换实现的。

2)扩展的转换内核:为AV1中的帧内和帧间块定义了一组更丰富的转换内核。完整的2-D内核集由DCT,ADST,flipADST和IDTX 的16个水平/垂直组合组成。除了已在VP9中使用的DCT和ADST之外,flipADST则以相反的顺序应用ADST,并且恒等变换(IDTX)意味着沿某个方向跳过变换编码,因此对于编码锐利边缘特别有用。随着块大小变大,某些内核开始发挥类似作用,因此,随着变换大小的增加,内核集会逐渐减少。

DCT,ADST,flipADST和IDTX 的4个水平变换4个垂直变换可以组合成16个2D变换。其在libaom中定义如下:

enum {DCT_DCT,            // DCT in both horizontal and verticalADST_DCT,           // ADST in vertical, DCT in horizontalDCT_ADST,           // DCT in vertical, ADST in horizontalADST_ADST,          // ADST in both directionsFLIPADST_DCT,       // FLIPADST in vertical, DCT in horizontalDCT_FLIPADST,       // DCT in vertical, FLIPADST in horizontalFLIPADST_FLIPADST,  // FLIPADST in both directionsADST_FLIPADST,      // ADST in vertical, FLIPADST in horizontalFLIPADST_ADST,      // FLIPADST in vertical, ADST in horizontalIDTX,               // Identity in both directionsV_DCT,              // DCT in vertical, identity in horizontalH_DCT,              // Identity in vertical, DCT in horizontalV_ADST,             // ADST in vertical, identity in horizontalH_ADST,             // Identity in vertical, ADST in horizontalV_FLIPADST,         // FLIPADST in vertical, identity in horizontalH_FLIPADST,         // Identity in vertical, FLIPADST in horizontalTX_TYPES,DCT_ADST_TX_MASK = 0x000F,  // Either DCT or ADST in each direction
} UENUM1BYTE(TX_TYPE);

由上面可知当AV1为一个变换块选择划分方式和变换模式时需要遍历19x16=304种模式组合,复杂度非常高。

变换模式快速剪枝

为了减少变换模式决策的复杂度,AV1实现了基于机器学习(全连接神经网络FCN)的变换模式剪枝方法。在选择水平变换模式和垂直变换模式的时可以分别通过两个机器学习模型根据得分剪枝掉概率低的变换。

该机器学习模型是通过全连接神经网络FCN构建的,每层的模型参数(包括weights和bias)都预先训练好了直接在源码中固定了。AV1为水平变换和垂直变换分别都预先提供了19种机器学习模型,分别用于处理19种变化尺寸。

模型定义如下:

// Map tx_size to its corresponding neural net model for tx type prediction.
static NN_CONFIG_V2 *av1_tx_type_nnconfig_map_hor[] = {&av1_tx_type_nnconfig_4x4_hor,   // 4x4 transform&av1_tx_type_nnconfig_8x8_hor,   // 8x8 transform&av1_tx_type_nnconfig_16x16,     // 16x16 transformNULL,                            // 32x32 transformNULL,                            // 64x64 transform&av1_tx_type_nnconfig_4x8_hor,   // 4x8 transform&av1_tx_type_nnconfig_8x4_hor,   // 8x4 transform&av1_tx_type_nnconfig_8x16_hor,  // 8x16 transform&av1_tx_type_nnconfig_16x8_hor,  // 16x8 transformNULL,                            // 16x32 transformNULL,                            // 32x16 transformNULL,                            // 32x64 transformNULL,                            // 64x32 transform&av1_tx_type_nnconfig_4x16_hor,  // 4x16 transform&av1_tx_type_nnconfig_16x4_hor,  // 16x4 transformNULL,                            // 8x32 transformNULL,                            // 32x8 transformNULL,                            // 16x64 transformNULL,                            // 64x16 transform
};static NN_CONFIG_V2 *av1_tx_type_nnconfig_map_ver[] = {&av1_tx_type_nnconfig_4x4_ver,   // 4x4 transform&av1_tx_type_nnconfig_8x8_ver,   // 8x8 transform&av1_tx_type_nnconfig_16x16,     // 16x16 transformNULL,                            // 32x32 transformNULL,                            // 64x64 transform&av1_tx_type_nnconfig_4x8_ver,   // 4x8 transform&av1_tx_type_nnconfig_8x4_ver,   // 8x4 transform&av1_tx_type_nnconfig_8x16_ver,  // 8x16 transform&av1_tx_type_nnconfig_16x8_ver,  // 16x8 transformNULL,                            // 16x32 transformNULL,                            // 32x16 transformNULL,                            // 32x64 transformNULL,                            // 64x32 transform&av1_tx_type_nnconfig_4x16_ver,  // 4x16 transform&av1_tx_type_nnconfig_16x4_ver,  // 16x4 transformNULL,                            // 8x32 transformNULL,                            // 32x8 transformNULL,                            // 16x64 transformNULL,                            // 64x16 transform
};

下面以4x4的水平模型为例讲解其结构:

上图即为该模型的网络结构,输入输出各4个单元,包含一个隐藏层(8个隐藏单元)。有sigmoid和relu两种激活方式,默认不激活直接输出。

输入层到隐藏层的weights和bias如下:

static const float av1_tx_type_nn_weights_4x4_hor_layer0[32] = {-1.64947f, -1.54497f, -1.62832f, -0.17774f, -2.89498f, -0.72498f, 0.72036f,0.17996f,  1.20000f,  -0.27654f, 0.77396f,  1.21684f,  -1.75909f, -0.51272f,-1.25923f, 0.35005f,  -0.04257f, -0.23389f, -0.41841f, -0.08229f, 0.09503f,2.73144f,  -0.16875f, -0.23482f, 0.02194f,  -0.26427f, 0.28049f,  0.21260f,1.35792f,  0.27733f,  0.88660f,  -0.68304f,
};static const float av1_tx_type_nn_bias_4x4_hor_layer0[8] = {1.38742f, 0.59540f,  -1.37622f, 1.92114f,0.00000f, -0.38998f, -0.32726f, -0.15650f,
};

隐藏层到输出层的weights和bias如下:

static const float av1_tx_type_nn_weights_4x4_hor_layer1[32] = {1.65254f,  1.00915f,  -0.89318f, -2.05142f, -0.23235f, 0.96781f,  -0.37145f,-0.21056f, 1.13891f,  0.38675f,  0.87739f,  -1.42697f, 0.48015f,  0.61883f,-0.03979f, 0.11487f,  0.48042f,  0.45200f,  -0.23242f, 0.75166f,  0.55458f,0.39452f,  -0.35285f, 1.59120f,  -1.49221f, -0.48349f, -0.64692f, 1.49297f,-0.26782f, -0.65416f, -0.10648f, 0.05568f,
};static const float av1_tx_type_nn_bias_4x4_hor_layer1[4] = {4.07177f,3.26961f,0.58083f,1.21199f,
};

变换块尺寸快速剪枝

AV1为每种尺寸块定义的机器学习模型如下:

static const NN_CONFIG *av1_tx_split_nnconfig_map[TX_SIZES_ALL] = {NULL,                          // TX_4X4,&av1_tx_split_nnconfig_8x8,    // TX_8X8,&av1_tx_split_nnconfig_16x16,  // TX_16X16,&av1_tx_split_nnconfig_32x32,  // TX_32X32,&av1_tx_split_nnconfig_64x64,  // TX_64X64,&av1_tx_split_nnconfig_4x8,    // TX_4X8,&av1_tx_split_nnconfig_4x8,    // TX_8X4,&av1_tx_split_nnconfig_8x16,   // TX_8X16,&av1_tx_split_nnconfig_8x16,   // TX_16X8,&av1_tx_split_nnconfig_16x32,  // TX_16X32,&av1_tx_split_nnconfig_16x32,  // TX_32X16,&av1_tx_split_nnconfig_32x64,  // TX_32X64,&av1_tx_split_nnconfig_32x64,  // TX_64X32,&av1_tx_split_nnconfig_4x16,   // TX_4X16,&av1_tx_split_nnconfig_4x16,   // TX_16X4,&av1_tx_split_nnconfig_8x32,   // TX_8X32,&av1_tx_split_nnconfig_8x32,   // TX_32X8,&av1_tx_split_nnconfig_16x64,  // TX_16X64,&av1_tx_split_nnconfig_16x64,  // TX_64X16,
};

每个模型都是全连接神经网络FCN,其原理和前面的类似。通过这个FCN可以快速判断该块是否还需要进一步向下划分,节省了搜索每种划分方式的时间,可以降低复杂度。

总结

以上便是AV1通过机器学习进行变换模式快速选择的方法,其中每个FCN的层数和神经元数量都比较小所以进行神经网络计算的复杂度比较低。通过FCN进行剪枝可以免去对很多模式的遍历计算可以节省大量计算时间。这些FCN都是预先定义和训练好的,不需要通过码流传输。

感兴趣的请关注微信公众号Video Coding

 

这篇关于AV1基于机器学习的快速变换模式选择的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/278198

相关文章

el-select下拉选择缓存的实现

《el-select下拉选择缓存的实现》本文主要介绍了在使用el-select实现下拉选择缓存时遇到的问题及解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录项目场景:问题描述解决方案:项目场景:从左侧列表中选取字段填入右侧下拉多选框,用户可以对右侧

Rust中的Option枚举快速入门教程

《Rust中的Option枚举快速入门教程》Rust中的Option枚举用于表示可能不存在的值,提供了多种方法来处理这些值,避免了空指针异常,文章介绍了Option的定义、常见方法、使用场景以及注意事... 目录引言Option介绍Option的常见方法Option使用场景场景一:函数返回可能不存在的值场景

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

如何选择适合孤独症兄妹的学校?

在探索适合孤独症儿童教育的道路上,每一位家长都面临着前所未有的挑战与抉择。当这份责任落在拥有孤独症兄妹的家庭肩上时,选择一所能够同时满足两个孩子特殊需求的学校,更显得尤为关键。本文将探讨如何为这样的家庭做出明智的选择,并介绍星贝育园自闭症儿童寄宿制学校作为一个值得考虑的选项。 理解孤独症儿童的独特性 孤独症,这一复杂的神经发育障碍,影响着儿童的社交互动、沟通能力以及行为模式。对于拥有孤独症兄

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

电脑桌面文件删除了怎么找回来?别急,快速恢复攻略在此

在日常使用电脑的过程中,我们经常会遇到这样的情况:一不小心,桌面上的某个重要文件被删除了。这时,大多数人可能会感到惊慌失措,不知所措。 其实,不必过于担心,因为有很多方法可以帮助我们找回被删除的桌面文件。下面,就让我们一起来了解一下这些恢复桌面文件的方法吧。 一、使用撤销操作 如果我们刚刚删除了桌面上的文件,并且还没有进行其他操作,那么可以尝试使用撤销操作来恢复文件。在键盘上同时按下“C

在JS中的设计模式的单例模式、策略模式、代理模式、原型模式浅讲

1. 单例模式(Singleton Pattern) 确保一个类只有一个实例,并提供一个全局访问点。 示例代码: class Singleton {constructor() {if (Singleton.instance) {return Singleton.instance;}Singleton.instance = this;this.data = [];}addData(value)

C#实战|大乐透选号器[6]:实现实时显示已选择的红蓝球数量

哈喽,你好啊,我是雷工。 关于大乐透选号器在前面已经记录了5篇笔记,这是第6篇; 接下来实现实时显示当前选中红球数量,蓝球数量; 以下为练习笔记。 01 效果演示 当选择和取消选择红球或蓝球时,在对应的位置显示实时已选择的红球、蓝球的数量; 02 标签名称 分别设置Label标签名称为:lblRedCount、lblBlueCount