Ubuntu上构建Android的MediaPipe


前言

MediaPipe 为直播和流媒体提供开源跨平台、可定制的 ML(机器学习) 解决方案。

MediaPipe的安装可以看我上一篇文章:
Ubuntu上安装MediaPipe


提示:以下是本篇文章正文内容,下面案例可供参考
参考Google MediaPipe构建android项目

一、前提条件

1、安装MediaPipe

MediaPipe是使用Bazel进行构建的,因此需要按照官网MediaPipe安装步骤或者我提供的MediaPipe安装步骤将MediaPipe安装到你的电脑上

2、安装JDK,配置JDK环境

安装命令如下,不配置JAVA_HOME环境也是可以的

sudo apt install openjdk-11-jdk

3、配置Android SDK的版本,至少为30.0.0

4、配置Android NDK的版本,在18和21之间(包含18和21)

对于SDK和NDK的配置,如果你已经下载了SDK和NDK(比如通过Android studio下载)直接使用命令行配置。

sdk和ndk配置命令<>包含的路径:进入sdk或者ndk目录,输入pwd命令获取完整路径

# 第一步:在当前用户打开如下文件
$ vim .bashrc 

# 第二步:在.bashrc文件末尾添加如下命令
#例如我本地:export ANDROID_HOME=/home/silicon/Android/Sdk,等价于 export ANDROID_HOME=`pwd`/Android/Sdk
export ANDROID_HOME=<path to the Android SDK>
#例如我本地:export ANDROID_HOME=/home/silicon/Android/Sdk/ndk-bundle/android-ndk-r21,等价于export ANDROID_HOME=`pwd`/Android/Sdk/ndk-bundle/android-ndk-r21
export ANDROID_NDK_HOME=<path to the Android NDK>
#最后一步,配置如下
export PATH=$ANDROID_HOME:$ANDROID_NDK_HOME:$PATH

# 第三步:执行如下命令
$ source .bashrc

# 最终验证是否配置完成
$ echo $ANDROID_HOME

然后将 android_ndk_repository() 和 android_sdk_repository() 规则添加到WORKSPACE文件中,如下所示:

#第一步,找到你本地的MediaPipe项目
$ cd mediapipe

#第二步执行如下两个语句
echo "android_sdk_repository(name = \"androidsdk\")" >> WORKSPACE
echo "android_ndk_repository(name = \"androidndk\", api_level=21)" >> WORKSPACE

分割割割割割割割割割割割割割割割割割割割割割割割割割割割割割割割割割割割割割割割

如果你懒得自己安装,就是想偷懒,好。Google MediaPipe团队也为你考虑到了,执行MediaPipe包含的脚本文件进行傻瓜式操作

#第一步,找到你本地的MediaPipe项目
cd mediapipe

#第二步执行如下脚本
./setup_android_sdk_and_ndk.sh

执行第二步脚本文件可能会报如下错误:
/bin/bash^M:解释器错误: 没有那个文件或目录,原因:由于windows系统下换行符为 \r\n,linux下换行符为 \n,所以导致在windows下编写的文件会比linux下多回车符号 \r。

解决方式

sed -i 's/\r$//' setup_android_sdk_and_ndk.sh

二、构建MediaPipe的Android项目

建议科学上网,因为咱们的国墙太厚了,会阻挡你接下来前进的步骤,各种网络错误,因为有一堆的网络问题,Google官方也没有办法帮你解决

遇到问题之后我们可以去看看MediaPipe官方的错误解决录中是否有我们出现的问题。

1. 构建MediaPipe Android apk

要构建 Android 示例应用程序,请针对相应的android_binary构建目标进行构建。例如,我们以构建Hands手势跟踪为例,对于MediaPipe Hands,目标handtrackinggpu位于BUILD文件中:

注意:要减小二进制大小,请考虑附加–linkopt="-s"到以下命令以去除符号。

构建命令如下:

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

遇到的问题

1、执行了上述命令,此时你可能会遇到第一个问题,报错如下

2022/06/09 19:56:46 Downloading https://releases.bazel.build/5.2.0/release/bazel-5.2.0-linux-x86_64...
2022/06/09 19:56:49 could not download Bazel: could not copy from https://releases.bazel.build/5.2.0/release/bazel-5.2.0-linux-x86_64 to /home/silicon/.cache/bazelisk/downloads/bazelbuild/bazel-5.2.0-linux-x86_64/bin/download481996173: unexpected EOF

此时我们查看错误,发现could not copy from....../home/silicon/.cache........,意思就是不能将文件copy到另外一个文件,查看了.cache这个文件发现是权限不足。

两种解决方式:

  • 通过sudo chmod xxx .cache修改.cache文件权限
    例如:sudo chmod 777 .cache,可以参考网上很多的Ubuntu权限讲解
  • 直接在执行命令之前加sudo
sudo bazel build -c opt --config=android_arm64 mediapipe/examples/android/src/java/com/google/mediapipe/apps/handtrackinggpu:handtrackinggpu

构建apk成功截图:
在这里插入图片描述

2、接下来我们又碰到如下问题,通过bazelisk下载最新的bazel的问题,
https://www.googleapis.com网址我们不能访问,即使科学上网之后查看还是404,很尴尬

2022/06/09 20:02:24 could not resolve the version 'latest' to an actual version number: unable to determine latest version: could not list Bazel versions in GCS bucket: could not list GCS objects at https://www.googleapis.com/storage/v1/b/bazel/o?delimiter=/: could not fetch https://www.googleapis.com/storage/v1/b/bazel/o?delimiter=/: Get "https://www.googleapis.com/storage/v1/b/bazel/o?delimiter=/": dial tcp 142.251.42.234:443: i/o timeout

bazelisk的issue中找到解决方式,参考最后的解决方式。

3、还会出现Python环境找不到的问题

ERROR: An error occurred during the fetch of repository 'local_execution_config_python':
   Traceback (most recent call last):

通常表示 Bazel 无法找到本地 Python 二进制文件。要解决这个问题,请先找到 python 二进制文件在哪里,然后添加–action_env PYTHON_BIN_PATH=< path to python binary >到 Bazel 命令中。

bazel build -c opt \
    --action_env PYTHON_BIN_PATH=$(which python3) \
    --config=android_arm64 mediapipe/examples/android/src/java/com/google/mediapipe/apps/handtrackinggpu:handtrackinggpu

4、缺少必要的 Python 包

File "/root/.cache/bazel/_bazel_root/dc627073c9c97a85c1d325052ea10bb0/external/org_tensorflow/third_party/py/python_configure.bzl", line 216, column 39, in _create_local_python_repository
		numpy_include = _get_numpy_include(repository_ctx, python_bin) + "/numpy"
	File "/root/.cache/bazel/_bazel_root/dc627073c9c97a85c1d325052ea10bb0/external/org_tensorflow/third_party/py/python_configure.bzl", line 190, column 19, in _get_numpy_include
		return execute(
	File "/root/.cache/bazel/_bazel_root/dc627073c9c97a85c1d325052ea10bb0/external/org_tensorflow/third_party/remote_config/common.bzl", line 230, column 13, in execute
		fail(
Error in fail: Problem getting numpy include path.
Traceback (most recent call last):
  File "<string>", line 1, in <module>
ModuleNotFoundError: No module named 'numpy'
Is numpy installed?

安装命令

pip3 install numpy scipy matplotlib -i https://pypi.tuna.tsinghua.edu.cn/simple

2.安装到手机

命令如下

adb install bazel-bin/mediapipe/examples/android/src/java/com/google/mediapipe/apps/handtrackinggpu/handtrackinggpu.apk

运行效果:

Google MediaPipe手势检测例子


参考

1、Google MediaPipe官网构建Android项目文档
2、Bazel的release发布地址
3、MediaPipe安装和构建过程中可能会遇到的问题
4、菜鸟教程安装Python numpy步骤

猜你喜欢

转载自blog.csdn.net/u013855006/article/details/125215779