MeidiaPipeを使うためにWindowsに導入する話 

MediaPipeに全部入りが公開された、というツイートを見かけて試してみようと思い、そのための環境をWindowsで整えるまでのトラブルシュートを思い出しながら、その手順を記しておきます。

#Bazel の導入
BazelというのはGoogleのビルドツールらしいです。
まずこれが必要ということで導入します。
https://bazel.build/ から Windows 用のバイナリを https://github.com/bazelbuild/bazel/releases からダウンロードしてきます。
**bazel-3.7.2-windows-x86_64.exe** (3.7.2 は任意のバージョン) というファイル名なので、これを bazel.exe にリネームして、好きなところに置きます。
私は **C:\Program Files\Google\Bazel** に置いておきました。
そして PATH に C:\Program Files\Google\Bazel を追加します。
そしてコマンドラインから bazel を実行すればインストール完了で、次から bazel コマンドを使えるようになります………ハズでした。

#Bazel のファイルが出力される場所
初回 bazel 実行時には **<ユーザーフォルダ>\_bazel_<ユーザー名>** 以下のディレクトリに install や cache 等のディレクトリが作成され色々なファイルが出力されるようです。
しかし「ファイルが展開できません」的なエラーが出てしまいました（スクショは撮ってません<(_ _)>）。
エラーメッセージを見ると、ファイルのパスがおかしいです………文字化けしています。
どうやらユーザー名が日本語だと文字化けして正常に動かないようです。

##Windows10 のアカウント名変更
まず、ユーザー名をアルファベットのみの名前に変更するためにローカルアカウントに切り替えます。これは Windows の「設定」から行うことができます（のですぐにわかります）。
アカウント名の変更は「コントロールパネル」の「ユーザーアカウント」から行いました。コントロールパネルは Windows10 では分かりにくくなりましたが、スタートメニューの「Windows システムツール」にあるようです。
>![アカウント名の名変更.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285025/43ea9044-e8cb-145d-66b2-373d359d022b.png)

##Windows10 のユーザーフォルダパスの変更
アカウント名を変えて bazel を試しましたが状況は変わりませんでした。
アカウント名を変えると見た目には名前が変わったように見えますが、ユーザーフォルダのパスは変わっていません。そこで、ユーザーフォルダのパスを変えました。[^1]

[^1]: もしかしたらこれは不要かもしれません。ので先に後述のユーザー名の変更を試してみるべきです。但しそれでうまくいった場合、bazel の出力ファイルはユーザーフォルダではない場所に出力されることになると思います。

ユーザーフォルダの変更はレジストリエディタで行います（スタートメニュー「Windows 管理ツール」の中から起動するか、コマンドラインから regedit を直接実行します）。

ユーザーフォルダのパスの設定は
**HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList**
の中の該当プロファイルフォルダの中の **ProfileImagePath** キーを変えることで変更できますが、その他にも Windows エクスプローラーの設定他、各種アプリの設定等も変える必要がありますので、検索して一つ一つ書き換えていきます。
この作業に数時間かかりました（それでも関係無さそうな個所はスルーしました）。[^2]

レジストリを書き換えたら、別途管理者権限を持ったアカウントでログインして、ユーザーフォルダのフォルダ名をエクスプローラーでリネームしました。

一通り設定を終えて Windows を再起動し bazel を実行しましたが、ユーザーフォルダまでは文字化けしませんでしたが、"\_bazel_<ユーザー名>" の部分が文字化けしていたと思います。
どうやらユーザー名を変更しなければならないようです。

[^2]: アプリその他を含めた全環境を作り直すほうが楽なのであれば、新規にアカウントを作り直したほうが早いと思います。


##Windows10 のユーザー名の変更
アカウント名は変えたはずなのにユーザー名は変わっていない？
という事で、「コンピューターの管理」からユーザー名を変更します。[^3]
「コンピューターの管理」はスタートボタンを右クリックするか、デスクトップのPCアイコンの右クリックメニューの「管理」から呼び出すことができます。

>![ユーザー名変更.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285025/5d12f415-b23a-9f62-0929-9441e850183e.png)

ユーザー名を（アルファベット名に）変更すると bazel が正常にインストールできました！

[^3]: 実のところ「コンピューターの管理」ではなく何か別のところで変更したのですが、それがどこだったのか忘れました。頑張って検索しましたが出てきません。昔の Windows だと結構すぐに出せたと思うのですが、Windows10 は色々整理しようとした結果、システムの管理周りが分かりにくいところに追いやられて色々大変です。


#MediaPipeの導入
まず適当な場所に
https://github.com/google/mediapipe
からファイルをダウンロードして展開、又はリポジトリをチェックアウトします。

それから [Installing on Windows](https://google.github.io/mediapipe/getting_started/install.html#installing-on-windows) を参照しながら環境をセットアップしていきましょう。

###1.MSYS2 のインストール
https://www.msys2.org/ から MSYS2 のインストーラーをダウンロードしてインストールします。
インストールしたら、インストール先の usr\bin を PATH に追加します。
それからコマンドラインから

```
pacman -S git patch unzip
```

を実行し、必要なパッケージをインストールします。

###2.Python のインストール
https://www.python.org/ から Python のインストーラーをダウンロードしてインストールします。
また、以下の環境変数を設定しました。

```
set PYTHON_BIN_PATH=C:\Users\<ユーザー名>\AppData\Local\Programs\Python\Python39\python.exe
set PYTHON_LIB_PATH=C:\Users\<ユーザー名>\AppData\Local\Programs\Python\Python39\Lib
```


###3. Visual C++ Build Tools 2019 と WinSDK のインストール
私は既に Visual Studio Professional 2019 をインストール済みだったので以下の環境変数を設定だけしました。
（bat ファイルなどで都度設定しない場合には「コントロールパネル」＞「システム」＞「システムの詳細設定」＞「環境変数」で設定）

```
set "BAZEL_VC=C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC"
```

BAZEL_VC_FULL_VERSION や BAZEL_WINSDK_FULL_VERSION も設定できるようですが、特に設定しなくてもビルド出来ました。


###4.OpenCV のインストール
https://opencv.org/releases/
からダウンロードして適当な場所に展開します。
私はバージョン 3.4.12 をダウンロードしました。デフォルトは 3.4.10 のようです。（バージョンが違うとビルドの際に設定の変更が必要です）

ファイルを展開したら CMake を起動して Where is source code に sources ディレクトリ、Where to build the binaries に build ディレクトリを選択して、「Configure」、「Generate」を実行しました。

>![CMake_OpenCV](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285025/b8fc306a-7b24-627d-2735-484318f972b0.png)

尚、その時インストールしていた Cmake-3.17.0-rc3 では上手くできなかったので、[CMake](https://cmake.org/) の最新バージョンをインストールして実行しました。

それから MediaPipe のルートにある WORKSPACE ファイルの以下の該当箇所の path を書き換えておきます。

```
new_local_repository(
    name = "windows_opencv",
    build_file = "@//third_party:opencv_windows.BUILD",
    path = "D:\\SDK\\OpenCV\\opencv\\build",
)
```

また、third_party\opencv_windows.BUILD ファイルの以下の箇所

```
OPENCV_VERSION = "3410"  # 3.4.10
```

を

```
OPENCV_VERSION = "3412"  # 3.4.12
```

のように書き換えます。


#C++ の example のビルド
https://google.github.io/mediapipe/getting_started/cpp.html を見ながらビルドを実行します。
まず

```
bazel build -c opt --define MEDIAPIPE_DISABLE_GPU=1 mediapipe/examples/desktop/hand_tracking:hand_tracking_cpu
```

を実行します。
エラーが出たら [Troubleshooting](https://google.github.io/mediapipe/getting_started/troubleshooting.html) を参考に対応します。


####パス絡みの問題修正

初めに、[このエラー](https://github.com/google/mediapipe/issues/724)が出た記憶があります。
そこに書いてあるように

「**C:/users/**<ユーザー名>**/\_bazel_**<ユーザー名>**/**<ランダム？>**/external/org_tensorflow/third_party/py/python_configure.bzl**」のファイルの128行目を

```
cmd += "system(\"%s script.py\");" % python_bin.replace("\\","/")
```

に書き換えてパスします。ただ、現状は元通りで動いているみたいなので謎です。

「**C:/users/**<ユーザー名>**/\_bazel_**<ユーザー名>**/**<ランダム？>**/external/local_execution_config_python/BUILD**」ファイル内の interpreter_path の部分のファイルパスの中身の \\ を / に書き換えたのが良かったのかもしれません。

尚、パスの <ランダム？> の箇所は bazel を実行して実際に生成されたフォルダ名です（ランダムなのかハッシュなのかは分かりません。初回起動時に生成されていると思います）。


####Numpy絡みの問題修正

次に

```
ImportError: No module named numpy
Is numpy installed?
```

が出たと思います。
Numpy をインストールしてみますが、既にインストールしていますと言われました。
ソースを追ってみると、どうにも CPU チェックのような箇所で未対応のような応答の結果エラーになっているようでした。

色々調べると、[Numpy 1.19.4 絡みで Windows 側のバグ？があるようです](https://qiita.com/bear_montblanc/items/b4b75dfd77da98076da5)。
この記事にあるように

```
pip install numpy==1.19.3
```

で Numpy 1.19.3 にするとビルドが通るようになりました。


####OpenCVのバージョン指定
前述のとおり third_party\opencv_windows.BUILD で OpenCV のバージョンが 3.4.10 になっていたためエラーが発生しました。
インストールしたバージョンに書き換えておきます。


#C++ の example の実行
ビルドが通ったらサンプルを実行します。
その前に私は以下のように環境変数を設定しました。

```
set bazel_bin=C:\Users\<ユーザー名>\_bazel_<ユーザー名>\<ランダム？>\execroot\mediapipe\bazel-out\x64_windows-opt\bin
```

次にコマンドラインから

```
set GLOG_logtostderr=1
%bazel_bin%/mediapipe/examples/desktop/hand_tracking/hand_tracking_cpu --calculator_graph_config_file=mediapipe/graphs/hand_tracking/hand_tracking_desktop_live.pbtxt
```

を実行したら見事、example app が動きました！

~~因みに、ビルドを実行すると bazel-bin というジャンクションが生成されていますが、Windows10 のコマンドラインからジャンクション越しのパスは通らないようなので、上記のように環境変数に実際のパスを登録しておくと example のようなパスの指定で起動できると思います。~~
"bazel-bin" という名前が Windows10 のコマンドラインのパーサーと相性がよろしくないのか、exe パスをダブルクォーテーションで囲めば起動できました。