macOS CatalinaでOpenVinoを動かす

#これは何
久しぶりにOpenVinoのデモをosx上で動かしたくなっていじってみたら、動かないのであります。講義で使おうと思ってたんだが、困ったなー、ということでなんとかした件の備忘録。


#環境

macOS Catalina(10.15.４)
OpenVino(2020.2.117)
Python 3.7.5
cmake 3.17.1

#インストール
[ここから](https://software.intel.com/en-us/openvino-toolkit/choose-download/free-download-macos)、dmgとってきてインストールしてね。インストールディレクトリは /opt/intel だよ。
そして[動作確認のチュートリアル](https://docs.openvinotoolkit.org/2020.2/_docs_install_guides_installing_openvino_macos.html#set-the-environment-variables)を実行してね。ここまでで問題出た人は他あたってね。



#pythonのデモを動かす

pythonのデモをまるっとコピーしてくる。

```shell-session
$ cp -r /opt/intel/openvino/deployment_tools/open_model_zoo/demos/python_demos .
```

face_recoginitionのデモを起動してみよう。

```shell-session
$ cd python_demos/face_recognition_demo/
$ python3 ./face_recognition_demo.py -h
Traceback (most recent call last):
  File "./face_recognition_demo.py", line 24, in <module>
    import cv2
ImportError: dlopen(/opt/intel/openvino_2020.2.117/python/python3/cv2.so, 2): Library not loaded: @rpath/libopencv_ml.4.3.dylib
  Referenced from: /opt/intel/openvino_2020.2.117/python/python3/cv2.so
  Reason: image not found
```

intel謹製のopencvから、リンクしてる別のライブラリが読めてない雰囲気。どうなってんのか見てみよう。

```shell-session
$ otool -L /opt/intel/openvino_2020.2.117/python/python3/cv2.so
/opt/intel/openvino_2020.2.117/python/python3/cv2.so:
	@rpath/libopencv_ml.4.3.dylib (compatibility version 4.3.0, current version 4.3.0)
	@rpath/libopencv_photo.4.3.dylib (compatibility version 4.3.0, current version 4.3.0)
	@rpath/libopencv_dnn.4.3.dylib (compatibility version 4.3.0, current version 4.3.0)
	@rpath/libopencv_highgui.4.3.dylib (compatibility version 4.3.0, current version 4.3.0)
	@rpath/libopencv_objdetect.4.3.dylib (compatibility version 4.3.0, current version 4.3.0)
	@rpath/libopencv_stitching.4.3.dylib (compatibility version 4.3.0, current version 4.3.0)
	@rpath/libopencv_video.4.3.dylib (compatibility version 4.3.0, current version 4.3.0)
	@rpath/libopencv_videoio.4.3.dylib (compatibility version 4.3.0, current version 4.3.0)
	@rpath/libopencv_imgcodecs.4.3.dylib (compatibility version 4.3.0, current version 4.3.0)
	@rpath/libopencv_calib3d.4.3.dylib (compatibility version 4.3.0, current version 4.3.0)
	@rpath/libopencv_features2d.4.3.dylib (compatibility version 4.3.0, current version 4.3.0)
	@rpath/libopencv_flann.4.3.dylib (compatibility version 4.3.0, current version 4.3.0)
	@rpath/libopencv_imgproc.4.3.dylib (compatibility version 4.3.0, current version 4.3.0)
	@rpath/libopencv_core.4.3.dylib (compatibility version 4.3.0, current version 4.3.0)
	/usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 400.9.4)
	/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1252.250.1)
```

ヒェっ、なんかいっぱいリンクしてるけど、rpathがなんなのか指示されていないのが問題のようだ。環境変数の設定を確認してみよう。

```sh:/opt/intel/openvino/opencv/setupvars.sh
export OpenCV_DIR=$INSTALLDIR/opencv/cmake
export LD_LIBRARY_PATH=$INSTALLDIR/opencv/lib:$LD_LIBRARY_PATH
```

う～～ん、設定してるっぽいのに使えないとはなんちゅーこと？　調べた結果、ElCapitan以降、セキュリティ強化のためLD_LIBRARY_PATHがシステムをゴニョゴニョしないと使えない模様。一番簡単なのは、関係しそうなものを全部/usr/local/libとかにぶっこんじゃえばいいのだろうけど、Uninstallが面倒になるのでやりたくない。
ソースからコンパイルする手もあるが、opencvクラスのプログラムをコンパイルすると結構時間がかかりそうなので、それもやりたくない。
良い方法が思いつかないので、応急処置としてバイナリに直接rpathを設定してしまおう。

```shell-session
$ sudo install_name_tool -add_rpath '/opt/intel/openvino/opencv/lib' /opt/intel/openvino_2020.2.117/python/python3/cv2.so
Password:
$ sudo install_name_tool -add_rpath '/opt/intel/openvino/inference_engine/lib/intel64' /opt/intel/openvino_2020.2.117/python/python3/cv2.so
$ sudo install_name_tool -add_rpath '/opt/intel/openvino/deployment_tools/ngraph/lib' /opt/intel/openvino_2020.2.117/python/python3/cv2.so
$ sudo install_name_tool -add_rpath '/opt/intel/openvino/inference_engine/external/tbb/lib' /opt/intel/openvino/deployment_tools/inference_engine/lib/intel64/libinference_engine_legacy.dylib 
$ sudo install_name_tool -add_rpath '/opt/intel/openvino/inference_engine/lib/intel64' /opt/intel/openvino/deployment_tools/inference_engine/lib/intel64/libMKLDNNPlugin.dylib
$ sudo install_name_tool -add_rpath '/opt/intel/openvino/inference_engine/lib/intel64' /opt/intel/openvino/python/python3.7/openvino/inference_engine/ie_api.so
$ sudo install_name_tool -add_rpath '/opt/intel/openvino/inference_engine/external/tbb/lib' /opt/intel/openvino/python/python3.7/openvino/inference_engine/ie_api.so
$ sudo install_name_tool -add_rpath '/opt/intel/openvino/deployment_tools/ngraph/lib' /opt/intel/openvino/deployment_tools/inference_engine/lib/intel64/libinference_engine.dylib
$ sudo install_name_tool -add_rpath '/opt/intel/openvino/deployment_tools/ngraph/lib' /opt/intel/openvino/deployment_tools/inference_engine/lib/intel64/libinference_engine_legacy.dylib

```

ほかにもあるが、いまのところこれくらいにしておいてやる。またなんかあったら同様の方法で解決するべし。今度はモデルをダウンロードして再度実行。

```shell-session
$ /opt/intel/openvino/deployment_tools/open_model_zoo/tools/downloader/downloader.py --name face-detection-retail-0004 
$ /opt/intel/openvino/deployment_tools/open_model_zoo/tools/downloader/downloader.py --name landmarks-regression-retail-0009
$ /opt/intel/openvino/deployment_tools/open_model_zoo/tools/downloader/downloader.py --name face-reidentification-retail-0095
$ python3 face_recognition_demo.py \
-m_fd ./intel/face-detection-retail-0004/FP16/face-detection-retail-0004.xml \
-m_lm ./intel/landmarks-regression-retail-0009/FP16/landmarks-regression-retail-0009.xml \
-m_reid ./intel/face-reidentification-retail-0095/FP16/face-reidentification-retail-0095.xml \
--verbose -fg ./test

```

ゴチャゴチャ言われるがとりあえず動く。そして動かないデモもある（が、それはまた別の問題の気がする）。


#C++のデモをコンパイルする

インストール時の通過儀礼のsecurity_barrierのデモが実行できていると、homeディレクトリにinference_engine_demos_buildディレクトリが作成されているはずである。
これは/opt/intel/openvino/deployment_tools/open_model_zoo/demos/と同等である。

READMEを読むと、いくつかのPythonデモはでnative Python extension modulesが必要であると書いてあるので、ついでにPython moduleをenableにしてcmakeする。

```shell-session
$ cd ~/inference_engine_demos_build
$ rm CMakeCache.txt
$ cmake -DCMAKE_BUILD_TYPE=Release -DENABLE_PYTHON=ON /opt/intel/openvino/deployment_tools/inference_engine/demos
・・・・・中略・・・・・
$ make -j2
・・・・・中略・・・・・
/opt/intel/openvino/deployment_tools/open_model_zoo/demos/multi_channel/common/input.cpp:292:11: error: 
      'getAvgReadTime' overrides a member function but is not marked 'override'
      [-Werror,-Winconsistent-missing-override]
    float getAvgReadTime() const {
          ^
/opt/intel/openvino/deployment_tools/open_model_zoo/demos/multi_channel/common/input.cpp:43:19: note: overridden
      virtual function is here
    virtual float getAvgReadTime() const = 0;
                  ^
3 errors generated.
make[2]: *** [multi_channel/common/CMakeFiles/common.dir/input.cpp.o] Error 1
make[1]: *** [multi_channel/common/CMakeFiles/common.dir/all] Error 2
make: *** [all] Error 2
・・・・・中略・・・・・
```

おぅ？！ジーザス、なんかお小言を頂戴したぜよ。こういうときはスルー力がだいじ。動かんかったらまたそのときに考える。
CMakeCache.txtに馬の耳に念仏フラグを立てようぜ。

```text:CMakeCache.txt
・・・・・中略・・・・・
//Flags used by the CXX compiler during all build types.
CMAKE_CXX_FLAGS:STRING=-Wno-inconsistent-missing-override
・・・・・中略・・・・・
```

これで再度make実行。
O.K.Done.　細かいことは気にしない。
intel64/Release以下にバイナリがビルドされる。
C++版のデモも動くようになったので、それなりに遊べる。


#あとがき

以前はすんなり動いたんだけど、結構苦労しちゃったな。
OpenVinoって、nvidiaのGPUがのっていないPCなんかで、さくっとDNN使ったデモっぽいものをインプリしたい！という時とか、主にmacbook系を使ってる学生相手に、さくさく動いてるところを体験させたいって時とかに、結構便利だと思うんだけど、macOSについてのこういった情報が少ないのね・・・。あんまり使ってる人いないのかなぁ。
っていう文章を書いている時に気がついたんだけど、macだと内蔵HD Graphicsに対応しとらんのね！せっかくのメリットが・・・。早く対応してくれるといいなぁ。

あと、あらゆるライブラリのrpathが通ってないので、今後も同様の問題に遭遇する可能性があるが、上記の方法で強行突破できる。本当は環境変数が使えるといいんだけど、最近のmacOSはよくわからん。教えて偉い人。


#更新
2020.5.19 macOS 10.15.4で確認。C++のプログラムもrpathを設定しないと動かないので、pythonの実行と順序を入れ替える。足りないrpath設定を追加。