
在如今在线会议、网络教学盛行的时代,员工和学生被要求打开摄像头,将自己、居住环境、隐私暴露在公众视野中。背景虚化、虚拟背景应用恰恰可以解决这一问题,而人像分割技术正是背后支撑这些应用的关键技术。
有读者可能疑惑,Native环境下的背景虚化、虚拟背景技术已经存在多时了,把它直接迁移到Web端能有多难呢,我们今天就从这个问题出发,展开聊聊。
相比于Native端的AI推理任务实现,目前Web端实现时有如下难点:
针对上述难点,笔者将从模型选择、框架选择、算法调优、数据IO优化几方面介绍TRTC的Web端人像分割技术实践。
Web端实时人像分割技术实现
一个基本的实现思路是:首先利用WebRTC视频采集能力收集MediaStream,视频流式处理过程通过编写Insertable Stream变换函数来刻画:变换函数中利用canvas获得逐帧数据,进一步调用人像分割模型,系统还可以根据当前运行环境选择tensorflow.js的WASM或是WebGL作为runtime,模型输出为一个与原视频帧相同大小的mask,该mask将作为掩膜指导WebGL进行背景模糊、虚拟背景等后置处理完成应用需求。下面对上述方案中几个关键点详细阐述:

较大的模型(MobileNet v2)

上表显示,针对这些模型,WASM 比普通的 JS CPU 后端快 10-30 倍;并且针对 BlazeFace(https://github.com/tensorflow/tfjs-models/tree/master/blazeface)(轻量化 (400KB) 但运算数量尚可 (~20M))之类的较小模型,则可与 WebGL 抗衡。考虑到 WebGL 程序每执行一次运算的固定开销成本,这就解释为何较小模型在 WASM 运行时上速度更快。 笔者又对本实践中使用的模型[1][2]进行了测试,测试结果和上表中FaceMesh性能结果相近。
// 源MediaTrack const {readable: cameraReadable} = new MediaStreamTrackProcessor({track: inputTrack});
// 目标MediaTrack outputTrack = new MediaStreamTrackGenerator({kind: 'video'});// 流式算子:将源MediaTrack中的cameraFrame处理为composedFrame transformer = new TransformStream({ async transform(cameraFrame, controller) { const composedFrame = new VideoFrame(......); cameraFrame.close(); controller.enqueue(composedFrame); }})
// 启动流式处理,并注册终止信号 let abortController = new AbortController(); cameraReadable .pipeThrough(transformer, {signal : abortController.signal}) .pipeTo(outputTrack.writable) .catch((e)=>{});
// 发出终止信号,终止流式处理 abortController.abort();最终实现效果

总结展望
首先是一点方法论的分享,笔者在具体实践过程中走了很多弯路,回顾下来,如果你也想动手创建一个Web端AI推理的应用,你可以从选择什么模型、选择什么推理框架&runtime、如何进行前后置处理与数据io、是否需要算法优化五方面去思考梳理您的方案。
接下来展望一下潜在高性能的推理运行时:基于WebGPU标准的运行时,WebGPU是即将推出的下一代Web 图形标准,它不再继承或者完全仿制某一个已经实现的本地图形标准,而是参考了新一代图形API(Vulkan、Metal 和 D3D12)的设计理念,对标这些图形框架研发了一个全新的跨平台的高性能图形接口,同时提供一流的通用计算接口,诸如计算着色器与通用存储缓冲器的支持,这也是它和WebGL最大的区别,下图展示了二者进行通用计算时的过程[4]:
WebGL:

WebGPU:

可见WebGPU有五个优势:
为探索 WebGPU 进行机器学习部署的潜力,主流机器学习框架(Tensorflow.js、ONNX.js、TVM)都开始实验性地支持WebGPU运行时,这些runtime同时利用了WASM和WebGPU技术:其中WASM用于构建计算启动参数和调用设备启动的主机代码,WebGPU则用于构建设备的实际执行代码。
最后回到人像分割这一任务,本文使用的模型是逐帧独立预测,没有考虑帧间信息,最近开源的如RVM模型[2]基于循环神经网络构建,加入了对于帧间信息的考察,同时团队也给出了一个经过INT8量化的轻量模型。从性能角度来看,目前Web端runtime尚未针对循环神经网络(RNN)提供良好支持,模型的循环状态无法驻留于设备中,需要开发者手工往返拷贝,这带来了一定的性能损失。
参考文献:
[1] When should I use WASM?https://www.tensorflow.org/js/guide/platform_environment#when_should_i_use_wasm
[2] Robust Video Matting (RVM)
https://github.com/PeterL1n/RobustVideoMatting
[3] Webassembly backend for Tensorflow.jshttps://blog.tensorflow.org/2020/03/introducing-webassembly-backend-for-tensorflow-js.html
[4] WebGPU computations performance in comparision to WebGLhttp://pixelscommander.com/javascript/webgpu-computations-performance-in-comparison-to-webgl/#more





腾讯云音视频在音视频领域已有超过21年的技术积累,持续支持国内90%的音视频客户实现云上创新,独家具备 RT-ONE™ 全球网络,在此基础上,构建了业界最完整的 PaaS 产品家族,并通过腾讯云视立方 RT-Cube™ 提供All in One 的终端SDK,助力客户一键获取众多腾讯云音视频能力。腾讯云音视频为全真互联时代,提供坚实的数字化助力。

