本期作者
蔡春磊
bilibili资深算法工程师
从事视频图像处理与编解码算法的研究与应用
尹壮
bilibili高级开发工程师
负责B站视频云转码系统研发,专注于窄带高清服务研发与应用
王一
bilibili技术专家
B站技术委员会多媒体通道负责人
叶天晓
bilibili技术专家
B站视频云技术部音视频算法组负责人
背景
B站每天都会接收数十万的视频投稿,在这海量的稿件中,有一部分作品会成为热门视频。这些热门视频吸引了大部分用户的关注,同时也会消耗大部分的带宽资源。因此当作品热度上升之后,B站会对视频进行重新转码,此时会使用更高复杂度的编码方法,在保持画质不变的前提下,进一步去除数据冗余,以提高压缩比,降低码率,避免带宽资源的浪费。为了提高视频转码的性能,B站研发了一种画质可控的场景自适应转码系统
先自动切分出每个单镜头场景,然后对每段场景预测最优编码参数,精准控制编码画质,最后合并码流得到压缩视频文件
该系统能够以 99% 的准确率对视频中每段场景的画质进行控制,从而可以保障稳定的画质体验,同时避免了码率的浪费,该系统近日已经上线。使用新的转码系统之后,视频画质更加稳定,画质问题得到了明显改善。与此同时,新系统还带来了 15% 的码率节省,避免了不必要的带宽浪费
在手机 app 上全屏观看 1080p 视频,发现新的转码系统明显改善了画质问题
画质可控的场景自适应转码系统能够取得这样的效果,是因为具备以下两个核心特性。
1. 分段编码+画质可控
  • 场景自适应分段编码是指
    首先切分出视频中所有单镜头的场景片段,对每个片段采用内容自适应的参数进行编码,再将片段码流拼接成一个视频文件
    ,而不是使用一个参数对整个视频进行编码

  • 画质可控是指转码的目标,是控制编码视频的画质达到目标,而不是控制码率
当一个转码系统拥有这两个特性之后,就可以提供稳定的画质体验,同时避免码率的浪费,下图中的模型可以对此进行直观的解释。
画质可控的场景自适应编码相比于其他模式,既能保证稳定的画质体验,又能避免码率浪费
在这个模型中,一个视频包含了 6 个单镜头的场景片段,片段之间的内容复杂度各有不用。因此为了编码之后达到相同的画质,各个场景所需要的码率是不一样的,复杂场景所需码率高,简单场景所需码率低。
作为对比,我们首先在图中用虚线框表示平均码率编码的结果,平均码率编码(average bit-rate)是一种日常应用中被广泛使用的编码方法,该方法目的是输出具有稳定码率的视频。在这个模型中,平均码率编码方法对整个视频设置了同一个目标码率,虽然在这样的平均码率下,视频总体的平均画质可以达到预设目标,但是明显存在两大弊端:1. 对于复杂场景而言,目标码率不足以保留足够的视频信息,从而导致画质严重受损,出现模糊、块效应等失真,即使短暂的画质恶化,也会严重破坏观看体验;2. 对于简单场景而言,目标码率高于目标画质所需的码率,保留了大量数据冗余,多余的码率很难继续改善画质,从而造成了不必要的带宽浪费。因此使用简单的目标码率编码方法,既不能保障稳定的画质体验,又存在严重的码率浪费。
为了解决上述问题,B站提出使用画质可控的场景自适应编码方法,其编码过程在上图中用绿色方块表示。该方法具备分段编码和画质可控两大核心特性。具体而言,首先将视频分成独立的场景片段,每个片段只包含一个镜头场景,然后对每个视频进行分段编码。而在分段编码时,通过设置合适的编码参数,控制所有场景的画质都能达到目标。从上图可以直观地看到,使用画质可控的场景自适应转码时,简单场景码率消耗很低,在达到画质目标的同时,避免码率的浪费;同时复杂场景为了画质不受损,将获得更多的码率资源。
要想实现这样的转码系统,就需要实现分段编码和画质控制这两个核心功能。对于分段编码功能,场景切分越精确,场景内容就越一致,编码的画质就越稳定。对于画质控制而言,使用的编码参数越准确,输出画质就越接近目标,出现画质受损和码率浪费的现象就越少不过,要得到这样的效果,需要克服很多难题。
2. 检测场景切换
分段编码的前提是准确地识别视频中的场景切换。检测场景切换的基本思路是判断帧与帧之间,内容相关性的强弱。不同场景之间,由于存在镜头切换,所以画面内容的变化是跳跃且不连续的,帧间相关性很弱,比如背景、光照、环境等发生了较大变化。通过检测这些内容上的不连续,即可对场景进行切分
在我们的系统中,采用了一种被广泛用于视频编码器中的场景切换检测算法。在视频编码过程中,一帧视频可以用帧内模式编码(Intra frame,I 帧),也可以用前向预测模式编码(Predictive frame,P 帧),它们的区别在于是否需要前向帧作为参考。如果某帧视频与前面的帧具有很强的时间相关性,那么这一帧被编码成 P 帧的率失真代价将会很低;反之如果帧间的相关性很弱,那么帧间的残差信息会很多,用 P 帧编码的率失真代价将会超过 I 帧。
同一个场景中的视频帧和前一帧有很多相似内容,利用 P 帧模式进行编码的代价很低。当出现场景切换时,视频帧与前一帧中几乎没有相似内容,此时使用 P 帧编码的代价不比 I 帧小
因此在编码一个视频时,如果某一帧视频与前面一帧处在同一个场景片段中,那么对这一帧使用 P 帧模式进行编码的率失真代价将会远远小于 I 帧模式。反之,如果这一帧和前一帧之间存在场景切换,那么对这一帧使用 P 帧模式的率失真代价接近或者超过 I 帧。
所以利用编码器的这个特性,在编码每一帧视频时,分别测试其工作在 I 帧和 P 帧时的率失真代价,然后比较它们的大小关系,就可以判断是否存在场景切换了。我们实现了一种超高速的预编码算法,可以以超过 300 帧每秒的速度对视频进行场景进行准确切分
3. 画质可控的编码方法
在视频编码时,通过调节编码参数,可以控制码率资源的分配,从而使压缩结果满足特定的码率或画质要求。
满足码率要求相对简单,因为在编码过程中可以快速准确地计算码率,从而及时调整量化参数,使实际码率不断靠近目标。
但是想要控制编码器满足画质要求就难得多了。首先,这里的画质是指人眼主观感受到的画面质量,获取真实画质需要组织大量人员进行主观评测,耗时耗力。在实践中一般采用某些客观指标,自动计算出结果,对画质进行评价。但是,画质评价作为数字图像处理的终极问题,目前还没有一个完美的解决方案。比如编码中广泛使用的指标 PSNR(Peak Signal to Noise Ratio),也只能衡量像素级信息的保真度,与人眼主观感受存在巨大差别。
目前业内影响力最大的视频画质指标是 Netflix 在 2015 年提出的 VMAF(Video Multi-method Assessment Fusion)。该算法用于评价视频编码后的画质,属于全参考的指标,具体是以 3 种基本失真指标作为时空域特征,训练一个机器学习模型,对整体的主观画质进行预测。VMAF 和主观感受的匹配度较高,因而能够比较准确地评价编码后的画质。所以在我们的系统中,我们使用 VMAF 来对画质进行评价,并控制编码后视频的 VMAF 值达到某个预设的目标。
主观画质评价作为图像处理的终极问题,是指导视频图像进行智能处理、编码、分析等任务的重要依据。目前业内广泛使用的是 Netflix 提出的 VMAF 指标,可以比较准确地评价视频的编码画质
那怎么样控制编码视频 VMAF 达到目标呢?VMAF 的计算相对复杂,涉及大量时空域信息,无法在编码过程中通过局部信息推导得到,因此无法在编码过程通过实时反馈的方式调整编码参数,只能在编码之后,计算得到准确的 VMAF 结果,然后再去调整编码参数重新编码,如此反复,直到搜索得到合适的参数。
以常用的 crf(constant rate factor,恒定码率因子模式)编码模式为例,通过改变码率因子(rate factor, rf)这一参数,就可以调整视频的画质。一般而言,rf 越小,编码后视频的画质越好,VMAF 分数越高;反之 rf 越大,编码后视频画质越差,VMAF 越低。但是,由于不同视频的内容特性有差异,使用同一个 rf 参数,编码后的 VMAF 分数是不同的。而且由于视频编码是一个高度非线性的过程,rf 参数与实际编码后的 VMAF 之间的关系非常复杂,很难通过传统方法构建可解析的模型进行描述
通过搜索的方法可以找到最优的 rf 参数,使编码画质满足要求,但是需要反复进行多次编码和 VMAF 计算
要想控制编码后的 VMAF 达到目标值,可以过不断调整编码参数,反复编码以及计算 VMAF,搜索得到最优的结果。很显然,这种策略的计算量非常大,需要执行很多次编码和 VMAF 计算才能得到合适的编码参数,无法用于大规模转码的业务中。
为了提高画质可控编码方法的实用性,可以将参数搜索问题变换成一个参数预测问题。在编码之前先根据目标 VMAF 和输入视频的内容特性,对最优参数进行预测,只要预测的准确率足够高,那么使用预测的参数进行编码,结果的 VMAF 就会足够接近目标
不过,对编码参数进行准确预测,依然是一个很难的非线性优化问题。最近几年深度学习技术得到了迅猛发展,作为一种解决高度非线性优化问题的工具,深度学习在很多预测类问题上表现得非常出色。我们的系统引入深度学习技术,实现了一种 rf 参数预测方法,可以取得 99% 的预测准确率。
4. 基于深度学习的 rf 参数预测方法
如下图所示,最优编码参数 rf 和视频内容特性以及目标画质之间的关系可以建模成一个函数,函数本身和编码器相关。当函数表达确定好后,就可以根据输入的视频特征和目标画质,预测得到一个编码参数。这里的问题就是求解,在预测参数与实际最优参数之间误差最小的时候,函数的表达形式。
将搜索最优参数转化成预测问题,利用深度神经网络模拟预测函数,通过大数据优化预测准确率
使用深度神经网络来构建该函数,那么该函数的表达形式就可以由神经网络的模型结构和模型参数所决定。我们根据经验先设计好一种模型结构,此时的优化问题,就转变成了如何求解或者训练网络的最优参数,而该问题目前已经有大量成熟的解决方案了。
在实现过程中,有大量细节值得分享:包括如何表达视频的内容特性、如何设计有效的深度神经网络模型、如何对参数进行训练等。
 4.1 视频内容特性的表达方法
对视频进行编码时,由于内容特性的不同,编码结果会有很大不同。视频内容特性包括视频分辨率、帧率等元信息,以及空间复杂度和时间复杂度等内容特征。在进行视频编码时,对应目标画质的最优编码参数和内容特性密切相关。因此在对最优参数进行预测时,需要将视频内容特性作为输入特征。
视频元信息很容易获取,但是如何表达视频的时空复杂度等内容特征呢?在很多深度学习的视频图像处理和分析方法中,比如目标识别、图像分类等任务中,一般会将原始像素信息直接作为输入,训练网络自动学习表达视频特征的方法。因此网络在训练完成后,就可以通过对图像进行一系列卷积变换,得到很多特征用于表达视频的内容特性。但是这些特征都是网络推理过程中的隐藏状态,它们本身是非常复杂且无法解析的,网络最后会将这些特征用于分类或回归等任务,才能得到最终的预测结果。
虽然直接将视频像素数据作为输入很智能,但是需要构建大容量网络,消耗巨大算力。因此我们选择对视频进行预分析,提取约 600 个特征,构建小规模深度神经网络
虽然直接将原始像素作为输入的做法很智能,因为不需要花费精力设计特征描述方法,一切都可以通过算力自动学习得到。但是这种方法不适合用在我们的转码任务中,因为这种方法的复杂度太高。如果将一个视频所有帧(或者相邻几帧)的所有像素都送进网络,再经过一系列卷积操作,那么所需要消耗的计算资源和内存资源都非常巨大,其代价将会远远超过编码本身。这显然与我们想要设计一种实用算法的初衷不符。
为了加速网络推理效率,我们需要将一个视频快速地映射成一组简化的特征,再将特征作为网络输入,进行快速的参数预测。我们使用了两种传统图像分析算法来对视频的时空特性进行描述,同时我们还从预编码的码流中提取大量模式信息作为特征来描述视频在编码过程中的表现。
  • 基于 GLCM 的空间特征
GLCM(Gray-Level Co-occurrence Matrix),灰度共生矩阵是一种经典的空间纹理特征描述方法,通过对图像上保持固定距离的两个像素之间具有各种灰度关联状况进行统计得到,本质上是纹理结构的概率分布矩阵。每帧图像都可以计算得到一张灰度共生矩阵,然后通对矩阵中的系数计算各类统计量,这些统计量即可用于表征图像的空间纹理特性。
在我们的系统中,对每帧视频图像,首先计算得到 3 张像素距离不同的 GLCM 矩阵,用以表达多尺度纹理特征。然后对每个 GLCM 矩阵的系数,分别计算信息熵、对比度、相关性、对比度等指标。现在每帧图像都有一组特征,最后要将每帧图像的特征整合到一起,用于表达整个视频片段,方法是针对每个指标,分别计算它们在所有图像中的均值、方差、峰度、偏度等统计量。
通过上面的方法,我们就可以得到一组用于表达视频空间纹理特性的特征值。GLCM 的计算非常适合 GPU 加速,在加速后可以对视频进行超高速的分析。
  • 基于 NCC 的时间特征
NCC(Normalized Correlation Coefficient 归一化相关系数),是一种通过计算相邻帧之间图像块相关性的方法,可以描述视频时域复杂度。时域复杂度越低,相邻帧之间的相关性就越强,视频数据中存在的冗余就越多;反之时域复杂度高,相关性就越弱。
我们首先对视频中每对相邻帧计算一个 NCC 系数矩阵,系数矩阵大小和视频帧大小一致,其中每个系数表示相邻两帧在同一个邻域窗口内纹理的相关性。然后对每个 NCC 矩阵,计算均值,方差,峰度,偏度、信息熵等统计值,即可将矩阵转化成一组特征值。现在每对相邻图像都有一组特征值,最后将它们整合在一起,方法同 GLCM 类似,针对每类特征,计算它们在所有图像对中的均值、方差、峰度等统计量。
此时,我们又得到了一组用于表达时域复杂度的特征值。NCC 同样适合 GPU 加速,可以以很快的速度对视频进行分析。
  • 基于超高速预编码的码流特征
视频编码器的工作原理是利用视频数据中数据相关性,对冗余的数据进行去除,从而达到压缩的效果。编码过程中,会利用运动估计、运动补偿、块划分、自适应滤波、模式选择等工具发现视频数据中的时空域相关性。因此,视频编码包含了很多对视频的分析过程,编码产生的很多模式信息可以用来表征视频的内容特性。比如最优块划分信息,可以用于表达视频的纹理复杂度,复杂的地方,最优块较小;简单平坦的地方,最优块较大。同样,运动矢量信息可以表达视频的时域复杂度。
前面提到在进行场景切分时,运行了一次超高速的预编码。我们在这次编码过程中还收集了很多编码模式信息,统计得到了诸如平均最优块大小、各种预测方向的概率分布、平均运动矢量大小等丰富的指标,用来表征视频的内容特性。很显然,这一组特征的获取代价很低,不需要额外的计算
我们通过视频分析和预编码,得到了约 600 个特征,再加入视频的长、宽和帧率等元信息,最终得到一组特征,我们用它来描述一个视频的时空内容特性。
 4.2 用于 rf 预测的深度神经网络
确定输入特征之后,我们构建了一个深度神经网络,对最优编码参数进行预测。我们对每段视频采用 crf 模式进行编码,那么需要预测的编码参数就是 rf(码率因子)。下图展示了该神经网络的结构。
用于预测 rf 的深度神经网络,由几个重要的模块构成
网络输入是表征视频内容特性的一组特征值,经过一系列卷积变换等操作,最后输出一个预测的 rf 值。该网络由几个核心模块组成,它们在这个预测任务中分别起到了重要的作用。
  • Batch Normalization,批归一化操作。该操作是将各个特征归一化成均值为 0,方差为 1 的正太分布,目的是为了消除不同类型的特征之间量纲和分布差异,降低网络训练难度,同时提高模型的表达能力。在我们的系统中,视频特征种类很多,比如模式占比、运动矢量幅度、帧率等,它们的量纲和数据类型有很大差异,所以使用 BN 操作可以在相同模型复杂度的前提下,显著提高模型的性能,而且可以加速训练过程
  • Attention Module,注意力机制模块。在传统机器学习方法中,一个重要的工作是对特征进行筛选,剔除那些没有区分度的特征,挑选出那些区分度很强的特征,这样避免无关特征对模型的影响,提高性能,这就是特征工程。特征工程十分依赖专家知识,需要花费很多精力去设计和反复验证。不过,使用深度学习方法,筛选有效特征可以更加智能。我们使用注意力机制模块,在网络训练过程中,可以自动学习如何筛选重要的特征,同时抑制无效特征。注意力机制模块中包含两条支路,第一条是对输入特征进行一系列卷积变换和 Sigmoid 操作,输出一组权重,第二条支路连接输入特征和权重相乘。权重较大的特征将会保留并传递到后面的模块,而权重较小的特征将会被抑制,降低对后面模块的影响。该模块在整个模型训练过程中,将会自动学习为区分度强的特征分配较大权重,为区分度低的特征分配较小权重,从而达到了特征筛选的效果。在我们的系统中,视频特征包含约 600 个元素,其中各个特征的重要性很难验证,通过加入注意力机制模块,就能很好地利用所有特征,同时避免无效特征对模型性能的影响。
  • Residual Block,残差变换模块。对编码参数进行预测是一个高度非线性的问题,增加模型中的卷积层可以提高模型的非线性表达能力。残差变化模块是一种被广泛使用的模块,可以在扩充模型深度的同时,避免梯度消失等问题。因此我们在模型中加入了几个残差模块来提升性能
  • Full Connection,全连接模块。模型的最终输出是一个 rf 参数,因此,在最后一层,我们使用全连接层,将隐藏特征整合输出为最终的预测结果。
现在我们针对 rf 参数预测任务的特点,已经构建了一个深度神经网络,接下来需要对模型中的参数进行求解。
对神经网络中的模型参数进行训练是一个最优化问题,优化目标是使预测的 rf 与真实的最优 rf 之间的均方误差最小。真实的最优 rf,是指编码器使用该 rf 进行编码后,压缩视频的 VMAF 正好等于预设目标值(比如目标 VMAF 为 92)。那么对于一个视频而言,提取视频特征作为输入,然后通过搜索的方式得到真实的 rf 作为标签,就可以获得一对训练数据。获取足够多的训练数据之后,就可以对神经网络进行训练了。我们收集了约 20 万条 UGC 稿件,切分得到约 100 万段单镜头场景视频,用来生产训练数据
 4.3 2pass rf 预测框架
模型训练完成之后,我们在 1 万个视频的测试集上,对预测准确率进行评估,结果如下表所示。其中准确率定义为使用预测 rf 进行编码后的实际 VMAF 成功落在最优 rf 附近一定误差范围内的样本量占比。结果显示了两种不同误差水平下的准确率。同时我们定义实际 VMAF 误差超过 ±4 为画质失控,以此计算画质失控率。作为对比,我们还测试了一种在实际中常用的非自适应固定编码参数的转码方法,该方法对所有视频采用同样的 rf,使用该参数,所有视频编码之后的平均 VMAF 在目标值附近,但是每个视频和每个场景的 VMAF 是不可控的。
基于深度学习的画质可控编码方法对画质控制的准确度显著高于固定编码参数的方法,而当采用 2pass 预测框架后,正负 1 误差的准确率高达98.80%,且没有样本出现画质失控
从结果中可以看到,非自适应的编码方法,仅有 15.85% 的测试视频,其画质在目标附近,只有这些视频的画质有保障,同时码率没有浪费。但是还有超过 40.39% 的视频,画质明显低于或者高于目标(误差超过4),这些视频要么画质明显受损,要么存在严重的码率浪费
而采用我们的方法,单步预测即可将 ±1 误差的准确率从 15.85% 提高到 45.10%,同时仅有 4.70% 的视频出现画质失控
我们注意到,上面表中还有一个结果,其准确率达到了 98.80%,这是我们提出的 2pass rf 预测方法,如下图所示。
第一次预测的准确率已经达到了 45%,因此只有约 55% 的视频片段需要执行第二次预测和编码。平均而言,我们只需要进行 1.55 次编码和 1 次 VMAF 计算,最终准确率接近 99%
该方法在第一次预测得到 rf 并对视频进行编码之后,先进行一次 VMAF 验证,如果实际 VMAF 落在目标附近,则直接保存编码好的码流,继续编码下一个场景片段;否则,将第一次的预测 rf 和实际 VMAF 作为额外的特征,再进行一次深度学习 rf 预测。由于增加了第一次的结果作为反馈,第二次的预测准确率将会显著提高,同时不再出现画质失控的结果,因此我们可以直接接受第二次的编码结果,而不再进行额外的画质验证
我们再从编码视频 VMAF 的分布看一下结果,结果显示该方法能够十分精准地将编码画质控制在目标值附近。
我们提出的基于深度学习的 2pass 画质可控编码方法可以将每个视频的 VMAF 精准控制在目标值附近
当我们设定 VMAF 误差不超过 ±1 时,由于第一次预测的准确率已经达到了 45%,因此只有约 55% 的视频片段需要执行第二次预测和编码。所以平均而言,我们只需要进行 1.55 次编码和 1 次 VMAF 计算,就能够以 99% 的准确率对编码画质进行控制
现在,我们已经解决了检测视频场景切换和控制编码画质两大难题,也就能够构建出一套画质可控的场景自适应转码系统了。
5. 使用 ROI 编码对画质提供额外保护
有一点值得注意,我们系统基于 VMAF 指标对画质进行评价,虽然 VMAF 是业界比较认可的方法,但是它和人眼主观感受还是有所差别的,并不能准确衡量所有场景的实际画质,所以使用该系统可能对某些场景不够有效。比如 VMAF 在衡量大面积静止背景中包含小面积运动人物的场景时,会给出偏高的分数,导致系统决策出的码率不足,出现模糊失真的画质问题。而当人体或人脸区域的内容出现失真时,人眼会非常敏锐地察觉到画质受损,从而影响观看体验。
针对该问题,我们提出使用感兴趣区域(Region Of Interest,ROI)编码策略作为系统扩展,对人体和人脸区域的画质进行额外的保护,避免因为 VMAF 对主观画质衡量不准确对观看体验带来的伤害。我们开发了一种可以同时检测人脸和人体区域的检测算法,可以快速对视频进行分析,得到 ROI 区域。
快速检测出视频画面中的人体区域和人脸区域,在编码时针对背景、人体和人脸区域的码率进行分级调整
在编码过程中,我们对 ROI 区域的码率进行额外补偿。码率调整按照背景、人体和人脸区域分级进行,补偿力度根据内容自适应决定,可以在总体码率几乎不变的情况下,避免人体和人脸区域的画质受到损伤,明显改善观看体验。
由于 VMAF 对复杂背景前人体和人脸的画质衡量不准确,我们采用 ROI 编码对这些区域的画质提供额外保护,进一步保障观看体验
6. 总结
为了保障热门视频的画质体验,需要对它们投入更多的计算资源,进行更加先进的转码操作,从而对画质进行精准控制,同时避免严重的带宽浪费。我们研发了一种画质可控的场景自适应转码系统,该系统利用场景切换检测算法和基于深度学习的编码参数预测方法,将视频切分成单镜头的场景片段,再精准控制每个片段的编码画质,达到了保障画质、避免码率浪费的效果。新转码系统上线之后,视频画质更加稳定,画质问题明显改善,同时码率下降 15%,避免了带宽浪费。

继续阅读
阅读原文