Google CloudのAutoML Visionで学習した画像分類モデルを「AE2100」で推論してみよう

# 要約
この記事では、Google CloudのAutoML Visionで学習した画像分類のAIモデルをOpenVINO上で推論実行できるようにするためにModel Optimizerを使用してモデル変換する方法を説明します。
また、変換後のモデルをAE2100のUbuntu + OpenVINOコンテナへデプロイし、推論を実行します。


# はじめに
AutoML VisionはGoogle Cloud上で画像分類や物体検出のモデルを学習することができるサービスです。
今回はGoogle CloudのAutoML Visionで学習した画像分類のAIモデルをAE2100上のOpenVINOで推論する方法について説明します。



# 環境
本記事ではGoogle Cloudのアカウントをお持ちであること、AE2100の環境と開発環境が既に用意されていることを前提としています。
<font color="Red">今回紹介する方法はOpenVINO 2022.1.0以降でないと正しく推論されないようですのでご注意ください。</font>

**【開発環境】**
<font color="Red">**OS：Ubuntu20.04 LTS**</font>
<font color="Red">**OpenVINO：2022.1.0**</font>

**【AE2100】**
 <font color="Red">**本体ファーム：V3.8.0（HDDL Daemon：OpenVINO 2022.1.0）**</font>
 <font color="Red">**標準コンテナ：OpenVINO有（Ubuntu20.04版）2022年10月版**</font>

AE2100の環境と開発環境の構築は「AE2100 シリーズ SDK 取扱説明書 ―DeepLearning 編―」の2章のチュートリアルを参考に環境構築してください。

# AutoML Visionでの学習
AutoML Visionは、Google Cloudで提供されているクラウドサービスで、画像分類や物体検出のAIモデルを簡単に自動学習することができます。以降は今回学習した際のポイントを記載します。

学習モデルは**単一ラベル分類**、**マルチラベル分類**、**オブジェクト検出**の３種類から選択できます。
今回はAE2100の外観に問題がないかをOK/NGで判定するために**単一ラベル分類**を選択しました。
![fig4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2781101/639d835a-cce6-b389-9b39-227d1bb3a3b4.png "学習モデル選択画面")

学習に使用した画像はAE2100の外観をカメラで撮影して使用しました。
OK画像は外観を撮影した画像をそのまま使用し、NG画像はペイントソフトを使用して色線を描画しました。
<font color="Red">※今回は分かり易い例としてキズに模したペイント線を描画したAE2100の画像を使用しました。実際のAI判定では精度を上げるために多くのOK画像と実際のNG画像を用意して学習する必要があります。</font>
以下が学習画像のサンプルです。

![学習画像例.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2781101/ed610074-04ab-19b6-db25-d6c54508ff87.png "学習画像例")

学習モデルは用途に応じて**モデルの定義**と**最適化オプション**の選択、**ノード時間予算**の設定ができます。
モデルの定義は学習したモデルをGoogle Cloud上で使用する場合はCloud hosted、ダウンロードして使用する場合はEdgeを選択します。
今回は**Edge**を選択しました。

![fig9.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2781101/3d6e9c51-cd29-605e-40ac-6d632ba18ac7.png "モデル定義の選択画面")

最適化オプションはHigher accuracy、Best trade-off、Faster predictionsが選択可能です。
左から順に認識精度が高いモデルが学習できますが、推論速度が遅くなります。
今回は**Best trade-off**を選択しました。

![fig10.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2781101/eecaa101-bb60-2e50-c2b8-365c600a9a05.png "最適化オプションの選択画面")

最後にノード時間予算は学習に費やすノード時間を設定します。
ノード時間予算は学習画像の枚数や学習の予算も応じて変えた方がいいようですが、今回はおすすめされた値の3にしました。
上記をすべてを設定すると「トレーニングを開始」ボタンが選択できるようになります。
「トレーニングを開始」を押して学習を開始すると自動でモデルの学習と評価が行われます。

![fig11.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2781101/fd3596bd-cec2-ccdd-f26a-79b11e935bd1.png "学習実行画面")

十分に学習ができたらモデルのエクスポートを行います。
選択できるモデル形式は**TF Lite**、**TensorFlow.js**、**Core ML**、**Container**、**Coral**の5種類です。

![fig15.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2781101/cb87fc06-c5cf-5e02-1b2e-f634c3694a76.png "モデルのエクスポートの選択画面")

ここでは <font color="Red">**TF Lite**</font>を選択してください。TF Liteを選択しエクスポートすると以下のTensorFlow Lite形式のファイルをダウンロードすることができます。

* dict.txt
* model.tflite
* tflite_metadata.json

# Model Optimizerでの変換（開発環境側）
AIモデルをOpenVINOの環境で推論するために、Model OptimizerでIR形式に変換させる必要があります。
しかし、TensorFlow Lite形式のモデルはModel OptimizerでIR形式に直接変換させることができません。
そのため、一度ONNX形式に変換してからModel OptimizerでIR形式に変換します。
以下ではその手順を示します。

まず、エクスポートしたモデルを開発環境にコピーします。
TensorFlow Lite形式のモデルをONNX形式に変換するために、以下のコマンドを実行してツールをインストールします。

```
# source /opt/intel/openvino/venv/bin/activate
# pip install tf2onnx
```

次に、モデルファイルがあるフォルダで、以下のコマンドを実行してTensorFlow Lite形式のモデルをONNX形式に変換します。

```
# python3 -m tf2onnx.convert --opset 13 --tflite model.tflite --output model.onnx --dequantize --inputs image --inputs-as-nchw image
```

実行すると「**model.onnx**」というファイルが作成されます。
次に、以下のコマンドを実行してONNX形式のモデルをIR形式に変換します。

```
# mo --output scores_prequant --input_model model.onnx --output_dir .
```
実行すると「**model.bin**、**model.mapping**、**model.xml**」という3つファイルが作成されます。

# 推論プラグラムの用意（開発環境側）
今回はOpenVINOに含まれているサンプルプログラム（[classification_sample_async](https://github.com/openvinotoolkit/openvino/tree/2022.1.0/samples/cpp/classification_sample_async)）を使用して推論実行します。
サンプルプログラムのビルドについては「AE2100 シリーズ SDK 取扱説明書 ―DeepLearning 編―」の「2.3章サンプルプログラムのビルド」を参照してください。

classification_sample_asyncは分類結果のスコアが高い順に10個のラベルを表示するのですが、今回はOK/NGの2クラス分類のためエラーが表示されてしまいます。
そのため、main.cppの33行目を以下のように修正してビルドしました。
```
33行目： constexpr auto N_TOP_RESULTS = 2;
```

# AE2100へのデプロイ（開発環境側／AE2100側）
ここではAIモデルファイルと推論プログラムをAE2100にデプロイします。
以降の内容は「AE2100 シリーズ SDK 取扱説明書 ―DeepLearning 編―」の「2.4章AE2100へのデプロイ」を参照してください。

開発環境側でディレクトリ（例えば、sample）を１つ用意し、その中に以下のファイルを格納してZIP形式に圧縮してください。
もしzipコマンドが使えない場合は、「apt-get install zip」を実行してzipコマンドをインストールしてください。

* sample.zip
    * model.bin
    * model.xml
    * model.mapping
    * model.labels ※
    * classification_sample_async
    * libformat_reader.so
    * 推論に使用する画像ファイル（例えば、OK_img.png）

※model.labelsは画像分類結果に対応するラベルを記載したファイルです。今回はクラスID：0がOK、クラスID：1がNGとなるように学習したため、1行目にok、2行目にngと記載したファイルを用意しました。

TeraTermなどでAE2100にログインし、上記のZIPファイル「sample.zip」を開発環境からAE2100へ転送します。
転送が行えたら、AE2100上で以下のコマンドを実行し、ホストからコンテナへ「sample.zip」をコンテナ内の/rootディレクトリにコピーします。あらかじめOpenVINO 2022.1.0がインストールされた標準コンテナを起動しておいてください。

```
root@ae2100:~# docker cp sample.zip ubuntu-openvino:/root/
```

コンテナへ入り、zipファイルを展開します。
もしzipコマンドが使えない場合は、「apt-get install zip」を実行してzipコマンドをインストールしてください。

```
root@ae2100:~# docker exec -it ubuntu-openvino /bin/bash
# source /opt/intel/openvino/setupvars.sh
# export LD_LIBRARY_PATH=/root:$LD_LIBRARY_PATH
# cd /root
# unzip sample.zip
# cd sample
# chmod 755 ./*
```

# AE2100での推論実行（AE2100側）
AutoML Visionで学習した画像分類モデルをAE2100上で推論実行します。

以下のコマンドを実行してください。OK_img.pngを以下に示します。

```
# ./classification_sample_async  -i ./OK_img.png -m ./model.xml -d HDDL
```

![OK_img.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2781101/36fd00ee-4546-832b-a2ea-e3b0f7dc6676.png "OK_img.png")

実行すると以下のような結果が出力されます。

```
Top 2 results:

Image OK_img.png

classid probability label
------- ----------- -----
0       0.9526367   ok
1       0.0478210   ng
```

OKのスコアが95%以上となり、正しく分類できているようです。
また、OK_img.pngにペイントソフトで赤線を描画した以下の画像をNG画像として同様に推論させます。
![NG_img.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2781101/6150a34e-a4a6-5fe6-64fa-ced7c7b53da6.png "NG_img.png")

```
Top 2 results:

Image NG_img.png

classid probability label
------- ----------- -----
1       0.8686523   ng
0       0.1312256   ok
```

今度はNGのスコアが87%以上となりました。
今回はお試しで簡単なモデルを使用しましたが、AutoML Visionで学習した画像分類モデルをAE2100で推論できることが確認できました。

# まとめ
今回はGoogle CloudのAutoML Visionで学習した画像分類モデルをAE2100で推論しました。
AutoML VisionではTensorFlow形式でモデルのエクスポートができないため、TensorFlow Lite形式でエクスポートしたモデルに対して、ONNX形式に変換してからOpenVINOのModel OptimizerでIR形式に変換しました。
IRモデルの実行はAE2100の取説に記載のチュートリアルで使用しているOpenVINOのサンプルプログラムを使用しました。

Google CloudのAutoML Visionはモデルの選択等の簡単な設定で自動的にAIモデルを学習をすることができます。
ご自身の学習環境がない場合や学習モデルの設計をしないで学習したい場合は便利なサービスですね。
今回はサンプルプログラムで推論実行をしましたが、ぜひご自身のアプリケーションでも推論実行をお試しください。

# 関連記事
AmazonのAWS（Amazon Web Services）やMicrosoftのAzureのようなクラウドサービスで学習したAIモデルをAE2100にデプロイする方法は以下に掲載されています。そちらの記事も参考にしてください。

* [AWS SageMaker JumpStartで転移学習した画像分類モデルを「AE2100」で推論してみよう](https://qiita.com/shimatak/items/a9935a503e27bb9e5301)
* [Azure Custom Visionで学習した画像分類モデルを「AE2100」で推論してみよう](https://qiita.com/shimatak/items/b2e66b7cc877af08939f)