Intel® Neural Compute Stick 2  (Movidius™ Myriad™X)をOpenBlocks IoT VX2で利用するためのdockerコンテナイメージの使い方と、OpenVINO™ toolkitの導入に関するメモ

Intel® Neural Compute Stick 2 (Movidius™ Myriad™X)を入手しましたので、OpenBlocks IoT VX2にてNCS2に対応したOpenVINO™ Toolkit R4を使うためのdockerコンテナを作成しました。

![ncs2.jpg](https://qiita-image-store.s3.amazonaws.com/0/316451/19b2b2b4-23fb-0dd5-c75d-f7c69a5b347a.jpeg)
OpenVINO ToolkitをOpenBlocks IoT VX2シリーズで利用するにあたり、VX2のハードウェアに最適化したOpenCV 3.4.3およびtensorflowをbuildするとともに、dockerコンテナのイメージとして、dockerhubにてpublic公開しました。
今回は、dockerコンテナイメージをOpenBlocks IoT VX2で利用する方法と合わせて、Toolkitを公式サポート外のdebian stretch(amd64)に導入するための方法を紹介します。

**・改めてハードウェア構成を見直した上でテストを行ったところ、現状ではFIFOエラーなどは起きていません。
また、Myriad-Xによる処理が30fpsを超えることにより、CPU側の負荷も増しており、vmstatの結果も違いますので、計測値を書き直しました。
・Pythonの環境変数などが設定されていませんでしたので、修正したコンテナイメージをpushしました**

## Dockerコンテナイメージの使い方

dockerコンテナイメージは以下の場所で公開しています。

https://hub.docker.com/r/goto2048/obxvx2_openvino_r4_420_fixed2/

OpenBlocks IoT VX2に拡張機能として、docker (WebUI付き)をインストールし、WebUIより検索しダウンロードするか、コンソールから、以下の様にpullしてください。

```
docker pull goto2048/obxvx2_openvino_r4_420
```
上記ページのDescriptionにも記述していますが、初期起動のオプションは、

```
-ti --name openvino --privileged --net=host -v /dev:/dev --restart always
```
となります。
サンプルのアプリケーションを利用するにあたり、Linux版のOpenCVの場合は、X11の環境が必要となりますが、OpenBlocks IoTシリーズには基本ディスプレイはつきませんので、別にXサーバを用意する必要があります。Linuxデスクトップ環境をお持ちであれば、それを、Windows環境の場合は、VcXsrvなどをインストールして下さい。
コンテナへ入るには、以下のコマンドおよびオプションを使います

```
docker exec -ti --privileged openvino /bin/bash
```
XサーバのIPアドレス(もしくはサーバ名)を指定してください。

```
export DISPLAY=xxx.xxx.xxx.xxx:0<br>
```
Toolkit全般は/opt/intelに展開されており、buildしたsampleは、~/inference_engine_samples/intel64/Releaseの下にあります。

顔認識のプログラムの実行例は以下の通り。

CPUを使用

```
./interactive_face_detection_demo -i cam -m /opt/intel/computer_vision_sdk/deployment_tools/intel_models/face-detection-retail-0004/FP32/face-detection-retail-0004.xml -d CPU
```
Myriad(VPU)を使用

```
./interactive_face_detection_demo -i cam -m /opt/intel/computer_vision_sdk/deployment_tools/intel_models/face-detection-retail-0004/FP16/face-detection-retail-0004.xml -d MYRIAD
```
vmstatを見るとわかりますが、VPU(Myriad-X)使用時はCPU負荷が4割程度となっています。

```
root@obsiot:~# vmstat 5
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 3  0      0 3089192  38840 456684    0    0     0     2 11635 2578 92  8  0  0  0
 2  0      0 3089696  38840 456684    0    0     0     0 11584 2414 91  8  0  0  0
 4  0      0 3088888  38840 456684    0    0     0     0 11636 2461 91  8  0  0  0
 2  0      0 3090544  38840 456684    0    0     0     0 11578 2483 91  8  0  0  0
--------- 上側がCPU、下側がMyriad ------------------------
 2  0      0 2986524  49552 529084    0    0     0     6 11907 3538 25 18 58  0  0
 1  0      0 2986280  49552 529084    0    0     0     0 11858 3537 25 17 59  0  0
 1  0      0 2986804  49552 529084    0    0     0     1 11831 3449 25 17 58  0  0
 1  0      0 2986068  49556 529084    0    0     0    17 11808 3433 24 18 58  0  0
 1  0      0 2986068  49556 529084    0    0     0     0 11722 3463 25 17 58  0  0
```
security_barrier_camera_demoの入力例と実行画面です。

```
./security_barrier_camera_demo -i /opt/intel/computer_vision_sdk/deployment_tools/demo/car_1.bmp -d MYRIAD -m /opt/intel/computer_vision_sdk/deployment_tools/intel_models/vehicle-license-plate-detection-barrier-0106/FP16/vehicle-license-plate-detection-barrier-0106.xml -d_va MYRIAD -m_va /opt/intel/computer_vision_sdk/deployment_tools/intel_models/vehicle-attributes-recognition-barrier-0039/FP16/vehicle-attributes-recognition-barrier-0039.xml -d_lpr MYRIAD -m_lpr /opt/intel/computer_vision_sdk/deployment_tools/intel_models/license-plate-recognition-barrier-0001/FP16/license-plate-recognition-barrier-0001.xml
```
![carj2pg.png](https://qiita-image-store.s3.amazonaws.com/0/316451/33335cc3-45f7-3479-50b5-1c882b0474df.png)

なお、本コンテナイメージは3GBを超えており、OpenBlocks IoT VX1シリーズで使用する場合は、eMMCサイズが非常に厳しい状況となります。VX2でのご利用をお勧めします。
## ソースコードからのビルドに関してのTips
上記コンテナを構築するにあたり、OpenCV 3.4.3をOpenBlocks IoT VX2のCPUに対応したビルドおよび、tensorflowのビルド、OpenVINO Toolkitのインストールおよびデモ環境の構築を行いました。
すべての手順はここでは書きませんが、構築にともなうTipsについてそれぞれ書いておきます。
### opencv 3.4.3
前回の記事にありますのでご参照下さい。
### tensorflow
tensorflowも、pip3で導入できるパッケージでは、CPUがAVX命令をサポートしていないため利用できません。OBDNマガジンにてビルド方法について解説していますので、参考にしてください。

http://obdnmagazine.blogspot.com/2018/06/vx2-movidius-neural-compute-stick.html

### OpenVINO Toolkit
OpenVINO Toolkitは、以下のサイトからダウンロードできます。

https://software.intel.com/en-us/openvino-toolkit

Choose & DownloadからLinuxを選んで、Register&Downloadから名前やE-mail Addressなどの情報を入れるのですが、Companyの部分に、スペースで区切った入力をすると(CompanyName Co., LTDのように)、Errorとなりダウンロード出来ませんでした。

インストールはGUIで行う場合は、X環境をご用意ください。
ベースのコンテナで上記の作業を行ったあと、インストールを行うと、cpioがないといわれますので、apt-getします。<br>
デモ環境の構築は、以下のスクリプトを修正して、実行します。

```
/opt/intel/computer_vision_sdk/deployment_tools/demodemo_squeezenet_download_convert_run.sh
/opt/intel/computer_vision_sdk_2018.4.420/deployment_tools/inference_engine/share/InferenceEngineConfig.cmake
```
どちらも、os_nameに関する分岐を行っていますので、事前にos_nameをUbuntu 16.04にすることで回避しています。修正して以下のスクリプトを起動して下さい。

```
cd /opt/intel/computer_vision_sdk/deployment_tools/demo
./demodemo_squeezenet_download_convert_run.sh
```
## 最後に
今回は、主としてdockerhubにpushしたdockerコンテナイメージの使い方について説明しました。
ビルドに関しては、VX2の標準の状態では、/tmpのサイズへの対策など、細かい対応が必要になります(VX2では、eMMCの保護のため、標準ではtmpfileによるメモリ割り当てとなっています)。
またtensorflowもopencvもVX2での処理では時間がかかりますので、別のdebian stretch(amd64)のPCにて一部の処理を行っています。
今回は、そういった細かいところまでは解説せず、大まかな手順と、変更点についてのTipsのみとなります。