本期作者
马程前
多媒体技术部高级开发工程师
吴志强
多媒体技术部高级算法工程师

贺沁雯
多媒体技术部高级算法工程师
杨尚鑫
多媒体技术部开发工程师
成超
多媒体技术部资深开发工程师
01 前言
B站每天都会接收数十万的视频投稿,在这大量的视频中,有一些稿件会成为热门视频。这些热门视频吸引了大部分用户的关注和播放,同时也会消耗很大部分的带宽资源。因此当作品热度上升之后,B站会对视频进行重新转码,此时会使用更高复杂度的转码系统方案如(画质可控的场景自适应转码系统),在保持画质不变的前提下,更好的去除数据冗余,以提高压缩比,降低码率,避免带宽资源的浪费。为了进一步提升转码系统性能,我们研发了一套视觉无损的深度学习前处理系统。该系统可以在原有场景自适应转码系统的基础上,带来15%左右的码率节省,与此同时,保持画面质量不变。
02 基于DCT的低秩表达损失函数
变换、量化、熵编码是传统视频编码框架中最主要的流程。其中DCT变换(Discrete Cosine Transform)完成了图像由空域到频域的转换,它有三个重要的特征:1.它可以将像素块转换成同样大小的频率系数块。2. 它可以集中能量。3.它是可逆的。尤其是第二个特点,利用这个特性可以更简单的消除图片的空间冗余。
图1 DCT频率系数图
在一张图片中绝大部分的能量都会被集中在左上角的低频区间,所以如果我们只保留左上角的低频区间就可以保留图片的绝大部分信息了。一种简单的方法是直接舍弃右下角的高频区间,这样虽然可以还原图片的大部分内容,但在一些纹理细节上会有一定的损失。那么我们是否可以设计一种视频前处理的方法在保留一些重要纹理细节的同时,微弱一些次要纹理,以保证画面质量。此时对处理后的视频进行编码,编码器就不会在平坦的纹理处消耗大量码率,同时会在边缘纹理处分配更多的码率。这样我们就可以在优化码率的同时保证画面质量。
图2 舍弃不同DCT系数的DCT可视化图
如图2:左图为原始图片DCT变换后的频域系数,中间图片为DCT变换后直接舍弃21%高频分量后的频域系数,右图为DCT变换后优化舍弃23%频率分量后的频域系数。
图3 图片在含有不同比例DCT频率分量下的画面对比
如图3,左图为原始16*16图片块,中间图片为DCT变换后直接舍弃21%频率分量后做逆变换的结果,右图为DCT变换后优化舍弃23%的频率分量后做逆变换的结果。我们可以看到中图虽然可以还原大部分的信息,但是在一些细节纹理上出现了较明显的马赛克块状的情况,相比原图有较明显的劣化。反观右图,虽然相比中图丢弃了更多的DCT频率分量,但整体的画面主观感受要好于中图,特别是马赛克的情况要少于中图,更加接近原图的主观感受。
于是我们想利用DCT的这个特性去设计一个损失函数,去帮助前处理网络去学习消除一些平坦区域的微弱纹理和噪声并且保留一些重要的纹理细节。
首先我们将大小为N*N的图片块(N通常为8,16...)进行DCT变换,得到该图片块的DCT频域系数。
得到图片块的DCT频域系数后,求取其高频分量区间系数的均值。
最后将低于均值的系数和0做平均绝对误差,得到损失。
图4 使用不同方法舍弃DCT系数的频率分布柱状对比图
图4将图3的DCT系数二维图按ZigZag的遍历方式变为一维柱状图,通过图4我们可以更清晰的看到,相比直接暴力的舍弃所有高频分量,通过我们设计的损失函数可以更好的保留一些重要的高频分量的同时舍弃一些次要的高频分量。
通过这样的损失函数设计,我们可以让模型学习到保留图片高频分量中系数较大的部分,消除一些高频分量中系数较小的毛刺部分。从而达成消除一些平坦区域的微弱纹理和噪声并且保留一些重要的纹理细节。这些系数较小的高频分量虽然在图片中的占比很少,但是对熵编码来说却有不小的影响,因为对熵编码来说这些系数较小的高频分量会在熵编码的过程中占据相当部分的字节数,从而增加了编码器的负担。在编码器编码的过程中,编码器会将相当一部分的码率分配给这些占比不大的高频分量,从而导致编码器对其他更为重要的高频分量的码率分配的减少。如果我们消除一些高频分量中系数较小的毛刺部分,就可以让编码器给更为重要的高频分量分配更多的码率。这样既能在主观上保证画面的质量,又能降低对编码器的负担。
03 轻量小模型设计
由于线上转码任务对时效性和计算资源的要求相对较高。从算法方案初期就定位于要使用轻量小模型来达成时效性和计算资源的要求。
算法部署的目标平台是x86 cpu,我们根据部署平台设计了一个高效轻量化的模型,首先图片通过Pixel Unshuffle进行下采样,然后经过一次3*3卷积后进入分组卷积模块,最后经过一系列卷积跳连等操作和Pixel Shuffle的上采样得到最后的结果。在模型设计阶段,我们侧重选择了一些对于x86平台更加友好的算子进行模型的构造。
  • Pixel Shuffle/ Pixel Unshuffle:一般情况下,在对图片或者特征图进行上下采样的时候,大多数模型会使用类似max/average pooling、stride conv/transpose conv或者插值上采样。但针对于图像预处理这种low level的任务,反卷积会有一定的概率产生棋盘格效应, 而插值+卷积在计算开销上也会更大,所以综合来看Pixel Shuffle即可以规避棋盘格效应也没有引入额外的计算开销,非常适合这个任务场景。
图5 Pixel Shuffle 示意图
  • Split Conv Block: 在low level的视觉任务中,拆分通道卷积和模块蒸馏的方式在最近一段时间被比较广泛的使用在各种low level的视觉任务模型中。我们参考了RFDB的设计结构,经过一些改进,设计了一个超轻量级的Split Conv Block。并尝试使用重参数化的方式进行部署,降低了模型在推理时的计算量。
图6 RFDB结构图
经过设计和大量的调优验证,我们最终把模型参数量固定到0.0032M,模型在1080P下的FLOPs降低到了1.644G。在某x86平台上,输入为1080P分辨率的图片,在仅开启8个threads进行模型推理的情况下throughput可以达到实时。
图7 轻量小模型的结构示意图
04 训练阶段
图8 训练流程示意图
训练阶段我们对训练数据采取了两阶段降质的方案,训练数据会有一定的概率跳过第二阶段的降质或者不经过降质。单阶段单调的降级方法,其实很难模仿真实世界中的复杂图像的退化状况,而多阶段的降质过程可以更好的模拟真实世界中的复杂的退化情况。每个降质阶段中都可能包括了模糊、缩放、噪声、压缩等操作。经过多次降质的图片数据更好的帮助模型去学习真实场景中图片可能存在的退化方式从而恢复图片的质量。
损失函数上,我们使用L1 loss和Low rank DCT loss同时对网络进行优化,这样可以保证在优化频域信息的同时保证模型在空间域上的重构能力。在计算L1 loss的时候,我们也会对原图做一定的去噪和锐化,来保障原图作为GroundTruth的画面质量。
综合上述的这些方法,可以很好的让模型学习到如何去减小输入图片的信息冗余度并同时提高它的画面质量。
05 数据和效果
我们挑选了上万个线上视频并增加深度学习前处理流程配合现有线上系统进行重新转码并统计码率和客观指标相比原系统的变化。数据如下:(编码器为B站自研的HEVC编码器)
表1 深度学习前处理在各种分辨率上的码率和客观画质变化表
我们可以看到经过深度学习前处理算法的视频在各个分辨率上都有不同程度码率的下降和画质客观指标的提升。在1080P分辨率下,在保证画面质量的情况下码率优化效果甚至可以接近20%,效果非常可观。
图9 效果对比图
上图为原转码系统的效果,下图为增加深度学习前处理后转码系统的效果。
通过图9可以看到在增加深度学习前处理之后,画面效果依旧得到了保证甚至在一些区域还得到了增强。如图中的文字和树木部分。
06 总结
为了更好的保障热门视频的画质体验并同时更好的控制成本,避免带宽的浪费,我们研发了一种视觉无损的深度学习前处理算法,该方法使用基于DCT的低秩表达损失函数更好的降低了冗余的信息,帮助编码器去将码率分配给更重要的细节部分。同时我们设计了超轻量化的模型使得1080P级别的计算处理可以在x86平台上达到实时的速度。在训练阶段我们也使用了多次降质并优化GroundTruth的多样的训练方案,使得模型能够处理应对更多复杂的场景。在线上的真实业务中,此视觉无损的深度学习前处理算法实现了即保障画质也避免码率浪费的效果。

继续阅读
阅读原文