Mediapipe作为一个可以跨平台的流视频处理库,也兼容了安卓的使用(毕竟亲爹是Google)。
为了在安卓里使用Mediapipe需要使用bazel将mediapipe的编译为aar,来使用。

环境要求

  1. Linux系统(部分配置需要sh完成,为了便利,不推荐使用windows编译)
  2. bazel编译器(用于编译)
  3. adb(需不需要无所谓,是便于之后bazel打包apk后,直接install)
  4. OpenCV
  5. JDK
  6. 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了。

  1. 使用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. 直接下载安装脚本文件并执行

(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下,影响之后的运行

  1. 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。