大数跨境
0
0

RTE2021 回顾丨声网实时背景分割算法研究与应用落地

RTE2021 回顾丨声网实时背景分割算法研究与应用落地 RTE开发者社区
2021-12-03
1
导读:RTE2021 技术演讲回顾

本文整理自声网的视频算法架构师谢锦滨的视频技术专场演讲分享。在演讲中主要分享主题关于实时背景分割模型算法研究与应用落地,同时针对人像分割技术还可以往哪个方向去发展问题展开讨论,带给我们无限思考!





首先给大家分享虚拟背景三个常见场景,第一个,会议场景有时候在家里和办公情况下,希望把背景隐掉,比如你家里比较零乱,背景信息去掉看起来干净一些。在办公室,你背后可能有一些同事在看电脑,可能在敲代码,在这种情况下有一定隐私,它可以提供一定的隐私空间。



第二个,这种教育场景在线上,课件是主屏上,老师基本上缩小到右下角,不会对屏幕造成一定影响,但这种情况下一般老师往往背后是一堵墙,也需要去除掉,把老师贴到课件上面,老师边上的课件不会被遮挡的。还有娱乐场景,在移动端比较多,增加一定的趣味性。



当然我们有的场景比较特殊,我们公司有的客户是做双师课堂的,相当于有一个主讲老师,老师在课堂里上课,在远程还有一帮学生也是在上课,他们看的是视频,但是那边有个辅导老师,在这种情况下,这个视频怎么传的呢?比如这块是液晶屏,老师在这里走来走去,手会指着黑板上的东西,课件是通过摄像头拍下来传到远端,通过摄像头拍下来画质会变差,因为有光照和影子,这种情况下,客户提出一个要求,我们能不能把老师抠下来,因为课件是电脑上可以直接屏幕共享或者提前录好的,课件很清楚,这样的话把老师放到课件上,远端同学看到这个课件可以很清晰。这边涉及到的抠图有点不一样,其实抠图有两种,一种是分割,就是 0 和 1,发丝级抠图是希望每一根发丝都看得非常清楚。左边人像分割边缘不是特别好,如果再贴回课件就会对课件有一定影响,所以这种场景是需要发丝级抠图的,但发丝级抠图,平时讲虚拟背景一般讲端上的,要做发丝级比较困难,但双师课堂比较特别,硬件是可以专门配置的。




给大家看一下课堂应用 DEMO,这是老师在屏幕前讲,上面的灯光,包括上面还有影子,对课件都是有影响的,把人抠下来以后再贴到课件上,远端的同学上课的时候质量就会比较高,这种情况下其实跟一般会议场景不太一样,老师往往会在前面走动,老师的手会指黑板,对手势和抠图要求会高一点,这是一个场景。



刚才说的是应用场景,我们团队运行算法的设备挺复杂的,如果分的话主要是分移动端和 PC,总体来讲,苹果的设备是比较单一的,所以落地起来会相对比较方便,Android 设备系统和厂商,还有用的芯片,各不相同,往往会比较复杂,我们目前背景分割算法基本上都是跑在 CPU 上的,但是它也是有 GPU 和 NPU 这些东西,目前做下来,像 Android 上面,跑在 GPU 和 NPU 上性能未必有 CPU 好。



这张图的意思是,要落地这个算法的话考虑的环境比较复杂。




接下来讲到一些实现虚拟背景通常采用的一些技术。


语义分割方法较为简单,主要是几个步骤。第一步,要获取人像的掩码,一张图获取掩码,一张图人就在背景里面了,但视频就比较复杂,一个人坐在一个地方静止的,人没有动,AI 算法跑下来之后图像边缘还是会有一些抖动的,所以你获取掩码之后一般要加后处理,这样的话边缘会比较稳定,再替换到背景里面,大概是这样的步骤。



这边也简单介绍一下目前做分隔的传统方法和目前新的手段。



传统方法一个是绿幕,其实方法很多,深度学习方法,右边劣的是常用的 AI 网络框架,其实用的最多的是 UNET。绿幕有绿幕的特点,AI 听起来很高级,但 AI 需要样本,需要样本的情况下它就有它处理不了的问题。比如我们做的是针对人像的,如果是商家带货,手上拿的东西往往被扣除掉,绿幕除了做样本之外,还有一个地方,就算 AI 也很难做到的地方,grabcut 比较简单,框一下就可以,但也不是特别完美。右边是一篇论文,它有两种方法,一种是 scribbles input,一张图像点一下自动抠好。下面这个等于你给它引导图,你标记好前景,过渡区域,背景。原图加上这个就可以做到发丝级抠图,其在做样本过程中有用过这些算法,但跑起来都不快,就算它真的非常好,你想在端上落地也不太可能直接就用。



我们这边采用到的一个方案基本上是基于 UNET 架构,有一个编码过程和解码过程,这上面图示很简单,这篇论文原来就是这样的结构,发表于 2015 年,这是一个医学相关国际会议,少量样本训练出来的结果就已经很好了。但做虚拟背景的时候发现,样本少,看起来 OK,但随便换个场景可能会很差。



前面讲的分割主要是基于图像,基于视频会有它的特点,比单独基于图像会更难,一个是数据集,不同场景需求不太一样,比如会议场景和教育场景,往往这个人是坐着,半身的,手动来动去比较多。娱乐一般是站立的,是全身的,但动的场景比较多,AI 需要拟合数据,所以不同场景需求不同。运算量,如果你在端上落地,往往受到约束比较大,特别是很多手机性能,低端机蛮多的。



网络结构也是,如果在移动端落地,相当于你可以选的网络结构会比较少,有一些甚至要自己去改造,去设计,包括有一些算子它的效果很好,但运算不友好,比如神经网络里面的 Global Average Pooling,它在多线程落地的时候不是特别友好,我们做AI工程优化的同事往往会建议你这个东西不要用,或者换一下别的。从边缘稳定性角度来说,因为你做视频场景,如果坐着一动不动,头发一直在飘,效果就会差很多。这几点对算法的要求是比较高的。


工程落地也是,工程落地有不同的设备和操作系统,我们用的很多框架也不一样,相当于你做一个算法,做工程的同事就相当于你是1:N 的工作量,硬件比较复杂,不同的硬件需要不同的方案。此外,我们支持 web,它相对 native 来说性能要求会更高一些。



接下来介绍 Agora 目前的方案。其算法是近一年开始做这块工作的,我们的算法一直在不停迭代,目前最新的方案是后面讲的这个。首先我们讲到数据集是怎么做出来的,即开源数据集有很多,但那个数据集的质量往往达不到你的要求,或者标准和你的不一样,比如有一个数据集叫 coco,里面有人物的掩码,你可以拿出来用,但那个数据也不太好,所以最后没有用上。所以,大部分数据是自己做的,我们维护了一个样本池。首先你要得到这些样本肯定要有图片,我们采取的手段,一个是网上去搜索图片,还有一些通过绿幕,虽然AI模型跟直接用绿幕不太一样,但如果你直接在绿幕里用AI模型也要跑,所以有一部分数据是用绿幕做出来的。绿幕比较简单,直接过滤一下绿色基本就能得到,用我前面说的传统算法做一下就有了。还有针对特定场景,比如办公室,我们拍了视频,拿到这些图片,先要把它标记出来。



我们采用的方法是先训练比较大的好的模型,首先要拿到一些比较好的样本,先用大的模型,把网上的图片和实景拍的视频把大模型跑出来,把明显错误都删掉,如果还有一些瑕疵,就用逻辑或者传统算法处理,处理完以后就得到一批初步样本。这个样本可能有 50 万左右的量级。在此基础上,我们把模型训出来,然后给实验室和客户,客户会有一些反馈,然后可以针对那些不好的场景增加一些样本回来。目前用到的一个网络大概是这样的结构,类似于UNTE,encoder-decoder stage,在解码过程中有三个 block,训练分几个阶段,第一阶段先去训,得到一个中间结果,目前采用的方案,中间结果是有头发有脸部周围区域,主要是皮肤,还有其他,有这三个标签,这是我们想的一种标注方式,这个也是用一种模型跑出来的标签做的。



在此基础上,再去训第二阶段,会得到 Alpha,这样做的好处有几个方面,一个是中间可以做后处理,脸部、头发、身体一些部位后处理的时候会有一些不一样,比如你想让边缘稳定一点,可以做滤波。但滤波比较难控制,可能导致其他边缘地方不想被滤波的地方滤波了,有这样的信息我就可以做更复杂一点的处理。第二步 matting head,相当于第一步先训练得到一个基础模型,在此基础上训 Alpha 的时候,往往会有一些残留和边界不清楚,在这种情况下,一般训完第一阶段之后,第二阶段换一个 loss,可能把结果改变了,效果不好。所以实际操作时我们先卸完第一阶段,第二阶段很简单的微调,可能一个周期都不到,这样的话手指缝的效果就会变好。网络结构和过程大概是这样的。


关于训练方法,刚才也提到了一些。数据增光是其中一个很重要的点,除了常用的 flip、rotate,前景和背景融合是训练的时候随机换的,比如实际样本是 50 万张,但背景图片没有人的可以用来做替换背景,做增广的图片假设 10 万张,总的训练的时候,如果乘一下,相当于 50 万×10 万,很多样本就出来了。这里有一些需要注意的点,比如数据增广,常用的 flip,我们只做了左右的 flip,上下也做的话效果影响会比较大。在移动端落地的时候,手机会翻转,怎么处理这个问题呢?要工程上检测到这个手机做了一些方向的,人像根据这个调整,送到网络里的图像一定要保证人像是正的。


训练,我们这边分了三个阶段。第一阶段是训得到 parsing info,第二阶段得到 Alpha,但效果不是很好,所以还要做微调。损失函数也没有太多特别的,因为我们出来的标签有四个结果,这样的话我们肯定有多种损失约束这个。后面这一点是在论文上看到的,训练的时候如果是样本的话,做完增广是不太一样的,但标签结果是一样的,在这种情况下,增广前后 KL 散度约束,加强训练稳定,包括视频里面出来的结果也比较稳定。



这边提到 KL 散度,很多蒸馏也会用这个做 loss。我们试过,但可能使用大模型做了很多标签,相当于已经蒸馏过了,直接蒸馏也没有感觉特别有用,所以针对模型最后没有用到直接蒸馏。




我们公司内部有一个内部自研的 Agora AI 引擎,目前这个引擎了支撑其公司所有的AI算法,底下做了各种平台和芯片的适应,为什么没有用第三方或者开源的话,因为多多少少都会和我们的场景不配。如果用开源的东西,首先模型就直接带在里面,一方面可能暴露,另外性能上没有我们自研 Agora AI 引擎好,测试下来,Agora AI 引擎性能比大家知道的开源那些好有 30% 左右。



这是我们的主体架构,模型针对不同平台做了一些优化适配,我们内部有模型转化工具,处理完以后直接转换成代码,稍微做一些调整,基本上就可以集成到我们 SDK 里面去了。



Web 上,虚拟背景目前可以跑在 Web 里面,主流 Web 机器学习框架有下面这几种,这边有一些主要的问题,也是和 native 像,对模型文件缺乏一定的保护,模型 ONNX 在里面,别人直接打开就可以看了,所以这点不是特别好。另外一个,通用的框架,并没有考虑到实际使用的场景,因为我们做算法的时候有一些特别的算子不支持,所以需要自己做一个原生机器学习框架移植,对一些算子也要做一些支持,再做一些优化,大概是这样。



我们用来实现人像分割算法 WASM 模块,主要功能是对输入数据做归一化,模型加载、推理运算的事情,用到了图里右边的一些策略,其很多代码比如有一些是 C++ 的,需要工具转一下,包括并行指令优化处理。





最后我们对人像分割技术还可以往哪个方向去发展问题展开讨论,今年有一些比较好的文章,基于视频的算法我们做了一些调研,比目前基于图像做分割然后做后处理的效果会更好,它有一个好处,如果你是基于视频的分割算法,出来的模型结果本身就是稳定的,不需要处理了,甚至后处理运算量可以给模型提高精度。另外一种,虚拟背景经常有一个情况,你在一些比较背光或者暗的场景下,你抠下来再放到背景里看起来特别别扭,所以这也有一些论文和相关研究,做重光照,但是这块我们目前没有,后面可能往这个方向研究一下。




往期回顾

RTE2021 回顾丨面向 RTE 场景的新一代 API 探索和实践

RTE2021 回顾丨实时语音活动背后的质量监控

RTE2021 回顾丨一增两减,助力深度学习在实时推理场景中的应用

RTE2021 回顾丨WebRTC 漫漫成长路,下一个十年将走向何方?

RTE2021 回顾丨基于深度学习的音频编/解码的实现与落地挑战

【声明】内容源于网络
0
0
RTE开发者社区
RTE 开发者社区是聚焦实时互动领域的中立开发者社区。不止于纯粹的技术交流,我们相信开发者具备更加丰盈的个体价值。行业发展变革、开发者职涯发展、技术创业创新资源,我们将陪跑开发者,共享、共建、共成长。
内容 1122
粉丝 0
RTE开发者社区 RTE 开发者社区是聚焦实时互动领域的中立开发者社区。不止于纯粹的技术交流,我们相信开发者具备更加丰盈的个体价值。行业发展变革、开发者职涯发展、技术创业创新资源,我们将陪跑开发者,共享、共建、共成长。
总阅读197
粉丝0
内容1.1k