AV1编码器优化技术
AV1视频编解码器是一种由开放媒体联盟AOM开发的royalty-free的压缩技术。libaom库是AV1的参考软件,应用各种编码器优化技术来实现更好的编码效率。本次分享,我们邀请到了来自Google 的李博晗,一起来讨论 GOP优化、时域滤波器、libaom库的其他改进以及正在进行的一些工作。
首先是GOP优化,GOP代表图片组(group of picture)。我们要编码的视频序列有很多帧,编码器会将这些帧分组为GOP。然后,编码器将顺序对每个GOP进行编码。基本上GOP是用于决定诸如分层编码结构和码率分配等的基本单元。举一个例子,这是一个包含九帧的GOP。GOP内具有层次结构,基础层一般包括第一帧和最后一帧。可以从这两个帧来预测下一层的帧。而再下一层的帧可以由这个三个帧来预测,以此类推。现在,我们想要确定每个GOP的长度。它的长度非常重要,因为从直觉上来说,我们希望每个GOP中的帧都包含具有相似特征,或者这些帧在GOP内部存在更高的相关性。想要知道GOP的长度,就要确定最后一帧在哪里。通常,最后一帧位于基础层,这意味着它将被用于预测此GOP中存在的所有其他帧。因此,为了提供更好的预测,我们想为最后一帧分配更高的质量。但是,如果我们错误地分配了GOP,例如,这里的最后一帧,如果它位于非常糟糕的位置,与其他帧之间相关性较低(比如GOP停止在场景更改的中间),那么即使我们此帧的重建质量非常高,也不会帮助到其他帧的预测。
2.1 Utilizing first-pass stats
从直觉出发,我们希望可以确定GOP的长度,使得最后一帧可以更好的预测其他帧。我们可以使用一些自适应方法来确定每个GOP应该多长以及最后一帧应该在哪里。在这里我们使用第一次编码(first-pass)数据。liibom支持两次(two-pass)编码,它先将所有帧编码处理一次,然后收集数据,再重新对所有帧进行编码。第一部分很快,而第二部分才是真正的编码——它使用所有从第一部分收集到的各种帧级别的统计信息。
在这里有三个第一次编码数据的示例,分别是帧内编码错误,一阶编码错误和二阶编码错误。帧内编码错误意味着在从其他帧预测的情况下对该帧进行帧内预测而得到的平均误差。一阶编码错误和我们前面提到的帧内编码错误意义相似,只是我们不仅可以进行帧内编码,还可以进行帧间预测,不过必须通过前一帧。这样,该帧的最大平均预测误差,就是一阶编码错误,二阶编码错误也非常相似。我们仍然可以使用帧内编码或进行帧间预测,但是只能使用相隔两帧的那一帧,这样就得到了二阶编码错误。
拥有这些很多帧级别的特征和数据,我们要使用它们来确定GOP的长度。我们想从这些统计信息中,获悉或者至少估计一下帧之间的相关性,以及其他一些我们关注的特征,并依此来分析第一遍的统计数据。
2.2 The hidden Markov model
这里,我们使用隐马尔可夫模型(HMM)。该模型假设两件事,首先,它假定基础对象的亮度遵循马尔可夫链。在此示例中,我们可以看这个球,此球沿着这样的轨迹移动。沿着该运动轨迹,我们用xi表示在时间i的亮度。这个模型是一个回归模型,但与自动回归略微有所不同,因为ai会变化。对于xi来说,这是一个马尔可夫链,因为你可以看到 x 在时间 i 的亮度,仅取决于 x 在时间 i-1 的亮度。在此条件下,它与以前所有的亮度都没有关系,这就是马尔可夫模型。
马尔可夫模型已被广泛用于对运动对象在运动轨迹上的建模。这里的ε是创新项(也就是新息),创新项代表xi无法从xi-1中预测的部分。例如,当光逐渐变化,或者物体在其表面上有一些细微的变化时,你将无法得到精确为 1 的相关性,而可能会得到0.95、0.98之类的值,以及这样一个无法预测的创新项。这基本就是我们使用的马尔可夫模型。
应用这里的马尔可夫模型,我们进一步假设当观察物体的亮度时,例如如下所示,捕获每一帧视频时将会捕获到噪声,那些噪声并不依赖于创新项,实际上也与xi无关。它们只是捕获时的加性噪声。在这里用另一个随机变量ni对表示这些噪声。我们假设它是IID(独立同分布)的白噪声。这样我们便得到观察值yi。可以看到,因为噪声的存在,在对事物进行编码时我们根本无法直接得知xi,而只能访问观测值 yi。我们在这里得出的yi以及它背后的模型,这就是一个隐马尔可夫模型,也就是指实际的马尔科夫模型被这种噪声隐藏了。
以上是一个隐马尔科夫模型的非常简单的示例,这就是我们对模型的假设。要注意有两点非常重要,第一是一个重要参数ai。ai基本控制着帧之间的相关性,如果假设xi的方差不变,则ai就是xi和xi-1 之间的相关系数。从我们的出发点来看,我们希望能够估测帧之间的相关性,ai能够帮助我们借用此模型来估测。同时,我们也想了解噪声有多大,从实际情况来看,噪声的方差也很重要。
2.3 Optimal linear prediction error
我们能观测到在任意的时间点i和j的观测值yi和yj,并希望能够估测ai和噪声。为了能做到这一点,我们首先假设我们使用最优线性预测器,也就是用一个系数w乘以yj来预测yi。如果我们考虑最优线性预测的误差,且使用先前的模型进行计算的话你最终会得到这个等式。此处显示了最佳线性预测误差e^i,j。这个等式是由几个部分组成的。首先,你需要yi和yj的方差,以及从 j 到 i的ak,还需要该帧的噪声的方差。有了这个方程式。回过头来,我们将讨论如何使用它来预测ai。
让我们来看看,首先,知道在这个方程式中,实际上很多东西可以直接从第一遍统计数据中估算出来。例如yi的方差,也就是观察到的像素方差,可以用帧内编码错误用以近似估计。其背后的原因是,当你进行帧内预测时,可以使用其相邻像素预测该块。然后从该块中移除该预测,这与减去估算出的区块平均值非常相似。这样的话,则帧内编码错误基本上就可以看作像素的方差。这并非完全准确,但非常接近。其后,当j等于i-1时,我们是在从前一帧来预测当前帧。而这恰恰是我们所说的一阶编码错误的含义。同理,如果j等于i-2,最佳线性预测误差就基本可以看作是二阶编码错误。因此,我们使用这三个第一遍统计信息来估测随机变量的这三个特征。我们将获得y的方差,e^i,i-1的方差和e^i,i-2的方差。
2.4 Estimate correlation from first-pass stats
如果假设所有这些都成立,同时再假设该邻域中的噪声方差不变,即nj的方差在该邻域中保持不变,那么我们可以针对帧i,j写出以下几个等式。一个是从 i-1 预测 i,一个是从i -2预测i-1,还以一个是从i -2预测 i。也就是说我们关心这三个帧,以及其对应的三个预测。现在,如果你写下这三个方程式,你将会发现,实际上我们只有三个未知变量,即ai-1,ai-2,以及该邻域中的噪声方差。因而,基于这三个方程,我们可以很轻松地计算出这三个未知变量。算出之后,也就可以得到ai,aj,可以得到噪声方差。到目前为止,基于此隐马尔可夫模型,我们成功地仅通过第一遍的数据,就能够通过帧邻域来估测帧与帧之间的相关性以及噪声水平。
2.5 Frame regions and GOP length decision
如果现在我们想使用分析出的相关性和噪声水平,来决定GOP长度。首先要做的是确定帧区域的类型,帧可能处于稳定区域或不稳定区域中。我们将不稳定区域分为三种:一种是高变化区域,它其中的帧会变化得较快;一种是场景切换,它会突然改变帧内容;还有一种是渐变区域,这经常出现在电影以及其他内容类型的视频中,一个场景淡出的同时,另一个场景淡入。有了这四种类型的帧区域,首先我们要将每一帧分组到这些区域中。该分组使用前面分析第一遍统计数据得到的ai,噪声水平和其他数据。
有了这些帧区域后,我们希望最终决定的GOP不包括场景切换,也就是不在一组图片中改变场景。同时还希望该GOP的最后一帧找到处于稳定区域,这背后的原因是,如果它在稳定区域中,则意味着它可以很好地预测其相邻帧。这是我们的首选,如果无法在稳定的区域中找到结束帧,我们将尝试在高变化区域内找到相对稳定的帧。同时,我们也要确保我们不会在渐变区域的中间放置最后一帧。因为通过使用双向多参考,实际上可以很好地对渐变区域进行预测。如果我们将其切开,则意味着预测将变得比较难。因而,我们一般希望将渐变区域放入一个单独的GOP中,而不想将它从中切开。可以看到,一旦我们得到所有帧区域,这些逻辑是很简单的。
此处以流程图形式展示以上的逻辑。在这里我不想再谈得过于深入,但基本逻辑就如我们在这里所描述的这样。
上图是GOP长度优化的一个例子。这里展示了帧的编码错误。这是我们标准测试集中的mobisode视频序列。这些编码错误显示了它与前一帧相比发生了多大变化。你可以看到直到第40帧左右为止它的场景都相当稳定。而在40帧这里实际上是一个场景切换,这是一个渐变场景——实际上视频中的人正在慢慢打开灯,在它(场景)之后这儿又有一个渐变场景。之后一段时间内情况很稳定,然后,就在这里还有另一个渐变场景。之后它会稍微稳定一些,有点高变化,不过并不剧烈。这就是视频序列的情况。
现在看这里的灰色圆圈,这些圆圈是最初由编解码器在没有此自适应GOP技术的情况下完成的GOP长度决策。可以看到实际上切割发生在了该区域的中间。而且就在这个渐变区域的中间,这并不是我们真正想要的。通过自适应方法得到的结果用黑色三角形表示,这是我们实际切割GOP的地方。我们将最大间隙长度设置为20——而之前是固定为16。然后,如你所见,它选择了最佳的切割位置,这是一个GOP,在这里附近切割。不过它没有在渐变区域内切割,以及下在一个渐变区域之前就结束了当前GOP。对于这个序列,如果我们可以像这样准确地切割GOP,我们会得到大约5%的增益,对于仅是更改GOP而言,这是相当大的。
如你所见,此方法可能相当高效,但这具体取决于视频的内容。当然,如果视频非常稳定,则无需在此处进行太多调整,也不会有太多增益。但是如果对于这样具有某些特定特征的序列,你将获得很大增益。标准测试集中我们能看到平均0.4%(已经比较大的)左右的增益,但是在用户生成集中,我们看到的增益更大,约0.8%。因为对于用户生成集而言,大多数视频比标准测试集中的视频更加不稳定,其中有的是通过一直晃动的手机拍摄的,有的是包含像场景剪辑、光线变化之类快速变化的内容。对于它们,自适应GOP方法可以提供更多帮助。以上就是有关libaom编码器中的自适应GOP优化的内容。接下来我们要谈谈时域滤波。
本文分享自微信公众号 - LiveVideoStack(livevideostack)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。










