MediaPipe的编译与测试

MediaPipe是谷歌开源的多媒体机器学习框架,里面包含了很多例如姿态、人脸检测、虹膜等各种各样的模型以及机器学习算法。用于构建跨平台多模态应用的ML管道的框架。其包括快速ML推理、经典计算机视觉。核心框架由 C++ 实现,并提供 Java 以及 Objective C 等语言的支持。MediaPipe 的主要概念包括数据包(Packet)、数据流(Stream)、计算单元(Calculator)、图(Graph)以及子图(Subgraph)。数据包是最基础的数据单位,一个数据包代表了在某一特定时间节点的数据,例如一帧图像或一小段音频信号;数据流是由按时间顺序升序排列的多个数据包组成,一个数据流的某一特定时间戳(Timestamp)只允许至多一个数据包的存在;而数据流则是在多个计算单元构成的图中流动。MediaPipe 图是有向的——数据包从数据源(Source Calculator或者 Graph Input Stream)流入图直至在汇聚结点(Sink Calculator 或者 Graph Output Stream) 离开。

一、Ubuntu下配置MediaPipe
1、环境配置
Python >= 3.9.0
Bazel >= 3.7.2, (< 4.0.0 for iOS)
GCC/G++ >= 8.0.0 (Linux, macOS)
NuGet
jdk安装(源码安装):ubuntu18 安装jdk11 (jdk-11.0.9_linux-x64_bin.deb)
OpenCV3 (最好OpenCV3,安装OpenCV4编译C++报错)
(1)OpenCV3安装:
cd mediapipe-master
chmod +x setup_opencv.sh
./setup_opencv.sh
(2) 安装MediaPipe所需依赖库

pip --default-timeout=1000 install -i requirements.txt

(3) Bazel下载与安装
Bazel下载地址
Bazel3.7.2下载地址
Bazel 安装:

chmod a+x bazel-3.7.2-installer-linux-x86_64.sh
./bazel-3.7.2-installer-linux-x86_64.sh --user

(4)Python3.9.1安装
ubuntu 16.04 编译安装 python3.9
Python3.9.1 make过程中报错:fatal error: ffi.h: No such file or directory
MediaPipe的编译与测试_第1张图片
该错误是因为缺少ffi库的原因,解决方法:

sudo apt-get install libffi-dev

安装完成后继续make,问题解决~
(5) 安装SDK/NDK以及配置相应的环境变量
-> cd到mediapipe-master文件夹下,执行命令:

chmod +x ./setup_android_sdk_and_ndk.sh
bash ./setup_android_sdk_and_ndk.sh ~/Android/Sdk ~/Android/Ndk r18b

->配置环境变量
一次性操作,关闭终端后需要重新进行配置

export ANDROID_HOME=/home/admin1/Android/Sdk
export ANDROID_NDK_HOME=/home/admin1/Android/Ndk/android-ndk-r18b

永久配置全局环境变量:

sudo gedit /etc/profile
## 在profile最下方添加:
export ANDROID_HOME=/home/admin1/Android/Sdk
export ANDROID_NDK_HOME=/home/admin1/Android/Ndk/android-ndk-r18b
source /etc/profile

2、实例测试
(1)HelloWorld测试:

1、clone the code:
   git clone https://github.com/google/mediapipe.git
   cd mediapipe
2、Install OpenCV and FFmpeg:
   sudo apt-get install libopencv-core-dev libopencv-highgui-dev libopencv-calib3d-dev libopencv-features2d-dev libopencv-imgproc-dev libopencv-video-dev
3、运行Hello World:
   export GLOG_logtostderr=1
   bazel run --define MEDIAPIPE_DISABLE_GPU=1 mediapipe/examples/desktop/hello_world:hello_world

运行结果:
MediaPipe的编译与测试_第2张图片
出现如上界面,表示MediaPipe环境配置成功。
(2)HandTracking:

bazel build -c opt --define MEDIAPIPE_DISABLE_GPU=1 mediapipe/examples/desktop/hand_tracking:hand_tracking_cpu
GLOG_logtostderr=1 bazel-bin/mediapipe/examples/desktop/hand_tracking/hand_tracking_cpu \
  --calculator_graph_config_file=mediapipe/graphs/hand_tracking/hand_tracking_desktop_live.pbtxt

编译完成后,连接USB摄像头,然后运行bazel-bin命令,会出现摄像头实时手部检测界面。
二、Win10编译MediaPipe
Mediapipe – Windows10 编译Mediapipe C++版本保姆级教程
1、Bazel设置环境变量,在MSYS中设置而不是在cmd中进行设置

set BAZEL_VS=C:\Program Files (x86)\Microsoft Visual Studio\2019\Community
set BAZEL_VC=C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC
set BAZEL_VC_FULL_VERSION=14.29.30036
set BAZEL_WINSDK_FULL_VERSION=10.0.19041.685

注意需要进行字符转义,如下:
MediaPipe的编译与测试_第3张图片
2、编译与运行测试
(1)HelloWorld测试

bazel build -c opt --define MEDIAPIPE_DISABLE_GPU=1 --action_env PYTHON_BIN_PATH="C:\\Users\\xxx\\AppData\\Local\\Programs\\Python\\Python39\\python.exe" mediapipe/examples/desktop/hello_world

编译结果如下:
MediaPipe的编译与测试_第4张图片
运行:

set GLOG_logtostderr=1
bazel-bin\mediapipe\examples\desktop\hello_world\hello_world.exe

运行结果如下:
MediaPipe的编译与测试_第5张图片
(2)HandTracking

bazel build -c opt --define MEDIAPIPE_DISABLE_GPU=1 --action_env PYTHON_BIN_PATH="C:\\Users\\xxx\\AppData\\Local\\Programs\\Python\\Python39\\python.exe" mediapipe/examples/desktop/hand_tracking:hand_tracking_cpu
set GLOG_logtostderr=1
bazel-bin\mediapipe\examples\desktop\hand_tracking\hand_tracking_cpu.exe --calculator_graph_config_file=mediapipe\graphs\hand_tracking\hand_tracking_desktop_live.pbtxt

(3) Face Detection

bazel build -c opt --define MEDIAPIPE_DISABLE_GPU=1 --action_env PYTHON_BIN_PATH="C:\\Users\\xxx\\AppData\\Local\\Programs\\Python\\Python39\\python.exe" mediapipe/examples/desktop/face_detection:face_detection_cpu
set GLOG_logtostderr=1
bazel-bin\mediapipe\examples\desktop\face_detection\face_detection_cpu.exe --calculator_graph_config_file=mediapipe\graphs\face_detection\face_detection_desktop_live.pbtxt

三、MediaPipe on Android

执行如下命令:

bazel build -c opt --config=android_arm64 mediapipe/examples/android/src/java/com/google/mediapipe/apps/facedetectioncpu:facedetectioncpu
## 安装facedetectioncpu.apk到手机设备:
adb install bazel-bin/mediapipe/examples/android/src/java/com/google/mediapipe/apps/handtrackinggpu/handtrackinggpu.apk

不过执行第一步的编译命令报错:

@androidsdk//:dx_jar_import: missing input file 'external/androidsdk/build-tools/31.0.0/lib/dx.jar', owner: '@androidsdk//:build-tools/31.0.0/lib/dx.jar'

MediaPipe的编译与测试_第6张图片
解决办法:1)将ndk进行升级,从r18b升级到r21e,android-ndk-r21e-linux-x86_64.zip网盘下载
将android-ndk-r21e-linux-x86_64.zip解压,复制android-ndk-r21文件夹到~/Android/Ndk文件夹下。
对应修改全局的环境变量

sudo gedit /etc/profile
## 最下面添加:
export ANDROID_HOME=/home/admin1/Android/Sdk
export ANDROID_NDK_HOME=/home/admin1/Android/Ndk/android-ndk-r21e
source /etc/profile

2)WORKSPACE中android_sdk_repository添加:

    api_level = 29,
    build_tools_version = "29.0.1",

如下:
在这里插入图片描述
然后保存,继续执行命令:

bazel build -c opt --config=android_arm64 mediapipe/examples/android/src/java/com/google/mediapipe/apps/facedetectioncpu:facedetectioncpu

顺利通过编译
然后会生成相应的.apk文件:

bazel-bin/mediapipe/examples/android/src/java/com/google/mediapipe/apps/facedetectioncpu/facedetectioncpu.apk

将生成的.apk文件安装在Android设备上进行测试。
3) 编译测试object detection:

bazel build -c opt --config=android_arm64 mediapipe/examples/android/src/java/com/google/mediapipe/apps/objectdetectioncpu:objectdetectioncpu
## 生成objectdetectioncpu.apk
bazel-bin/mediapipe/examples/android/src/java/com/google/mediapipe/apps/objectdetectioncpu/objectdetectioncpu.apk

编译结果如下:
MediaPipe的编译与测试_第7张图片
将objectdetectioncpu.apk安装到手机上进行实时检测,效果如下:
MediaPipe的编译与测试_第8张图片
objectdetection.apk
四、MediaPipe编译用于Android的aar包
Mediapipe框架学习之三——构建 MediaPipe 的 Android aar 包
1、编译构建手势识别的aar包:
进入文件夹:mediapipe/examples/android/src/java/com/google/mediapipe/apps

mkdir build_aar
cd build_aar
touch BUILD
gedit BUILD
## 添加如下内容,这是编译手势检测的aar包,使用的模型为//mediapipe/graphs/hand_tracking:mobile_calculators
load("//mediapipe/java/com/google/mediapipe:mediapipe_aar.bzl", "mediapipe_aar")

mediapipe_aar(
    name = "mediapipe_hand_tracking",
    calculators = ["//mediapipe/graphs/hand_tracking:mobile_calculators"],
)

然后进入mediapipe主目录,执行编译命令:

bazel build -c opt --strip=ALWAYS --host_crosstool_top=@bazel_tools//tools/cpp:toolchain --fat_apk_cpu=arm64-v8a,armeabi-v7a mediapipe/examples/android/src/java/com/google/mediapipe/apps/build_aar:mediapipe_hand_tracking.aar

编译结果如下表示成功编译:
MediaPipe的编译与测试_第9张图片
编译成功会生成mediapipe_hand_tracking.aar文件:

bazel-bin/mediapipe/examples/android/src/java/com/google/mediapipe/apps/build_aar/mediapipe_hand_tracking.aar

执行命令生成二进制图:

bazel build -c opt mediapipe/graphs/hand_tracking:hand_tracking_mobile_gpu_binary_graph

编译结果如下:
MediaPipe的编译与测试_第10张图片
生成的hand_tracking_mobile_gpu.binarypb文件路径为:

bazel-bin/mediapipe/graphs/hand_tracking/hand_tracking_mobile_gpu.binarypb

接下来需要复制以下文件到Android Stdio工程的app/src/main/assets/目录下:

bazel-bin/mediapipe/graphs/hand_tracking/hand_tracking_mobile_gpu.binarypb
mediapipe/modules/hand_landmark:handedness.txt
mediapipe/modules/hand_landmark:hand_landmark.tflite
mediapipe/modules/palm_detection:palm_detection.tflite

2、编译构建mp_face_detection_aar.aar 包
(1)在 mediapipe/examples/android/src/java/com/google/mediapipe/apps 中,新建文件aar_example
(2)在aar_example中,新建BUILD文件,内容为:

load("//mediapipe/java/com/google/mediapipe:mediapipe_aar.bzl", "mediapipe_aar")

mediapipe_aar(
    name = "mp_face_detection_aar",
    calculators = ["//mediapipe/graphs/face_detection:mobile_calculators"],
)

name 为 aar 的包名
calculators 为将要构建的App所需的计算单元,Mediapipe 库已提供。
(3)构建aar包

cd mediapipe    ## (mediapipe主目录)
chmod -R 755 mediapipe/
bazel build -c opt --fat_apk_cpu=arm64-v8a,armeabi-v7a //mediapipe/examples/android/src/java/com/google/mediapipe/apps/aar_example:mp_face_detection_aar

编译结果如下:
MediaPipe的编译与测试_第11张图片
(4)复制生成的aar包到指定路径(aar_example文件夹下)

cp bazel-bin/mediapipe/examples/android/src/java/com/google/mediapipe/apps/aar_example/mp_face_detection_aar.aar //home/bot/mediapipe/mediapipe/examples/android/src/java/com/google/mediapipe/apps/aar_example

(5) 构建 facedetectiongpu:binary_graph及相关文件

bazel build -c opt mediapipe/graphs/face_detection:face_detection_mobile_cpu_binary_graph

构建过程:
MediaPipe的编译与测试_第12张图片
(6)复制生成的face_detection_mobile_cpu.binarypb到指定路径(aar_example下)

cp bazel-bin/mediapipe/graphs/face_detection/face_detection_mobile_cpu.binarypb mediapipe/examples/android/src/java/com/google/mediapipe/apps/aar_example

以上为个人配置及测试过程,仅做记录,如有问题欢迎留言交流探讨。
参考链接
MediaPipe Getting Started
Ubuntu16.04安装配置opencv3.4.3+opencv_contrib3.4.3
Ubuntu16.04安装Mediapipe
ubuntu 16.04 编译安装 python3.9
mediapipe 编译用于android的aar包
CMake官网
MediaPipe教程:Google 多媒体机器学习框架入坑指南

你可能感兴趣的:(AI,MediaPipe)