AIMINAで作成したAIモデルを「AE2100」で推論してみよう(2) ―セグメンテーション編―

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

# はじめに
本記事は、AIMINAとAE2100の連携に関する2つ目の記事です。
前回の記事では、AIMINAで作成した画像分類のAIモデルを、AE2100のOpenVINO上で推論する方法を解説しました。
[AIMINAで作成したAIモデルを「AE2100」で推論してみよう(1) ―画像分類編―](https://qiita.com/shimatak/items/debf4145f20e67cb3caa)

本記事では、AIMINAで作成した**セグメンテーション**のAIモデルを、AE2100のOpenVINO上で推論する方法を解説します。

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


# 環境
実行環境は第1回と同様です。詳細については[第1回の記事](https://qiita.com/shimatak/items/debf4145f20e67cb3caa)を参照してください。

![AIMINAのQiita環境構成図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/660784/8db35965-d227-38e4-0520-6843e40274ea.png)

**【開発環境】**　
OS：Ubuntu20.04 LTS　　　OpenVINO：2021.4.2 LTS
**※本記事では、上記開発環境をWindows PC上に構築**
**【AE2100】**
本体ファーム：V3.8.0（HDDL Daemon：OpenVINO 2021.4.2 LTS）
標準コンテナ：OpenVINO有（Ubuntu20.04版）2022年4月版


# セグメンテーションモデルの作成（AIMINA）
それでは、AIMINA上でセグメンテーションのAIモデルを作成してみましょう。
### ■ AIモデルの学習
[第1回の記事](https://qiita.com/shimatak/items/debf4145f20e67cb3caa)を参考に、AIMINAのポータルサイトにアクセスをします。

「学習」の「使いたい機能選定からはじめる」をクリックすると、AIモデルのカテゴリ選択の画面に遷移します。カテゴリとしては画像処理、自然言語処理、異音検知、時系列解析の４種類があります。（2023年1月時点）
今回はセグメンテーションモデルを作成したいので、「画像処理」の中の「Semantic Segmentation」を選択しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/660784/8a29fe5c-a1f1-c463-866f-f09dea0c285d.png)


「次へ」をクリックすると利用する学習データの選択画面に遷移します。
今回はAIMINA上にあるサンプルデータを利用して簡易にAIモデルを作成しようと思うので、「サンプルデータを利用する」の中から「学習_SemanticSegmentation サンプルデータ」を選択しました。（車のセグメンテーション）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/660784/b77c91c8-1ac3-d560-d0e3-139e195d9e1e.png)

「AIモデルを作成する」をクリックするとAIMINA上での学習が開始されます。
（学習には数分ほど時間がかかりますが、ウィンドウを閉じても学習は中断されません。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/660784/0087851b-6b9b-49d9-38d6-378dc55aa0ec.png)

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


### ■ AIモデル、推論サンプルデータのダウンロード
学習が完了したら、AIMINA上で作成したAIモデルのダウンロードを行います。
[第1回の記事](https://qiita.com/shimatak/items/debf4145f20e67cb3caa)と同様の手順でMy AIモデルへの保存を行ってください。
今回作成したモデルは「AIMINA Semantic Segmentation Sample」という名称にしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/660784/4d1c3ce2-91d4-bdb3-8efb-af91b76cf5a3.png)

該当のモデルを選択し「OpenVINO対応ダウンロード」をクリックすることで、ローカルのPCに学習させたAIモデルをダウンロードすることが可能です。
「predict_model.zip」というzipファイルがダウンロードされます。
※画像分類モデルをダウンロードしたときと、zipファイル名が同一なので注意してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/660784/90a7cc74-5e02-4ab4-7b91-780e98aea531.png)

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


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

前章でダウンロードした「predict_model.zip」を解凍すると、「deeplabv3_plus」と「unet」の2種類のAIモデルが格納されています。
本記事では**unet**のモデルを使用しますが、いずれも車のセグメンテーションを行うAIモデルなのでどちらでもOKです。

unetのディレクトリの中に「best_model.onnx」というONNXのファイルが格納されています。
こちらを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.pyを実行し、onnxファイルをIRへ変換します。
※**predelict_model.zipは解凍し、/home/tmp2の下**に置いています。
```
# python3 /opt/intel/openvino_2021/deployment_tools/model_optimizer/mo.py \
--framework onnx \
--data_type FP16 \
--input_model /home/tmp2/best_model.onnx \
--input_shape [1,3,256,256] \
--scale_values [58.395, 57.12,57.375] \
--mean_values [123.675,116.28,103.53] \
--reverse_input_channels 
```

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

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

**【参考】**
・[Model Optimizerの引数等の詳細](https://docs.openvino.ai/2021.4/openvino_docs_MO_DG_prepare_model_convert_model_Converting_Model.html)


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

デモプラグラムの用意については、[AWS SageMaker JumpStartで転移学習した画像分類モデルを「AE2100」で推論してみよう](https://qiita.com/shimatak/items/a9935a503e27bb9e5301)の「デモプラグラムの用意（開発環境側）」の章を参照してください。
※本記事では「classification_demo」ではなく、「segmentation_demo」を使用します。

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


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

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

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

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

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

**【AE2100側】**
AE2100にログインを行い、まずは画像分類の推論実行用標準コンテナのDockerイメージから「AIMINA_segmentation」という名称のコンテナを作成します。
```
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_segmentation -d ae2100_openvino/ubuntu20_runtime:2021.4.2 /bin/bash
```

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

コンテナへ入り、tarファイルを展開します。
```
root@ae2100:~# docker exec -it AIMINA_segmentation /bin/bash
# cd
# tar xvf AIMINA_segmentation_demo_unet.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_segmentation_demo_unet
# ./segmentation_demo -m best_model.xml -d HDDL -i images/1-0147.png -loop
```
各オプションについては、下表にて説明します。

オプション|説明|今回の入力
:--|:--|:--|
-m|xmlファイルへのパスを指定|**best_model.xml**|
-i|推論用の画像ファイル（ディレクトリ）へのパスを指定|**推論用の画像ファイルへのパス**|
-d|推論に使用するデバイスを指定|**Myriad X VPU：HDDL**<br>CPU：CPU<br>GPU：GPU|
-loop|推論の繰り返し（オプション）|**推論が終了するとウィンドウが閉じてしまうため、推論状況の確認のために付与**|

以下が実行結果のウィンドウです。
車が存在する領域のみ、概ね赤色で塗りつぶされているのが分かります。
![AIMINA_Segmentation_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/660784/e04a8cc5-9feb-c5ea-6c5f-52859215dab0.png)

この通り、AIMINAで作成したセグメンテーションのAIモデルもAE2100で推論することが出来ました。

今回はAIMINA上にあるサンプル学習データで作成したセグメンテーションのAIモデルにて、画像から車の領域を抽出する推論をAE2100で行いました。
もちろん車以外の学習データを使うことで、AIMINA上で簡単に独自のセグメンテーションモデルを作ってAE2100で推論を行うことも可能です。


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

AE2100でエッジでのAI推論を行いたいけども学習環境に悩んでいるという人は、是非AIMINAを使ってみてください。

■前回の記事：
[AIMINAで作成したAIモデルを「AE2100」で推論してみよう(1) ―画像分類編―](https://qiita.com/shimatak/items/debf4145f20e67cb3caa)
■AE2100関連の記事まとめ：
[OKI AIエッジパートナー開発者コミュニティ Qiita記事まとめ](https://qiita.com/shimatak/items/35c3c7804af7ee6fc422)