4. 关键技术解析
1) 视频理解
• 极致修复生成
前面已提到我们输入源本身画质不高,同时还经过了多次转码,因此第一个处理步骤为修复生成,其主要目的是修复视频中的多种瑕疵,比如压缩块效应、压缩伪影、边缘毛刺、去交错后残留噪声、模糊等,同时生成一些因压缩丢失的细节纹理。
学术界有不少利用深度学习去专门做去压缩失真、专门做去模糊的研究工作。比如早期做图片去压缩的ARCNN[1],做视频去压缩的MFQE[2],早期端到端去模糊算法DeepDeblur[3]。
比较新的方法有:自带压缩程度估计的图片去压缩算法FBCNN[4],基于可形变卷积的视频去压缩算法STDF[5],无需非线性激活的NAFNet[6]等等。
这些算法大部分都是针对单一任务构造数据集和设计网络结构进行模型训练,得到的模型只能处理单一退化类型,但是在这次百视TV NBA比赛直播转码中,我们要处理的视频同时包含多种“退化降质”,除了典型的视频压缩,还有相机失焦模糊/运动模糊,去交错后残留噪声等。
图片去压缩算法ARCNN的网络结构
视频去压缩算法MFQE的网络结构
端到端去模糊算法DeepDeblur的网络结构
为了解决上述诸多“退化”,一种方式是针对每一种退化训练一个模型,然后依次运行这些模型。这种方式的优点是每个模型的任务变得比较简单,方便构造数据集和训练,但在实际使用时效果并不好,因为其他退化会带来很大的干扰,导致算法性能急剧下降。
于是,我们采用了第二种方式,即用一个模型来处理多种退化。第二种方式的好处是可以取得相对更好的处理效果,难点在于训练数据的构造比较复杂,对网络容量的要求较高,需要同时兼顾多种退化方式,这其中还可以有多种排列组合。
在训练数据构造方面,我们借鉴了图像超分领域的BSRGAN[7]/Real-ESRGAN[8]和视频超分领域的RealBasicVSR[9]中的数据退化方式,同时添加了一些体育赛事直播场景特有的退化模式来模拟场地边界线处的锯齿、白边等瑕疵。
在网络结构方面,为了减少计算量,我们采用了单张图片处理方式,可以采用经典的ESRGAN[10]模型或常见的UNet[12]结构,亦或ResSR[13]提到的VGG-Style结构。
在损失函数方面,考虑到需要修复因各种退化丢失的细节,除了使用常见的L1/L2 loss外,还使用了percectual loss和GAN loss。
BSRGAN提出的多种图像退化方式
基于GAN的生成网络的一个主要问题是鲁棒性和时域连续性不够好。
• 鲁棒性问题是指能否稳定地生成比较自然的纹理,比如有些GAN模型有时生成出来的细节纹理比较奇怪不自然,尤其是当在人物区域生成一些奇怪纹理时会比较恐怖。
• 时域连续性问题是指相邻帧生成出来的纹理是否保持一致,如果不一致则会产生闪烁现象,降低观看体验。
为了解决鲁棒性问题,尤其是人物区域鲁棒性,我们借鉴了LDL[14]中通过检测fine-scale details区域并加以额外惩罚来提升fine-scale details生成效果的思想,通过人物区域分割得到人物区域,对人物区域生成效果施加额外的惩罚来提升人物区域细节生成的鲁棒性。
人物区域分割
针对时域连续性问题,我们采用了TCRnet网络来作为额外监督信号来提升。TCRnet网络原本用于超分任务,通过简单改造可用于修复任务,该网络用IRRO偏移迭代修正模块结合可变形卷积,来提高运动补偿的精度,同时利用ConvLSTM进行时序信息的补偿防止造成信息误差,从而提升时域连续性。
TRCNet网络结构
下面两张图对比了源流和修复后效果。
从第一张对比图可以看出,修复后地板上的字母GARDEN的边缘变得非常清晰锐利,边界线、球员轮廓及球衣上数字22也变得更清晰,此外地板纹理也得到修复。
第二张对比图也能看到场外观众轮廓和衣服上线条变得更清晰,此外原本扭曲成锯齿状的地板边界线也变直了。
• 模型加速
为了获得极致修复生成效果,基于深度学习的AI算法通常是首选算法。但深度学习算法的一个问题是计算量大,而对于视频修复生成这种low level视觉任务来说,计算量比普通high level视觉任务还要大很多。
一方面,视频修复生成模型的输入通常是视频原分辨率,而像检测分类这种high level处理模型的输入分辨率,可以比原分辨率小很多,且基本不影响检测分类性能。而同样的网络结构,输入分辨率越大计算量越大,所以视频修复模型的计算量要大很多。
另一方面,视频修复生成模型的输出是和输入视频同分辨率的视频帧,这势必使得模型后半部分的计算量也会很大,因为后半部分也需要在比较高的分辨率特征图上做计算,不像检测分类high level任务只输出目标框或类别这种语义信息,模型后半部分虽然通道数多但因为特征图分辨率小所以总体计算量小很多。
此外,对于体育赛事直播,视频帧率通常都是50fps,蓝光档位的分辨率通常是1080p,也就是深度学习模型在1080p输入下需要至少跑到50fps,这对深度学习算法是非常大的挑战。
针对这一情况,我们从多个维度进行模型推理加速。
首先,对深度学习模型做压缩,比如通过神经架构搜索(Neural Architecture Search,NAS)或剪枝降低模型大小,为了弥补模型变小之后的性能损失,需要对压缩后的模型,进行知识蒸馏训练提升小模型的性能,此外还可以通过8bit整型量化或者FP16半精度来进一步降低计算量。
其次,可以通过选择合适的硬件和推理框架来获得极致的速度提升,比如使用高性能GPU卡和配套的推理框架实现最优配置。为了进一步提升推理速度,还可以使用多GPU卡并行计算。
通过上述多种方式加速,在1080p分辨率输入下,处理速度从8fps提升到67fps,完全满足50fps直播转码需求。
深度学习算法加速分类
• 清晰度增强
为了提升观看体验,在上述极致修复生成基础上,进一步做了清晰度增强处理。
最简单的清晰度增强算法就是做锐化处理,比如ffmpeg自带的unsharp和cas就是两种简单的锐化算法。unsharp和cas这两种方法都是基于USM(UnSharp Mask)框架设计的,USM框架可以用如下公式[15]来描述:
其中,original待锐化的图像,blurred是original的模糊版本,比如高斯模糊后的版本,这也是unsharp名字的由来。(original-blurred)表征的是原始图像的细节部分,乘以amount之后叠加到原图,即可获得细节更锐利看起来更清晰的图sharpened。
除了锐化,还可以通过调节对比度、亮度、色彩等方法来提升清晰度。在百视TV篮球赛直播中,我们使用自研的锐化、亮度、对比度和色彩增强算法来实现清晰度的进一步提升。
其中,相比开源锐化算法如unsharp,阿里云视频云自研锐化算法具有如下特点:
• 更精细的图像纹理细节提取方式:能提取不同尺寸,不同特征的图像纹理结构,增强效果更优;
• 通过对图像内容纹理结构分析,根据区域纹理复杂度实现局部区域自适应增强;
• 与编码结合,根据编码器的编码信息反馈,来自适应调整增强策略。
细节增强(锐化)算法流程
2) 码率分配
• JND
通过前面的极致修复生成和清晰度增强,细节信息得到极大增加,同时我们希望经过压缩编码后能尽量保留这些信息。
我们知道,传统的视频编码是基于信息论的,所以它在一直做时域冗余、空域冗余、统计冗余等等冗余的去除,但是对视觉冗余的挖掘是远远不够的。
下图取自于王海强博士的一篇paper,它的思路是传统做RDO,是一个连续的凸曲线,但在人眼中它是个阶梯形的,那我们只要找到这个阶梯就可以省下码率,同时不影响主观质量。JND(Just Noticeable Difference)正是基于这个思路对视觉冗余进行挖掘。
比特率与感知失真关系
阿里云视频云自研的JND算法从空域和时域两个维度,对视觉冗余进行充分挖掘,实现在通用场景下,同等主观质量码率节省30%以上。
有了该自研JND算法,使得通过极致修复生成和清晰度增强获得的细节信息经过较低码率编码后,仍然得以保留。
JND算法流程