在WebRTC上实现ML Kit笑容检测

2021-09-01 10:24:46 浏览数 (1)

本文来自Houseparty的WebRTC视频专家Gustavo Garcia Bernardo和TokBox的WebRTC移动端专家Roberto Perez,他们通过Google的ML Kit在WebRTC通话中实现了简单的笑容检测,期间考虑到了检测准确率、延时以及检测频度与CPU占用率的平衡等,实际结果表明ML Kit的检测结果令人满意。LiveVideoStack对本文进行了摘译。

文 / Roberto Perez, Gustavo Garcia

译 / 元宝

原文 : https://webrtchacks.com/ml-kit-smile-detection/

现在,在大部分时间里建立视频通话变得相对简单,我们可以继续使用视频流做一些有趣的事情。随着机器学习(ML)的新进展以及越来越多的API和库的出现,计算机视觉也变得越来越容易。Google的ML Kit是最近提出的一个新的基于机器学习的库,可以快速访问计算机视觉输出。

为了展示如何使用Google的新ML KIT来检测实时WebRTC流上用户的笑容,我想欢迎过去Houseparty的WebRTC视频大师Gustavo Garcia Bernardo。与此同时欢迎TokBox的移动WebRTC专家Roberto Perez。他们给出了一些关于做面部检测的背景知识,展示了一些代码示例,但更重要的是分享了他们实现实时通信(RTC)应用程序内的微笑检测的最佳配置的研究。

介绍

在实时通信(RTC)中最常见的机器学习(的例子是计算机视觉。然而,除了使用人脸检测进行识别、跟踪和增强之外,我们还没有看到这些算法的许多实际应用。 幸运地是两周前Houseparty首席执行官Ben Rubin发表的一则让我们有机会探索人造视觉用例的评论:

“若有人可以做一个来检测笑脸的编外项目,以便让我们可以开始测量笑容并在仪表板上显示。 我认为这在许多不同的层面上都很重要。”

几乎与此同时,Google发布了他们用于机器学习的新的跨平台移动SDK,名为ML Kit。 我们想要立即测试这个。 幸运地是,所有的行星都可以让我们在一个真正的应用上尝试一下,即:在WebRTC对话中,在iPhone本地上通过ML检测笑容。

框架选择

我们可以一些设备上的机器学习框架和库开始这项任务。这种类型的用例最有名的库可能是OpenCV。 OpenCV是一个非常成熟的多平台解决方案,具有多种基于传统图像处理技术的功能。 特别是对于iOS,Apple去年在这一领域开始添加一些新的API接口。现在他们拥有高层次的Vision框架和更低层次但更灵活的CoreML。 在Android方面,ML支持主要由Tensorflow Lite提供。另外还有,在前面提到的,Google最近添加了新的ML Kit框架。

ML Kit具有一些优点。首先,它是多平台的,支持Android和iOS。 它也有几个不同级别的抽象概念(高级和低级的API)。另外,它提供了不同的部署和执行模型,允许在设备上和在云中进行处理。 最后,它还能够实时优化和更新设备上的模型。

实现

从流中提取图像

我们需要做的第一件事是将ML Kit集成在我们的WebRTC应用程序,以便访问这些图像。 我们需要获取本地或远程框架(取决于我们的用例)并将它们转换为ML Kit支持的正确格式。

ML Kit 人脸检测实验中 帧图像朝上的方向

在iOS中,ML Kit支持以UIImage或CMSampleBufferRef格式传递的帧。 注意 - 请确保旋转图像以保证图像帧“朝上”。根据您使用的不同WebRTC API,获取图像的方法也不同。如果你使用官方WebRTC iOS框架,则可以将新的渲染器连接到本地或远程RTCVideoTrack,以接收视频帧作为RTCVideoFrame的实例。 通过访问YUV缓冲区,你可以轻松地将其转换为UIImage。

如果你使用的是像TokBox这样的平台上的API,那么你将使用自定义驱动程序访问原始本地帧,然后在用户端收到它们后将它们传递给WebRT和/或远程帧。 这些帧将作为CVPixelBuffer或YUV缓冲区接收,这些缓冲区也很容易转换为UIImage。

人脸检测API

一旦你有了UIImage的框架,你可以将它传递给ML Kit人脸检测器。正如我们稍后在大多数情况下会看到的那样,您只会传递一定比例的帧,以减少对CPU使用率的影响。这是一段代码,展示了访问ML Kit API的容易程度:

概率阈值

我们发现使用0.5作为微笑概率阈值为我们的需求提供了良好的结果。 你可以看看我们构建的示例应用程序中的完整代码,通过利用使用OpenTok捕获视的频和上面的代码来检测微笑的概率。

性能评估

RTC应用程序通常是资源密集型的。 添加机器学习增加了这一点,所以资源消耗是一个主要问题。对于ML,通常要在准确性和资源使用之间进行权衡。在本节中,我们从不同的角度评估这些影响,为决定如何将这些功能引入应用程序提供一些预期值和指导方针。

注意:以下测试中的所有结果均在使用低端的iPhone 5 SE设备完成。

时延

要考虑的第一个重要参数是执行检测需要多长时间。

ML Kit具有一系列设置:

  • 检测模式:ML Kit在此提供两个选项:Fast vs. Accurate(快速与准确)。
  • 标记:识别眼睛,嘴巴,鼻子和耳朵。启用此功能会减慢检测速度,但我们得到的结果要好得多。
  • 分类:我们需要此功能进行笑脸检测
  • 脸部跟踪:跨帧跟踪相同的脸部。启用它可以使检测速度更快

检测时间以毫秒为单位 (ms)

精确模式和快速模式之间的差异并不大(除非跟踪功能被禁用)。 我们用快速模式获得的精确度非常好,所以我们决定采用以下组合:快速模式 标志 追踪。

CPU使用率

接下来我们将评估CPU使用率。 我们以每秒25帧的速率来处理。 在我们的用例中(以及其他许多情况下),我们不一定需要处理每一帧。 CPU /电池节省对我们来说比检测每一个微笑更重要,因此我们运行了一些测试,修改了我们传递给ML Kit进行识别的每秒帧数。

正如您在下图中看到的那样,在默认基线之上的额外CPU使用率(仅从摄像头捕获而不进行任何ML处理)与传递至ML Kit的脸部和笑脸检测API的每秒帧数几乎成线性增长。

ML Kit以不同帧率处理的CPU使用率

对于我们的实验,每1或2秒处理一帧时,CPU使用率就是合理的。

应用程序大小

现在,我们来考虑应用程序的大小。 我们的应用程序与任何应用程序一样,需要下载并加载。小总是好一些。随着ML套件的应用程序的大小“刚”增长约15Mb。 示例应用程序大小从只使用OpenTok时的46.8Mb到ML Kit添加进来后的61.5Mb。

准确度

最后我们聊聊准确性。我们注意到的第一件事情是即使在快速模式下配置ML Kit时,面部检测的准确程度也是如此。 我们的测试是在一个典型的移动/桌面视频会议设置中完成的,人在看相机,没有任何物体阻挡它。 在其他情况下,检测会更加不可靠,并且不是很有用。 ML Kit也支持在图像中检测多个面,但我们没有进行太多的测试,因为它在我们应用程序的使用中并不常见。

在我们的测试中,算法的决策总是非常接近人类可能会说的那样(至少在我们看来)。 您可以在下面看到一个视频以供参考,或者是自己运行示例应用并查看结果。

结论

即使这个用例非常简单,它也使我们有机会评估新的有前途的ML Kit框架。 它让我们看到了向应用程序添加新计算机视觉功能的价值和便利性。 从我们的角度来看,这次评估的两个最有意思的结果是:一,这些模型的准确性之高令人惊讶,二,无法像预期中的在当今典型的移动设备中以全帧速率运行这些算法

同样重要的是要注意,这些人脸检测用例中的一些可以用更简单的图像处理算法来解决,而不是应用ML技术。 在这方面,像苹果核心图像这样的一些API可能会提供更好的资源与精确度之间的折衷 - 至少可以在iOS平台上进行人脸检测。

然而,传统的图像处理方法仅限于用在那些算法设计的一些简化场景。 ML算法可以进行扩展和重新训练。 例如,使用ML来检测自定义人员的其他特征(如性别,年龄等)也可能很好。这种分析级别超出了传统图像分析算法可以达到的级别。

下一步

从技术角度来看,这次评估的下一步将是使用定制模型(可能使用CoreML)来实现更复杂的用例。 我们想到的是基于生成对抗网络的图像重建,用于非理想网络条件下的视频传输。这可能是提高视频质量的全新方法。

0 人点赞