「AE2100」で「OpenVINO™ Notebooks」を動かしてみよう(2) ―webカメラ動作編―

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

# はじめに
[前回の記事](https://qiita.com/masu646/items/4ca45f0446d755c2015f)では、「AE2100」上に「OpenVINO™ Notebooks」環境を構築してサンプルコードの動作確認を行いました。
本記事では、webカメラを「AE2100」の標準コンテナ内で動作できるように環境構築を行い、
人物の骨格推定を行う「OpenVINO™ Notebooks」のサンプルコードで動作確認を行います。


# 事前準備
以下のような構成で、ウインドウズPCからAE2100へTeraTermでコンソール接続できることを前提とします。
（適宜IPアドレスなどはご使用環境に合わせ読み替えてください。）
なおAE2100のコンテナバージョンは「ae2100_openvino_ubuntu20_runtime_2021.4.2.tar」とします。
ウインドウズPCには、ブラウザ（Google Chrome）をインストールしてください。

今回必要なものはUSB2.0接続のWebカメラとなります。
この記事では"Logicool HDウェブカメラ C270"を使って動作確認をおこないました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2698399/29c3b571-0774-6b07-f24d-497eaf6127f9.png)


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

TeraTermでAE2100のホストOSにログインし、lsusbコマンドでWebカメラが認識されているかを確認します。
”Bus 001 Device 005: ID 046d:0825 Logitech, Inc. Webcam C270”　と表示されていれば認識されています。
```shell
root@ae2100:~# lsusb
Bus 001 Device 002: ID 0403:6015 Future Technology Devices International, Ltd Bridge(I2C/SPI/UART/FIFO)
Bus 001 Device 003: ID 0403:6014 Future Technology Devices International, Ltd FT232H Single HS USB-UART/FIFO IC
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 004 Device 017: ID 03e7:f63b Intel
Bus 004 Device 016: ID 03e7:f63b Intel
Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 003 Device 003: ID 2c42:5114
Bus 001 Device 005: ID 046d:0825 Logitech, Inc. Webcam C270
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
```

/dev/video0 を作成します。
```shell
root@ae2100:~# mknod /dev/video0 c 81 0
root@ae2100:~# chmod 666 /dev/video0
root@ae2100:~# chown root.video /dev/video0
```


コンテナの引数を追加するため、[前回の記事](https://qiita.com/masu646/items/4ca45f0446d755c2015f)で構築したdockerコンテナを一度dockerイメージに保存して削除します。
```shell
root@ae2100:~# docker stop ubuntu-openvino-notebooks
root@ae2100:~# docker commit ubuntu-openvino-notebooks ubuntu-openvino-notebooks-images
root@ae2100:~# docker rm ubuntu-openvino-notebooks
```

下記コマンドでコンテナを起動します。
コンテナからwebカメラを使えるようにするため、引数に`--device=/dev/video0:/dev/video0`を加えます。
```shell
root@ae2100:~# docker run \
 --device /dev/dri \
 -it \
 --device=/dev/ion:/dev/ion \
 --device=/dev/video0:/dev/video0 \
 -v /var/tmp:/var/tmp \
 -v /dev/shm:/dev/shm \
 -p 10000:8888 \
 --name ubuntu-openvino-notebooks \
 -d ubuntu-openvino-notebooks-images \
 /bin/bash
```

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

pythonの仮想環境をactivateします。
```shell
root@639e291eece6:/opt/intel/openvino_2021.4.752# cd ~
root@<CONTAINER_ID>:~# source openvino_env/bin/activate
```

「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=''
```

以上で「OpenVINO™ Notebooks」の動作環境の構築は完了です。以下では「OpenVINO™ Notebooks」のサンプルコードで動作確認をします。



# サンプルコードの実行　人物の骨格推定

このサンプルコードは、[human-pose-estimation-0001]( https://github.com/openvinotoolkit/open_model_zoo/tree/master/models/intel/human-pose-estimation-0001)のIRモデルで人物の骨格推定を行います。人物の骨格推定は、webカメラもしくは動画ファイルに対して行うことができます。


`Jupyter Lab`の起動画面から`402-pose-estimation-webcam`のフォルダをクリックして開きます。 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2698399/b3c216dc-0cc1-6091-3c08-cb6563737ff8.png)

`402-pose-estimation-webcam.ipynb`をクリックすることで`Jupyter Lab`内でタブが立ち上がりソースコードを開くことができました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2698399/a8b16ef0-04bd-fd9b-6129-2c8d15385170.png)
　　　　　　　　　　　　　　　　 　　　　　　　↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2698399/6fad1f78-2d5d-2254-c497-4ad1251e9891.png)


AE2100のGPUとHDDL実行に対応させるため、
以下の赤丸部分に記載しているコードを編集し、ダウンロードモデルをFP16-INT8からFP16に変更します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2698399/a40b740f-8f1f-88c8-21c1-1212ba2cc5db.png)

本サンプルコードでは、以下の赤丸部分に記載しているコードを編集し、実行デバイスをGPUに変更します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2698399/394b5c49-5718-2072-3b51-07b0cd1770c7.png)


サンプルコードを実行します。
ソースコードが記載されているセルを上から順番に実行し、`Run`セクションの前まで実行します。
`Run`セクションでは、webカメラ動作と動画ファイル実行の2種類セルが用意されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2698399/cb2344ba-64e1-ae49-6b7a-b7aba6d68d2e.png)


今回はwebカメラ動作のセルを実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2698399/1e325705-17a8-c3cc-6403-01098135245d.png)

無事webカメラから得られる映像をリアルタイムに処理することができました。
処理を停止する場合はソースコード上部にある■ボタンをクリックすることで停止することができます。


なお、AE2100で実行できる各デバイス別のスループットは下記の通りでした。

|推論デバイス|スループット[FPS]|
|:-:|:-:|
|CPU|1.7|
|GPU|11.5|
|HDDL|4.9|

GPUのスループットが最も高い結果となりました。
HDDLは本サンプルコードが同期実行で処理を行っているため、
あまり高いスループットになっていないことが考えられます。



# まとめ
本記事では、「AE2100」上にwebカメラ動作が可能な「OpenVINO™ Notebooks」環境を構築してサンプルコードの動作確認を行いました。

本記事で動作確認を行ったサンプルコードは同期処理で推論を行っていますが、
下記の記事のように非同期処理を実装することでスループットの改善も試すことができるので、ぜひトライしてみてください！
[OKI AIエッジコンピューター「AE2100」で動く物体検出プログラムを作ろう (2) ―非同期処理編―](https://qiita.com/TWAT/items/4b1c8289ccf0e2dd38d0)


# 参考
- [OpenVINO™ Notebooks（GitHub）](https://github.com/openvinotoolkit/openvino_notebooks)
- [human-pose-estimation-0001]( https://github.com/openvinotoolkit/open_model_zoo/tree/master/models/intel/human-pose-estimation-0001)
- [「AE2100」で「OpenVINO™ Notebooks」を動かしてみよう(1) ―構築編―](https://qiita.com/masu646/items/4ca45f0446d755c2015f)
- [OKI AI エッジコンピューター「AE2100」でOpenVINOのサンプルプログラムを動かしてみよう Ubuntuコンテナ版 (3)](https://qiita.com/TWAT/items/9c607be6af887ec3a044)
- [OKI AIエッジコンピューター「AE2100」で動く物体検出プログラムを作ろう (2) ―非同期処理編―](https://qiita.com/TWAT/items/4b1c8289ccf0e2dd38d0)