Windowsでmediapipeのサンプルを動かしたときのメモ

2021年09月20日
Windowsでmediapipeのサンプルをいくつか動かしたときのメモです。
基本的に公式の手順通りなんですが、関連するソフトウェアのバージョンの違いで変なところで苦労したので、その記録です。

OS:Windows 10

スポンサーサイト

目次




はじめに


mediapipeは、Googleが公開している、ライブおよびストリーミングメディア向けの機械学習のソリューションだそうです。
私は、ハンドトラッキングに興味があって、これをWindowsで動かしてみることにしました。

基本的な手順は、mediapipe公式の手順の通りです。
Installation - mediapipe
書かれている通り、現時点でWindowsで動かすことは実験的なもののようです。

また、Windows 10にMediaPipe をインストール (WSL不使用) もかなり参考にさせていただきました。

以下、手順通りのところは省略し、苦戦したところだけメモします。


1.MSYS2インストールしてパスを通す


ここは手順通りで特に問題なかったです。
このあともパスを通したり、環境変数を設定したりする作業がありますが、私はすべてユーザー環境変数に設定しました。


2.git、patch、unzipをインストール


ここも手順2の通りで特に問題なかったです。

3.Python をインストールしてパスを通す


これどうするか悩みました。
私の環境は既にminicondaのpython環境が入っていたので、minicondaを使って大丈夫なのか、手順に書かれている通りhttps://www.python.org/downloads/windows/ からダウンロードした方が良いのか?で悩みました。
どちらも試してみた結果、私の場合はどちらでも大丈夫そうでした。
環境によっては違うかもしれません。
バージョンの指定が無かったので、この時点で最新の3.9.7を使いました。


4.Visual C++ Build Tools 2019 と Microsoft Visual C++ 2019 Redistributable と WinSDKをインストール


Visual C++ Build Tools 2019をインストール


手順に書かれているところからダウンロードしてインストールしました。
特に問題はなかったと思います。
私の場合は16.11.3がインストールされたようです。


Microsoft Visual C++ 2019 Redistributableをインストール


どこからダウンロードするのかよくわからなかったです。
Visual Studio Tools のダウンロード - Windows、Mac、Linux 用の無料インストールの「その他のツールとフレームワーク」の中に「Visual Studio 2019 の Microsoft Visual C++ 再頒布可能パッケージ」がありましたので、これをダウンロードしてインストールしました。


WinSDKをインストール


これは、手順のリンク先のWindows 10 SDK - Windows app developmentに書かれている通り、Visual Studio 2019 Installerで「Windows 10 SDK (10.0.19041.0)」をインストールしました。

Visual Studio 2019 Installerを起動して「変更」ボタン→「個別のコンポーネント」で「Windows 10 SDK (10.0.19041.0)」にチェックを入れて「変更」で、インストールできました。


5.Bazel をインストール


Bazel、もしくはBazeliskをインストールすればよいらしいですが、私はBazelをインストールしました。
(Bazeliskのインストールはやってないのでよくわからないです。)

ここが、あとで一番ハマる原因になりました。
ダウンロードするバージョンを気にした方が良いです。
私は4.2.1で、うまくいきました。
(ちなみに5.0.0-pre.20210907.1 では、あとでエラーになりました)

ダウンロードしたら、ファイル名をbazel.exeに変更して、パスを通すか、パスが通ったフォルダに置きます。


6.Bazel の環境変数を設定


手順には環境変数を設定することしか書かれていませんが、リンク先Windows - Bazel mainに書かれている通り、まずVisual C++ コンパイラが必要です。

Visual C++ コンパイラのインストール


私は、もともとVisual Studio Community 2019をインストールしてあったので、コンパイラも入っているかと思っていたんですが入ってなかったようです。多分、C#しか入れてなかったせいだと思います。(VCフォルダはあったのですが)
これを忘れていて、後でエラーになりました。

どうやるのが正解かわかりませんが、私はVisual Studio 2019 Installerからインストールしました。
Visual Studio 2019 Installerを起動し、「変更」ボタン→「個別のコンポーネント」で「MCVC v142 - VS 2019 C++ x64/x86 ビルドツール(最新)」にチェック→「変更」でインストールしました。

先にCommunity 2019をインストールしてあったせいかわかりませんが、C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VCの下にインストールされました。


環境変数を設定


以下、4つの環境変数を設定します。
・BAZEL_VS
・BAZEL_VC
・BAZEL_VC_FULL_VERSION
・BAZEL_WINSDK_FULL_VERSION

設定する値は、Windows - Bazel mainに書かれていますが、まあまあ悩みました。

・BAZEL_VS
 BuildToolsのフォルダのようです。私は、手順に書いてある通りで大丈夫でした。
 C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools

・BAZEL_VC
 Visual C++ コンパイラの場所を指定します。
 私の場合は下記フォルダでした。
 C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC

・BAZEL_VC_FULL_VERSION
 VCのバージョンを設定するのですが、さっきの C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC の下をTools→MSVCと辿った下にあるフォルダがVCのバージョン番号になっています。
 14.29.30133

・BAZEL_WINSDK_FULL_VERSION
 インストールしたWinSDKのバージョンです。
 10.0.19041.0


7.MediaPipe リポジトリをCheckout チェックアウト


手順に書いてある通りで特に問題なく実行できました。

8.OpenCVをインストール


手順に書かれてある通り、最新版ではなく、3.4.10をインストールしました。
Cドライブの直下C:\opencvにしました。
(他のバージョンは確認していません)


9.Hello World! in C++ example をビルドして実行


手順に書いてある通りで、bazel build の引数 PYTHON_BIN_PATHをPythonのexeファイルに設定して実行しました。
パスの「¥」は「//」で記述する必要があるのと、フォルダ指定じゃなくてexeのファイルを指定するのが注意点でした。

ここで私の場合、いくつかエラーが出てビルド失敗しました。
Troubleshooting - mediapipeで解決するものも多かったですが、一応、私のエラーと対策も残しておきます。

ANDROID_NDK_HOMEが設定されてない?


ERROR: C:/users/(ユーザ名)/mediapipe_repo/mediapipe/WORKSPACE:253:23: fetching android_ndk_repository rule //external:androidndk: Either the path attribute of android_ndk_repository or the ANDROID_NDK_HOME environment variable must be set.
ERROR: Analysis of target '//mediapipe/examples/desktop/hello_world:hello_world' failed; build aborted: Either the path attribute of android_ndk_repository or the ANDROID_NDK_HOME environment variable must be set.
Bazel のバージョンによっては、このエラーが発生するようです。
私は、5.0.0-pre.20210907.1で上記エラーとなり、4.2.1をインストールしなおして解決しました。


numpyが入ってなかった


ImportError: No module named numpy
minicondaでインストール済みのPythonでは問題なかったのですが、別途インストールしたPythonではnumpyが入っていませんでした。
そっちのPythonではpipも古かったのでアップデートして、

python.exe -m pip install --upgrade pip
python -m pip install numpy
でインストールして解決しました。

Visual C++コンパイラが無い


The target you are compiling requires Visual C++ build tools.
Bazel couldn't find a valid Visual C++ build tools installation on your machine.

Visual C++ build tools seems to be installed at C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC
But Bazel can't find the following tools:
VCVARSALL.BAT, cl.exe, link.exe, lib.exe, ml64.exe
for x64 target architecture
Visual C++ コンパイラのインストールを忘れていて、このエラーが出ました。
上述の6.Bazel の環境変数を設定で、インストールしたら解決しました。


何かビルドエラー


.\mediapipe/framework/packet.h(452): error C2143: 構文エラー: ';' が '&&' の前にありません。
.\mediapipe/framework/packet.h(452): error C2512: 'std::is_base_of': クラス、構造体、共用体に既定のコンストラクターがありません。
.\mediapipe/framework/packet.h(452): note: ターゲット型にコンストラクターはありません。
.\mediapipe/framework/packet.h(452): note: コンパイルされたクラスの テンプレート のインスタンス化 'mediapipe::packet_internal::is_concrete_proto_t' の参照をご確認ください
.\mediapipe/framework/packet.h(452): error C2143: 構文エラー: '>' が ';' の前にありません。
.\mediapipe/framework/packet.h(452): error C2143: 構文エラー: ',' が ';' の前にありません。
.\mediapipe/framework/packet.h(452): error C2143: 構文エラー: ';' が '}' の前にありません。
.\mediapipe/framework/packet.h(452): fatal error C1004: 予期せぬ EOF が検出されました。
Target //mediapipe/examples/desktop/hello_world:hello_world failed to build
Use --verbose_failures to see the command lines of failed build steps.
Visual C++ コンパイラのバージョン指定違いでこのエラーが発生しました。
最初、Visual C++ コンパイラを入れ忘れていて、後からいろんなバージョンをインストールしたので、どのバージョンを使うのが良いかわからなくなって、違うバージョンのコンパイラをBAZELの環境変数で設定していたことが原因でした。
上で書いたバージョンをインストールして環境変数に設定することで解決しました。


他にもいくつかエラーが発生しましたが、すべてTroubleshooting - mediapipeで解決できました。


10.hand_tracking をビルドして実行


ここからは手順に書かれてないけど、それぞれのAPIのサンプルのところに説明がありました。Hands - mediapipe
Windows版ではGPUは動かないので、CPUで動かしました。

ビルド

bazel build -c opt --define MEDIAPIPE_DISABLE_GPU=1 --action_env PYTHON_BIN_PATH="C://Python39//python.exe" mediapipe/examples/desktop/hand_tracking:hand_tracking_cpu

実行
bazel-bin\mediapipe\examples\desktop\hand_tracking\hand_tracking_cpu.exe
--calculator_graph_config_file=mediapipe/graphs/hand_tracking/hand_tracking_desktop_live.pbtxt

やってみると、Webカメラの映像が映るはずのウィンドウが真っ黒でした。
以前にも似たようなことが起きたことがあり、私の環境のUSBのWebカメラのデバイスは#0じゃなくて、#1になっているので、そのせいかなと思いました。
ソースコードをたどっていくと、
mediapipe\examples\desktop\demo_run_graph_main.cc
の中が、
capture.open(0);
と決め打ちになっていたので、
capture.open(1);
に変更して、再度ビルドして実行したらうまく動きました。


11.holistic_tracking をビルドして実行


基本的に上のhand_tracking と同じでやり方で動きました。
Holistic - mediapipe
bazel build -c opt --define MEDIAPIPE_DISABLE_GPU=1 --action_env PYTHON_BIN_PATH="C://Python39//python.exe" mediapipe/examples/desktop/holistic_tracking:holistic_tracking_cpu

bazel-bin\mediapipe\examples\desktop\holistic_tracking\holistic_tracking_cpu.exe
--calculator_graph_config_file=mediapipe/graphs/holistic_tracking/holistic_tracking_cpu.pbtxt



最後に


あまり深い意図もなく、なんとなくmediapipeのサンプルを動かしてみただけなんですが、思っていた以上に軽くて、精度もいい感じに動きました。
ここからさらにAPIを使って何かやるかどうかは、まだ考えていません。

以上


スポンサーサイト

posted at 00:28 | Comment(0) | プログラミング
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント: