技术标签: H.266/VVC VVC/H.266 视频编码
Matrix Weighted Intra Prediction(MIP)技术,即矩阵加权帧内预测技术,是VVC中新增加的一种帧内预测技术。其最初的思想来源于基于神经网络的帧内预测技术(JVET-J0037),即利用多层神经网络基于相邻已重建像素预测当前pu像素值。但是这种预测方式复杂度太高,经过权衡,发展出最后采纳的基于线性仿射变换的帧内预测技术。
Tracking route: N0217 -> M0043 -> L0199 -> K0196 -> J0037
MIP技术相关代码:H.266/VVC代码学习:MIP技术相关代码_BigDream123的博客-程序员秘密
其主要流程如下图:
对于预测一个宽度为W和高度为H的矩形块PU,矩阵加权帧内预测(MIP)以块左侧的的H重建像素和块上方的W个重建像素作为输入(重建像素的获取和传统帧内预测相同),然后通过平均、矩阵向量乘法和线性插值获得最终预测像素。无论最大变换大小是多少,MIP最多支持64x64。
此步骤主要目的是对参考像素进行归一化,即根据块大小和形状,通过平均来获得4个或8个像素,具体为对于4x4的PU归一化为4个像素,对于其余形状的PU归一化为8个像素。(MIP模式中参考像素的获取和传统帧内预测模式相同)
具体来说,首先对输入的长参考边界像素和
通过计算邻域平均的方法化为短参考边界像素
和
以减少预测过程中的计算量和模型参数存储空间。当W=H=4时,左边取2个上边取2个,共4个。其他情况下左边取4个,上边取4个,共8个。计算邻域平均是个下采样过程,如下:
然后将转换后的这两个短参考边界和
连接成最终的长度为4或者8的向量
,连接的方式如下:
其中,mode指的是MIP-mode。
通过对平均后获得的向量进行矩阵向量乘法,然后加上偏移量, 获得预测值
,其尺寸为
X
,其中
和
定义如下:
预测值的生成过程如下:
其中A是一个行 (W==4&H==4?4:8)列的矩阵,b为尺寸为
的向量。实际应用中,A和b都已经预先训练好,存储在集合
中,集合的索引与尺寸有关:
S0中包含mipMatrix4x4和mipBias4x4,S1中包含mipMatrix8x8和mipBias8x8,S2中包含mipMatrix16x16和mipBias16x16。
mipMatrix4x4里含16个16x4的矩阵,mipBias4x4里含16个16维的向量,用于4x4的块。
mipMatrix8x8里含8个16x8的矩阵,mipBias8x8里含8个16维的向量,用于4xN,Nx4,8x8块。
mipMatrix16x16里含6个64x7的矩阵,mipBias16x16里含6个64维的向量,用于其他块。
插值是一个上采样过程。通过上一步矩阵向量相乘获得一个向量,长度为
,它可以转换为一个
x
的矩阵,该矩阵一般小于W x H,因此需要在水平方向或者垂直方向或者水平垂直两个方向上进行插值;如果需要对水平垂直两个方向插值,则插值顺序固定,即先水平后垂直。
以WxH块的垂直插值为例,其中max(W,H)≧8且W≧H。定义垂直上采样因子并写入
。
首先,将待插值的矩阵扩展到上面一行,如图1右半部分所示。上边一行按下式得到。
然后,对空余位置利用相邻值按下式进行插值。
从上面公式可以看出,当上采样2倍时即U_ver=2或U_hor=2,进行插值计算时不需要乘法运算。在其他情况下每次插值计算会进行不多于2次乘法运算。
插值改进- 只用移位操作 :
对于垂直方向的线性插值,首先对上下预测值进行加权,计算方式如下:
使用相邻的加权参考,于是垂直上采样可以写成以下形式:
水平方向插值可用相同的方式得出。
对于帧内模式下的每个编码单元(CU),会发送是否将MIP模式应用于相应的预测单元(PU)的标志。 如果要应用MIP模式,则会发出MIP模式(preModeIntra)的信号。对于MIP模式,如下得出一个转置标志(isTransposed),该标志确定该模式是否被转置,MIP模式 Id(modeId)确定用于使用哪种MIP矩阵。
isTransposed = preModeIntra & 1
modeId = preModeIntra >> 1
VTM中根据CU尺寸,最多支持32中MIP预测模式。具体来说,对于&
尺寸的CU支持32种MIP预测模式,max(W,H)=8和max(W,H)>8分别有16和12种预测模式,并且允许对所有的预测模式进行转置操作。
为了减少不同模式存储时的内存占用,两种模式可能会共用Matrix和offset,具体共用模式情况如下:
1).对于4x4的块,从左边和上边参考行各取两个值组成一个4维的向量。将该向量进行矩阵向量相乘运算,矩阵取自于S0。完成矩阵向量相乘和偏移值相加后得到一个16维的向量。这个16维向量形成一个4x4的矩阵不用进行插值直接作为预测矩阵。预测矩阵的每个值需要进行(4x16)/(4x4)=4次乘法运算。
2).对于8x8的块,从左边和上边参考行各取4个值组成一个8维的向量。将该向量进行矩阵向量相乘运算,矩阵取自于S1。完成矩阵向量相乘和偏移值相加后得到一个16维的向量。这个16维向量形成预测矩阵的奇数位置值。然后在垂直和水平方向进行插值,由于这个插值过程不需要进行乘法运算,所以预测矩阵的每个值需要进行(8x16)/(8x8)=2次乘法运算。
3.对于8x4的块,从左边和上边参考行各取4个值组成一个8维的向量。将该向量进行矩阵向量相乘运算,矩阵取自于S1。完成矩阵向量相乘和偏移值相加后得到一个16维的向量。这个16维向量形成预测矩阵的奇数行值和所有的列值。然后在水平方向进行插值,由于这个插值过程不需要进行乘法运算,所以预测矩阵的每个值需要进行(8x16)/(8x4)=4次乘法运算。4x8块处理过程类似。
4.对于16x16的块,从左边和上边参考行各取4个值组成一个8维的向量。将该向量进行矩阵向量相乘运算,矩阵取自于S2。完成矩阵向量相乘和偏移值相加后得到一个64维的向量。这个64维向量形成预测矩阵的奇数行值和奇数列值。然后在垂直和水平方向进行插值,由于插值过程不需要进行乘法运算,所以预测矩阵的每个值需要进行(8x64)/(16x16)=2次乘法运算。
对于更大尺寸的块处理过程类似,很容易计算出每个样点乘法运算次数小于4。
对于Wx8,W>8的块,生成的8x8预测矩阵包含所有行和奇数列,所以只需要在水平方向进行插值。预测矩阵的每个值需要进行(8x64)/(Wx8)=64/W次乘法运算。当W=16时,它的线性插值过程不需要乘法运算。当W>16时,每个像素插值过程需要的乘法运算少于2次。所以每个像素总的乘法运算小于等于4次。8xW类似。
对于Wx4的块,矩阵相乘时要去掉矩阵的奇数行,最终只需要在水平方向进行插值。预测矩阵的每个值需要进行(8x32)/(Wx4)=64/W次乘法运算。当W=16时,它的线性插值过程不需要乘法运算。当W>16时,每个像素插值过程需要的乘法运算少于2次。所以每个像素总的乘法运算小于等于4次。4xW类似。
View的事件体系 Activity承担这可视化的功能,同时Android系统提供了很多基础控件,比如TextView、CheckBox等。系统提供的控件不能满足需求,控件的自定义就需要对Android的View体系有深...
在JS编程中,有时候会需要函数返回多个值,在这里可使用数组的方式来实现话不多说,放代码:<script type="text/javascript">// 编写一个函数,计算两个数字的和、差、积、商var a=prompt("请输入")var b=prompt("请输入") //输入a,b的值var a= Number(a);var b=Number(b); //将string类型转换成number类型var result=new Array; //声明resu
/* *1.重做复习题3,但用月份名的拼写代替月份号(别忘记了可以使用strcmp())。 *2.编写一个程序,请求用户键入日,月,年,月份可以月份号、月份名或是月份缩写,然后 *程序返回一年中给定的日子(包括这一天)的总天数。 */#include #include #include #include #include void delffush();// 删除多余的缓冲区字
文章目录一、lua是什么二、lua的用途三、学习lua的资料一、lua是什么lua是一种轻量小巧型的脚本语言,用C语言编写,它是在运行时动态编译,所以每次修改不需要重新编译链接执行。二、lua的用途其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的拓展和定制功能。常用于的应用场景:游戏开发独立应用脚本Web 应用脚本扩展和数据库插件如:MySQL Proxy 和 MySQL...
今天数据库突然连不上了,报ORA-00257错误(空间不足错误),通过查找资料,绝大部分说这是由于Archivelog归档日志太多,占用了全部的硬盘剩余空间导致的,通过简单删除日志或加大存储空间就能够解决。首先进入oracle用户,使用rman工具执行命令rman target/:[email protected]$ rman target/ Recovery Manager...
数据提取之JSON与JsonPATHJSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,它使得人们很容易的进行阅读和编写。同时也方便了机器进行解析和生成。适用于进行数据交互的场景,比如网站前台与后台之间的数据交互。JSON和XML的比较可谓不相上下。Python 2.7中自带了JSON模块,直接import json就可以使用了。官方文档:...
私信我或关注微信号:狮范儿,回复:学习,获取免费学习资源包。Shell是种命令解释程序,也可以看作是一种命令语言的解释器。用户在与Shell交互时所输入的命令行必须符合Shell命令的语法和语义规范,才能够被Shell理解并执行。Shell所使用的这种命令语言称为Shell 语言。Shell语言不仅仅是一种交互式语言, 它还是一种可编程的程序设计语言。将若干个Shell命令行写入个文件就构成了一个...
这里定义了一个模版函数,功能同STL里的copy函数:#include <vector>#include <list>#include <iostream>template <typename Iter1, typename Iter2>Iter2 copy(Iter1 f1, Iter1 e1, Iter2 f2){ ...
问答时间:2021年01月21日嘉宾简介:侯家文:江西云都网络技术有限公司总经理,香港云都网络安全技术研发部总工程师,从事多年技术开发和技术团队建设,针对Linux内核、网络协议栈、高性...
汇编的除法指令是div, 实际上相对高级语言的除法, 汇编指令的div是同时得到商和余数的, 结果分别保存在不同的寄存器.除数: 有8位和16位两种, 在一个寄存器或者内存单元中被除数: 如果除数是8位则被除数为16位, 默认放在AX中, 如果除数是16位, 则被除数为32位, 默认高位放在DX, 低位放在AX结果: 如果除数是8位, 那么执行div后, 余数存放在AH, 商存放在AL中; 如
话不多说,先上图界面简洁明了功能强大
DEBUG调试Eclipse之中支持有代码的调试操作,即:可以一步一步的观察代码的执行处理操作流程。