AITRIOS で AIモデル (Mobilenetv2) をインポートして動かしてみた

こんにちは。
ソニーセミコンダクタソリューションズ の野田です。

AITRIOS では AI モデルとして MobilenetV2 が動きます。
[ドキュメント](https://developer.aitrios.sony-semicon.com/edge-ai-sensing/documents/tflite-import-and-deployment-guide)を参考に実際にどのように使えるのか試してみました。

# はじめに
この記事では、AITRIOS の Developer Edition と エッジデバイス:SZP123S-001 を利用して、画像分類: Classification の AI モデル(MobilenetV2)を AITRIOS 上にインポートしたうえで、実際に SZP123S-001 で撮影+推論を実行し、推論結果のメタデータを Visualization で表示するまでの作業をステップバイステップで紹介します。

**また、2024年6月3日時点の情報に基づいてこの記事は作成されています。**

## 前提

  * こちらの記事では [AITRIOS のデバイスで Object Detection してメタデータを取得してみた](https://qiita.com/SSS-NorimitsuTakahashi/items/3c11544610fcc8f8d4c1) をご覧になった方を前提に説明しますのでまだの方は、先にご覧ください。

  * こちらの記事では [TFLite インポート・デプロイガイド](https://developer.aitrios.sony-semicon.com/edge-ai-sensing/documents/tflite-import-and-deployment-guide) の手順に従い説明をしております。こちらのガイドの内容も併せてご覧ください。

# 手順

## 0. 今回の作業の流れ

1. AI モデルのダウンロード
2. AI モデルのインポート
3. モデルのコンバート
4. デプロイ Config の登録
5. AI モデルのデプロイ
6. Edge Application の登録
7. Edge Application のデプロイ
8. Command Parameter の準備
9. Command Parameter の登録
10. Command Parameter の適用
11. 撮影の準備
12. 推論動作の確認
13. Visualization Tool での推論結果の可視化

## 1.AI モデルのダウンロード

### 実際の手順
[Portal](https://portal.aitrios.sony-semicon.com/) にログインして Console を開きます。

Console のホーム画面    
![01Home.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3725029/d7361828-9da1-856f-a42f-9aaf2fd5c433.png)

AITRIOS では量子化された AI モデルを利用する必要があります。※量子化についてはここでは割愛し今後の記事で説明予定です。

[ドキュメント](https://developer.aitrios.sony-semicon.com/edge-ai-sensing/documents/tflite-import-and-deployment-guide)にリンクのある量子化済の MobileNet V2 を以下からダウンロードします
https://storage.googleapis.com/download.tensorflow.org/models/tflite_11_05_08/mobilenet_v2_1.0_224_quant.tgz

tgz を解凍し、フォルダ内の  mobilenet_v2_1.0_224_quant.tflite を使用します。
![unzip_folder](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3725029/8d0a32ea-12bc-b843-003e-199d2ee7fac0.png)


## 2.AI モデルのインポート
Console 画面左のメニューリストから Create model を選び、画面上部の import をクリックすると以下のようなダイアログが表示されるので以下のように tflite ファイルを登録します。   
![ImportAIModel2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3725029/db2ee74b-0f37-0a89-533a-493bdb799411.png)   

Model ID は "MobilenetV2"としました。
![ImportAIModel2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3725029/5e8ab98c-aa4e-d962-ea61-953f2154a5c6.png)

今回はローカルからアップロードするので Import Model は Local import を選択しました。
Import from Link で Azure Blob Storage を使用してアップロードする場合はドキュメントを参照して下さい。
他は Default 設定のままで大丈夫です。

## 3. モデルのコンバート
インポートしたAIモデルを、エッジAIデバイスにデプロイ可能な型式にコンバートする必要があるので、以下の右下にある Convert ボタンをクリックします。            
![convert_aimodel](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3725029/e5d34a54-42c7-4e24-8fe7-5ca553550862.png)
Convert が始まると、Status が "Converting"になります。
Convert 自体は 5分程度かかりますのでしばらくお待ちください。
Convert が終了すると Status が "Add to configuration complete"に変わります。自動では Status が変わらないので、画面上部の Reload をクリックして確認してください。


## 4. デプロイ Config の登録
Console 画面左のメニューリストからDeploy to deviceをクリックし画面上部の New Config をクリックすると、以下のようにダイアログがでてくるので Name を入力し、Select DNN Model に先ほどConvert した AI Model を選択して config を作成します。
![config_aimodel](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3725029/5ea61e55-6d2c-c7dd-9275-89e06954a5e1.png)
Select DNN Model 以外はエッジデバイス内の FW なので今回は None のままで大丈夫です。

## 5. AI モデルのデプロイ
画面上部の Deploy ボタンをクリックすると以下のようにダイアログが表示されるので、デプロイするエッジデバイスを選択し先ほどConvert した AI Model をデプロイします。
![deploy_aimodel](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3725029/7f173374-cc26-f3cf-38be-38e2faa8d2c3.png)
![deploy_aimodel2](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3725029/157d33b0-91d7-f10a-1ef9-b80c3b42ce6c.png)
注意：既に４つ AI モデルがデバイス内に入っている場合は Error になるので、「Replace other AI Model」にて不要なAIモデルと入れ替えてデプロイしてください。
デプロイ状況はManage deviceメニューの詳細情報エリア (Status - Deployment) より確認できます。
StatusがSuccessになるまで約5分かかりますのでしばらくお待ちください。自動では Status が変わらないので、画面上部の Reload をクリックして確認してください。

## 6. Edge Application の登録
次に、Edge Application (ドキュメント内では VnS Applicationと呼んでます)をデプロイしていきます。
[Developer Site for AITRIOSのDownloadsページ](https://developer.aitrios.sony-semicon.com/edge-ai-sensing/downloads)
にログインの上、Sample Classification Edge App V1.1.2を ダウンロードして zip を解凍します。
解凍したフォルダ内のsample_classification_edge-app_v1.1.2.wasm を使用します。
AITRIOS | Console の左ペインにある Settings を開き Application タブを選択し画面下部の Import をクリックし 事前にダウンロードした sample_classification_edge-app_v1.1.2.wasm を選択し Edge Application を登録します。
![import_edgeapp](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3725029/70422288-8702-50c3-733e-94243b4c7635.png)
今回登録したのが wasm ファイルのため、エッジデバイスで利用できるように Console 内で自動的にコンパイルが行われます。
Status が Proccesiing から Ready に切り替わると利用可能となります。
約5分程度かかりますのでしばらくお待ちください。自動では Status が変わらないので、画面上部の Reload をクリックして確認してください。

## 7. Edge Application のデプロイ
左ペインの Deploy to Device から Application タブを選択し、先ほど登録した Edge Application をデプロイします。    
![DeployToDevice.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3725029/6b0203b5-29e8-326d-5215-925b4ac50d98.png)

デプロイ状況はDeploy下側のStatus表示エリアで確認できます。

## 8. Command Parameter の準備
Command Paraetetr の json ファイルを準備します。
```json
{
    "commands" : [
        {
            "command_name": "StartUploadInferenceData",
            "parameters": {
                "ModelId": "MobilenetV2",
                "Mode": 1,
                "UploadMethod": "BlobStorage",
                "FileFormat": "JPG",
                "UploadMethodIR": "MQTT",
                "PPLParameter":{
                    "header" :
                    {
                        "id" : "00",
                        "version" : "01.01.00"
                    },
                    "dnn_output_classes" : 1001,
                    "max_predictions" : 5
                },
                "CropHOffset": 0,
                "CropVOffset": 0,
                "CropHSize": 4056,
                "CropVSize": 3040,
                "NumberOfImages": 60,
                "UploadInterval": 30,
                "NumberOfInferencesPerMessage": 1
            }
        }
    ]
}
```
[ドキュメント](https://developer.aitrios.sony-semicon.com/edge-ai-sensing/documents/tflite-import-and-deployment-guide)の Command Parameter 例の ModelId は "mobilenet_v2" になっています。    
  "ModelId": "mobilenet_v2",    
となっている箇所は今回デプロイした ModelID に合わせて変更する必要がありますのでご注意ください。    
私は "MobilenetV2"という名前で登録したので、上記のように変更しました。

## 9. Command Parameter の登録
先ほど準備した Command Parameter file を Settings の CommandParameter から Import します。         
  ![import_comparam](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3725029/91701407-7780-1b94-75b0-e1ae0b0a189a.png)

## 10. Command Parameter の適用
画面左のメニューリストからManage deviceをクリックし画面右の詳細情報/操作エリアの Settings エリアを展開し、Command Parameter File エリアから先ほど登録した Command Parameter を選択の上 Bind します。    
![Bind.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3725029/75509ca6-d009-1183-7ef4-3f2df02b7cd8.png)

## 11. 撮影の準備
今回ダウンロードしてもらった MobileNetV2 では ImageNet の画像分類が可能です。
ImageNet の[ラベルリスト](https://gist.github.com/yrevar/942d3a0ac09ec9e5eb3a)の中から画像分類したい画像を選びます
今回は、魚の分類として、金魚(Goldfish)とサメ(Tigershark)の分類を試してみたいと思います。
金魚(goldfish)とサメ(tiger shark)の画像を準備（プリントアウトする、画面に表示する等）しておきます。
今回はディスプレイに表示できるように準備しました。

## 12. 推論動作の確認
エッジデバイスを金魚の画像を写したディスプレイに向けた状態で画面右下にある「Get Inference Data」トグルをONにして推論撮影を行います。
![getInference.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3725029/6f4cfff8-87ef-bc50-cbc2-302f3d85275e.png)

その後、[Check data] の [Image] と [Meta Data] にデータが保存されていることを確認します。
![checkdata_image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3725029/945df4d9-4b0a-b9a0-8db0-b1bbca7e3254.png)
![checkdata_meta](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3725029/379ac22e-5e6a-2296-c7eb-d9a40b5fd5e1.png)

## 13. Visualization Toolでの推論結果の可視化
Visualization Tool を利用して推論結果を確認します。
今回は、推奨されている Github Codespaces を利用して Visualization Tool を動かします。
2023/4/24時点でCodespacesは毎月一定の使用量まで無料で利用することができます。一定を超過した使用は費用が発生します。詳細は[GitHub Docs : GitHub Codespaces](https://docs.github.com/ja/billing/managing-billing-for-github-codespaces/about-billing-for-github-codespaces)の請求について を参照してください。

https://github.com/SonySemiconductorSolutions/aitrios-sdk-visualization-ts/tree/main    
上記の Githubを開き、緑色の [<> Code ] ボタンから + を押します
![github_codespaces](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3725029/1ef28051-51d2-1ec4-c33c-2048eab74b17.png)

しばらくすると Web Browser 上に Visual Studio Code のような画面が表示されます。
![codespaces](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3725029/d20b8299-4d54-9cf1-1d1f-526e5826899a.png)

src/common/
に console_access_settings.yaml
という名前のファイルを作成して、以下を参照の上情報を入力します。

https://github.com/SonySemiconductorSolutions/aitrios-sdk-visualization-ts/blob/main/docs/development-docs/CloudSDK_Tutorial_Visualization_ja.adoc#_Execute_visualization

 - console_endpoint に、コンソールエンドポイントを指定します。
 - portal_authorization_endpoint に、ポータル認証エンドポイントを指定します。
 - client_secret に、登録したアプリケーションのシークレットを指定します。
 - client_id に、登録したアプリケーションのクライアントIDを指定します。

#### Important 
クライアントIDとシークレットの取得方法詳細は、 「[Portalユーザーマニュアル](https://developer.aitrios.sony-semicon.com/documents/portal-user-manual)」 の「SDK用のClient Secretを発行する」をお読みください。
コンソールエンドポイントとポータル認証エンドポイントの取得方法詳細は、[こちらのドキュメント](https://developer.aitrios.sony-semicon.com/file/download/rest-api-authentication) をお読みください。
これらは「Console」へのアクセス情報となります。
公開したり、他者との共有をせず、取り扱いには十分注意してください。

![console_access_settings](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3725029/9103621e-988a-394f-1dbc-7c9d298b500e.png)

### Visualization Tool を 起動する
Codespaces のターミナルに以下のコマンドを入力して実行します。
```
npm run build
npm run start
```

Web Browser 上で右下に以下のポップアップがでて「ブラウザーで開く」を選択すると Visualization Tool が起動します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3725029/3997809d-b513-7f7b-4229-6a2950e809f1.png)

左上で 「Classification」 を選択し、右上から「History Mode」を選択します。
![visualization_top](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3725029/cd9a1e47-6c96-a929-eb09-893f8ec13d62.png)

### ラベルリストの作成
ImageNet の[ラベルリスト](https://gist.github.com/yrevar/942d3a0ac09ec9e5eb3a)の中身をコピーして「Label Setting」に書き込みます。   
ただし今回利用したモデルの場合、0番目のclassとして background を入れる必要があるため、ラベルリストの 0 に background を入れ、それ以外はひとつづつインクリメントしてください。 
```text
0:background
1:tench, Tinca tinca
2:goldfish, Carassius auratus
3:great white shark, white shark, man-eater, man-eating shark, Carcharodon carcharias
4:tiger shark, Galeocerdo cuvieri
5:hammerhead, hammerhead shark
6:electric ray, crampfish, numbfish, torpedo
7:stingray
8:cock
9:hen
10:ostrich, Struthio camelus
```
本来は 11~1001 までの label もコピーが必要ですが、ここでは割愛します。

### 結果の表示
「Device Name」で自分のデバイスを選択して 「Start Playing」をクリックすると以下のように表示されました。
![visualization_goldfish](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3725029/e6756d11-1179-e2f4-04ed-0c705d7a0484.png)
goldfish（金魚） の確率が一番上に表示されました。
ただ、score が 19で 1以上の値になっており 1900% と緑のゲージが枠をはみ出てしまっています。
score が 1 の時に 100% になるはずですので、score が 1以上になるのが原因ですが、これはAIモデルによってScoreの range が異なるため、この Visualization Tool は全ての AI モデルに対応しているわけではないためこのような表示となるようです。
Visualization Tool のソースコードを数か所書き換えることでこのAIモデルに特化した Visualization Tool にもできるようですが、今回の目的とは違ってくるのでここではこのままとします。

2番目は anemone fish(アネモネ)が 875% との結果になりました。
これだけ score がはなれているのであれば、なんとか分類はできそうです。

同じ手順で tiger shark(サメ) を撮影した時は以下のように認識されました。
![visualization_tigershark](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3725029/f4b50d34-2b48-f336-9ffe-a37dfaf8765c.png)
tiger shark（サメ） が1150% で何とか一番上に表示されたものの、great white shark が 1100% や hammershark が 1000% などサメ関連が上位を独占しました。
近い種類の場合は、画像分類するのも工夫が必要そうです。

ということで、MobileNetv2 を AITRIOS で利用することができました。
長い記事になりましたがお付き合いいただきありがとうございました。

## 困った時は
もし、記事の途中でうまくいかなかった場合は、気軽にこの記事にコメントいただいたり、以下のサポートのページもご覧ください。
コメントのお返事にはお時間を頂く可能性もありますがご了承ください。
- [Support(FAQ)](https://developer.aitrios.sony-semicon.com/edge-ai-sensing/support)


また、記事の内容以外で AITRIOS についてお困りごとなどあれば以下よりお問い合わせください。
- [Contact Us](https://developer.aitrios.sony-semicon.com/edge-ai-sensing/contact-us)

## さいごに

今回はAITRIOSのDeveloper Siteで公開されているドキュメントを参考にしながらAIモデルの Import から画像分類の結果表示まで試してみました。  
また、MovileNetV2以外の AI モデルも量子化やメモリサイズなどの条件を満たせばAITRIOSで利用できます。
今後、様々な AI モデルを AITRIOS で利用する内容の記事や AITRIOS で利用できる AIモデルの作り方なども記事化していければと思います。
長い記事となりましたが改めて、見ていただきありがとうございました！