MediaPipe 是一款由 Google 开发并开源的数据流处理机器学习应用开发框架. 它是一个基于图的数据处理管线 , 用于构建使用了多种形式的数据源 , 如视频、音频、传感器数据以及任何时间序列数据. MediaPipe 是跨平台的 , 可以运行在嵌入式平台(树莓派等) , 移动设备( iOS 和 Android ) , 工作站和服务器上 , 并支持移动端 GPU 加速 . 使用 MediaPipe ,可以将机器学习任务构建为一个图形的模块表示的数据流管道 , 可以包括推理模型和流媒体处理功能.

本篇文章记录下从零搭建 Mediapipe 环境以及构建 Android AAR 的过程

首先当然是阅读 官方文档 , 需要注意的是在环境选择上 , 最好阅读完相关文章后再进行选择和行动 .

这里本人就吃了个大亏 , 没有仔细看完文档再行动 . 因为本人电脑是 Win11 , 因此就想当然对着 Windows 版本的安装教程进行 , 当整体进行完了 , Hello World Demo 可以运行成功 , 构建 AAR 时却会得到一个错误 , 后面看回文档才知道 , __Windows__原生系统不支持构建 AAR 包!!!

官方截图 :

接下来改用 Docker 进行构建

Docker 安装 Mediapipe

步骤为

  1. 在系统上安装 Docker
  2. 构建 mediapipe镜像
  3. 运行 Hello World C++ 示例项目 (可选)
  4. 自定义构建 AAR

1. 在系统上安装 Docker (略)

步骤 1 略 , 可参考对应系统的相关教程

2. 构建 mediapipe 镜像

clone mediapipe仓库

1
2
git clone https://github.com/google/mediapipe.git
$ cd mediapipe

若直接构建 Image , 不出意外会有很多报错 , 大多是由于网络环境引起的.

我们需要先做的几个操作是

a. 关闭本机代理 (有Issue反馈代理会影响部分拉取包的过程 , 也可先不关闭 , 影响到再关闭)

b. 修改 Docker 镜像源 -> 国内镜像

1
2
3
4
5
"registry-mirrors": [
"https://registry.docker-cn.com",
"http://hub-mirror.c.163.com",
"https://docker.mirrors.ustc.edu.cn"
]

c. 修改 mediapipe 根目录 Dockerfile

首先增加 ubuntu 阿里云镜像 , 在 ENV DEBIAN_FRONTEND=noninteractive 后加上

1
2
3
4
5
6
ENV DEBIAN_FRONTEND=noninteractive
# 更新镜像
RUN sed -i s@/archive.ubuntu.com/@/mirrors.aliyun.com/@g /etc/apt/sources.list
RUN sed -i s@/security.ubuntu.com/@/mirrors.aliyun.com/@g /etc/apt/sources.list
RUN apt-get clean
RUN apt-get update

再给 Python 安装 Tensorflow 指定国内镜像仓库 , 在 RUN ln -s /usr/bin/python3 /usr/bin/python 这行前插入以下配置

1
2
3
4
# 更新镜像
RUN pip3 install --upgrade pip
RUN pip3 install tensorflow==1.14.0 -i https://pypi.tuna.tsinghua.edu.cn/simple
RUN pip3 install tf_slim -i https://pypi.tuna.tsinghua.edu.cn/simple

然后再进行构建

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$ docker build --tag=mediapipe .

# 不出意外 , 将会打印一下内容 , 构建成功
# Sending build context to Docker daemon 147.8MB
# Step 1/9 : FROM ubuntu:latest
# latest: Pulling from library/ubuntu
# 6abc03819f3e: Pull complete
# 05731e63f211: Pull complete
# ........
# See http://bazel.build/docs/getting-started.html to start a new project!
# Removing intermediate container 82901b5e79fa
# ---> f5d5f402071b
# Step 9/9 : COPY . /mediapipe/
# ---> a95c212089c5
# Successfully built a95c212089c5
# Successfully tagged mediapipe:latest

3. 运行 Hello World C++ 示例项目 (可选)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
docker run -it --name mediapipe mediapipe:latest
GLOG_logtostderr=1 bazel run --define MEDIAPIPE_DISABLE_GPU=1 mediapipe/examples/desktop/hello_world

# Should print:
# Hello World!
# Hello World!
# Hello World!
# Hello World!
# Hello World!
# Hello World!
# Hello World!
# Hello World!
# Hello World!
# Hello World!

4. 自定义构建 AAR

这里首先要给容器中环境安装 vim zip 等工具

1
2
3
4
5
apt-get update

apt-get install -y vim

apt-get install zip unzip

然后修改项目根目录 WORKSPACE 文件 , 增加 Android 依赖仓库镜像

1
2
3
4
5
6
7
8
9
10
# 更新镜像 (大约在第358行)
repositories = [
"https://maven.aliyun.com/repository/google",
"https://maven.aliyun.com/repository/central",
"https://maven.aliyun.com/repository/public",
"https://maven.google.com",
"https://dl.google.com/dl/android/maven2",
"https://repo1.maven.org/maven2",
"https://jcenter.bintray.com",
],

再在目录下新建目标 AAR 文件对应 BUILD 文件

1
2
mkdir mediapipe/examples/android/src/java/com/google/mediapipe/apps/aar_example
vim mediapipe/examples/android/src/java/com/google/mediapipe/apps/aar_example/BUILD

BUILD 文件内容:

1
2
3
4
5
6
load("//mediapipe/java/com/google/mediapipe:mediapipe_aar.bzl", "mediapipe_aar")

mediapipe_aar(
name = "mediapipe_holistic_tracking",
calculators = ["//mediapipe/graphs/holistic_tracking:holistic_tracking_gpu_deps"],
)

然后编译 AAR

1
2
3
4
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/aar_example:mediapipe_holistic_tracking.aar

成功后再构建对应 binarypb 文件

1
2
bazel build -c opt \
mediapipe/graphs/holistic_tracking:holistic_tracking_gpu

然后将上面得到的 aar 文件和 binarypb 从容器中拷贝出来即可