作者: Google
转自:阿chai带你学AI
我是来自山区、朴实、不偷电瓶的AI算法工程师阿chai,给大家分享人工智能、自动驾驶、机器人、3D感知相关的知识
哈罗小伙伴们,今天阿chai给大家介绍谷歌的多媒体机器学习框架。该框架提供了Python、C/C++、Java等语言对应的库文件,喜欢的小伙伴移植到自己的Demo中,非常方便。接下来我门开始学习啦。
Mepipe是谷歌开源的多面体机器学习框架,里面包含了很多例如姿态、人脸检测、虹膜等各种各样的模型以及机器学习算法。
姿态跟踪与人脸关键点
MediaPipe 的核心框架由 C++ 实现,主要概念包括Packet、Stream、Calculator、Graph以及子图Subgraph。数据包是最基础的数据单位,一个数据包代表了在某一特定时间节点的数据,例如一帧图像或一小段音频信号;数据流是由按时间顺序升序排列的多个数据包组成,一个数据流的某一特定Timestamp只允许至多一个数据包的存在;而数据流则是在多个计算单元构成的图中流动。MediaPipe 的图是有向的——数据包从Source Calculator或者 Graph Input Stream流入图直至在Sink Calculator 或者 Graph Output Stream离开。
mediapipe\_tree
谷歌的大多数平台中都能找到MediaPipe的影子,比如Youtube、Google Lens、ARCore、Google Home 以及 Nest,都已深度整合了 MediaPipe。
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
点开我们看到的界面如下所示:
viz\_mediapipe
图片的左边是我们可视化控件的编辑窗体,右边为脚本的编辑窗体,我们可以选择喜欢的进行设置。在编辑完成后我们点击RUN(右上角奔跑的小人)可以看到效果。
阿chai这里推荐大家使用官方的脚本,小伙伴们可以尝试,我们跑一个手部检测的,运行效果如下图所示。
手部识别效果
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在这里就放上图片,就不展示视频效果了,小伙伴们可自己进行测试。
运行效果截图
相关阅读
关注元峰微信号“AIZOOTech”
更多算法模型相关请关注AIZOO专栏