「AE2100」で「OpenVINO™ Notebooks」を動かしてみよう(1) ―構築編―

# 要約
* 本記事では、AIエッジコンピューター「AE2100」の標準コンテナ内に「OpenVINO™ Notebooks」環境を構築する方法を説明します。
* ブラウザからAE2100で動作している「OpenVINO™ Notebooks」に接続し、サンプルコードの実行を行います。

# 「OpenVINO™ Notebooks」とは
「[OpenVINO™ Notebooks](https://github.com/openvinotoolkit/openvino_notebooks/tree/main) 」は、OpenVINO™ ToolkitのAPIを使ったPythonサンプルコード集です。<br>様々なタスクに対応したサンプルコードが用意されており、OpenVINO™の基本的な使い方や推論処理の最適化の方法を学ぶことができます。

以下では、各サンプルコードの概要を説明します。
なお、AE2100はAVX2に対応していないため、一部サンプルコードは動作できません。
AE2100におけるサンプルコードの動作可否も下記表に記載します。

💻 First steps
OpenVINO™のPythonAPIを使用した簡単なチュートリアル用のサンプルコード集です。
|notebook名  |概要  |AE2100<br>動作可否|
|---|---|:-:|
|[001-hello-world]( https://github.com/openvinotoolkit/openvino_notebooks/tree/2021.4/notebooks/001-hello-world)  |OpenVINO™のIRモデルで画像分類を行います。  |〇|
|[002-openvino-api]( https://github.com/openvinotoolkit/openvino_notebooks/tree/2021.4/notebooks/002-openvino-api)  |OpenVINO™ APIの基本動作の確認を行えます。<br>検証に使用しているIRモデルを独自のモデルに入れ替えて<br>検証することもできます。 |〇|
|[003-hello-segmentation]( https://github.com/openvinotoolkit/openvino_notebooks/tree/2021.4/notebooks/003-hello-segmentation) |セマンティックセグメンテーションのIRモデルにより<br>道路領域のマスキングをします。|〇|
|[004-hello-detection]( https://github.com/openvinotoolkit/openvino_notebooks/tree/2021.4/notebooks/004-hello-detection)  |物体検出のIRモデルにより入力画像内の<br>テキストを検出します。 |〇|

⌚ Convert & Optimize
TensorFlowやONNXモデル等をIRへ変換したり、量子化をおこなうサンプルコード集です。
AE2100はAVX2に対応していないためOpenVINO™のModel Optimizerを使用する本サンプルコードは動作しません。

🎯 Model Demos
学習済みのIRモデルを使用した様々なタスク毎のサンプルコード集です。
|notebook名|概要|AE2100<br>動作可否|
|---|---|:-:|
|[201-vision-monodepth]( https://github.com/openvinotoolkit/openvino_notebooks/tree/2021.4/notebooks/201-vision-monodepth)  | 単眼深度推定により入力画像・動画の<br>深度を推定するデモアプリです。 |〇|
|[202-vision-superresolution-image]( https://github.com/openvinotoolkit/openvino_notebooks/tree/2021.4/notebooks/202-vision-superresolution) <br> [202-vision-superresolution-video]( https://github.com/openvinotoolkit/openvino_notebooks/tree/2021.4/notebooks/202-vision-superresolution) | 超解像モデルにより入力画像のピクセル数を<br>増やして画像品質を向上させます。 |〇|
|[205-vision-background-removal]( https://github.com/openvinotoolkit/openvino_notebooks/tree/2021.4/notebooks/205-vision-background-removal)  | 入力画像の物体検出を行い検出物体以外の<br>背景を削除をして別の背景に変更します。 |〇|
|[206-vision-paddlegan-anime]( https://github.com/openvinotoolkit/openvino_notebooks/tree/2021.4/notebooks/206-vision-paddlegan-anime)  | PaddleGANにより入力画像をアニメに変換します。 |×|
|[207-vision-paddlegan-<br>superresolution]( https://github.com/openvinotoolkit/openvino_notebooks/tree/2021.4/notebooks/207-vision-paddlegan-superresolution)  | PaddleGANにより入力画像のピクセル数を<br>増やして画像品質を向上させます。 |×|
|[208-optical-character-recognition]( https://github.com/openvinotoolkit/openvino_notebooks/tree/2021.4/notebooks/208-optical-character-recognition)  | 入力画像内のテキストを検出してから<br>テキストの注釈を追加します。 |×|
|[209-handwritten-ocr]( https://github.com/openvinotoolkit/openvino_notebooks/tree/2021.4/notebooks/209-handwritten-ocr)  | 手書きの日本語と簡体字中国語の<br>光学的文字認識を行います。 |〇|
|[210-ct-scan-live-inference]( https://github.com/openvinotoolkit/openvino_notebooks/tree/2021.4/notebooks/210-ct-scan-live-inference)  | 腎臓CTスキャンのセグメンテーションを<br>リアルタイムに表示します。|〇|
|[211-speech-to-text]( https://github.com/openvinotoolkit/openvino_notebooks/tree/2021.4/notebooks/211-speech-to-text)  | 入力音声ファイルの自動音声認識を行います。 |〇|
|[212-onnx-style-transfer]( https://github.com/openvinotoolkit/openvino_notebooks/tree/2021.4/notebooks/212-onnx-style-transfer)  | 入力画像を５つの異なるスタイルに変換します。 |〇|
|[213-question-answering]( https://github.com/openvinotoolkit/openvino_notebooks/tree/2021.4/notebooks/213-question-answering)  | 入力テキストへの質疑応答を行います。 | 〇 |

🏃 Model Training
モデル学習を行うサンプルコード集です。
AE2100は推論用のエッジコンピューターであるためモデル学習を行う本サンプルコードは動作しません。

📺 Live Demos
webカメラを使用してリアルタイムな処理と描画を行うサンプルコード集です。
動作にはAE2100へのwebカメラ接続が必要です。
次回、webカメラを使った動作を紹介します。

|notebook名  |概要  |AE2100<br>動作可否|
|---|---|:-:|
|[401-object-detection-webcam]( https://github.com/openvinotoolkit/openvino_notebooks/tree/2021.4/notebooks/401-object-detection-webcam)  | webカメラもしくは動画ファイルに対して<br>物体検出を行います。 | ×|
|[402-pose-estimation-webcam]( https://github.com/openvinotoolkit/openvino_notebooks/tree/2021.4/notebooks/402-pose-estimation-webcam)  | webカメラもしくは動画ファイルに対して<br>人物の骨格推定を行います。 | 〇 |
|[403-action-recognition-webcam]( https://github.com/openvinotoolkit/openvino_notebooks/tree/2021.4/notebooks/403-action-recognition-webcam)  |webカメラもしくは動画ファイルに対して<br>人物の行動認識を行います。 | 〇 |


# 事前準備
以下のような構成で、ウインドウズPCからAE2100へTeraTermでコンソール接続できることを前提とします。
（適宜IPアドレスなどはご使用環境に合わせ読み替えてください。）
なおAE2100のコンテナバージョンは「ae2100_openvino_ubuntu20_runtime_2021.4.2.tar」とします。
ウインドウズPCには、ブラウザ（Google Chrome）をインストールしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2698399/616106c1-434f-3a6a-a575-506313f4118b.png)

# 環境構築
本記事は[公式ドキュメント](https://github.com/openvinotoolkit/openvino_notebooks/wiki/Ubuntu)を参考にAE2100に合わせた環境構築を行っています。

最初に、TeraTramでAE2100のホストOSにログインして、標準コンテナのDockerイメージを取り込みます。
※標準コンテナはAIエッジユーザーサイトよりダウンロードしてホストOSにコピーしておく必要があります。
```shell
root@ae2100:~# docker load < ae2100_openvino_ubuntu20_runtime_2021.4.2.tar
```

下記コマンドでコンテナを起動します。
`-p`でポート設定を行うことでコンテナ外からコンテナ内で起動したjuputer notebookへのアクセスが可能となります。jupyter notebookにおいてデフォルトで使用されている`8888`ポートはAE2100で使用済みのため、`10000`ポートにポート変換を行います。
```shell
root@ae2100:~# docker run \
--device /dev/dri \
-it \
--device=/dev/ion:/dev/ion \
-v /var/tmp:/var/tmp \
-v /dev/shm:/dev/shm \
-p 10000:8888 \
--name ubuntu-openvino-notebooks \
-d ae2100_openvino/ubuntu20_runtime:2021.4.2 \
/bin/bash
```

コンテナにアクセスします。
```shell
root@ae2100:~# docker exec -it ubuntu-openvino-notebooks /bin/bash
```

必要なパッケージをインストールします。
```shell
root@<CONTAINER_ID>:/opt/intel/openvino_2021.4.752# cd ~
root@<CONTAINER_ID>:~# apt-get -y update
root@<CONTAINER_ID>:~# apt-get install -y python3-venv build-essential python3-dev git-all 
```

pythonの仮想環境を作成してactivateします。
```shell
root@<CONTAINER_ID>:~# python3 -m venv openvino_env
root@<CONTAINER_ID>:~# source openvino_env/bin/activate
```

下記コマンドでGitから「OpenVINO™ Notebooks」の`2021.4`ブランチ（標準コンテナと同じOpenVINOバージョンにするためブランチを指定）をcloneします。
```shell
(openvino_env) root@<CONTAINER_ID>:~# git clone --depth=1 -b 2021.4 https://github.com/openvinotoolkit/openvino_notebooks.git
```


「OpenVINO™ Notebooks」の動作に必要なpythonパッケージをインストールします。
```shell
(openvino_env) root@<CONTAINER_ID>:~# cd openvino_notebooks
(openvino_env) root@<CONTAINER_ID>:~/openvino_notebooks# python -m pip install --upgrade pip
(openvino_env) root@<CONTAINER_ID>:~/openvino_notebooks# pip install -r requirements.txt
```

依存パッケージをインストールします。
```shell
(openvino_env) root@<CONTAINER_ID>:~/openvino_notebooks# source /opt/intel/openvino/install_dependencies/install_openvino_dependencies.sh
 ```

「OpenVINO™ Notebooks」を起動します。
```shell
(openvino_env) root@<CONTAINER_ID>:~/openvino_notebooks# cd ~/openvino_notebooks
(openvino_env) root@<CONTAINER_ID>:~/openvino_notebooks/notebooks# jupyter lab notebooks \
--no-browser \
--port=8888 \
--ip=0.0.0.0 \
--allow-root \
--NotebookApp.token=''
```

なお、各サンプルコードはコンテナ内に格納されています。
`/root/openvino_notebooks/notebooks`
`jupter Lab`でソース変更した場合、変更したソースを上記のディレクトリから引き揚げるか、
`Jupyter Lab`の機能を使用してファイルをウインドウズPC側へダウンロードする必要があります。


以上で「OpenVINO™ Notebooks」の動作環境の構築は完了です。以下では`Jupyter Lab`の基本操作説明と「OpenVINO™ Notebooks」のデモアプリを起動して動作確認をします。


# Jupyter Labの基本動作

AE2100と接続しているウインドウズPCのGoogle Chromeに **http://192.168.100.1:10000** （IPアドレス部はAE2100に設定しているIPに変更してください。）を入力することで、「OpenVINO™ Notebooks」にアクセスします。

コンテナ内では「OpenVINO™ Notebooks」を`8888`ポートで起動していますが、`docker run`時にポート変換設定を行ったのでWindowsPC側からは`10000`ポートでアクセスすることができます。

以下の画面が表示されたらAE2100で起動した`Jupyter Lab`にアクセスできています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2698399/b90be22e-5f12-2300-d6b7-0009246c4357.png)


以降では、サンプルコードによる動作確認の前に`Jupyter Lab`の基本動作について記載します。

- Notebookの新規作成
`Jupyter Lab`ではNotebookと呼ばれるソースファイルにプログラムを記述することでPythonプログラムの開発をすることができます。
Launcherを起動`Ctrl+Shift+L`（初期画面では起動しています。）して、Notebook欄にあるPython3ボタンをクリックすることでNotebookを新規作成できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2698399/f62f5fd8-fd90-1856-bd6b-f411a4d58a1b.png)
　　　　　　　　　　　　　　　　  　　　　　　　↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2698399/1678626d-4b2f-4f4b-4abd-7c1e5289e543.png)

- セルの編集と実行
起動したNotebookはセル毎にプログラムを記述して実行`Shift+Enter`することができます。
下にセルがない状態でセルの実行をすると自動で空のセルが下に生成されます。
1つのセル内にはプログラムやコメントを複数行記述（関数毎にセルを分ける等）することが可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2698399/41ffa2e1-803e-be12-2f56-a046eddb5ca7.png)
ページ上部の選択バーから`Run All Cells`をクリックすることですべてのセルを上から順番に実行することも可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2698399/5c1c3afc-1b24-5adb-8776-f35a7386f928.png)

- セルの作成、削除
空のセルはショートカットキーで作成できます。
`A`キーで選択しているセルの上部に作成、`B`キーで選択しているセルの下部に作成できます。
セルの削除は`DD`キーですることができます。
また、セルの右側のアイコンをクリックすることでもセルの操作（コピー、上下移動、作成、削除）が行えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2698399/2fb5e970-dcdf-dffa-0b75-9bccafa0f199.png)

- ソースコードの保存（自動保存、手動保存）
編集中のソースコードは変更があると2分周期で自動保存されます。編集箇所があり自動保存されていない状態でファイルのタブを閉じようとすると確認画面が出てきて保存することができます。
また、手動でも notebook上部のSaveアイコンをクリック や ショートカットキー`Ctrl+S`を入力 により保存できます。

- ファイルの操作
ファイルを右クリックするとメニューが表示され、選択することでそれぞれの操作を行うことができます。
`Download`を選択することでAE2100上に保存されているファイルをウインドウズPC側にダウンロードすることができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2698399/486f31a8-9800-54fe-8e23-410f98d2af7c.png)

- フォルダの作成、ファイルのアップロード
下記のアイコンをクリックすることでウインドウズPC側からファイルをアップロードしたり、新規フォルダを作成することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2698399/9c9d6170-c3de-fcd1-e315-d7c812bfb884.png)



以下では「OpenVINO™ Notebooks」のデモアプリによる動作確認を行います。

# サンプルコードの実行
このサンプルコードは、[Mobilenet V3]( https://github.com/openvinotoolkit/open_model_zoo/blob/master/models/public/mobilenet-v3-small-1.0-224-tf/README.md)のIRモデルで入力画像の画像分類を行います。

`Jupyter Lab`の起動画面から`001-hello-world`のフォルダをクリックして開きます。 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2698399/3ba659d7-9b44-0d39-1899-189eb4787b2e.png)

今回は編集も考慮して、サンプルコードをコピーしてコピーしたファイル内で動作確認を行います。
下記ファイル(001-hello-world.ipynbファイル)を右クリックして、
`Duplicate`を選択することでnotebook（サンプルコード）のコピーを作成することができます。
（ショートカットキーも用意されており、`Ctrl+D` や `Ctrl+C`&`Ctrl+V`でもファイルコピーができます。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2698399/41d067e0-25c5-2209-20c4-92bdcde2da7f.png)
　　　　　　　　　　　　　　　　  　　　　　　　↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2698399/58f50495-8311-21e5-182f-8659b99764fd.png)

コピーしたファイルをクリックすることで`Jupyter Lab`内でタブが立ち上がりソースコードを開くことができました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2698399/5da58177-a268-68a6-e288-46cfa89bc63b.png)

サンプルコードを実行します。
下記画像では全セルの実行をしていますが、通常の`Jupyter Lab`と同様、セルの個別実行もできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2698399/b8dfb723-238b-8726-1689-ada5f5df7dc9.png)

各セルが上から順に実行され、Notebookをスクロールしてみると入力データの画像描画と推論結果がそれぞれ正しく表示されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2698399/fc2ba1b3-4373-f617-ed47-69d2c3520e20.png)

CPUでの推論ができたので推論デバイスをHDDLやGPUによる推論をしてみます。
下記の様にdevice_nameで指定されているCPUを別の動作可能なデバイス名に書き換えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2698399/020a68f3-f9a6-708c-c8fe-cfda4016b321.png)
　　　　　　　　　　　　　　　　  　　　　　　　↓
* 内蔵GPUの場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2698399/a5ffe1f1-349b-3863-47d5-0aea34a1dc19.png)
　　　　　　　　　　　　　　　　  　　　　　　　or
* HDDL（Myriad X）の場合　
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2698399/1a0a5fbf-b097-976f-adb7-c1cc6fd61618.png)

上記で変更した`Load the Model`にある1つのセルと`Do Inference`にある2つのセルを上から順番に再実行することにより動作確認をします。（パッケージのimportや入力データの再読み込みをせず動作確認ができます。）
実行デバイスを変更しても下記のようにCPU実行時と同様の推論結果を得ることができました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2698399/3222da10-cb76-250f-6bdb-69a6fdaee73a.png)

本サンプルのモデルは比較的モデルのロード時間が短いですが、
モデルによってはロードに数分かかる場合がありますので、
数十秒から5分程度までは応答がなくとも焦らず、気長にお待ちください。
また、一部モデルはHDDL実行に対応していないため、モデルロードできない場合があります。その場合は別デバイスでの実行をお願いします。

# まとめ
本記事では、「AE2100」上に「OpenVINO™ Notebooks」環境を構築してサンプルコードの動作確認を行いました。「OpenVINO™ Notebooks」を利用することで、簡単にAPIの動作確認や、ブラウザ上に推論した結果を画像表示することができます。
次回は更に実践的なサンプルコード（LiveDemo内のサンプルコード）の動作を試していきます。


# 参考
- [OpenVINO™ Notebooks（GitHub）](https://github.com/openvinotoolkit/openvino_notebooks)
- [Mobilenet V3]( https://github.com/openvinotoolkit/open_model_zoo/blob/master/models/public/mobilenet-v3-small-1.0-224-tf/README.md)