元峰 · 2021年01月26日

MediaPipe教程:Google 多媒体机器学习框架入坑指南

作者: Google
转自:阿chai带你学AI
我是来自山区、朴实、不偷电瓶的AI算法工程师阿chai,给大家分享人工智能、自动驾驶、机器人、3D感知相关的知识

哈罗小伙伴们,今天阿chai给大家介绍谷歌的多媒体机器学习框架。该框架提供了Python、C/C++、Java等语言对应的库文件,喜欢的小伙伴移植到自己的Demo中,非常方便。接下来我门开始学习啦。

Mepipe是谷歌开源的多面体机器学习框架,里面包含了很多例如姿态、人脸检测、虹膜等各种各样的模型以及机器学习算法。

640 (11).gif

姿态跟踪与人脸关键点

MediaPipe 的核心框架由 C++ 实现,主要概念包括Packet、Stream、Calculator、Graph以及子图Subgraph。数据包是最基础的数据单位,一个数据包代表了在某一特定时间节点的数据,例如一帧图像或一小段音频信号;数据流是由按时间顺序升序排列的多个数据包组成,一个数据流的某一特定Timestamp只允许至多一个数据包的存在;而数据流则是在多个计算单元构成的图中流动。MediaPipe 的图是有向的——数据包从Source Calculator或者 Graph Input Stream流入图直至在Sink Calculator 或者 Graph Output Stream离开。

image.png

mediapipe\_tree

谷歌的大多数平台中都能找到MediaPipe的影子,比如Youtube、Google Lens、ARCore、Google Home 以及 Nest,都已深度整合了 MediaPipe。

640 (12).gif

AR与运动跟踪

MediaPipe同时支持谷歌的TensorFLow/Keras与TFLite,在移动端能得倒很好的支持。同样支持NVIDIA的显卡算力,可通过CUDA加速计算。

MediaPipe的安装

MediaPipe的预览版是谷歌在19年的CVPR上开源,项目中提供了大量的项目案例以及安卓与ios、web上的app共大家下载体验,接下来我们学习一下怎么使用如此完美的神器。

Paper:https://arxiv.org/pdf/1906.08172.pdfGitHub:https://github.com/google/mediapipe

如果是偷懒,想直接安装Python版本的MediaPipe,请在配置好Anaconda的环境后直接输入以下命令即可安装(有些会提示需要opencv- python),但是阿chai在这里建议小伙伴们编译一下源码项目。

pip install numpy==1.19.3pip install mediapipe

1.Ubuntu上安装MediaPipe

a. 安装Bazel

按照官方的Bazel文档安装Bazel 3.4或更高版本。对于具有aarch64 Linux的Nvidia Jetson和Raspberry Pi设备,Bazel需要从源代码构建:

mkdir $HOME/bazel-3.4.1cd $HOME/bazel-3.4.1wget https://github.com/bazelbuild/bazel/releases/download/3.4.1/bazel-3.4.1-dist.zipsudo apt-get install build-essential openjdk-8-jdk python unzip unzip bazel-3.4.1-dist.zipenv EXTRA_BAZEL_ARGS="--host_javabase=@local_jdk//:jdk" bash ./compile.shsudo cp output/bazel /usr/local/bin/

b. 导入MediaPipe

git clone https://github.com/google/mediapipe.gitcd mediapipe

c.安装OpenCV和FFmpeg

可使用程序包管理器工具安装预编译的OpenCV库。FFmpeg将通过libopencv-video-dev安装。最好安装高版本的OpenCV。

sudo apt-get install libopencv-core-dev libopencv-highgui-dev \                     libopencv-calib3d-dev libopencv-features2d-dev \                     libopencv-imgproc-dev libopencv-video-dev

对于具有ARM Ubuntu的Nvidia Jetson和Raspberry Pi设备,需要像下面这样修改库路径:

sed -i "s/x86_64-linux-gnu/aarch64-linux-gnu/g" third_party/opencv_linux.BUILD

d. CUDA

sudo apt-get install mesa-common-dev libegl1-mesa-dev libgles2-mesa-dev# To compile with GPU support, replace--define MEDIAPIPE_DISABLE_GPU=1# with--copt -DMESA_EGL_NO_X11_HEADERS --copt -DEGL_NO_X11# when building GPU examples.

2.在Mac上安装

a. 需要环境:

  • 安装Homebrew。
  • 通过安装Xcode及其命令行工具xcode-select --install

b. 安装Bazel。

按照官方的Bazel文档安装Bazel 3.4或更高版本。

c. 导入MediaPipe:

git clone https://github.com/google/mediapipe.gitcd mediapipe

d.安装OpenCV和FFmpeg。

使用HomeBrew软件包管理器工具安装预编译的OpenCV 3.4.5库。FFmpeg将通过OpenCV安装。

brew install opencv@3brew uninstall --ignore-dependencies glog

e.安装Python 3。

brew install pythonsudo ln -s -f /usr/local/bin/python3.7 /usr/local/bin/pythonpip3 install --user six

3.Docker安装MediaPipe

Docker安装mediaPipe首先需要配置好Docker的环境,具体的安装请参考阿chai之前写过的教程,这里不再重复。安装完成后使用如下指令完成安装。

git clone https://github.com/google/mediapipe.gitcd mediapipedocker build --tag=mediapipe .

MediaPipe图形化工具的使用

可能有的小伙伴并不擅长编程,不想自己配置环境,那么图形化工具就非常的适合。鼠标点一点,”CV“一个脚本就能直接在自己的浏览器中运行。

MediaPipe的图形化工具的地址如下:

https://viz.mediapipe.dev

点开我们看到的界面如下所示:

image.png

viz\_mediapipe

图片的左边是我们可视化控件的编辑窗体,右边为脚本的编辑窗体,我们可以选择喜欢的进行设置。在编辑完成后我们点击RUN(右上角奔跑的小人)可以看到效果。

阿chai这里推荐大家使用官方的脚本,小伙伴们可以尝试,我们跑一个手部检测的,运行效果如下图所示。

image.png
手部识别效果

Python调用MediaPipe

相信小伙伴们还是喜欢Python直接刚,那阿chai通过一个案例的了解Python中MediaPipe的使用。

所有MediaPipe解决方案的Python API示例都在mp.solutions中。对于MediaPipe Pose解决方案,可以通过mp\_pose = mp.solutions.pose访问这个模块。我们可以在初始化期间更改参数,例如static\_image\_mode和min\_detection\_confidence。运行help(mp\_pose.Pose)以获得有关参数的更多信息。

import mediapipe as mpmp_pose = mp.solutions.pose# Initialize MediaPipe Pose.pose = mp_pose.Pose(    static_image_mode=True, min_detection_confidence=0.5)mp_drawing = mp.solutions.drawing_utils drawing_spec = mp_drawing.DrawingSpec(thickness=1, circle_radius=1)

接下来我们尝试调用BazePose的模型,完整的代码如下所示:

import mediapipe as mpimport numpy as npimport cv2from matplotlib import pyplot as pltimport timemp_pose = mp.solutions.posepose = mp_pose.Pose(    static_image_mode=True, min_detection_confidence=0.5)mp_drawing = mp.solutions.drawing_utils drawing_spec = mp_drawing.DrawingSpec(thickness=1, circle_radius=1)#filename = '你的视频路径'#cap = cv2.VideoCapture(filename)cap = cv2.VideoCapture(0)if not cap.isOpened():  print("Cannot open camera")  exit()cv2.namedWindow('res')time.sleep(3)while(cap.isOpened()):    ret, frame = cap.read()        a = time.time()    results = pose.process(cv2.cvtColor(frame, cv2.COLOR_BGR2RGB))    b = time.time()        print(b-a)        image_hight, image_width, _ = frame.shape    annotated_image = frame.copy()    mp_drawing.draw_landmarks(        image=annotated_image,        landmark_list=results.pose_landmarks,        connections=mp_pose.POSE_CONNECTIONS,        landmark_drawing_spec=drawing_spec,        connection_drawing_spec=drawing_spec)    cv2.imshow('res', annotated_image)    if cv2.waitKey(1) == ord('q'):        breakcap.release()cv2.destroyAllWindows()

代码运行后看到视频中的姿态检测或者摄像头检测自己的姿态信息。由于视频上传慢的原因,阿chai在这里就放上图片,就不展示视频效果了,小伙伴们可自己进行测试。

640 (46).png

运行效果截图

相关阅读

image.png
关注元峰微信号“AIZOOTech”

更多算法模型相关请关注AIZOO专栏
推荐阅读
关注数
227
内容数
48
AIZOO.com 致力于搭建AI开发者、AI公司与需求方的桥梁,打造中国最大的算法和产品商城。传播AI领域资讯和技术,展示AI算法和产品。
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息