Mediapipe 主要概念介绍

1,129 阅读3分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第1天,点击查看活动详情

简介

MediaPipe 是 Google Research 开源的机器学习模型应用框架,为流媒体提供跨平台、可定制的机器学习解决方案。

它提供了以下特性:

  • 端到端加速
  • 跨平台部署
  • 现成的解决方案
  • 免费开源

本文将对 Mediapipe 的基础概念以及其模型的可视化工具进行介绍。

框架概念

Mediapipe 定义了一下概念

  • 图 Graph

    • 媒体流的处理被表示为一个有向图;
    • 宏观上看,graph 由一个个算子组成,并且一个合法的 graph 不能存在环;
    • graph 使用类似json的格式来描述和配置有向图,其在初始化时就确定了,是静态的;
    • graph 配置的合法性校验仅在初始化时做一次,因此每个算子都要保证在任意情况下都要将数据传递下去(即便是无意义的数据),以此来避免因为数据断流造成的卡死。
  • 子图 Subgraph

    • graph 可以嵌套使用, subgraph 相当于一个大算子。
  • 计算单元 Calculator

    • 图的每个节点被称为计算单元(单一的功能)或子图(一个综合性的功能);
    • calculator 的存在主要是为了实现功能模块的复用;
    • MP 的优雅很大程度上体现在算子的拆分上,一个通用的计算模块就值得封装成一个算子。
  • 数据流 Stream

    • 由按时间顺序升序排列的多个数据包组成,一个数据流的某一特定时间戳(Timestamp)只允许至多一个数据包的存在,数据流在多个计算单元构成的图中流动;
    • stream 是算子多线程运行的核心思想,算子的运行是依靠数据驱动的,当算子需要的所有数据到齐后算子开始执行。
  • 数据包 Packet

    • 最基础的数据单位,是用来传递数据的数据封装格式,一个数据包代表了在某一特定时间节点的媒体数据;
    • MP已有算子中的 packet 均使用共享指针的方式传递内存对象。

整理

MediaPipe用图(Graph)来表示媒体流的处理过程,图的每个节点可为计算单元或子图;计算单元(Calculator)可以看做是一个算子,将一个通用的计算封装成一个算子以实现计算的复用;子图(Subgraph)可以看做是一个大的算子,它将可实现某一完整功能的一些算子整体封装起来,成为一个功能模块;数据包(Packet)是MP中最基础的数据单位,一个数据包代表了在某一特定时间节点的数据,MP已有算子中的Packet均使用共享指针的方式传递内存对象;按时间顺序升序排列的多个数据包组成数据流(Stream),数据流在计算单元之间流动传输数据。

可视化工具

官方提供了可以将解决方案可视化的工具: viz.mediapipe.dev/

下面是手势跟踪方案 HandTrack 的可视化图

mediapipe.png

其中黄色的是数据流和数据包,白色的是计算单元,紫色的是子图

总结

了解 MediaPipe 的基本概念以及学会利用可视化工具,有助于我们更好地理解和使用其提供的优秀的媒体处理方案。