Local Edition (v1.2.2, v1.3.0) 触ってみた！！

:::note alert
**2024/11/30 現在、Local Edition は v1.4.0 が公開されています。**

**この記事で紹介している v1.3.0 以前からは大幅にUIやインストール手順が変わっているため、v1.4.0 以降をお使いの方は本記事を参考にしないようお願いいたします。**
:::

---

こんにちは！  
SSS の高橋です。

Local Edition という、ブラウザを利用せずにローカルPCの環境で AITRIOS のデバイスを動かせるソフトウェアが新しくリリースされたので触ってみました。  
Local Edition については以下を参照してください。  

https://www.aitrios.sony-semicon.com/news/local-edition-released/

https://www.chip1stop.com/sp/solution/aitrios-sony

上記ページでも紹介されていますが、Local Edition の特徴を簡潔に箇条書きでまとめると以下のようになるかなと思っています。

* 個人でもすぐに利用が可能
* Windows PC とデバイスが直接接続されるので、データをインターネットに送信しなくてよい
* AI モデルの作成や、デバイスの制御や、推論結果の表示がより直感的にわかりやすく行える

下記の画像は左が Local Console と右が Local Studio (Brain Builder) ですが、Local Console では推論結果がバウンディングボックス付きですぐに確認できるのが素敵で、Local Studio は AI モデルを非常にわかりやすく作ることができます。

<img width="318" alt="Local Console" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3724982/7fa9c229-4a4c-febd-d6e6-a1fd4e3cdf7d.png">
<img width="350" alt="Local Studio (Brain Builder)" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3724982/d563921a-ef5a-542b-6dc7-0ebb13069562.png">

# 前提
:::note info
こちらの記事は **2024/09/30** の情報をもとに執筆されています。

今後のアップデートでUIが変わる可能性があるのでご注意ください。
:::

:::note warn
**(追記) 2024/10/02**
記事を書いている途中に新しいバージョンが出たので、追って修正します🙇‍♂
v1.3.0では、ファームウェアの更新が簡単になっているようです！
:::

## Local Edition とは？
Local Edition とは下記のソフトウェア群の名称です。
* **Local Console**: カメラとの接続や、推論、ファームウェア更新、AI モデルや Edge Application のデプロイを担うソフトウェア
* **Local Studio** (Brain Builder): 画像をもとに、Classifier と Object Detection の AI モデルを作成するソフトウェア / Local Studio はPC で AI モデルを作成するツール群の総称で、現在は Brain Builder がツールとして存在している
* **Converter/Packager**: AI モデルを AITRIOS のデバイス向けに変換するソフトウェア

ブラウザ上で動作する Developer Edition の、まさにローカル版のソフトウェアになります。

## 準備するモノ
::: note warn
**【最も必要なもの】**
* **管理者権限があり**
* **WSL の Ubuntu (22.04) が利用でき**
* **ファイアウォール(FW)が制御できる** (inboundの1883ポート)
* **Windows 10 か 11 の PC**
:::
* CSV26 (有線/PoEモデル) もしくは AIH-IVRW2 (Wi-Fiモデル)
  * この記事は有線モデルの CSV26 を対象としています
      * **そのため、Wi-Fiモデルをご利用の方は接続方法や、ファームウェアのバージョンがこの記事の記載と違うのでお気を付けください**
* Local Studio 一式
  * 各販売店様よりご購入いただくとダウンロードリンクが提供されます
  * **本記事は V1.2.2 (2024/08/31 最新)  を利用しています**
* Brain Builder のソフトウェアライセンス
* (CSV26の場合) PoE スイッチ、インターネットと接続できる回線(NTPのため)、LANケーブル
* (あるとトラブル発生時に助かるかも) ポートミラーリングができるスイッチと Wireshark

上記に加えて、**WSL や Python を少しでも触ったことがあることが望ましいです**。

# 本チュートリアルの作業の流れ
```
1. Local Console をインストールする
2. カメラを接続する
3. カメラのFWを更新する
4. Brain Builder をインストールする
5. Brain Builderでモデルを作る
6. Converter / Packager をインストールする
7. Brain Builder で作ったモデルを変換する
8. AI モデルと Edge App をデプロイする
9. 推論の下準備
10. 推論をする
11. メタデータをデシリアライズする
```

# 本文
## Local Studio をインストールしよう (チュートリアル:"2.1. Installing Local Console")
まずは Local Studio の zip をダウンロードし、解凍します。
中身はこのようになっています

![1_zip.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3724982/0ef5388f-18d6-b08b-df62-29ac6f45420d.png)

"Local Console"フォルダ内の local-console-setup.exe を実行します。

特にこだわりがなければそのまま続行。

![3_lcinstalllocation.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3724982/c046a468-3767-912b-67ff-3a4c527bface.png)

ユーザーアカウント制御(UAC)を有効にしている場合には、PowerShellのポップアップが出てくるので"はい"を選択。

![4_lcinstalluac.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3724982/6bf78f07-b43e-c071-312a-e2d710f89721.png)

インストール中では以下のソフトウェアがインストールされていなければインストールされます。
* Mosquitto
* Git
* Python 3.11

続いて、whlファイルでLocal Consoleがインストールされます。
その際に環境によってはもう一度PowerShellの実行許可画面が出るので、"はい"を選択します。
これでLocal Consoleインストール完了です。

デスクトップのショートカットファイルが作られているはずなので、ダブルクリックで起動したら成功です。
下の画像が、Local Console の**メインメニュー**です！
![5_lc.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3724982/b5f29f69-0558-275d-5eeb-d5a7968c0fcd.png)


## カメラを接続してみよう (チュートリアル: "3.1. Installing the Edge Device")
まず、PoEスイッチングハブに電源を入れ、ハブにインターネットに接続できる回線、CSV26、PCを接続します。
*※ 同じLAN内であればPCは有線ではなくWi-Fiでも問題ありませんが、できればデバイスと同じ通信環境のほうが何か問題があったときにデバッグできるので良いかもしれません。*

デバイスやPCを接続したら、まず PC がインターネットに接続できるかをGoogle等で検索して確認し、回線の有効性を確かめます。
続いて、カメラが QR コード読み取りモードになっているか、つまり Power LED がオレンジ色に点滅しているかを確認します。

そして、Local Consoleを起動し、`Connection` を選択します。

このとき、Powershell やコマンドプロンプトを起動し、`ipconfig` で PC の IP(v4) アドレスを確認します。 (今回の場合は `192.168.11.24` )

![6_ip.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3724982/e738dc69-4236-90f3-7f2d-4ffa0b65e8b0.png)


Local Consoleに表示されているIPアドレスが `ipconfig` で確認した情報と等しいかを確認して `Generate` を押し、QR コードを生成します。

::: note
Wi-Fi モデルのデバイスをご利用の方は Wi-Fi の SSID と Password の入力を忘れないように!
:::

![7_generateqr.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3724982/1ff60792-ed29-2946-634c-92a947ab285b.png)

QR コードの読み取りにはコツがいるので、ぜひ下の記事を参照してください。  
https://qiita.com/SSS-keijimorikawa/items/240e6243eb9178c59457  
`Local Console` のウィンドウを最大化し、QRコードを大きくするとカメラから読み取りやすいです。

カメラが QR コードを読み取り、`Connection Status: Connected [No TLS]` になったら Local Console とデバイスの接続が成功です！

Local Console のホームに戻り、`Streaming` → `Start Streaming` でカメラからの映像が映れば成功です。

![8_stream.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3724982/29c72a0a-746c-d7b7-16b5-da3e5cc0a612.png)

映ったことを確認したら `Stop Streaming` をクリックします。

続いて次のステップのために、デバイスのファームウェアのバージョンを確認します。
ホームに戻って `AI Model` でFWの情報を確認できるので、メモ帳などにコピーして保存しておきましょう。

```
■ 例

{
    "OTA": {
        "SensorFwLastUpdatedDate": "",
        "SensorLoaderLastUpdatedDate": "",
        "DnnModelLastUpdatedDate": [],
        "ApFwLastUpdatedDate": "20240624062554",
        "UpdateProgress": 100,
        "UpdateStatus": "Done"
    },
    "Version": {
        "SensorFwVersion": "010500",
        "SensorLoaderVersion": "020301",
        "DnnModelVersion": [],
        "ApFwVersion": "0700F8",
        "ApLoaderVersion": "010301"
    }
}
```

Local Console は開いたままにしておきましょう。

## カメラのFWを更新しよう (チュートリアル: "3.4. Updating the firmware")
引き続き Local Console の `Connection` で、接続状況が `Connected [No TLS]` であるかを確認しましょう。

最初に解凍したフォルダの中の `EdgeDeviceFW` フォルダを開き、`SZP123S-001_20240607_00_0700F9_010707_020301.zip` を解凍し、展開されたフォルダを開きます。

:::note 
以下、このフォルダ※を **☆** とします。
※ `Local_edition_1.2.2\EdgeDeviceFW\SZP123S-001_20240607_00_0700F9_010707_020301`
:::

:::note warn
Local Editionのバージョンが更新された場合、ファームウェアが更新されている可能性があるので、以下はご自身がダウンロードしたものに合わせて読み替えてください。

また、この記事は有線モデルの記事なので、Wi-Fiモデルの場合にも同様に読み替えてください。
:::

☆のフォルダ内の `version.txt` を開いて、先にメモしたデバイスのファームウェアの JSON と見比べましょう。
* **ota.bin(ApFwVersion)**: 0700F9 かどうか
* **firmware.fpk(SensorFwVersion)**: 010707 かどうか

もし、バージョンが違えばファームウェアのアップデートを実行します。

もう一度念のため PowerShell などで `ipconfig` を実行し、自分の PC の IP アドレスをメモします。
今回の私の環境であれば `192.168.11.24`ですが、以下、`192.168.11.24` はご自身の環境に置き換えてください。

☆のフォルダをエクスプローラーで表示し、何もないところで Shift を押しながら右クリックし、`Open Git Bash here` を選択
Git Bashをスタートメニューなどから普通に起動して、☆に移動してもらってもOKです。

![11_opengitbash.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3724982/0293314e-e38f-eb61-1ff0-6294effc1ef3.png)

Git Bash を開いたら、念のため `python --version` で Python が実行できることを確認しましょう。
```
(例)
$ python --version
Python 3.11.9
```

実行できた場合には、`python -m http.server 8000 --bind {IPアドレス}` を実行し、サーバーを起動します。
```
(例)
python -m http.server 8000 --bind 192.168.11.24
```
上記を実行しても特に何も表示されませんが、それでOKです。
上記コマンド実行後に、ブラウザ(chromeなど)で http://192.168.11.24:8000 にアクセスします。
以下の図のように `Directory listing for /` が出てくればOKです。

![12_fwserver.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3724982/de7fd683-7369-0eea-d47e-9fad263e1d50.png)

続いて、Local Consoleがインストールされているフォルダを開きます。
開き方ですが、デスクトップ上のLocal Consoleのアイコンを右クリック→`プロパティ`→`ファイルの場所を開く`、フォルダを開くことができます。

![13_lclocation.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3724982/0010409c-0a6d-9f4d-b6d1-56dbc4db92f6.png)

インストール場所を変更していなければ、以下のディレクトリのはずです。
`C:\Users\{お使いのユーザー名}\AppData\Local\Programs\LocalConsole\virtualenv\Scripts`

上記のフォルダを開いた後、再度何もないところで Shift+右クリックで "Open Git Bash here" を実行します。
もちろん普通に起動してこちらに移動してもOKです。

Git Bash を開いたら `source ./activate` を実行します。
`(virtualenv)` のように表示されればOKです。
続いて、`local-console config set webserver port 8000` を実行します。
もし、サーバーを起動した際に `8000` 以外のポートを選択していれば `8000` をその数字に変更してください。

上記コマンドが実行できた場合には、以下のコマンドを順次実行し、2種類のFWを更新します。
重ねてになりますが、`192.168.11.24` と `8000` は随時自分の環境に合わせて変更してください。

:::note warn
本記事では PoE モデルを利用しましたが、Wi-Fi モデルを利用の方は以下のコマンド中の `DesiredVersion` や `HashValue` が異なるので、マニュアルを参照してください。
:::
```
[AppFwの更新コマンド]
local-console config instance backdoor-EA_Main placeholder '{"OTA": {"UpdateModule": "ApFw", "PackageUri": "http://192.168.11.24:8000/ota.bin", "DesiredVersion": "0700F9","HashValue": "5qN7ABQzaNldKdVJer70SRLHjteyMbx4AKKvb7pIr7I="}}'

[SensorFwの更新コマンド]
local-console config instance backdoor-EA_Main placeholder '{"OTA": {"UpdateModule": "SensorFw", "PackageUri": "http://192.168.11.24:8000/firmware.fpk", "DesiredVersion": "010707", "HashValue":  "kft4VHlEqtGA7Gpyu4Cs0PZNgWC09teH1IVM+g4NPAI="}}'
```

更新状況はLocal Consoleのホーム→ `AI Model` から確認可能です。
`(Downloading -> Updating -> Done)`
AppFw の更新が終わってから (UpdateStatusがDoneになってから) SensorFw の更新を実施しましょう。

更新が完了したら `python -m http.server 8000 --bind {IPアドレス}` を実行していた Git Bash を再度開いて、`Ctrl+C` を押してサーバーをシャットダウンしましょう。

最後に念のため Local Console の `AI Model` より、ファームウェアが更新されたことを確認しましょう。

## Brain Builder - Classifier/Detector for AITRIOS をインストール、モデルを作成(チュートリアル:"2.3. Installing Brain Builder - Classifier/Detector", "Chapter 4. Creating an AI model and converting it to a packaged AI model")
Local Edition に同梱されている Brain Builder は、Classification と Object Detection 用の AI モデルを、手持ちの画像を利用して作成するツールです。

### Brain Builder のインストール、ライセンス管理用の CodeMeter のインストール
それでは Brain Builder のインストール方法を説明します。
`NeuralaVIA-Sony-BrainBuilder-CPU-24.05.1-amd64.zip` を解凍し、`NeuralaVIA-Sony-BrainBuilder-CPU-24.05.1-amd64.exe` を実行します。
もし再度、`WindowsによってPCが保護されました` が表示された場合には、`詳細情報` -> `実行` でインストールを開始できます。利用規約等にチェックを入れて実行します。インストールには少し時間が掛かります。

Brian Builder の実行にはライセンスが必要です。
Local Edition には評価用のライセンスが同梱されており、製品版のライセンスは別途ご購入いただけます。

どちらのライセンスを利用する場合でも、ライセンス管理ソフトウェアである `CodeMeter` が必要になるので、まずはこちらをインストールします。

まずは以下のリンクから `CodeMeter` をダウンロードします。
https://www.wibu.com/support/user/user-software.html#CodeMeter_User_Download
"CodeMeter User Runtime for Windows" の最新版をダウンロードします。

![14_codemeter.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3724982/27bc4b67-ea79-1f54-c68c-fe63ec48ccca.png)

ダウンロード後に `CodeMeterRuntime.exe` を実行しインストールを実行します。

![15_cminstall.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3724982/6c9517f1-0055-f8e4-2c1e-0c1a22e2aab5.png)

スタートメニューを開き、"CodeMeter Control Center" と入力して `CodeMeter` を起動します。

![16_cm.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3724982/8679a47d-e0ee-43df-dd9d-cbf0f555d049.png)

ライセンスを購入済み場合には同梱チュートリアルの P9 に合わせて実行します。
同梱されている試用版のライセンスを利用する場合には、"BrainBuilder_TrialLicense" 内のファイルを `CodeMeter` のウィンドウにドラッグアンドドロップし、ライセンスが有効化されます。

:::note warn
今回私が利用したのは社内用のライセンスのため、以下の画像とは表記が異なる可能性があります。
:::
![17_cmlisence.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3724982/8c723d4d-cb2f-e798-2343-e1e64b7faec9.png)

ライセンス有効化後に、デスクトップにある `Brain Builder` を起動します。
アカウントを作成していなければ `アカウントの作成` をクリックしてアカウントを作成します。

![18_bblogin.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3724982/be6a6225-2041-fbce-63f0-e4b317760532.png)

`プロジェクト`の画面が表示されたら無事 Brain Builder の起動です！

![19_bb.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3724982/d63ef014-5a11-ec99-8b7b-fc5cb3913d03.png)

### Brain Builder を利用しての AI モデルの作成

この章の冒頭でご案内したとおり、Brain Builder を利用すると Classification と Object Detection の AI モデルを、手持ちの画像から作成できます。
Classification は入力した画像が何であるかを推論した結果を出力するモデルで、Object Detection は学習させた対象が、画像のどの位置に存在しているかを出力するモデルです。
今回はシンプルな Classification を例にご案内します。

起動時の画面の右上の `プロジェクトを作成` をクリックし、プロジェクトの名前を入力し、`データセットの作成` をクリックします。
![8_1_dataset_create](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3724982/e688cf13-69f3-1240-2bf5-44d4d915ea46.png)
![8_2_dataset](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3724982/d38b5a70-5e36-c0b8-ff78-dd7910a43190.png)

画像は、判別対象 1 つごとに、少なくとも 20 枚以上準備しておく必要があります。
データセットがない場合には、Kaggle アカウントを作成の上、同梱チュートリアルの p.22~23 のデータセットを利用してもよいでしょう。

続いて、画像を Brain Builder に取り込み、その画像に対してタグ付けを実施していきます。
タグ付けとは、Classifier のモデルを作るにあたって、その画像が何であるかをあらかじめ指定することです。
その情報をもとに学習を行うことで、対象の画像が何であるかを出力できる AI モデルが作成されます。

この例の場合、鍵が掛かっている画像には"Locked"、開いているものは"Open"というタグを付けました。
Brain Builder では、Classifier の学習をする際には、zip でまとめた画像に一括で同じタグをつけることが出来ます！



![8_3_dataset_files](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3724982/87439134-bf16-c291-485e-73bbc1cb55d3.png)
![8_4_select_dynamic_or_static](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3724982/986639bd-0f4f-5b6f-06bf-d1f0904294ed.png)
![8_5_upload_images](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3724982/56455dda-7d33-31ae-6af0-d2e6149766f9.png)

学習用の画像のアップロードが終わり、タグ付けが終わるとこのようになります。動的学習を選択したので、ただアップロードしただけですが、学習用とテスト用に画像が分けられましたね。便利！

![8_6_dynamic](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3724982/7a7735f5-3f78-0293-1e01-eff2dfb28a77.png)

画像をアップロード、タグ付けが終わったので続いて学習です。
長く学習するほどモデルの精度が上がることが期待されますので、皆さんの準備できる時間に合わせて選択しましょう。


![8_7_learning](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3724982/f5339df0-127c-baa2-e04a-10a4c2902a09.png)

学習が完了すると、このように学習結果が表示されます。わかりやすいですね！

![8_8_result](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3724982/57d135d9-0b16-c3f7-2332-6bf0de263d94.png)

学習が終了したので、ついに AI モデルを生成し、ダウンロードします。
Learning Classifier と Static Classifierがありますが、今回は Static Classifier を利用します。
この 2 つの違いについては、英語になりますが以下をご参照ください。
[Training Classifiers and Anomaly Recognizers](https://support.neurala.com/docs/training-classifiers-and-anomaly-recognizers)

Static Classifier から AI モデルが入った zip ファイルをダウンロードできるので、それをダウンロードします。
その zip ファイルを解凍すると {プロジェクト名}.zip (以下の図の場合には `key.zip`)が含まれているので、それをさらに解凍すると AI モデルである tflite ファイルがあります。
この tflite ファイルを `Converter/Packager` で変換することで、AITRIOS のデバイスで利用できるようになります。

![8_9_download](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3724982/cfef06a9-154d-8715-2ee3-06c42367fc1b.png)

![8_10_ai_model_files](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3724982/354c45bf-4687-0d46-970f-33cec69e8c33.png)

ちなみに、同梱されている `Labels.txt` も重要で、いくつの対象を検出できるのかの情報であり、こちらのファイルも後々利用するので頭の片隅に置いておきましょう。

いずれにせよ、これでモデル作成完了です！

## Converter/Packager をインストール(チュートリアル: "2.2. Installing ConverterPackager")

Converter/Packager とは、AI モデルを AITRIOS のデバイスで利用可能な形式に変換するツールです。
WSL の Ubuntu 22.04 上での動作を推奨しているので、それに倣ってインストールします。

### WSL のインストール、および起動
まず、WSL の Ubuntu 22.04 がインストールされていない場合にはインストールします。
この記事では WSL のインストールについての詳細は説明しませんが、以下のような記事が参考になります。
https://zenn.dev/sunazukin/articles/8fe49e9dee7b7c
https://www.kkaneko.jp/tools/wsl/wsl2.html

インストール完了後にスタートメニューから Ubuntu を起動します。
もしくは、PowerShell などから wsl と入力して起動します。
複数のディストリビューションを利用している場合などには wsl -d {ディストリビューション名} で起動しましょう。

:::note warn
※ すでに WSL を利用している場合には、Converter/Packager のインストールの途中で PythonやOpenJDKをバージョンを指定してインストールするため、Export&Import で別環境を作って作業したほうが良いかもしれません

(参考)
https://qiita.com/koji_hattori/items/1480d25aca8cdf5ac4a1
:::


### Converter/Packager インストール作業
チュートリアルの以下の箇所を実行していきます。

![9_convpack_man1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3724982/3e271fa3-5bee-67ca-b43c-dacd5f641777.png)
![10_convpack_man2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3724982/7700c7a0-1d06-5072-d34f-57c181b66015.png)

まずは、以下を1行ずつ順番に実行し、Converter/Packagerに必要なソフトウェアをインストールします。
既に Python や OpenJDK などをインストール済みの場合には必要に応じて変更いただいてもよいかもしれません。
```
sudo apt-get update && sudo apt-get upgrade -y
sudo apt-get install -y python3.10 python3-pip unzip unrar
sudo apt-get install -y csh wget zip openjdk-17-jdk musl jq bc
```

上記インストールが終了したら、一度 Windows 側に戻って、この記事の一番最初に解凍したフォルダ内の `ConverterPackager` 内の `ConverterPackager_v1_0_2.msi` を実行します。
Local Console や Brain Builder のインストールと同様に、発行元についてのポップアップが出現した場合には、再度詳細情報 → 実行 をクリックします。
`Next` などを押して進めつつ、"Install ConverterPackager_v1.0.2 to:" を
`"\\wsl.localhost\{ディストリビューション名}\home\{Ubuntuのユーザー名}"`
に変更し、先ほど起動した Ubuntu 内にインストールします。
`例: \\wsl.localhost\Ubuntu\home\miso`

インストールが完了したら Ubuntu に戻り、`cd ~` で、homeディレクトリに移動し、`ls -l`で `ConverterPackager_v1_0_2` フォルダがあることを確認します。

![20_checkCP.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3724982/cc2ecf4c-1993-224b-9527-510e6e795106.png)

その後、以下の操作を実行します。

**※ homeディレクトリで作業したくない、などの場合には、適宜ディレクトリを変更してください。**

```
[インストールフォルダをひと階層変更し、内部のzipファイルを解凍]
mv ./ConverterPackager_v1_0_2/* ./
unzip FPK_Packager_v010001_for_ubuntu.zip
unzip PostConverter_v020400.zip
unzip SDSP_converter_v3_11.zip

[AI モデル変換プログラムをインストール]
python3 -m pip install SDSP_converter_v3_11/uni/uni_model-4.0.0-py3-none-any.whl
python3 -m pip install SDSP_converter_v3_11/ConvPy/convpy-3.11.0-py3-none-any.whl

[実行ファイルに実行権限を追加、PATHを追加]
chmod +x tflite2pkg.sh
cd SDSP_converter_v3_11/sdspconv && chmod a+x sdspconv
echo "PATH=\"$(pwd):\$PATH\"" >> ~/.profile
cd
. .profile
```

ここまで終了したら、念のため PATH が通っているか確認するとよいでしょう。以下のようなエラーメッセージが出力されれば成功です。
```
~$ sdspconv
2024-07-05 11:50:36,525 ERROR: CODE: [NPE] Null parameter exception: No network parameter is defined. It can be supplied either by CLI option '--network' or as a field in configuration file
```

これで tflite 形式の AI モデルを変換する `Converter/Packager` のインストールが完了しました！

## Brain Builderで作成したモデルを変換する (チュートリアル: "4.3. Running ConverterPackager")
この作業の概要は、`Brain Builder` で作成した tflite ファイルを、Ubuntu 側にコピーして変換して戻す、という流れです。

Ubuntu へのコピー方法として、チュートリアルでは Windows の Explorer を使えばよいとあります。
それでもいいのですが、以下の方法もあるので紹介します。

まず、`Brain Builder` で作成したモデルを Ubuntu の Home ディレクトリにコピーします。
Ubuntu 側からは Windows の C ドライブは `/mnt/c` で参照可能です。
```
[例: Windowsのダウンロードフォルダに存在している tflite ファイルを Ubuntu のホームディレクトリに移動]

cp /mnt/c/Users/Miso/Downloads/key-imx500/key-imx500/key/e8c25c10-bd62-494c-9a24-84dd9ade07ff.neubrain.tflite ~/
```

コピーしたら変換スクリプトを実行
```
cd ~
./tflite2pkg.sh -i ./e8c25c10-bd62-494c-9a24-84dd9ade07ff.neubrain.tflite
```

終了したら中身を確認します。
```
$ ls ./package_output/ -l
total 5928
drwxr-xr-x 5 miso miso    4096 Jul  5 12:03 intermediate_outputs
-rw-r--r-- 1 miso miso 3026976 Jul  5 12:03 network.fpk
-rw-r--r-- 1 miso miso 3027888 Jul  5 12:03 network.pkg
-rw-r--r-- 1 miso miso     912 Jul  5 12:03 network_info.txt
```

`network.pkg` が変換後の AI モデルなのでそれを Windows 側にコピーします。
`network.pkg` だとわかりづらいので、名前を変えてもよいかもしれません。
```
$ cp ./package_output/network.pkg /mnt/c/Users/Miso/Downloads/work/Local\ Studio\ for\ AITRIOS\ v1.2.0/key_lock_open.pkg
```

これで、Windows 側に変換後(`pkgファイル`)の AI モデルを設置できました！


## AIモデルとEdge Appをデプロイ (チュートリアル: "Chapter 5. Deploying packaged AI model and Edge Application")
さて、AI モデルの準備もできたので、実際に AI モデルと Edge App をデバイスにデプロイしていきます。

まず、Local Console を改めて開きます。
まだ接続されていればそのままで、もし接続が切れている場合には QR コードの読み取りを実施します。

デバイスが接続された状態で、Local Console の `AI Model` を開き、先ほど変換した AI モデル(.pkg)を選択してから `Deploy` をクリックします。

AI モデルのデプロイが終了したら、続いて Edge App をデプロイします。
デプロイする Edge App は `Classification` と `Object Detection` で異なります。
その 2 つの Edge App は、`Local Studio for AITRIOS v1.2.0` フォルダの `EdgeApp` 内にある以下の2つです。
* vision_app_classification_v1.1.2_signed.aot
* vision_app_objectdetection_v1.1.2_signed.aot

Edge App のデプロイ方法は、Local Console の `Applications` を開き、`Classification` か `Object detection` の aotファイルを選択し、`Deploy` をクリックです。

:::note warn
もし、AI モデルや Edge App の Deploy に継続して失敗するようであれば、一度 Factory Reset をしてみると良いかもしれません。
Factory Reset をするには、カメラのリセットピンを 30 秒押します。Factory Reset後に、QR の読み取りやファームウェアの更新から再度実行してください。
:::

## 推論前の各種準備 (チュートリアル: "Chapter 6. Classifier inference setting, execution, and check")
いよいよ推論、、の前に、推論時の各種設定を行います。

まず、Local Console の `Configuration` を開きます。

### 保存場所の設定
推論に当たってはカメラから画像と推論結果を出力できますが、その保存先を指定できます。
`Image dir` と `Inference dir` を好きなところに設定しましょう。

### `Application configuration` について
#### `Type:`
`classification` か `detection` の、今回 AI モデルや Edge App で選択したほうを選択します。
自作のモデルなどの場合には `custom` を選択してもよいです。

**① Schema**
デバイスからの推論結果のメタデータは、Flatbuffers でシリアライズされたうえで、BASE64 でエンコードされています。
なので、推論結果を人間が読めるようにするには、BASE64 でデコードの上、デシリアライズが必要になります。

デシリアライズに必要なのが Flatbuffers のスキーマファイル(`fbsファイル`)なので、その場所を指定します。
`custom`以外を選択している場合、それぞれのモデルに合ったスキーマファイルが自動的に設定されます。

なお、`Edge App` フォルダ内に `classification.fbs` と `objectdetection.fbs` が存在しているので、出力された推論データを活用する際にはこれらのファイルを利用して推論結果をデシリアライズする必要があります。
Local Console がデバイスから出力される推論結果を、自動的に BASE64 デコードとデシリアライズするわけではないので注意しましょう。

**② Configuration**
どの AI モデルで、どのように推論を実施するかの設定をする必要があります。
これも `Edge App` フォルダ内に `ClassifierPPLParameterSample.json` (Classification用) と `DetectorPPLParameterSample_v1.0.1.json` (Object Detection用) が存在するのでそれを指定します。

推論結果に含める推論結果の数 `(例: Classification であれば、画像が何であるかの確率が高い上位n個)` を変えたい場合などには、適宜各jsonファイルをもとに、自分のjsonファイルを作成し、それを指定しましょう。

:::note warn
dnn_output_classes が AI モデルを作成する際に作成したクラスの数と違うと、デシリアライズに失敗して推論結果が出力されないので注意しましょう。

`(例) りんごとバナナを推定する AI モデルであれば 2 クラス、グー/チョキ/パーを見分けるモデルであれば 3 クラス`
:::

:::note warn
Object Detection の場合、`dnn_output_detections` が 100 でないと推論結果が出力されないため、設定ファイルで 100 となっているか確認しましょう。
:::


**③ Labels**
AI モデルを作成する箇所でも説明しましたが、AI モデルを作った際に、なんというラベルを付けたかの情報である `labels.txt` も出力されます。
デバイスからの出力結果は、`class_id:0` と `score:0.98` で推定される、のような情報のみが出力されますが、`labels.txt` を指定することで、推論結果に `class_name:Apple` のような情報が追加され、より分かりやすくなります。

---

ここまでの全てを指定したら `Apply Configuarion` をクリックし、設定を適用します。

## 推論 (Classificatoin: "Chapter 6. Classifier inference setting, execution, and check"、Detector: "Chapter 7. Detector inference setting, execution, and check")

ついに推論を実施できます！

まず、Local Console のホームに戻って `Inference` を選択し、`Start Streaming` をクリックします。
以下の画像のように、デバイスからの画像と、推論結果が人間にも読めるように出力されれば成功です！
例は、家の鍵が開いているか閉まっているかを推論させた結果です。無事 `"Open"` と 0.99 以上のスコアで推論されました。

![21_decoded.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3724982/8ccb90be-cc58-e744-73b2-67b5f2cdd911.png)

結果を確認したら、適宜 `Stop Streaming` をクリックして推論を停止しましょう。

## 推論結果のデシリアライズ (チュートリアル: "6.4. Deserializing inference result files (classifier)")
さて、Local Console で推論結果が表示されましたが、Local Console では一時的にデシリアライズした結果を表示しているだけで、推論結果をデータベースに保存したり、他のアプリケーションで利用する場合には、元の推論結果をデシリアライズする必要があります。

そのためには Flatbuffers のバイナリを手に入れる必要があります。
ダウンロード先: https://github.com/google/flatbuffers/releases

上記リンクから `Windows.flatc.binary.zip` をダウンロードして解凍します。
解凍したフォルダの中の `flatc.exe` を最初に解凍した Local Studio の `EdgeApp` フォルダにコピーします。
そのうえで、`EdgeApp` フォルダで `Shift+右クリック` をして、Git Bash や PowerShell などを開きます。
そこで、今回実施した推論が Classification か Object Detection に合わせて以下のコマンドのどちらかを実行します。
```
./flatc.exe -p ./classification.fbs
もしくは
./flatc.exe -p ./objectdetectoin.fbs
```

上記コマンドを実行すると `SmartCamera` が出力されます。
この `SmartCamera` フォルダがあるディレクトリ、上記の作業通りであれば `EdgeApp` フォルダに、チュートリアルの P59 で紹介されている Python のプログラムを配置します。
ただ、自分は以下のように少し改変しました。推論を保存したフォルダを指す `inference_dir` だけ皆さんの環境に合わせて変更すれば利用できるはずです。

```Python
import os
import base64
import json
from SmartCamera import ClassificationTop

if __name__ == '__main__':
    # Set the path to the directory that stores inference result metadata files.
    inference_dir = '{ここは推論が保存されているディレクトリを記載}'
    ## 例
    ## inference_dir = 'C:\\Users\\Miso\\AppData\\Local\\Temp\\LocalConsole_xp7usx9k\\inferences'

    # Process all inference result files in the inference_dir
    for inf_file in os.listdir(inference_dir) :
        inf_path = '{0}/{1}'.format(inference_dir,inf_file)
        # Read one file in the folder.
        with open(inf_path, 'r', encoding='utf-8') as json_file:
            buf = json.load(json_file)

        # Base64 decode the string in the file.
        if 'O' in buf['Inferences'][0]:
            buf_decode = base64.b64decode(buf['Inferences'][0]['O'])
        else:
            with open('decoded_result_Classification.json', 'w', encoding='utf-8') as file:
                json.dump(buf, file, ensure_ascii=False, indent=4)

        # Deserialize the Base64-decoded string.
        ppl_out = ClassificationTop.ClassificationTop.GetRootAsClassificationTop(buf_decode, 0)
        cls_data = ppl_out.Perception()
        res_num = cls_data.ClassificationListLength()

        # Store the deserialized data in json format.
        buf['Inferences'][0].pop('O')
        for i in range(res_num):
            cls_list = cls_data.ClassificationList(i)
            buf['Inferences'][0][str(i + 1)] = {}
            buf['Inferences'][0][str(i + 1)]['class_id'] = cls_list.ClassId()
            buf['Inferences'][0][str(i + 1)]['score'] = round(cls_list.Score(), 6)

        # Output a json file.
        with open('{0}/decoded_{1}'.format(inference_dir,inf_file), 'w', encoding='utf-8') as file:
            json.dump(buf, file, ensure_ascii=False, indent=4)
```

これを実行すると、メタデータが保存されているディレクトリに"decoded_"で始まるファイルが生成されており、開くとデシリアライズされていることが確認できると思います。

# 困った時は

もし、記事の途中でうまくいかなかった場合は、気軽にこの記事にコメントいただいたり、以下のサポートのページもご覧ください。  
コメントのお返事にはお時間を頂く可能性もありますがご了承ください。

- [Support-AITRIOS (ログインすると情報が増えます)](https://support.aitrios.sony-semicon.com/hc/ja)

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


# おわりに

今回は Local Edition を紹介しました！
プロジェクトへのサインアップが不要だったり、個人でも使えたりと、これまでの AITRIOS に比べて非常に始めやすくなったなと個人的には思っております。
小規模な PoC などにも活用の可能性もあるかと思うので、ぜひご活用ください。

AITRIOS についての最新情報は X、LinkedIn で配信中なのでこちらのフォローも何卒よろしくお願いいたします！  

https://twitter.com/AITRIOSbySony

https://www.linkedin.com/company/aitrios-by-sony/