AIMINAで作成したAIモデルを「AE2100」で推論してみよう(1) ―画像分類編―

# 要約
* この記事は、SB C&SのAIプラットフォーム「AIMINA」上で学習したAIモデルをAE2100で推論する方法についての解説記事です。
* 本記事では、AIMINAで作成した画像分類とセグメンテーションのAIモデルを、AE2100のOpenVINO上で推論する方法を2回に分けて解説します。
* 第1回は「画像分類編」です。

# はじめに
OKIの[AE2100](https://www.oki.com/jp/AIedge/)はディープラーニングモデルの推論をエッジで高速に実行可能なコンピューターです。
ただし、推論用のAIモデルやアプリケーションはユーザー側で用意する必要があります。

一方、SB C&Sの[AIMINA](https://aimina.com/)はAIを手軽に「学べる・作れる・試せる」クラウド型AIプラットフォームであり、OpenVINO対応のAIモデルも作成可能です(※)。作成したAIモデルはクラウド上で試すことも出来ますが、ビジネスシーンにおいてはエッジ側で推論処理を行いたいといったケースもあるかと思います。
　<font color="red">※ OpenVINO対応モデル：画像分類、セグメンテーション（2023年1月時点）</font>


本記事では、AIMINAでAIモデルを作成し、AE2100で推論を実行する手順について「画像分類編」、「セグメンテーション編」の2回に分けて解説をします。

なお、AIMINAのフリートライアルプランでは作成したAIモデルのダウンロードは出来ません。<font color="red">**AE2100で推論をする場合はAIモデルのダウンロードが必須なので、[「AIMINA 料金プラン」](https://aimina.com/service/plan/)から有償プランの申し込みが必要です。**</font>

# 環境
実行環境は次の図のような構成を前提とします。
![AIMINAのQiita環境構成図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/660784/8db35965-d227-38e4-0520-6843e40274ea.png)

また、本記事ではAIMINAの有償プランをご利用中であること、下記の記事および[SDK取扱説明書](https://www.oki.com/jp/AIedge/support/#ae2100_sdk)に従って、AE2100の環境構築と開発環境構築、X-Windowクライアントのインストールが既に実施されていることを前提とします。
[OKI AI エッジコンピューター「AE2100」でOpenVINOのサンプルプログラムを動かしてみようUbuntuコンテナ版 (1)](https://qiita.com/TWAT/items/7398105a9e64178a84d7)

なお、AE2100および開発環境は以下のものを前提としています。
**【開発環境】**
OS：Ubuntu20.04 LTS　　　OpenVINO：2021.4.2 LTS
**【AE2100】**
本体ファーム：V3.8.0（HDDL Daemon：OpenVINO 2021.4.2 LTS）
標準コンテナ：OpenVINO有（Ubuntu20.04版）2022年4月版


# 画像分類モデルの作成（AIMINA）
それでは、AIMINA上で画像分類モデルを作成してみましょう。
### ■ AIモデルの学習
まずは、[AIMINAのログインページ](https://plt.aimina.com/entry/login)にて登録者のメールアドレスとパスワードを入力し、ログインを行います。
ログインを行うと以下のようなポータルサイトに遷移します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/660784/9d89bf26-8b14-95a8-9204-5e440594ed28.png)

「学習」の「使いたい機能選定からはじめる」をクリックすると、AIモデルのカテゴリ選択の画面に遷移します。カテゴリとしては画像処理、自然言語処理、異音検知、時系列解析の４種類があります。（2023年1月時点）
今回は画像分類モデルを作成したいので、「画像処理」の中の「Image Classification」を選択しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/660784/8ad920de-3df3-37ee-cf25-98e5d3956d3b.png)

「次へ」をクリックすると利用する学習データの選択画面に遷移します。
今回はAIMINA上にあるサンプルデータを利用して簡易にAIモデルを作成しようと思うので、「サンプルデータを利用する」の中から「学習_ImageClassificationサンプルデータ」を選択しました。（車とトラックの2クラス）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/660784/056383c9-f576-3871-deed-90299f90c08b.png)

「AIモデルを作成する」をクリックするとAIMINA上での学習が開始されます。
（学習には数分ほど時間がかかりますが、ウィンドウを閉じても学習は中断されません。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/660784/11dbf781-56f5-26fa-28af-0b1c45c02db2.png)

学習の進捗状況はAIMINAポータルサイトの左側にあるメニューの「AI管理」の「作成中モデル」タブから確認することも可能です。
以下は学習完了時の画面です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/660784/92e8dae8-d9e3-fbbb-c9f9-38297bf0d185.png)


### ■ AIモデル、推論サンプルデータのダウンロード
学習が完了したら、AIMINA上で作成したAIモデルのダウンロードを行います。
「AI管理」の「作成中モデル」タブの中から、前章で作成したAIモデルの「結果を確認」をクリックします。
ここでは作成したAIモデルについてのサマリーや詳細情報が確認可能です。
右上の「保存するモデルを選ぶ」をクリックし、任意のモデル名を設定して「決定」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/660784/b5ac1e30-4dd0-615a-f8db-68b18e7f0284.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/660784/d4c522fe-dff8-9f1d-dda3-17242ceb39f7.png)

そうすると「My AIモデル」タブに先程設定した任意のモデル名のAIモデルが表示されます。
該当のモデルを選択し「OpenVINO対応ダウンロード」をクリックすることで、ローカルのPCに学習させたAIモデルをダウンロードすることが可能です。
（「predict_model.zip」というzipファイルがダウンロードされます）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/660784/1e1bf471-1361-4aa4-2836-2b205fafc183.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/660784/3db3c03b-cab3-b998-8e83-7fa84306bf72.png)

また、今回はAIMINA上に配置されている「学習_ImageClassificationサンプルデータ」を使って学習を行いましたが、推論用のサンプルデータもAIMNA上に配置されています。
左メニューの「Data管理」にある「Sample Data」タブを選択し、「推論_ImageClassificationサンプルデータ」をダウンロードしておいてください。後で、AE2100での推論時の入力データとして使用します。
（「推論_ImageClassificationサンプルデータ.zip」というzipファイルがダウンロードされます）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/660784/b643007e-d1f2-c418-641c-31405b94099e.png)


# Model Optimizerでの変換（開発環境）
<font color="red">**※以降の作業はOpenVINO2021.4.2LTSに対応した開発環境および標準コンテナ（OpenVINO有（Ubuntu20.04版）2022年4月版）を利用していることを前提とします。**</font>

前章でダウンロードしたAIモデル(predict_model.zip)を解凍すると、「best_model」ディレクトリの中に「saved_model.pb」というTensorFlowのPBファイルが格納されています。
こちらをOpenVINOの環境で推論するために、Model OptimizerにてIR形式に変換します。

なお、Model Optimizerでの変換については、[OKI「AE2100」向け OpenVINO Model Optimizerの使い方 (画像分類モデル編)](https://qiita.com/sa9moto/items/5cd935ec76bffe7d4767)にて詳しく解説をしています。



それではModel Optimizerでの変換を行うので開発環境を起動します。
Model OptimizerはPythonにより実行するため、Pythonの仮想環境を起動します。
```
# source /opt/intel/openvino_2021/deployment_tools/model_optimizer/venv/bin/activate
```

下記のコマンドで/opt/intel/openvino_2021/deployment_tools/model_optimizer/mo_tf.pyを実行し、PBファイルをIRへ変換します。
※**predelict_model.zipは解凍し、/home/tmpの下**に置いています。
```
# python3 /opt/intel/openvino_2021/deployment_tools/model_optimizer/mo_tf.py \
> --data_type FP16 \
> --reverse_input_channels \
> --saved_model_dir /home/tmp/predict_model/best_model \　
> --input_shape=[1,260,260,3] \
> --scale_values=[255.0]
```

Model Optimizerの実行が成功すると、IRとしてxml形式のファイルとbin形式のファイルが得られます。
今回の変換では変換後のIRとして以下の2つのファイルが生成されていればOKです。
・saved_model.xml
・saved_model.bin

なお、上記変換の中で指定をしている入力チャネルの並びや形状、スケール値等の情報はpredelict_model.zipの中に含まれる「ImageClassification.ipynb」内に記載されています。

**【参考】**
・[Model Optimizerの引数等の詳細](https://docs.openvino.ai/2021.4/openvino_docs_MO_DG_prepare_model_convert_model_Converting_Model.html)
・[Model OptimizerでTensorFlowモデルを変換する方法の詳細](https://docs.openvino.ai/2021.4/openvino_docs_MO_DG_prepare_model_convert_model_Convert_Model_From_TensorFlow.html)


# デモプログラム、ラベルファイルの用意（開発環境）
Model Optimizerで変換したモデルは、OpenVINOに含まれているデモプログラム（Classification C++ Demo）を使用して推論してみます。

デモプラグラムおよびラベルファイルの用意については、[AWS SageMaker JumpStartで転移学習した画像分類モデルを「AE2100」で推論してみよう](https://qiita.com/shimatak/items/a9935a503e27bb9e5301)の「デモプラグラムの用意（開発環境側）」と「ラベルファイルの用意（開発環境側）」の章を参照してください。

ラベルファイルには「car」、「truck」の順番にラベルを記載します。

**【参考】**
・[Classification C++ Demoの詳細](https://docs.openvino.ai/2021.4/omz_demos_classification_demo_cpp.html)


# AE2100へのファイルコピー（開発環境側／AE2100側）
ここでは開発環境で用意した実行ファイルやラベルファイルをAE2100へコピーします。

**【開発環境】**
開発環境側でディレクトリを１つ用意し、その中に以下のファイルを格納してください。
* saved_model.xml
* saved_model.bin
* classification_demo
* imagenet_2012.txt　　  ※ラベル内容を書き換えたもの
* images（AIMINAからダウンロードした、推論サンプルデータが格納されているディレクトリ）

本記事では、ホームディレクトリ直下に「AIMINA_classification_demo」というディレクトリを用意し、その中に必要なファイルを格納しました。
```
# cd
# ls AIMINA_classification_demo
saved_model.xml         saved_model.bin         classification_demo
imagenet_2012.txt       images                  　
```

次に、AE2100へファイルを転送するため、tarコマンドで1つのファイルにまとめます。
```
# cd
# tar cvf AIMINA_classification_demo.tar AIMINA_classification_demo
```

以上が開発環境側での手順となります。
以降はAE2100側での手順です。

**【AE2100側】**
AE2100にログインを行い、まずは画像分類の推論実行用標準コンテナのDockerイメージから「AIMINA_classification」という名称のコンテナを作成します。
```
root@ae2100:~# docker run --device /dev/dri -it --device=/dev/ion:/dev/ion -v /var/tmp:/var/tmp -v /dev/shm:/dev/shm --name AIMINA_classification -d ae2100_openvino/ubuntu20_runtime:2021.4.2 /bin/bash
```

次に、「AIMINA_classification_demo.tar」を開発環境からAE2100のホストOSへSCP等でファイル転送します。
転送が行えたらAE2100上で下記コマンドを実行し、「AIMINA_classification_demo.tar」をコンテナ内のrootディレクトリにコピーします。
```
root@ae2100:~# docker cp AIMINA_classification_demo.tar AIMINA_classification:/root/
```

コンテナへ入り、tarファイルを展開します。
```
root@ae2100:~# docker exec -it AIMINA_classification /bin/bash
# cd
# tar xvf AIMINA_classification_demo.tar
```


# AE2100での推論実行（AE2100）
いよいよ、転移学習した画像分類モデルをIR形式に変換したモデルを、AE2100上で推論実行します
 [OKI AI エッジコンピューター「AE2100」でOpenVINOのサンプルプログラムを動かしてみよう Ubuntuコンテナ版 (1)](https://qiita.com/TWAT/items/7398105a9e64178a84d7)でインストールしたXlaunchを起動しておいてください。

まずは、コンテナ内で環境変数の設定、検出結果の画面表示先の指定を行います。
```
# source /opt/intel/openvino/bin/setupvars.sh
# export DISPLAY=192.168.100.2:0.0
```
※DISPLAYで指定するIPアドレスは、XLaunchをインストールしたWindowsPCのIPアドレスに適宜読み替えて下さい。

実行準備が整いましたので、プログラムを実行します。
```
# cd AIMINA_classification_demo
# ./classification_demo -m saved_model.xml -i images/ -d HDDL -labels imagenet_2012.txt -nt 2
```
各オプションについては、下表にて説明します。

オプション|説明|今回の入力
:--|:--|:--|
-m|xmlファイルへのパスを指定|**saved_model.xml**|
-i|推論用の画像ファイル（ディレクトリ）へのパスを指定|**推論用の画像ファイル又はディレクトリへのパス**|
-d|推論に使用するデバイスを指定|**Myriad X VPU：HDDL**<br>CPU：CPU<br>GPU：GPU|
-labels|ラベルファイルへのパスを指定|**imagenet_2012.txt**|
-nt|結果の出力数|**本記事では2種類の分類モデルであるため、「2」を指定**<br>【注】デフォルトは「5」になっており、4種類以下の分類モデルの場合はエラー発生|

以下が実行結果のウィンドウです。
![推論実行結果.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/660784/b56c8ee7-04fd-0209-d8ee-3c3fe94ca5e4.png)

この通りAIMINAで作成したAIモデルをAE2100で推論することが出来ました。
また、サンプルデータの入力に対しても正しい推論結果が得られているのが分かりますね。

今回はAIMINA上にあるサンプル学習データで作成した分類モデルにて、車かトラックかの簡易な2分類の推論をAE2100で行いました。
もちろん分類したい物の学習データさえあれば、AIMINA上で簡単に独自AIモデルを作ってAE2100で推論を行うことも可能です。


# まとめ
今回はSB C&SのAIMINA上で作成した**画像分類**のAIモデルをAE2100で推論しました。
AIMINAで用意されている／作成したAIモデルを簡単にAE2100で推論させることができるため、お互いに相性が良いということが理解いただけたのではないでしょうか。

次回は、**セグメンテーション**のAIモデルの作成/推論の記事も近日公開予定です。