解开疑惑之:全面解析腾讯会议的视频前处理算法,java 搭建分布式架构
![](https://static001.geekbang.org/infoq/e2/e2e944b1d8fd0f71303bdaff989ba300.png)
对于深度学习任务,大家都知道数据的数量和质量是效果的关键。由于腾讯会议中的数据非常敏感,涉及非常多的隐私,我们拿不到用户使用时的真实数据,所以腾讯会议采取了自采和精细标注两种方案,目前数据流程是一种闭环式的迭代优化。训练过程中数据也会做一系列的增广,比如说颜色变换、随机噪声、随机模糊等等来增加数据的多样性。
从模型层面,利用编码器得到输入图像的多层特征表示,其中第一层分辨率比较高,编码了人像的边缘细节信息,而高层特征空间分辨率比较低,只能编码人像的抽象语义信息。如果我们将高层特征表示送到解码器里进行融合学习,解码过程中分辨率又会逐级回升。腾讯会议还会在解码之后接一个轻量级的调优模块,这样就可以在高分辨率上恢复更多的细节。
网络输出后还要经过一系列的膨胀、腐蚀、边缘、羽化等等多项后处理算法的优化。损失函数也是训练流程的关键,它决定了这个网络能够聚焦在哪一些目标上进行学习,腾讯会议目前采用了多损失约束的方式来指导网络的学习。
交叉熵损失是对每个象素点进行约束,分割任务中的一项基础损失。
为了增加时域的平滑性,要约束网络对输入经过轻微干扰和原输入的距离,这样可以在一定程度上模拟实际运行中前后帧之间的稳定性和连续性。
边缘准确性对于人像分割的直观体验影响非常大,所以腾讯会议还利用了一个单独的分支和边缘损失来提升网络边缘处理的准确性。
虚拟背景是跑在各个端上,而不是服务器上,这就对神经网络的高效、轻量提出非常高要求,这也使得网络的深度和宽度非常受限,学习能力相比服务器端的模型有较大程度的下降。为了弥补网络带来的准确率的下降,腾讯会议采用了多种蒸馏方式,约束线上的小模型与服务器之间大模型的距离,使得小模型与服务器模型之间的输出分布尽量靠近。这种多蒸馏损失可以提升蒸馏的有效性,从而提升线上小模型的准确率与融贯性。实际训练的过程中,腾讯会议还采用了分布式等可以快速提升训练速度的多种优化的方式,并且支持在线和离线两种蒸馏方式。
最后是前向推理引擎,它可以对算法模型进行针对性的异构和并行计算优化,从而达到性能和效果之间良好的平衡,是算法最终能够落地的一个关键技术。
1. 数据
数据流程闭环是怎么形成的?具体来讲,首先是建立一个自采池,存放自采的数据。需要注意的是,由于用户数据的敏感性,腾讯会议拿不到任何线上实际的数据,所以只能模拟线上会议的场景来进行采集,比如大家一起进行自采,如果说这时候有用户反馈的话,会根据用户反馈的文字或者图片、或者视频的描述,来增加模拟布置类似的场景进行采集补充。
对于池子里面的数据会不断进行标注,并且把标注的数据提交到标注池,然后将标注后的数据提供给线上模型进行迭代训练。对于线上模型,会将自采的数据抽样进行自测和压测,将分割不达标的图片添加到自采池和 badcase 池。并且我们会对 badcase 池里的所有 badcase 通过分析特点进行存量分布归类,对归类的数据再进行特定的补充采集。
这就是整个数据流程的闭环式迭代优化,它有效推动了线上模型质量的持续提升。
![](https://static001.geekbang.org/infoq/ce/ce39e706908604d80402e6973d957760.png)
2. 模型
腾讯会议目前采用了经典的编码、解码、refine 的结构。编码器会不断地降低分辨率并逐级抽象,而解码模块则是对多级特征进行融合学习,实现分辨率回升。同时腾讯会议还采用了多任务约束,下面的图中可以看到实验结果,经过多损失约束限制,输出的图会更加准确,边缘的一致性也得到了提升。
![](https://static001.geekbang.org/infoq/0d/0d3d0991838d8d0c31ccbf585b267ea3.png)
3. 损失
前面提到为了弥补网络带来的准确率的下降,腾讯会议采用了多种蒸馏方式约束线上的小模型与服务器之间大模型的距离。
为什么要做蒸馏?蒸馏作为一种只增加训练耗时而不增加线上测试耗时的方法,在损失约束中被大量采用,对于线上超轻量的小模型来说,蒸馏可以比较好的缩小服务器、教师网络和学生网络之间的差距。并且在实际操作过程中发现经过蒸馏后的学生网络能够比蒸馏前的网络具有更好的稳定性。
目前腾讯会议支持离线蒸馏和在线蒸馏两种方式。其中离线蒸馏是单独训练老师网络,然后固定老师网络的参数,通过老师网络指导学生网络进行学习。在线蒸馏是教师网络带着学生网络一起学习,这样对网络而言既包括了教师网络的自我学习,还有同步指导学生模型的蒸馏学习,也包括学生网络的自我学习。
![](https://static001.geekbang.org/infoq/09/09f9ac55975d4f9f0585b247cca09228.png)
常用的蒸馏损失包括下面图中列出来的三种。Pixelwise 蒸馏是象素级的,Affinity 蒸馏是临近关系的方式,Attention 蒸馏是注意力的方式。
象素级的蒸馏主要作用在输出层,也就是说利用教师网络的输出作为软标签约束学生网络的输出。
基于 Affinity 矩阵的蒸馏的时候,教师网络和学生网络分别计算各自的 Affinity 矩阵,这种能够建模象素间的关系,然后该领域的信息知识从教师网络就迁移到了学生网络里面。虽然信息迁移能有效补充单象素点独立建模信息不足的问题,但是计算量相对比较大。
腾讯会议目前采用的是第三种,注意力蒸馏的方式,它是一种高效的约束中间特征层的蒸馏方法。从图中可以看出,经过建模空间注意力特征图从三维直接降到了二维,之后再进行约束,这样可以大幅降低计算量,提升蒸馏的效率。
![](https://img-blog.csdnimg.cn/img_conv
ert/6d701e0de4a384c1dc07a3a32b7a9a56.png)
4. 前向推理引擎
深度学习算法落地的过程中,前向推理加速是非常重要的一环。前向推理简单来说,如图所示,以输入数据为出发点,经过一层层的神经网络得到最终的输出数据。层之间的数据通常是用 tensor 表示,每个 tensor 就表示了一个多维矩阵。
腾讯会议自研推理引擎主要有三个方面的优势:
第一,音频是腾讯会议的核心能力之一,自研推理引擎在音频算法性能优化方向积累丰富,并已经上线了量化和量化训练的支持;
第二,桌面端是腾讯会议的核心场景之一,自研推理引擎在桌面端的异构计算和并行计算优化方向积累丰富,有力的支撑了桌面端的音视频算法。
第三,自研推理引擎可以快速定制化和响应业务的需求,特别是对于腾讯会议这种快速迭代的产品来说,快速定制化和迭代的能力非常重要。
目前腾讯会议前向推理框架主要分为三层:引擎层、逻辑层、接口层,从下到上。其中引擎层主要负责对各种神经网络算子进行计算优化,而逻辑层封装了与各个业务相关的逻辑,接口层是提供了跨平台的业务接口。
![](https://static001.geekbang.org/infoq/1c/1cfdfc868cc3201c497ece3020596285.png)
下面列了一些目前腾讯会议前向推理引擎支持的加速方案,由于不同的硬件或者处理器、设计理念不同,应用场景也不同,因此不同的方法在不同的处理器上会有不同的性能瓶颈,所以需要具体问题具体分析。举个例子,通常来说 CPU 适合处理逻辑比较复杂的计算,而 GPU 适合处理数据并行的计算密集型运算。而且还需要考虑在不同处理器之间的数据交互可能给性能带来的影响,这个消耗有时候会成为整体算法性能的一个瓶颈。以虚拟背景为例,视频人像分割深度学习模型适合运行在 GPU 上,而后处理的一些算法就更适合运行在 CPU 上。
![](https://static001.geekbang.org/infoq/a3/a3e4d7ad40edbeebe84591de806cfc87.png)
三、美颜功能的算法探索与实践
大家经常用美颜。它可以提升用户的视频体验,鼓励用户参与到语视频通话的场景中来。从技术的角度来说,美颜通常包括磨皮、美形和美妆三个部分。
评论