記事ディレクトリ
序文
MediaPipe は、ライブおよびストリーミング用のオープンソースのクロスプラットフォームでカスタマイズ可能な ML (機械学習) ソリューションを提供します。
この記事は、前回の 2 つの記事の続きです。
1. Ubuntu に MediaPipe をインストールする
2. Ubuntu で Android 用の MediaPipe をビルドする
1. MediaPipe Android アーカイブ (AAR) とは?
公式説明:
MediaPipe Android アーカイブ (AAR) ライブラリは、Android Studio および Gradle で MediaPipe を使用するための便利な方法です。MediaPipe は、すべてのプロジェクトで使用できる一般的な AAR を公開していません。代わりに、開発者は mediapipe_aar() ターゲットを追加して、独自のプロジェクト用のカスタム AAR ファイルを生成する必要があります。これは、各プロジェクトに必要な MediaPipe 計算機などの特定のリソースを含めるために必要です。
一般的な意味は次のとおりです。
MediaPipe Android アーカイブ (AAR) ライブラリは、Android Studio および Gradle で MediaPipe を使用するための便利な方法です。
MediaPipe は、すべてのプロジェクトで使用できる汎用 AAR を公開していません。開発者は、mediapipe_aar() ターゲットを追加して、独自のプロジェクト用のカスタム AAR ファイルを生成する必要があります。これは、各プロジェクトに必要な特定のリソースを含めるために必要です。
2. MediaPipe AAR をビルドする手順
1. mediapipe_aar() ターゲットを作成する
MediaPipe ディレクトリで、BUILD ファイルに新しい mediapipe_aar() ターゲットを作成します。グラフで使用されている計算機を特定し、計算機の依存関係を mediapipe_aar() に提供する必要があります。
公式の説明は非常に公式です.このプロセスを示すために、例として顔検出を取り上げましょう.
ステップ:
$ cd mediapipe
$ cd mediapipe/examples/android/src/java/com/google/mediapipe/apps/
$ mkdir aar_example
$ cd aar_example
$ touch BUILD
次に、得意な手段を使用して、次の内容をBUILDファイルに書き込みます。
# 这是固定的,加载mediapipe_aar.bzl脚本文件,这个脚本你可以在MediaPipe的如下目录找到
load("//mediapipe/java/com/google/mediapipe:mediapipe_aar.bzl", "mediapipe_aar")
# name:你编译的aar的名称
# calculators:这个配置你可以在如下目录mediapipe/graphs/根据你要编辑的aar去寻找需要的calculators
mediapipe_aar(
name = "mediapipe_face_detection",
calculators = ["//mediapipe/graphs/face_detection:mobile_calculators"],
)
mediapipe_aar がそのように構成されている理由を説明するために、例として face_detection の計算機を取り上げます。
cd メディアパイプ/グラフ/
cd face_detectionge
gedit BUILD
BUILD から必要な電卓を見つけます。Android aar であるため、モバイル側で電卓を見つけます。
2. Bazel ビルド コマンドを実行して AAR を生成する
2.1 solution_core.aar をビルドするコマンドは次のとおりです。
solution_core の aar 構成ファイルは Google によって既に実装されているため、自分で構成する必要はありません。
現在のファイルで設定: mediapipe/java/com/google/mediapipe/solutioncore/BUILD
bazel build -c opt --strip=ALWAYS \
--host_crosstool_top=@bazel_tools//tools/cpp:toolchain \
--fat_apk_cpu=arm64-v8a,armeabi-v7a \
--legacy_whole_archive=0 \
--features=-legacy_whole_archive \
--copt=-fvisibility=hidden \
--copt=-ffunction-sections \
--copt=-fdata-sections \
--copt=-fstack-protector \
--copt=-Oz \
--copt=-fomit-frame-pointer \
--copt=-DABSL_MIN_LOG_LEVEL=2 \
--linkopt=-Wl,--gc-sections,--strip-all \
--verbose_failures \
//mediapipe/java/com/google/mediapipe/solutioncore:solution_core.aar
2.2 mediapipe_face_detection.aar をビルドするコマンドは次のとおりです。
$ bazel build -c opt --strip=ALWAYS \
--host_crosstool_top=@bazel_tools//tools/cpp:toolchain \
--fat_apk_cpu=arm64-v8a,armeabi-v7a \
--legacy_whole_archive=0 \
--features=-legacy_whole_archive \
--copt=-fvisibility=hidden \
--copt=-ffunction-sections \
--copt=-fdata-sections \
--copt=-fstack-protector \
--copt=-Oz \
--copt=-fomit-frame-pointer \
--copt=-DABSL_MIN_LOG_LEVEL=2 \
--linkopt=-Wl,--gc-sections,--strip-all \
--verbose_failures \
//mediapipe/examples/android/src/java/com/google/mediapipe/apps/aar_example:mediapipe_face_detection.aar
最後のコマンドについて説明します。
# 第一步配置的aar的BUILD文件所在目录:第一步配置的BUILD文件中aar的名称
# BUILD目录:BUILD中配置的aar名称.aar
//mediapipe/examples/android/src/java/com/google/mediapipe/apps/aar_example:mediapipe_face_detection.aar
ビルド中のエラー
1. ビルド プロセス中に上記のビルド コマンドを実行すると、スクリプトの問題が発生します。問題が発生しないことを願っています。
ERROR: /home/silicon/code/mediapipe/mediapipe/mediapipe/examples/android/src/java/com/google/mediapipe/apps/aar_example/BUILD:3:14: Executing genrule //mediapipe/examples/android/src/java/com/google/mediapipe/apps/aar_example:mediapipe_face_detection_binary_manifest_generator failed: (Exit 127): bash failed: error executing command
(cd /home/silicon/.cache/bazel/_bazel_silicon/dc627073c9c97a85c1d325052ea10bb0/sandbox/linux-sandbox/2173/execroot/mediapipe && \
exec env - \
PATH=/home/silicon/.cache/bazelisk/downloads/bazelbuild/bazel-5.0.0-linux-x86_64/bin:/home/silicon/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin \
/bin/bash -c 'source external/bazel_tools/tools/genrule/genrule-setup.sh;
cat > bazel-out/k8-opt/bin/mediapipe/examples/android/src/java/com/google/mediapipe/apps/aar_example/mediapipe_face_detection_generated_AndroidManifest.xml <<EOF
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
package="dummy.package.for.so">
<uses-sdk android:minSdkVersion="21"/>
</manifest>
EOF
')
# Configuration: 42b5acd92d1adc889d3cf875a6930269a8b5b2c1cf2b927a64f9fccc558a0369
# Execution platform: @local_execution_config_platform//:platform
Use --sandbox_debug to see verbose messages from the sandbox
/bin/bash: $'\r': command not found
Target //mediapipe/examples/android/src/java/com/google/mediapipe/apps/aar_example:mediapipe_face_detection.aar failed to build
INFO: Elapsed time: 17.616s, Critical Path: 17.08s
INFO: 196 processes: 129 internal, 67 linux-sandbox.
FAILED: Build did NOT complete successfully
以下の画像で丸で囲まれたエラーに焦点を当てます。
- 緑色のボックスのエラー出力は、aar ビルド スクリプト
mediapipe_aar.bzl
からの出力です ( )。 换行符多了\r
丸で囲まれた赤いボックスは、この時点で改行文字が Windows では \r\n であり、Linux では \n であるため、Windows で記述されたファイルには Linux よりも多くのキャリッジ リターン記号 \r が含まれることを示しています。
したがって、エラーはmediapipe_aar.bzl
スクリプトの問題であると推測されます.スクリプトの改行に問題があります.次のコマンドを実行して問題を解決してください.
$ cd mediapipe
$ cd mediapipe/java/com/google/mediapipe/
$ sed -i 's/\r$//' mediapipe_aar.bzl
ビルドは成功です。
実行の最後に、図に示すような結果が表示され、aar パッケージが赤枠で囲まれたディレクトリに格納されます。
bazel-bin/mediapipe/examples/android/src/java/com/google/mediapipe/apps/aar_example/mediapipe_face_detection.aar
3. AAR を Android Studio プロジェクトにインポートする
1. aar を app/libs にインポートします。libs フォルダーがない場合は、新しいフォルダーを作成します。
2. app/src/main/assets を作成し、アセット (グラフィック、モデルなど) を app/src/main/assets にコピーします。
- 次のコマンドを実行します。
# 执行如下命令构建face_detection_mobile_gpu.binarypb
bazel build -c opt mediapipe/graphs/face_detection:face_detection_mobile_gpu_binary_graph
正常にコンパイルされた出力ファイル パス:bazel-bin/mediapipe/graphs/face_detection/face_detection_mobile_gpu.binarypb
2. 以下の 2 つのファイルをプロジェクト内の assets フォルダーにコピーし、assets なしで 1 つ作成します。
ファイルパス:
$ cd mediapipe
# 找到文件face_detection_mobile_gpu.binarypb
$ cd bazel-bin/mediapipe/graphs/face_detection/
# 找到文件face_detection_short_range.tflite
$ cd mediapipe/modules/face_detection/
次に、上記のファイルを Android Studio にインポートします。
3. app/build.gradle を変更して、MediaPipe の依存関係と MediaPipe AAR を追加します。
// 引入libs中的jar、aar包
implementation fileTree(dir: 'libs', include: ['*.jar', '*.aar'])
// MediaPipe deps
implementation 'com.google.flogger:flogger:latest.release'
implementation 'com.google.flogger:flogger-system-backend:latest.release'
implementation 'com.google.code.findbugs:jsr305:latest.release'
implementation 'com.google.guava:guava:27.0.1-android'
implementation 'com.google.protobuf:protobuf-javalite:3.19.1'
// CameraX core library
def camerax_version = "1.0.0-beta10"
implementation "androidx.camera:camera-core:$camerax_version"
implementation "androidx.camera:camera-camera2:$camerax_version"
implementation "androidx.camera:camera-lifecycle:$camerax_version"
// AutoValue
def auto_value_version = "1.8.1"
implementation "com.google.auto.value:auto-value-annotations:$auto_value_version"
annotationProcessor "com.google.auto.value:auto-value:$auto_value_version"
ここまでで、aar パッケージがコンパイルされました。これは、MediaPipe Hands や Face Mesh などの場合で、上記の方法を使用してコンパイルするだけです。
コードの使用方法については、MediaPipe の公式 Web サイトを参照してください。
要約する
例を見る必要がある場合は、MediaPipe のコードをローカルに直接複製します。
git clone git@github.com:google/mediapipe.git
或者
git clone https://github.com/google/mediapipe.git
$ cd mediapipe
$ cd mediapipe/examples/android/solutions
将solutions这个项目导入你的Android studio,其中就包含MediaPipe的Hands,face detection,face mesh的例子。
この例では、Google が Maven にアップロードした Hands、顔検出、および顔メッシュの aar を紹介します.自分で変更する必要がない場合は、Google がパッケージ化した aar を直接使用することをお勧めします.
Windows で動作している場合は、solutions
このプロジェクトを実行する前に、必ず管理者権限でコマンド ラインを開き、
create_win_symlinks.bat スクリプトを実行してください。
参考
1. MediaPipe が正式に MediaPipe Android Archive をビルド ステップ
2. MediaPipe の各 aar ライブラリの使用方法