AIを始めよう！OpenVINOのインストールからデモの実行まで［R4対応］

#R4の新機能
インテルの[ブログ](https://software.intel.com/en-us/forums/computer-vision/topic/799798)によるとＲ４では、以下の機能が追加されました。

1.新規ハードウェアのサポート
- Intel®Arria 10 FPGAのサポート
- Neural Compute Stick (Intel® NCS) 2のサポート

2.ディープラーニングの強化
- Advanced Vector Extensions 512（インテル®AVX-512）命令のサポート
- R-FCN、Yolo V3、OpenPoseなどTensorFlowで人気があるトポロジーの、インテルプラットフォームでの実行を支援
- 学習済みモデルとして、顔のランドマーク検出、人体の姿勢推定、画像の超解像度化を追加
![image.png](https://qiita-image-store.s3.amazonaws.com/0/137772/6c921b20-4c50-fd43-19c0-02323ec2b97b.png)


#OpenVINOとは
　インテルのインテルによるインテルのためのAI推論SDKです。インテル以外のハードウェアはサポートしません。画像系の推論（CNN：畳み込みニューラルネットワーク）を得意としていて、インテルプラットフォームで最高のパフォーマンスを発揮するように徹底的にチューニングされています。サポートされるハードウェアはIntel CPU, Intel GPU, MYRIAD(Movidius), ALTERA FPGAの4種類です。

AIの機能としては、推論に特化していて学習は行いません。NVIDIAのGPUが用意できない小規模なハードウェアでも比較的高速な推論を実現します。また、様々なAIプラットフォームの学習済みモデルを利用することができ、推論のためのAPIが提供されることから、開発コストを大幅に削減することができます。特に、[Python API](https://qiita.com/ammo0613/items/ff7452f2c7fab36b2efc)（現時点ではベータ版ですが）を使うことで、だれでも気軽にAI推論を実験できることも魅力の一つ。もちろん、C++でコーディングすることで、実務でも十分に使えるAI推論ソリューションを開発できます。

OpenVINO SDKは、以下のコンポーネントから構成されています。

- 推論エンジン用C++ API
- 推論エンジン用Python API（ベータ版）
- サンプルプログラム
- インテル作成学習済みモデル
- 学習済みモデルのダウンローダー
- モデルオプティマイザー（学習済みモデルをOpenVINOの中間表現(IR)に変換）
- OpenCV
- OpenVX

#インストール
動作環境は、Ubuntu 16.04とWindows 10です。ここではUbuntuでのインストールを紹介します。また、最新（2018年11月時点）のOpenVINO R4を使用します。

####サポート環境
OpenVINOが動作するCPUは以下の通りです。

- 6th-8th Generation Intel® Core™ (6th:Sky lake, 7th:Kaby Lake, 8th:Kaby Lake Refresh, Coffee Lake, Cannon Lake)
- Intel® Xeon® v5 family
- Intel® Xeon® v6 family
- Intel® Pentium® processor N4200/5, N3350/5, N3450/5 with Intel® HD Graphics

また、Movidius NCS（Neural Compute Stick）をサポートします。

- Intel® Movidius™ Neural Compute Stick
- Intel® Neural Compute Stick 2

###インストーラーのダウンロード
以下のサイトから、OSを選択します。今回は、'Linux'を選択。
https://software.intel.com/en-us/openvino-toolkit/choose-download
![image.png](https://qiita-image-store.s3.amazonaws.com/0/137772/bc8d14d0-4dd3-4ad5-6b01-b19a466d223e.png)

次に、Register & Downloadボタンをクリック。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/137772/14f05ac0-6ad7-e51b-d392-fc2fbf4a8c1e.png)

必要事項を入力し、Submitボタンをクリック。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/137772/66251b8f-33bb-c8e8-6ec8-910929123d5c.png)

Customizable Package または Full Packageをクリックし、インストーラーをダウンロード。
どちらでも構いませんが、offline installerをお勧めします。インストール作業の開始から終了までの待ち時間を節約できます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/137772/e0e7a031-442f-ac6b-e77d-16af99122fdf.png)

###事前準備とインストーラーの実行
ダウンロードが終了したら、以下のインストレーションガイドを参考にインストールを進めます。
https://software.intel.com/en-us/articles/OpenVINO-Install-Linux

#####注意：R3をインストールしていた場合

以下のディレクトリが作成されているので、名前の変更を行うか削除します。

- /home/\<user>/inference_engine_samples
- /home/\<user>/openvino_models

#####1.インストーラーの解凍と実行
ダウンロードしたディレクトリに移動し、必要なコンポーネントをインストールし、GUIベースのインストーラーを実行します。

```
cd ~/Downloads/
tar -xf l_openvino_toolkit_p_2018.<version>.tgz
cd l_openvino_toolkit_p_2018.<version>
./install_GUI.sh
```

#####2.インストーラーGUI
インストーラーのGUIが表示されますので、Installボタンをクリックしてインストールを開始します。
途中、ワーニングが表示されますが、無視して進めても問題ありませんでした。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/137772/58b3f889-4a3a-4a97-c908-07e920992574.png)
OpenVINO SDKのファイルは/optにインストールされますが、/optはユーザアカウントでの書き込みアクセス権がないので注意が必要です。ユーザアカウントではインストール先でビルドを行うと失敗します。R2までは、必要なファイルをコピーしてビルドしていたのですが、R3からはこの状況が改善され、後述するデモプログラムを実行すると、実行ファイルがホームディレクトリにビルドされるようになりました。

- /home/\<user>/inference_engine_samples
- /home/\<user>/openvino_models

#####3.依存関係の解消
以下のスクリプトを実行すると、依存関係を整理してくれます。

```
cd /opt/intel/computer_vision_sdk/install_dependencies
./install_cv_sdk_dependencies.sh
```
 
#####4.環境変数の追加
インストールが完了したところで、環境変数の追加を行います。

```
source /opt/intel/computer_vision_sdk/bin/setupvars.sh
```
ただし、注意が必要です。ターミナルを開くたびに実行する必要があります。忘れないためにも.bashrcに登録して自動実行させることをお勧めします。
vimなどのエディタでホームディレクトリの.bashrcファイルを開き、行末に上記コマンドを追加してください。

#####5.モデルオプティマイザの設定
次にモデルオプティマイザーの設定を行います。

```
cd /opt/intel/computer_vision_sdk/deployment_tools/model_optimizer/install_prerequisites
sudo ./install_prerequisites.sh
```

#####6.デモプログラムの実行
これで準備は完了しましたが、実行ファイルなどはまだビルドされませんし、必要なコンポーネントもダウンロードされていない状況です。
デモプログラムのシェルを実行することで、デモプログラムがビルドされ、必要なコンポーネントがインストールされます。

```
sudo -i
cd /opt/intel/computer_vision_sdk/deployment_tools/demo
./demo_squeezenet_download_convert_run.sh
```

このシェルはデモプログラムを実行するために必要な環境を準備します。OpenVINOを実行するために必要な処理を一通り行うので、シェルの中身を見てみましょう。

####Step 1. Download the Caffe model and the prototxt of the model

最初に、モデルオプティマイザが必要とするコンポーネントをインストールします。

```demo_squeezenet_download_convert_run.sh-Step-1.
sudo -E apt -y install build-essential python3-pip virtualenv cmake libpng12-dev libcairo2-dev libpango1.0-dev libglib2.0-dev libgtk2.0-dev libswscale-dev libavcodec-dev libavformat-dev libgstreamer1.0-0 gstreamer1.0-plugins-base
sudo -E pip install pyyaml requests
```

次に、モデルダウンローダーによりsqueezenet1.1の学習済みモデルをダウンロードします。
モデルは/home/\<user>/openvino_modles/FP32/classification/squeezenet/1.1/cafe/に格納されます。

```demo_squeezenet_download_convert_run.sh-Step-1.
python3 /opt/intel//computer_vision_sdk_2018.4.420/deployment_tools/model_downloader/downloader.py --name squeezenet1.1 --output_dir ${HOME}/openvino_models/FP32/
```

####Step 2. Configure Model Optimizer
モデルオプティマイザを設定します。環境変数の設定と、モデルオプティマイザの設定を行いますが、インストール手順で既に実行済みです。設定を忘れた場合も正常に動作するように念のため実行しているものと思われます。

####Step 3. Convert a model with Model Optimizer
ダウンロードしたモデルを、IR（中間表現）に変換します。
入力として、モデルを指定し、変換後のファイル（IR）の格納先を指定します。

IRの格納先　：　/home/\<user>/openvino_models/ir/squeeznet1.1/FP32/

変換時にはFP16（１６ビット浮動小数点演算）、またはFP32（３２ビット浮動小数点演算）のいずれかを指定します。推論に使う精度を指定します。なお、MovidiusはFP32に対応しないため、FP32を指定し作成されたIRを読み込むことができません。

```
python3  /opt/intel//computer_vision_sdk_2018.3.343/deployment_tools/model_optimizer/mo.py 
        --input_model ${HOME}/openvino_models/classification/squeezenet/1.1/caffe/squeezenet1.1.caffemodel
        --output_dir ${HOME}/openvino_models/ir/squeezenet1.1
        --data_type FP32
```
実行が終了すると、モデル名＋".bin"とモデル名＋".xml"の二つのファイルが作成されます。

####Step 4. Build samples
デモプログラムを含む、すべてのサンプルプログラムがビルドされます。
R3では、ユーザディレクトリにオブジェクトファイルと実行ファイルが作成されます。
実行ファイルのディレクトリ　：　/home/\<user>/inference_engine_samples/intel64/Release

####Step 5. Run samples
以下のサンプルプログラムが実行されます。
/home/\<user>/inference_engine_samples/intel64/Release/classification_sample

実行時に指定する引数は以下の通りです。

```
./classification_sample 
　　　　-d CPU
　　　　-i /opt/intel//computer_vision_sdk_2018.4.420/demo/car.png 
　　　　-m ${HOME}/openvino_models/ir/squeezenet1.1/FP32/squeezenet1.1.xml
```

-d　：　推論を実行するハードウェア
-i　：　入力する画像ファイル
-m　：　実行するIRのxmlファイル

途中、squeezenet1.1.labelsがコピーされます。SqueezeNetは１０００種類の画像（ImageNET）を学習しています。推論結果は画像の番号で出力されますが、数字では判定結果が正しいか直感的にわかりずらいので、番号を具体的に認識した物や動物の呼称に変換しています。labelsは、その変換に使うためのテーブルです。

実行すると、以下のように推論結果が出力されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/137772/38a2b734-1576-ce2c-7621-39a1b9e31161.png)
入力画像
![image.png](https://qiita-image-store.s3.amazonaws.com/0/137772/94e0699f-9401-dd27-6ab3-36676d760c5c.png)

83%の確率で、スポーツカーとして推論されました。しかし、この画像はスタイリッシュなセダンですよね。ダウンロードしたSqueezeNetの学習済みモデルは、ImageNetの画像を学習しています。そもそもImageNetにはセダンの分類がないため、学習済みの画像に最も形状が近いスポーツカーを選んだようです。
9%の確率で、コンバーチブルと推論しています。これは誤判定ですが、確率が低いので問題ないでしょう。

#GPUとMovidiusの設定
####推論にGPUを使う
カーネル4.14以降が動作条件ですので、普通にUbuntu 16.04をインストールするだけで条件はクリアします。

```
cd /opt/intel/computer_vision_sdk/install_dependencies/
sudo –E su
./install_NEO_OCL_driver.sh
reboot
```

####推論にMovidiusを使う
デフォルトではMovidiusのアクセス権はrootだけなので、ユーザアカウントでのパーミッションを設定します。

Udevのルールを作成します。

```
cat <<EOF > 97-usbboot.rules
SUBSYSTEM=="usb", ATTRS{idProduct}=="2150", ATTRS{idVendor}=="03e7", GROUP="users", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1"
SUBSYSTEM=="usb", ATTRS{idProduct}=="2485", ATTRS{idVendor}=="03e7", GROUP="users", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1"
SUBSYSTEM=="usb", ATTRS{idProduct}=="f63b", ATTRS{idVendor}=="03e7", GROUP="users", MODE="0666", ENV{ID_MM_DEVICE_IGNORE}="1"
EOF
```
ルールを登録し、デバイスを再認識させます。

```
sudo cp 97-usbboot.rules /etc/udev/rules.d/
sudo udevadm control --reload-rules
sudo udevadm trigger
sudo ldconfig
rm 97-usbboot.rules
```

以上で、ユーザからMovidiusが使用可能となります。

#次のステップ
インストールとサンプルの実行が終わったら、次のステップに進みましょう。
[AIを始めよう！OpenVINOで使うモデルを整備する](https://qiita.com/ammo0613/items/d9463d11741f1bc5d2e2)
[AIを始めよう！PythonでOpenVINOの仕組みを理解する](https://qiita.com/ammo0613/items/ff7452f2c7fab36b2efc)