OKIのAIエッジコンピューター「AE2100」とコニカミノルタの画像IoTプラットフォーム「FORXAI」を連携してみよう(2) ―AE2100推論編―

# 要約
* この記事は、OKIのAIエッジコンピューター「AE2100」とコニカミノルタの画像IoTプラットフォーム「FORXAI」の連携方法についての解説記事です。
* 本記事では、FORXAIの骨格推定エンジンとサンプルアプリを使用して**人の進入検知**をAE2100で推論する方法を2回に分けて解説します。
* 第2回の「AE2100推論編」では、AE2100側の環境構築およびFORXAIのAIモデル・サンプルアプリを使用した推論の実行方法を解説します。


# はじめに
本記事は、FORXAIとAE2100の連携に関する2つ目の記事です。
前回の記事では、FORXAIとAE2100の紐づけ方法やAIコンテナのデプロイ方法について解説しました。
[OKIのAIエッジコンピューター「AE2100」とコニカミノルタの画像IoTプラットフォーム「FORXAI」を連携してみよう(1) ―デバイス登録・AIコンテナ/アプリ準備編―](https://qiita.com/shimatak/items/b5d2f3a1d5d801c311db)

今回はAE2100側の環境構築およびFORXAIのAIコンテナ（骨格推定）とサンプルアプリ（Quick Start Kit）を使用した人の進入検知の実行方法を解説します。

なお、<font color="red">**本記事はFORXAIパートナーであることが前提の記事構成となっております。
（FORXAIパートナー以外の方は[FORXAIパートナーサイト](https://forxai-partner.konicaminolta.com/home)へアクセスすることが出来ません）**</font>
FORXAIパートナーではない方で興味がある場合は、[FORXAIのお問合せフォーム](https://forxai.konicaminolta.com/contact)から相談をしてみてください。


# 環境
実行環境は第1回と同様です。詳細については第1回の記事を参照してください。
[OKIのAIエッジコンピューター「AE2100」とコニカミノルタの画像IoTプラットフォーム「FORXAI」を連携してみよう(1) ―デバイス登録・AIコンテナ/アプリ準備編―](https://qiita.com/shimatak/items/b5d2f3a1d5d801c311db)

![FORXAI_環境図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/660784/e694dde6-75ab-cac0-12df-c074a8c6ad4b.png)

各バージョンは以下のものを使用しています。
項目|バージョン
:-:|:-:
AE2100(ファームウェア)|V3.7.0
FORXAI IoT Platform|V1.6.1-1
FORXAI Skelton Recognition|V1.0.0-2
Quick Start Kit|V1.0.0-1

:::note info
AE2100ファームウェアv3.8.0でも動作確認しています。
v3.8.0を使用する場合、HDDLデーモンは OpenVINO 2021.4.2 LTSを適用してください。
更新方法は、AE2100ファームウェアに同梱のリリースノートを参照してください。
:::

# AE2100のiptablesの設定
まずは、AE2100のiptablesの設定を行う必要があります。
FORXAI関連のコンテナは全て同一サブネット<font color="red">**172.18.0.0/16**</font>としてデプロイされているのですが、AE2100のiptablesのデフォルト設定のままではコンテナ間の通信が出来ません。
そのため、iptablesに以下のルールを事前に追加しておきます。
```php:iptablesへの設定追加
-A service_accept_in -s 172.18.0.0/16 -d 192.168.100.1 -j ACCEPT
```

なお、iptablesの設定を変更するためには「iptables-make-chain-custom」と「iptables-common-rule-custom」の作成が必要です。
詳細は[AE2100 SDK取扱説明書（共通編）](https://www.oki.com/jp/AIedge/support/#ae2100_sdk)の「ファイアウォール設定」を参照してください。


# Quick Start Kit実行用のコンテナを用意（ホストOS側）
前記事でFORXAI IoT Platform関連のコンテナとAIコンテナのデプロイは完了していますが、それら以外にFORXAIのサンプルコード集「Quick Start Kit」を実行するためのコンテナを別途用意する必要があります。

本記事では、Quick Start Kit実行用のコンテナとしてAE2100の標準コンテナ<font color="red">**ae2100_openvino_ubuntu20_runtime_2021.4.2.tar**</font>を使用します。
[AE2100 SDK取扱説明書（DeepLearnning編）](https://www.oki.com/jp/AIedge/support/#ae2100_sdk)の「AE2100へのデプロイ」を参考にDockerイメージを取り込み、以下のコマンドでコンテナを起動してください。
コンテナ名は任意ですが、本記事では**forxai-demo**としています。
```:コンテナ起動（forxai-demo）
# docker run -d --network forxai_network --expose 54321 --name forxai-demo -it ae2100_openvino/ubuntu20_runtime:2021.4.2 /bin/bash
```

次に、前記事でFORXAIパートナーサイトからダウンロードしていた「quick_start_kit_r01.zip」と「skeleton_recognition_dl.zip」をSCP等でAE2100のホストOSに転送し、forxai-demoにコピーします。
また、推論時の入力として[インテルのGithub上のサンプル動画「one-by-one-person-detection.mp4」](https://github.com/intel-iot-devkit/sample-videos/blob/master/one-by-one-person-detection.mp4)を使用するため、同様にforxai-demoにコピーします。

```:forxai-demoへ必要ファイルをコピー
# docker cp quick_start_kit_r01.zip forxai-demo:/root/
# docker cp skeleton_recognition_dl.zip forxai-demo:/root/
# docker cp one-by-one-person-detection.mp4 forxai-demo:/root/
```

# Quick Start Kit実行環境の構築（コンテナ側）
本章では、前章で作成したコンテナforxai-demoでQuick Start Kitを実行するための環境を構築します。
forxai-demoにアクセスしておいてください。

まず、デモ実行にはffmpeg等が必要になるため、依存パッケージのインストールをおこないます。
※インターネットへの接続が必要です。
```:依存パッケージをインストール
# cd /opt/intel/openvino/install_dependencies
# apt-get clean
# ./install_openvino_dependencies.sh
```

次に、ホストOS側からコピーした「quick_start_kit_r01.zip」と「skeleton_recognition_dl.zip」を解凍します。
解凍してできたディレクトリ**src/people-entering-detection**に人の進入検知アプリ「sample_entering-detection.py」が格納されているので、ついでにサンプル動画「one-by-one-person-detection.mp4」を同ディレクトリーに置いておきます。
```:zipファイルの解凍、サンプル動画の準備
# cd
# apt-get install zip
# unzip quick_start_kit_r01.zip
# unzip skeleton_recognition_dl.zip
# cp -p one-by-one-person-detection.mp4 src/people-entering-detection/
```

また、FORXAIの骨格推定エンジンをAE2100で動作させるためには、Pythonのクライアントライブラリをインストールする必要があります。
前項で解凍した「skeleton_recognition_dl.zip」の中にインストールパッケージが含まれているので、それらをインストールします。
詳細は[FORXAIパートナーサイトのAIコンテナ準備のページ](https://forxai-partner.konicaminolta.com/spec/skeleton_recognition/latest/ja/common/how_to_use.html)に記載されています。

```:Pythonクライアントライブラリのインストール
# cd
# pip3 install --upgrade pip
# pip3 install protobuf==3.20.0
# pip3 install /root/skeleton_recognition_dl/python/dist/forxai_base-1.0.0-py3-none-any.whl
# pip3 install /root/skeleton_recognition_dl/python/dist/forxai_recognition-1.0.0-py3-none-any.whl
```

最後に、「sample_entering-detection.py」を実行するために以下の箇所のコード修正を行います。
```php:sample_entering-detection.pyの修正箇所（修正前）
with forxai_recognition.Client('127.0.0.1', 52051) as d:
```

このIPアドレスの部分を、前記事でデプロイした骨格推定エンジン「forxai_skelton_recognition_ov」のIPアドレスに修正します。
AIコンテナのIPアドレスはFORXAIのPortainer画面の「Containers」から確認可能です。
![AIコンテナIPアドレス確認（FORXAI側）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/660784/b125c01a-013e-098e-bdf7-3f09c3ec8978.png)

私の場合は**172.18.0.2**であったため、以下のようにコードの修正を行いました。
```php:sample_entering-detection.pyの修正箇所（修正後）
with forxai_recognition.Client('172.18.0.2', 52051) as d:
```


# 推論の実行
あらかじめ[こちら](https://qiita.com/TWAT/items/7398105a9e64178a84d7)の記事を参考にしてWindowsPCでXLaunchを起動しておき、ウインドウ表示先であるウインドウズPCのIPアドレスを指定します。
```:画面エクスポート設定
# export DISPLAY=192.168.0.2:0.0
```

ここまでで推論実行までの準備が完了しました。
それでは、「one-by-one-person-detection.mp4」を入力として「sample_entering-detection.py」を実行してみましょう。
```:sample_entering-detection.pyの実行
# cd src/people-entering-detection/
# python3 sample_entering-detection.py --file one-by-one-person-detection.mp4
```

# 推論の実行結果
「sample_entering-detection.py」を実行すると、以下のようなウィンドウが表示されます。（まだ骨格推定のAIは動いていない状態です）
![推論実行 検知枠作成前.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/660784/26ac59aa-2cb3-dc78-9f0d-4cdb8c7cb158.png)

ウィンドウ左上の「Click the image window four times to define the area」に従い、検知エリアとして設定したい4箇所をマウスでクリックします。
そうすると検知エリアとして黄色い枠が表示され、骨格推定のAIが動く状態になります。
![推論実行 検知枠作成後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/660784/42bde1c2-1814-69bc-941d-b096a653ba81.png)

ウィンドウの中に人が映ると骨格推定が始まります。
そして事前に設定した検知エリアに人が入ると検知枠の色が赤色、つまり進入を検知した状態となりました。
![推論実行 進入検知（赤枠）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/660784/9e8f2a82-c6c7-3643-7f3c-1fdee5b2e536.png)

後ろ向きの人でも正確に骨格の位置を推定できていて検知精度としては中々良い感じですね。
入力を動画ではなくカメラ映像に変えることももちろん出来るので、現場でリアルタイムに推論結果を出すことも可能です。

なお、この推論はCPUで行っているので推論の処理速度（FPS）は若干低く出ています。
AE2100はMyriadを使用することでより高速な推論を実現できるので、FORXAI側でMyriadに対応していただくことを期待しています。

# まとめ
今回はAE2100側の環境構築およびFORXAIのAIモデル・サンプルアプリを使用した推論について解説しました。
FORXAIには他にもたくさんのAIコンテナがあるので、用途に応じて適切なAIを選択することでAE2100×FORXAIの組合せで色々なユースケースを実現することが出来ると思います。

前回の記事：
[OKIのAIエッジコンピューター「AE2100」とコニカミノルタの画像IoTプラットフォーム「FORXAI」を連携してみよう(1) ―デバイス登録・AIコンテナ/アプリ準備編―](https://qiita.com/shimatak/items/b5d2f3a1d5d801c311db)