【MediaPipe】Windowsで環境構築し、Multi Hand Trackingを動かしてみた
※ 5/29追記:本記事の内容はMediaPipeのバージョンはv0.7.4のときに実行したものです。5/22にバージョンがv0.7.5に変更になったため、以下の方法では動かない可能性がありますので、ご注意ください。
カフェチームの山本です。
前回は、MediaPipeのHand Trackingの性能を確認するため、公開されているAPKを手元のスマートフォンで動かしました。
今回は、MediaPipeで公開されている手順に従って、デスクトップ(Windows Subsystem for Lilnux、以下 WSL)で構築し、Hello Worldを動かすまでの内容をメインに記載しています。これによって、APKが公開されていない、MediaPipeの他のモデルを動かすことができるようになります。
最後にMulti Hand Trackingを起動し、複数の手を検出できることを確認しました。
MediaPipeに関連する記事はこちらにまとめてあります。
留意点
以下の点にご注意ください。
- 入出力としてWebカメラを利用することはできません(撮影してリアルタイムに検出するのはできません。WSL2をインストールしてもできませんでした)。動画ファイルを用意しパスを入力として渡す必要があり、結果は検出位置が描画された動画ファイルとして出力されます。
- ダウンロード・インストールに数時間かかりました。何か別の作業と並行して行うのがオススメです。
- 一部操作でWindowsの管理者権限が必要です。
- 作業中、Windowsの再起動が必要です。
構築手順
MediaPipeのページの内容に従って作業していきます。自分の作業環境はWindows 10です。
1.Windows Subsystem for Linuxを有効にする
Microsoftのページに従って操作します。(すでに有効にしている場合は必要ありません。)
- 管理者権限でPowerShellを起動し、以下のコマンドを実行します
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
- Windowsを再起動します
- Microsoftのページの下部から、利用したいディストリビューション・バージョンを選択し、インストールします(今回はUbuntu 18.04を選択しました)。
- 数十分ほどかかるので、手順2をすすめます。
2.Windowsにadbをインストールする
こちらのページを参考にさせていただきました。インストーラなどはなく、手作業でパスを通します。
- Androidのページで「SDK Platform-Tools for Windows をダウンロード」をクリックし、ダウンロード・解凍します。
- どこか適当なフォルダ(例:C:\sortwares\)へ移動し、解凍したフォルダへのパス(例:C:\softwares\platform-tools)をコピーします。
- 「システム環境変数の編集」で「環境変数」を選択し、「Path」にコピーしたフォルダへのパスを追加します。
3.Ubuntuを起動する(手順1が終わったら)
- WindowsのスタートメニューからUbuntuを起動します。(もちろん、スタートメニュー以外でも可です)
- 初回起動の場合は、ユーザ名とパスワードを設定します。
4.パッケージを更新する
- 起動したUbuntuで下のコマンドを実行します。
sudo apt-get update && sudo apt-get install -y build-essential git python zip adb openjdk-8-jdk
- 数十分かかるので待ちます
5.Bazelをインストールする
- Ubuntuで下のコマンドを実行します。
curl -sLO --retry 5 --retry-max-time 10 \ https://storage.googleapis.com/bazel/2.0.0/release/bazel-2.0.0-installer-linux-x86_64.sh && \ sudo mkdir -p /usr/local/bazel/2.0.0 && \ chmod 755 bazel-2.0.0-installer-linux-x86_64.sh && \ sudo ./bazel-2.0.0-installer-linux-x86_64.sh --prefix=/usr/local/bazel/2.0.0 && \ source /usr/local/bazel/2.0.0/lib/bazel/bin/bazel-complete.bash
/usr/local/bazel/2.0.0/lib/bazel/bin/bazel version && \ alias bazel='/usr/local/bazel/2.0.0/lib/bazel/bin/bazel'
6.MediaPipeのGitHubレポジトリをcloneする
- Ubuntuで下のコマンドを実行します。
git clone https://github.com/google/mediapipe.git
- 時間がかかるので待ちます。自分の環境では数時間かかりました。
-
v0.7.4バージョンを利用する場合は、以下のようにタグを指定してください
git clone https://github.com/google/mediapipe.git -b v0.7.4
- 今後の作業のため、ディレクトリを移動しておきます。
cd mediapipe
7.OpenCV と FFmpeg をインストールする
(MediaPipeのページ中の手順7のOption2でインストールしました。他のOptionでも問題ないと思われます。)
- インストール用のスクリプトファイルにパーミッションを与えるため、下のコマンドを実行します
chmod 755 ./setup_opencv.sh
- OpenCVとFFmpegをインストールするスクリプトを実行するため、下のコマンドを実行します。
sudo ./setup_opencv.sh
- ビルド用のパスを通すために、MediaPipeのページ中の手順7の「Note」にかかれている以下の操作を行います。
- WORKSPACE の157行目から数行を、以下のようにコメントアウトします(削除しても構いません)。
# new_local_repository( # name = "linux_opencv", # build_file = "@//third_party:opencv_linux.BUILD", # path = "/usr", # )
-
- WORKSPACE に以下を追加します。
new_local_repository( name = "linux_opencv", build_file = "@//third_party:opencv_linux.BUILD", path = "/usr/local", )
-
- third_party/opencv_linux.BUILD の15行目から数行を、以下のようにコメントアウトします(削除しても構いません)。
# cc_library( # name = "opencv", # srcs = glob( # [ # "lib/x86_64-linux-gnu/libopencv_core.so", # "lib/x86_64-linux-gnu/libopencv_calib3d.so", # "lib/x86_64-linux-gnu/libopencv_features2d.so", # "lib/x86_64-linux-gnu/libopencv_highgui.so", # "lib/x86_64-linux-gnu/libopencv_imgcodecs.so", # "lib/x86_64-linux-gnu/libopencv_imgproc.so", # "lib/x86_64-linux-gnu/libopencv_video.so", # "lib/x86_64-linux-gnu/libopencv_videoio.so", # ], # ), # hdrs = glob(["include/opencv2/**/*.h*"]), # includes = ["include"], # linkstatic = 1, # visibility = ["//visibility:public"], # )
-
- third_party/opencv_linux.BUILD に以下を追加します。
cc_library( name = "opencv", srcs = glob( [ "lib/libopencv_core.so", "lib/libopencv_highgui.so", "lib/libopencv_imgcodecs.so", "lib/libopencv_imgproc.so", "lib/libopencv_video.so", "lib/libopencv_videoio.so", ], ), hdrs = glob(["include/opencv4/**/*.h*"]), includes = ["include/opencv4/"], linkstatic = 1, visibility = ["//visibility:public"], )
8.Hello Worldを実行し、動作確認する
- Hello Worldを起動するために、下のコマンドを実行します
export GLOG_logtostderr=1
bazel run --define MEDIAPIPE_DISABLE_GPU=1 \ mediapipe/examples/desktop/hello_world:hello_world
- 以下のように、Hello Worldという出力が得られればOK
DEBUG: Rule 'rules_cc' indicated that a canonical reproducible form can be obtained by modifying arguments sha256 = "4d32debb2de7e3d0a96b59859d3effc9860f8d1d1dedc0eae8e74bef86295b26" DEBUG: Call stack for the definition of repository 'rules_cc' which is a http_archive (rule definition at /home/yamahiro/.cache/bazel/_bazel_yamahiro/65047748610aef68e1153d5a8727cedb/external/bazel_tools/tools/build_defs/repo/http.bzl:292:16): - /home/yamahiro/mediapipe/WORKSPACE:33:1 INFO: Analyzed target //mediapipe/examples/desktop/hello_world:hello_world (0 packages loaded, 0 targets configured). INFO: Found 1 target... Target //mediapipe/examples/desktop/hello_world:hello_world up-to-date: bazel-bin/mediapipe/examples/desktop/hello_world/hello_world INFO: Elapsed time: 0.145s, Critical Path: 0.01s INFO: 0 processes. INFO: Build completed successfully, 1 total action INFO: Build completed successfully, 1 total action I0514 02:35:30.670615 5382 hello_world.cc:56] Hello World! I0514 02:35:30.671943 5382 hello_world.cc:56] Hello World! I0514 02:35:30.672778 5382 hello_world.cc:56] Hello World! I0514 02:35:30.673615 5382 hello_world.cc:56] Hello World! I0514 02:35:30.674228 5382 hello_world.cc:56] Hello World! I0514 02:35:30.675115 5382 hello_world.cc:56] Hello World! I0514 02:35:30.675902 5382 hello_world.cc:56] Hello World! I0514 02:35:30.676796 5382 hello_world.cc:56] Hello World! I0514 02:35:30.677460 5382 hello_world.cc:56] Hello World! I0514 02:35:30.678161 5382 hello_world.cc:56] Hello World!
トラブルシューティング
Hello Worldを起動する際、自分がハマった問題と解決策を書いておきます。同じ問題が発生したら、この方法で解決できるかもしれませんので、お役立てください。
トラブル1:404エラーのメッセージが出力される(tensorflowのライブラリが見つかない)
- 対処:これはbazel側のキャッシュが影響しているようです。下のコマンドでクリーンするとエラーメッセージが出力されなくなりました。
bazel clean --expunge
bazel --host_jvm_args "-DsocksProxyHost=192.168.1.100 -DsocksProxyPort=1080" run --define MEDIAPIPE_DISABLE_GPU=1 mediapipe/examples/desktop/hello_world:hello_world
トラブル2:エラーメッセージ表示されないのに、Hello Worldが表示されない。
- 対処:GLOG_logtostderrが設定されていないことが原因です。下のコマンドを再実行すると、Hello Worldが表示されるようになりました。
export GLOG_logtostderr=1
Multi Hand Tracking を動かす
こちらのページを参考に、Multi Hand Trackingで手を検出します。
1.Multi Hand Trackingをビルドするために、下のコマンドを実行します。
bazel build -c opt --define MEDIAPIPE_DISABLE_GPU=1 \ mediapipe/examples/desktop/multi_hand_tracking:multi_hand_tracking_cpu
2.Multi Hand Trackingを起動します。
先程のページには、下のコマンドで実行できると書いてありますが、WSLだとカメラに接続できずエラーになります。
GLOG_logtostderr=1 bazel-bin/mediapipe/examples/desktop/multi_hand_tracking/multi_hand_tracking_cpu \ --calculator_graph_config_file=mediapipe/graphs/hand_tracking/multi_hand_tracking_desktop_live.pbtxt
なので、動画ファイルを用意し、パスを渡す必要があります。ソースコード(mediapipe/examples/desktop/demo_run_graph_main.cc)を見ると「FLAG_input_video_path」と書いてあるので、オプションで与えられそうです(実際できました)。(このあたりの詳しい実行方法がどこに書いてあるか、まだ見つけられていません、、、)
実行するコマンドを以下のように変更します。Windows側のファイルは、パスを /mnt/c/Users/yamamoto.hiroki/Desktop のようにすることでアクセスできます。ここでは、動画撮影で利用した Windows 10 の「Camera」アプリの出力先である Pictures/Camera Roll から入力させています。ユーザ名など、適宜変更してご利用ください。
GLOG_logtostderr=1 bazel-bin/mediapipe/examples/desktop/multi_hand_tracking/multi_hand_tracking_cpu \ --calculator_graph_config_file=mediapipe/graphs/hand_tracking/multi_hand_tracking_desktop_live.pbtxt \ --input_video_path="/mnt/c/Users/yamamoto.hiroki/Pictures/Camera Roll/sample.mp4" \ --output_video_path="/mnt/c/Users/yamamoto.hiroki/Pictures/Camera Roll/output.mp4"
実際に動かし、手を検出できることを確認できました。
まとめ
MediaPipeを実行する環境を設定し、Multi Hand Trackingを動かすことができました。
次↓
参考にさせていただいたページ・資料
Installing MediaPipe(GitHub)
Adbを簡単にインストールする手順(LaF-Tech)