AV1技术学习:Affine Motion Compensation

一、Affine Model Parameter

除了传统的平移运动补偿,AV1 还支持仿射变换模型,将当前像素点 (x, y) 通过以下方式投影到参考帧中的预测像素点 (x', y').

参数 (h13, h23) 对应于平移模型中使用的常规运动向量。 参数 h11 和 h22 控制垂直和水平轴上的比例因子,并与 h12 和 h21 一起决定旋转角度。

每个参考帧关联一个全局仿射模型,其中四个非平移参数的精度均为12位,平移运动矢量的编码精度为15位。一个编码块可以直接根据参考帧索引使用其仿射模型。

全局仿射模型捕获帧级缩放和旋转,主要关注整个帧的刚性运动设置。此外,编码块级别的仿射模型可以自适应地跟踪跨帧变化的非平移运动。然而,每个编码块发送仿射模型参数的开销成本也引入了额外的信息。因此,各种研究工作都集中在不增加额外开销的仿射模型参数估计上,AV1 采用一种基于空间相邻块的规则平移运动矢量的局部仿射参数估计方案。

编码块的局部仿射模型中的平移运动矢量 (h13, h23) 在比特流中显式传输。为了估计其他四个参数,假设局部尺度和旋转因子可以通过空间邻居的运动活动信息来反映。编解码器扫描编码块最近的相邻块,并根据运动信息使用和当前块相同参考帧的相邻块。最多允许八个相邻候选块。对于每个后选择的候选块,首先计算其中心位置和当前块中心位置的偏移,将该位置作为原始样本的位置,然后在该偏移的基础上,添加候选块和当前块间的运动矢量差,形成仿射变换后的目标样本的位置,对可用的原始和目标样本位置对进行最小二乘回归,计算仿射模型参数。

我们以上图为例来演示仿射参数估计过程。最近的相邻块由扫描顺序标记。对于Block k,其中心位置记为(xk, yk),运动矢量记为 mvk,其中当前编码块用 k = 0 表示。

假设,在这种情况下,相邻块 1、2、5和 7 与当前块使用相同的参考帧,选它们为参考块。原始样本位置形成为

式中k∈{1,2,5,7}。将运动矢量差进一步相加,得到相应的目标样本位置

为了构造最小二乘回归,我们将样本数据表示为

最小二乘回归计算出的 Affine 的参数为:

在实际中需要确保空间相邻块与当前块相关。因此,如果运动矢量差的任何分量的绝对值超过8个像素,我们就丢弃该参考块。此外,如果可用参考块的数量小于2,则最小二乘回归问题是病态的;因此,局部仿射模型被禁用。

二、Affine Motion Compensation

构建出 Affine 模型之后,进行Affine 模式的运动补偿。Affine 模型应用于 8x8 及以上的块大小。

一个预测块被分解成8 × 8个单元。首先由平移运动向量(h13, h23)确定每个 8×8 预测单元的中心像素,下图所示。下图中的绿色方格中位置(x, y)的其余像素,围绕中心像素(x1, y1)进行缩放和旋转,形成如下虚线中的仿射投影(x', y')

仿射投影允许 1/64 像素精度。设计了一组八抽头FIR滤波器(在某些情况下为六抽头)来进行亚像素插值。传统的平移模型在整个块上具有均匀的亚像素偏移量,这允许人们有效地“重用”大多数中间结果以减少总体计算。比如,要插值8 × 8块,首先应用水平滤波器从15 × 15 参考区域生成中间15 × 8数组。然后将垂直滤波器应用于中间的 15 × 8 数组,以产生最终的8 × 8预测块。因此,平移模型需要水平滤波进行(15×8)×8乘法运算,垂直滤波进行(8 × 8) × 8次乘法,共1472次乘法。

与平移模型不同,假设仿射模型中的每个像素由于旋转和缩放效应而具有不同的亚像素偏移是合理的。直接计算每个像素需要64 × 8 × 8 = 4096次乘法。然而,可以看到(7)中的旋转和缩放矩阵可以分解为两个剪切矩阵

其中右边的第一项对应于垂直插值,第二项对应于水平插值。这将构建仿射参考块转换为两个阶段的插值操作。
首先通过在15 × 15参考区域上的水平滤波得到一个15 × 8 的中间数组,其中水平偏移量计算为

然后中间数组进行垂直滤波以插值垂直偏移量

并生成8×8预测块。因此,它总共需要1472次乘法,与平移情况相同。然而,值得注意的是,仿射模型的实际计算成本仍然较高,因为每个像素的滤波系数都是变化的,而平移模型在水平和垂直方向分别使用固定的滤波器。

为了提高缓存性能,AV1要求 (9) 中的水平偏移量与 (x−x1) 的距离在1个像素以内,(10) 中的垂直偏移量与 (y−y1) 的距离在1个像素以内,这就限制了参考区域的距离在一个15×15像素数组内。考虑生成15 × 8中间像素数组的第一阶段。离其中心的位移为(x−x1)∈[−4,4],(y−y1)∈[−7,8]。

因此,我们对最大水平偏移量的约束为

同样,在第二阶段(x−x1)∈[−4,4]和(y−y1)∈[−4,4],从而导致

AV1中的有效仿射模型需要同时满足式(11)和式(12)中的条件。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/872385.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

unseping

nnnd,这道题谁标的难度1!参考文章:江苏工匠杯-unseping&序列化,正则绕过(全网最简单的wp)_江苏工匠杯unseping-CSDN博客 这是这道题的源码,一看exec和unserialize就是反序列化和命令执行,还有个正则应…

【Redis】集群

文章目录 一、集群是什么?二、 Redis集群分布式存储为什么redis集群的最大槽数是16384(不太懂)redis的集群主节点数量基本不可能超过1000个 三、 配置集群(三主三从)3.1 配置config文件3.2 启动六台redis3.2 通过redis…

理兔chat开发日记

1.注册 注册跟以前的差不多,我们将我们的验证码放在redis下,我们在注册的时候先判断我们输入的验证码是否正确 验证码成功后在我们的实现类中,我们先判断邮箱是否重复,不重复我们就继续注册 我们拥有联号注册的功能,就…

Puppeteer 是什么以及如何在网络抓取中使用它 | 2024 完整指南

网页抓取已经成为任何处理网页数据提取的人都必须掌握的一项重要技能。无论你是开发者、数据科学家还是希望从网站收集信息的爱好者,Puppeteer都是你可以使用的最强大工具之一。本完整指南将深入探讨什么是Puppeteer以及如何有效地在网页抓取中使用它。 Puppeteer简…

日志的编写与线程池的结合

目录 一、认识日志 二、时间的等级划分 三、日志的输出端 3.1 保存至文件 四、日志的部分信息 4.1 日志等级 4.2 日志时间 五、加载日志 六、日志的宏编写 七、ThreadPool Log 一、认识日志 记录事件: 日志用于记录系统运行过程中发生的各种事件&…

elementui 日历组件el-calendar使用总结

功能: 1.日历可以周视图、月视图切换; 2.点击月视图中日期可以切换到对应周视图; 3.点击周视图查看当日对应数据; 4.周、月视图状态下,点击前后按钮,分别切换对应上下的周、月; 5.点击回到…

算法 —— 高精度(模拟)

目录 加法高精度 两个正整数相加 两个正小数相加 两正数相加 减法高精度 两个正整数相减 两个正小数相减 两正数相减 加减法总结 乘法高精度 两个正整数相乘 两个正小数相乘 乘法总结 加法高精度 题目来源洛谷:P1601 AB Problem(高精&#x…

如何PR到别人仓库(指定分支,无废话)

如何PR到别人仓库(指定分支) 记录一下,之前都是直接master分支,现在记录如何pr到别人仓库的其他分支 首先进入别人仓库然后点击fork到自己仓库 步骤(以博主自己一个例子为例) (1)…

c++ primer plus 第16章string 类和标准模板库,16.1.3 使用字符串

c primer plus 第16章string 类和标准模板库,16.1.3 使用字符串 c primer plus 第16章string 类和标准模板库,16.1.3 使用字符串 文章目录 c primer plus 第16章string 类和标准模板库,16.1.3 使用字符串16.1.3 使用字符串程序清单16.3 hangman.cpp 16.1.3 使用字符串 现在&a…

【题目/训练】二叉树的创建遍历(递归非递归)

一、根据二叉树创建字符串 思路:在正常前序递归遍历的基础上,单独加上一个考虑到右子树为空的情况,如下:其结果为 1(2(4(5)(6)))&…

馥郁珍藏:品味红酒的层次与细腻

在生活的点滴中,总有一些事物以其不同的魅力,让我们为之驻足,为之沉醉。红酒,便是其中之一。它不仅仅是一种饮品,更是一种情感的寄托,一种生活的艺术。今天,就让我们一起走进红酒的世界&#xf…

工控主板:搭载海光3300处理器的全国产化工控主板

最近为客户定做了一款全国产化的工控机主板。搭载海光3300核心板的含有丰富接口的工控主板。

一张图生成绘画全过程,这下人人都成“原画师”了

玩过SD的应该都知道ControlNet吧,最近ControlNet的作者Lvmin Zhang 又搞了一个开源项目PaintsUndo,在Github刚上线就收获了2.7k Star。 只需要上传一张静态图像,PaintsUndo就可以根据提供的图像自动生成对应的绘画全过程视频。 展示从一张白…

linux中关于环境变量的常用的设置方法

一. linux中设置环境变量的方式 1.使用/etc/environment, 是一个全局的环境变量设置文件,它会影响到所有用户和所有进程。当你需要设置一个全局的环境变量时,应该使用这个文件。这个文件的格式是 KEYvalue,每行一个环境变量。 2. 使用/etc/…

C# Winform的三态CheckBox,以及批量修改Panel中的控件

在C# WinForms中,如果你想批量修改一个Panel容器内的所有CheckBox控件的状态,你可以使用foreach循环来遍历Panel的Controls集合。下面是一个示例,展示了如何将一个Panel内所有的CheckBox控件设为选中状态(Checked true&#xff0…

昇思25天学习打卡营第13天|munger85

文本解码原理–以MindNLP为例 重要的就是怎么样把数字最后转化成真正的文字。而且自回归模型它会一个字给一个字的预测,下一个字应该是什么? 如果这个模型下载很慢,你就可以通过这种方式从摩大社区进行下载。 这种方式, 每一次候…

如何让LabVIEW程序框图的图标简化,从而节省空间?

再点击选项 取消掉箭头所示的√即可。 这样就可以将生成的图标从下面所示: 变成简化的图标,如下所示:

【Pytorch】数据集的加载和处理(一)

Pytorch torchvision 包提供了很多常用数据集 数据按照用途一般分为三组:训练(train)、验证(validation)和测试(test)。使用训练数据集来训练模型,使用验证数据集跟踪模型在训练期间…

安全防御拓扑1

目录 实验的拓扑: 要求: 我搭建的实验拓扑 步骤: 创建vlan: 接口配置: 防火墙: 防火墙配置: 建立安全策略: 防火墙的用户: 办公区的市场部和研发部用户 市场部…

杰发科技AC7801 —— __attribute__指定地址存储常量

const uint8_t usFlashInitVal[] __attribute__((at(0x08002800))) {0x55,0x55,0x55,0x55,0x55};//定位在flash中,0x00030000开始的6个字节信息固定 注意7801的地址在8000000之后 如地址选0x00000800烧录时候报错 不知道是不是atclinktool的bug,使用_…