Hand Trackingが実装されたことで話題になったGoogle MediaPipeを、ビルドしてAndroidにインストールするまでの手順です。
基本的には公式README通りにやれば良いですが、何箇所が躓いたところがあるので、それを中心に書いておきます。
ちなみに、MediaPipeについてはHand Trackingの話題で存在自体を初めて知りました。日本語の解説記事があったので、合わせて読むと少しは理解が進むかも。
GoogleのMediaPipeでMLアプリ開発が楽になる · tkat0.github.io
MadiaPipeのビルド環境を整える
公式ドキュメントの通り進めていきます。Mac+Android Studioなら、以下の順序で読み進めていけばOKです。
以下、躓いたところと解決方法です。
Run the Hello World desktop example.
でビルドエラー
bazel run
で以下のようなエラーが出ました。
$ export GLOG_logtostderr=1 [(master) ~/Development/oss/mediapipe]
$ bazel run --define MEDIAPIPE_DISABLE_GPU=1 \ [(master) ~/Development/oss/mediapipe]
mediapipe/examples/desktop/hello_world:hello_world
Extracting Bazel installation...
Starting local Bazel server and connecting to it...
... still trying to connect to local Bazel server after 10 seconds ...
DEBUG: Rule 'build_bazel_rules_apple' indicated that a canonical reproducible form can be obtained by modifying arguments commit = "6c9fcae7a3597aabd43f28be89466afe0eab18de", shallow_since = "1565379803 -0700" and dropping ["tag"]
DEBUG: Call stack for the definition of repository 'build_bazel_rules_apple' which is a git_repository (rule definition at /private/var/tmp/_bazel_keita/d5c0de304ea3ae0df121006f1a08079f/external/bazel_tools/tools/build_defs/repo/git.bzl:181:18):
- /Users/keita/Development/oss/mediapipe/WORKSPACE:251:1
ERROR: /private/var/tmp/_bazel_keita/d5c0de304ea3ae0df121006f1a08079f/external/local_config_cc/BUILD:62:5: in apple_cc_toolchain rule @local_config_cc//:cc-compiler-watchos_arm64_32: Xcode version must be specified to use an Apple CROSSTOOL. If your Xcode version has changed recently, verify that "xcode-select -p" is correct and then try: "bazel shutdown" to re-run Xcode configuration
INFO: Call stack for the definition of repository 'com_google_absl' which is a http_archive (rule definition at /private/var/tmp/_bazel_keita/d5c0de304ea3ae0df121006f1a08079f/external/bazel_tools/tools/build_defs/repo/http.bzl:237:16):
- /Users/keita/Development/oss/mediapipe/WORKSPACE:16:1
INFO: Call stack for the definition of repository 'com_github_glog_glog' which is a http_archive (rule definition at /private/var/tmp/_bazel_keita/d5c0de304ea3ae0df121006f1a08079f/external/bazel_tools/tools/build_defs/repo/http.bzl:237:16):
- /Users/keita/Development/oss/mediapipe/WORKSPACE:61:1
ERROR: Analysis of target '//mediapipe/examples/desktop/hello_world:hello_world' failed; build aborted: Analysis of target '@local_config_cc//:cc-compiler-watchos_arm64_32' failed; build aborted
INFO: Elapsed time: 48.317s
INFO: 0 processes.
FAILED: Build did NOT complete successfully (24 packages loaded, 108 targets configured)
FAILED: Build did NOT complete successfully (24 packages loaded, 108 targets configured)
Xcodeの新しいコマンドラインツールのディレクトリを見られてないのが原因です。ちなみに、Xcodeが古い場合は最新版にしておきましょう。
$ xcode-select -p [(master) ~/Development/oss/mediapipe]
/Library/Developer/CommandLineTools
# このディレクトリだとエラーになる
$ sudo xcode-select -r
# xcode-selectをリストアする
$ xcode-select -p [(master) ~/Development/oss/mediapipe]
/Applications/Xcode.app/Contents/Developer
# このディレクトリになったらOK
$ bazel shutdown
# bazelサーバーを一度落とす
$ bazel run --define MEDIAPIPE_DISABLE_GPU=1 \ [(master) ~/Development/oss/mediapipe]
mediapipe/examples/desktop/hello_world:hello_world
# 再度ビルドを実行
getting Xcode-related error with Bazel - Google グループ
Android StudioのConfigure
って何?
Configure | SDK Manager | SDK Platforms
みたいになってるところのConfigure
はメニューバーにあるAndroid Studio > Preferences
に読み替えればOKです。
Import Bazel Project
の最後のFinish
を押すとエラー
最後の方にあるandroid_sdk_platformのコメントアウトを1つ外さないとエラーになります。基本的には最新のandroid_sdk_platform: android-28
のコメントアウトを外せば問題ないです。
Syncエラー
Error:Cannot run program "bazel" (in directory "/Users/keita/Development/oss/mediapipe"): error=2, No such file or directory
bazelコマンドのロケーションをAndroid Studioに設定する必要があります。まずはbazelコマンドの場所を特定します。
$ which bazel
/usr/local/bin/bazel
Android Studio > Preferences > Bazel SettingのBazel binaru locatiopnにパスを入力してOKを押します。
Cannot run program "bazel".. No such file or directory · Issue #285 · bazelbuild/intellij
アプリビルドでエラー
ERROR: /Users/keita/Development/oss/mediapipe/WORKSPACE:243:1: //external:android/sdk depends on @androidsdk//:sdk in repository @androidsdk which failed to fetch. no such package '@androidsdk//': Either the path attribute of android_sdk_repository or the ANDROID_HOME environment variable must be set.
環境変数にSDKとNDKのロケーションは設定しているのに、それが見つからないというエラーです。色々試したけど、環境変数の方法では解決しなかったので、WORKSPACEファイルにそれぞれの場所を記入する方法でビルドできるようになりました。
プロジェクトルートにあるWORKSPACE
ファイルにandroid_ndk_repository
とandroid_sdk_repository
がすでにあるので、そこにpath =
の行を追記します。
# You may run setup_android.sh to install Android SDK and NDK.
android_ndk_repository(
name = "androidndk",
path = "/Users/keita/Library/Android/sdk/ndk-bundle",
)
android_sdk_repository(
name = "androidsdk",
path = "/Users/keita/Library/Android/sdk",
)
SDKのパスは Tools > SDK Manager で開く画面のAndroid SDK Location
です。NDKはAndroid StudioのSDK Managerを使って入れている場合は [SDKパス]/ndk-bundle
です。
現在ビルドできるアプリ一覧
mediapipe/mediapipe/examples/android/src/java/com/google/mediapipe/apps at master · google/mediapipe
Hand Trackingのビルドとインストール
bazel build -c opt --config=android_arm64 mediapipe/examples/android/src/java/com/google/mediapipe/apps/handtrackinggpu
adb install bazel-bin/mediapipe/examples/android/src/java/com/google/mediapipe/apps/handtrackinggpu/handtrackinggpu.apk
mediapipe/hand_tracking_mobile_gpu.md at master · google/mediapipe