环境准备
- 操作系统:建议使用 Ubuntu 20.04 或者 macOS(这篇博客会以 Ubuntu 为例)。
- Python 版本:Python 3.7 或以上版本。
- Android Studio:配置好 Android Studio 和 Android NDK(Native Development Kit)。
- Android 架构:通常需要编译 ARM 架构的库,比如
armeabi-v7a
或arm64-v8a
,这些架构是 Android 设备常用的。 - 依赖工具:
- Bazel:构建 MediaPipe 的工具。
- CMake:用于编译 C++ 代码。
- Python NDK:用于 Android 上的 Python 构建。
- Chaquopy 插件:用于在 Android Studio 中集成 Python 代码。
- Protobuf:用于处理 MediaPipe 数据结构。
步骤 1:安装构建依赖
安装 Bazel
Bazel 是 MediaPipe 官方推荐的构建工具。你可以通过以下步骤安装 Bazel:
sudo apt update
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
sudo apt update
sudo apt install bazel-5.0.0
sudo apt update && sudo apt full-upgrade
安装 CMake 和 NDK
sudo apt install cmake
确保你已安装 Android NDK,可以通过 Android Studio 的 SDK Manager 安装。
安装 Protobuf
sudo apt install protobuf-compiler
步骤 2:获取 MediaPipe 源代码
从 GitHub 克隆 MediaPipe 仓库:
git clone https://github.com/google-ai-edge/mediapipe.git
cd mediapipe
步骤 3:配置 Android 构建
MediaPipe 默认是为桌面平台编译的,我们需要为 Android 环境进行配置。你需要使用 bazel
构建工具和 Android NDK 配置文件来生成 Android 架构下的 .whl
文件。
- 创建一个针对 Android 的构建配置:
在 mediapipe
目录下创建 android_build
文件夹,用来存放 Android 配置和构建文件。
- 修改
WORKSPACE
文件:
你需要在 mediapipe/WORKSPACE
文件中增加 Android 相关配置:
load("@bazel_tools//tools/python:rules.bzl", "py_binary", "py_library")
load("@bazel_tools//tools/ndk:ndk.bzl", "android_ndk_toolchain")
# 配置 NDK 路径
android_ndk_toolchain(
name = "android_ndk",
ndk_dir = "/path/to/ndk", # 指定 NDK 路径
)
确保你已经设置好 NDK 的路径。
步骤 4:编译 MediaPipe 为 .whl
文件
- 在 Bazel 构建文件中配置 Python 支持:
在 mediapipe/mediapipe/python
目录下创建 BUILD
文件,定义如何编译 MediaPipe 代码并将其链接到 Python 包中:
load("@bazel_tools//tools/python:rules.bzl", "py_binary", "py_library")
py_binary(
name = "mediapipe",
srcs = glob(["*.py"]),
deps = [
"//mediapipe/..." # 引用 MediaPipe 的相关模块
],
)
- 编译 Android 特定的
.whl
文件:
使用以下命令为 Android 编译 MediaPipe:
bazel build --config=android_arm64 //mediapipe/python:mediapipe_wheel
在这个命令中,--config=android_arm64
是为了指定 Android 平台的 ARM64 架构。如果需要编译其他架构(如 armeabi-v7a
),可以根据需要修改配置。
注意:
//mediapipe/python:mediapipe_wheel
是生成.whl
文件的目标,你可以根据自己的需求修改构建目标。- 编译过程可能会遇到一些依赖问题,特别是涉及到 Android NDK 和 C++ 库时,需要根据错误信息调整配置。
步骤 5:安装 .whl
文件
构建完成后,你会在 bazel-bin/mediapipe/python
目录中看到生成的 .whl
文件。例如,mediapipe-<version>-cp38-cp38-android_16_armeabi_v7a.whl
。
使用 pip
安装 .whl
文件:
pip install /path/to/mediapipe-<version>-cp38-cp38-android_16_armeabi_v7a.whl
确保安装时选择正确的 Python 版本和 Android 架构。
步骤 6:集成到 Android Studio 和 Chaquopy 插件中
- 配置 Chaquopy 插件:
在 Android Studio 的 build.gradle
文件中,添加 Chaquopy 插件和 Python 环境配置:
plugins {
id 'com.android.application'
id 'com.chaquo.python' version '12.0.0'
}
android {
compileSdk 30
defaultConfig {
applicationId "com.example.myapp"
minSdk 21
targetSdk 30
versionCode 1
versionName "1.0"
python {
pip {
install "mediapipe" // 安装生成的 .whl 文件
}
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
}
- 调用 Python 代码:
在 Android 应用中,你可以通过 Chaquopy 插件调用 Python 代码,例如:
import mediapipe as mp
mp_face_detection = mp.solutions.face_detection
mp_drawing = mp.solutions.drawing_utils
with mp_face_detection.FaceDetection(min_detection_confidence=0.2) as face_detection:
# 进行图像处理
pass
- 构建并运行 Android 应用:
构建并运行 Android 项目,确保 Python 代码在 Android 设备上能够正常运行。
步骤 7:调试和优化
- 性能优化:MediaPipe 在 Android 设备上可能会受到硬件性能的限制,特别是在较旧的设备上。你可能需要优化处理流程,例如减少帧率、优化图像处理算法等。
- 依赖问题:如果在构建过程中遇到任何依赖问题,检查 NDK 配置或尝试使用其他版本的 Android NDK。
- Python 环境:确保 Chaquopy 插件和 Python 环境配置正确,特别是在涉及到不同 Python 版本和 Android 架构时。
总结
通过上述步骤,你将成功地将 MediaPipe 编译成一个适用于 Android 平台的 .whl
文件,并通过 Chaquopy 插件集成到 Android Studio 项目中。这使得你能够在 Android 应用中使用 MediaPipe 进行实时的图像处理、手势识别等功能。