论文题目:MediaPipe: A Framework for Building Perception Pipelines
发表:ArXiv,2019
作者:Camillo Lugaresi, Jiuqiang Tang, Hadon Nash, Chris McClanahan, Esha Uboweja, Michael Hays, Fan Zhang, Chuo-Ling Chang, Ming Guang Yong, Juhyun Lee, Wan-Teh Chang, Wei Hua, Manfred Georg, Matthias Grundmann
Google团队出品
今天要介绍的MediaPipe是一个构建pipeline用于在任意的传感器数据上进行推理的框架。框架源码:https://github.com/google/mediapipe。该框架由于其扩展性强,实时性,跨平台等众多特点收到了广泛关注,该框架目前已经集成到Python,可以作为一个包来直接使用。
原文花费了很长的篇幅来介绍该框架的一些设计理念以及涉及的基本的概念,这里首先从一个简单的例子开始来介绍MediaPipe。
下图展示了使用MediaPipe进行目标检测的示意图。其中实体框表示外部到Graph的inputs/outputs, 透明框为计算节点(被称为Calculator), 实现表示数据流向(顶部输入,底部输出)
该Graph总共包含两个并行的分支,其中左边的用于Tracking, 右边的用于Detection,
该分支用来进行目标检测, 由于视频帧率一般30FPS,如果对每一帧都进行目标检测的话,无论是时间还是资源消耗都很难满足要求,因此MediaPipie的策略是:对帧先进行采样然后对采样的帧进行目标检测,然后Tracker再把检测结果(边界框,类标记)进行传播Propagate。那么如何采样呢?MediaaPipe主要是基于极限频率和场景变化分析来采样, 这样一来只需要对开始帧以及场景变化的帧进行目标检测即可。
如上图所示, 一个Frame selection node首先被用来选择帧,然后选择出来的帧被送入目标检测模块,Object detection node 加载ML模型和label map (作为输入侧packets)构建推断引擎对送入的帧进行推断。
Tracker的作用是更新早期的检测结果并将他们的位置推进到当前帧。
检测完成以后,detection merging node基于他们在帧中的位置比对,合并检测结果。这里需要说明的是:这两个Branches是并行的,比对是对同一帧进行的,因此该节点的Input strategy会自动对其两个检测结果的timestep。
最后, detection-annotation node对frame进行标注用于可视化。
Mediapipe允许开发人员以渐进的方式来搭建pipeline, 如上图所示,一个pipeline实际上就是一个有向图Graph,有向图中的每个节点node实际上就是Calculator。 Graph是使用GraphConfig协议缓冲区指定的,然后使用Graph对象运行。 在该graph中,两个calculator通过data stream进行连接,每个stream实际上就是数据包packets的时间序列。
用户可以自定义calculator, 同时还可以对Graph中的某个node进行替换,非常灵活。
Packets: 数据包, Mediapipie中的基本数据单元。
Streams: 数据流,为数据包的时间序列,特别注意的是这些数据包的时间戳timestep是单调递增的,这对于同步机制非常重要。
Side packets: Side packets相比于Packets的区别是未指定timestep, 其主要用来保存一些常数值,比如ML model的file path, 上图中的目标检测模块就用到了。
Calculator: 对应Graph中的每个node, 高度可定制, 其包含4中基本方法:GetContract(), Open(), Process() , Close().
Graph: 一个graph实际上由多个node组成,这些nodes直接有向连接,数据包就在这么一个driected graph中流动。
GraphConfig: GraphConfig是描述MediaPipe graph的拓扑结构和功能的一种规范。
每个graph至少有一个调度器队列, 每个调度器队列正好有一个执行器executor,
graph中的每个node有一个调度状态, 取值有三种:not ready, ready, running,当node的状态变为ready后,对应的任务被添加到优先级调度队列中等待执行。
Mediapipie是去中心化的,同一时刻,不同的nodes可能处理具有不同timestep的数据, 因此如何保证同步非常重要。每个数据包携带的timestep实际上作为同步密钥来实现同步。同时Mediapipe被设计来支持确定性操作从而满足实时性。
此外, Mediapipie还支持GPU, OpenGL,等
1.Lugaresi C, Tang J, Nash H, et al. Mediapipe: A framework for building perception pipelines[J]. arXiv preprint arXiv:1906.08172, 2019.