Ubuntu で MediaPipe Android アーカイブ (AAR) をビルドする


序文

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 にコピーします。

  1. 次のコマンドを実行します。
# 执行如下命令构建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,其中就包含MediaPipeHands,face detection,face mesh的例子。

この例では、Google が Maven にアップロードした Hands、顔検出、および顔メッシュの aar を紹介します.自分で変更する必要がない場合は、Google がパッケージ化した aar を直接使用することをお勧めします.

Windows で動作している場合は、solutionsこのプロジェクトを実行する前に、必ず管理者権限でコマンド ラインを開き、
create_win_symlinks.bat スクリプト
を実行してください。


参考

1. MediaPipe が正式に MediaPipe Android Archive をビルド ステップ
2. MediaPipe の各 aar ライブラリの使用方法

おすすめ

転載: blog.csdn.net/u013855006/article/details/125261000