【MediaPipe】Windowsで環境構築し、Multi Hand Trackingを動かしてみた

2020.05.15

※ 5/29追記:本記事の内容はMediaPipeのバージョンはv0.7.4のときに実行したものです。5/22にバージョンがv0.7.5に変更になったため、以下の方法では動かない可能性がありますので、ご注意ください。

カフェチームの山本です。

前回は、MediaPipeのHand Trackingの性能を確認するため、公開されているAPKを手元のスマートフォンで動かしました。

【MediaPipe】手の形状検出をやってみた

今回は、MediaPipeで公開されている手順に従って、デスクトップ(Windows Subsystem for Lilnux、以下 WSL)で構築し、Hello Worldを動かすまでの内容をメインに記載しています。これによって、APKが公開されていない、MediaPipeの他のモデルを動かすことができるようになります。

最後にMulti Hand Trackingを起動し、複数の手を検出できることを確認しました。

MediaPipeに関連する記事はこちらにまとめてあります。

【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を動かすことができました。

次↓

【MediaPipe】テスト動画で検出性能を確かめてみた

参考にさせていただいたページ・資料

Installing MediaPipe(GitHub)

https://github.com/google/mediapipe/blob/master/mediapipe/docs/install.md#installing-on-windows-subsystem-for-linux-wsl

Adbを簡単にインストールする手順(LaF-Tech)

Adbを簡単にインストールする手順