Mediapipe作为一个可以跨平台的流视频处理库,也兼容了安卓的使用(毕竟亲爹是Google)。
为了在安卓里使用Mediapipe需要使用bazel将mediapipe的编译为aar,来使用。
环境要求
- Linux系统(部分配置需要sh完成,为了便利,不推荐使用windows编译)
- bazel编译器(用于编译)
- adb(需不需要无所谓,是便于之后bazel打包apk后,直接install)
- OpenCV
- JDK
- python
配置环境
(1)配置依赖环境
配置依赖环境
1
| sudo apt-get update && sudo apt-get install -y build-essential git python zip adb openjdk-8-jdk
|
注意:指定python可能报错,可以自行更改为python3
安装JDK(方便之后编译java文件):
1
| sudo apt install openjdk-11-jdk
|
安装C++编译器:
1
| sudo apt install g++ unzip zip
|
安装adb:
1
| sudo apt-get install android-tools-adb
|
安装OpenCV:
1 2 3
| sudo apt-get install libopencv-core-dev libopencv-highgui-dev \ libopencv-calib3d-dev libopencv-features2d-dev \ libopencv-imgproc-dev libopencv-video-dev
|
(2)安装Bazel
Bazel是一款强大的编译工具。
对于Bazel的安装一般有两种方法:
注意:建议下载版本为5.2.0的bazel,在mediapipe的build里指定required version为5.2.0了。
- 使用curl下载安装脚本文件
1 2 3 4 5 6 7 8 9
| curl -sLO --retry 5 --retry-max-time 10 \ https://storage.googleapis.com/bazel/5.2.0/release/bazel-5.2.0-installer-linux-x86_64.sh && \ sudo mkdir -p /usr/local/bazel/5.2.0 && \ chmod 755 bazel-5.2.0-installer-linux-x86_64.sh && \ sudo ./bazel-5.2.0-installer-linux-x86_64.sh --prefix=/usr/local/bazel/5.2.0 && \ source /usr/local/bazel/5.2.0/lib/bazel/bin/bazel-complete.bash
/usr/local/bazel/5.2.0/lib/bazel/bin/bazel version && \ alias bazel='/usr/local/bazel/5.2.0/lib/bazel/bin/bazel'
|
- 直接下载安装脚本文件并执行
(1)下载bazel-5.2.0-installer-linux-x86_64.sh
(2)设置sh权限
1
| sudo chmod +x bazel-5.2.0-installer-linux-x86_64.sh
|
(3)执行sh文件
1
| ./bazel-version-installer-linux-x86_64.sh --user
|
注意: 不建议使用sudo执行,否则会安装到/root/bin下,影响之后的运行
- apt命令下载
1 2 3 4 5 6 7
| sudo apt install apt-transport-https curl gnupg curl -fsSL https://bazel.build/bazel-release.pub.gpg | gpg --dearmor >bazel-archive-keyring.gpg sudo mv bazel-archive-keyring.gpg /usr/share/keyrings echo "deb [arch=amd64 signed-by=/usr/share/keyrings/bazel-archive-keyring.gpg] https://storage.googleapis.com/bazel-apt stable jdk1.8" | sudo tee /etc/apt/sources.list.d/bazel.list sudo apt update && sudo apt install bazel sudo apt update && sudo apt full-upgrade sudo apt install bazel-5.2.0
|
编译前准备
(1)配置bazel到PATH环境变量
1
| export PATH="$PATH:bazel的安装路径/bin"
|
(2)克隆mediapipe源码并进入该目录
1 2
| git clone https://github.com/google/mediapipe.git cd mediapipe
|
(3)测试编译环境
1 2 3 4
| export GLOG_logtostderr=1
bazel run --define MEDIAPIPE_DISABLE_GPU=1 \ mediapipe/examples/desktop/hello_world:hello_world
|
注意: 编译时间可能稍长
如果配置成功,则会有类似如下的打印:
1 2 3 4 5 6 7 8 9 10
| I20200707 09:21:50.275205 16138 hello_world.cc:56] Hello World! I20200707 09:21:50.276554 16138 hello_world.cc:56] Hello World! I20200707 09:21:50.276665 16138 hello_world.cc:56] Hello World! I20200707 09:21:50.276768 16138 hello_world.cc:56] Hello World! I20200707 09:21:50.276887 16138 hello_world.cc:56] Hello World! I20200707 09:21:50.277523 16138 hello_world.cc:56] Hello World! I20200707 09:21:50.278563 16138 hello_world.cc:56] Hello World! I20200707 09:21:50.279263 16138 hello_world.cc:56] Hello World! I20200707 09:21:50.279850 16138 hello_world.cc:56] Hello World! I20200707 09:21:50.280354 16138 hello_world.cc:56] Hello World!
|
(4)下载安卓编译所需的SDK和NDK
1 2
| chmod +x ./setup_android_sdk_and_ndk.sh bash ./setup_android_sdk_and_ndk.sh ~/Android/Sdk ~/Android/Ndk r18b
|
建议使用r18b减少其他意外出现
建议顺便设置下环境变量:
1 2
| export ANDROID_HOME="~/Android/Sdk" export ANDROID_NDK_HOME="~/Android/Ndk/android-ndk-r21b"
|
编译所需aar包(测试hand_tracking)
(1)配置bazel build文件
1 2 3
| cd mediapipe/examples/android/src/java/com/google/mediapipe/apps/ mkdir buid_aar && cd buid_aar vim BUILD
|
编译文件BUILD中内容如下,name是生成后aar的名字,calculators为使用的模型和计算单元,其他的模型和支持计算单元可以查看 mediapipe/graphs/目录下的内容,在这个目录都是Mediapipe支持的模型。其中目录 hand_tracking就是使用到的模型,支持的计算单元需要查看该目录下的BUILD文件中的 cc_library,这里我们是要部署到Android端的,所以选择Mobile的计算单元。本教程我们使用mobile_calculators,这个只检测一个手的关键点,如何想要检查多个收修改成这个计算单元multi_hand_mobile_calculators。
之后输入:
1 2 3 4 5 6
| load("//mediapipe/java/com/google/mediapipe:mediapipe_aar.bzl", "mediapipe_aar")
mediapipe_aar( name = "mediapipe_hand_tracking", calculators = ["//mediapipe/graphs/hand_tracking:mobile_calculators"], )
|
(2)开始编译aar
1 2 3 4 5
| chmod -R 755 mediapipe/
bazel build -c opt --fat_apk_cpu=arm64-v8a,armeabi-v7a \ //mediapipe/examples/android/src/java/com/google/mediapipe/apps/buid_aar:mediapipe_hand_tracking bazel build -c opt mediapipe/graphs/hand_tracking:hand_tracking_mobile_gpu_binary_graph
|
在漫长的等待后,就找到文件 bazel-bin/mediapipe/examples/android/src/java/com/google/mediapipe/apps/buid_aar/mediapipe_hand_tracking.aar。