携手创作,共同成长!这是我参与「掘金日新计划 · 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 的基本概念以及学会利用可视化工具,有助于我们更好地理解和使用其提供的优秀的媒体处理方案。