AITRIOS の Local Edition でエッジデバイス AIH-IVRW2 を動かしてみる

# はじめに
[メカトラックス株式会社](https://mechatrax.com/)の[maeda01](https://qiita.com/maeda01)です。
[以前の記事](https://qiita.com/maeda01/items/514ac0b588f7620bbf1c) で Raspberry Pi AI Camera を使用したデモをご紹介しました。
Raspberry Pi AI Camera と同じイメージングセンサを使用し、エッジデバイス (カメラデバイス) として使用可能なものが Sony から提供されています。
本記事ではこのエッジデバイスのセットアップを行い、公式のサンプルを実行してみるという内容になります。

# AIH-IVRW2
AIH-IVRW2 は AITRIOS が提供しているエッジデバイス (カメラデバイス) の1つで、Sony 製インテリジェントビジョンセンサー IMX500 搭載の小型 Wi-Fi モデル となっています。

同 AITROIS が提供している SDK やサービスと組み合わせることで強力なエッジ AI センシングソリューションが構築できます。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3104552/61b603d8-cdba-4d25-9f33-ba33e0237a64.png)



AIH-IVRW2 のスペックなどの情報は以下をご参照ください。

https://www.aitrios.sony-semicon.com/edge-ai-devices

インテリジェントビジョンセンサー IMX500 の詳細については以下をご確認ください。

https://www.aitrios.sony-semicon.com/edge-ai-devices/imx500


> ※ AITRIOS はソニーセミコンダクタソリューションズが提供しているワンストッププラットフォームです。
> 「IMX500」に加え、AIカメラ上で動作するAIを開発するAIデベロッパー、AIを活用したセンシングアプリケーションを開発するアプリケーションデベロッパー、AIカメラを開発するカメラメーカー/モジュールインテグレーター、それらAIカメラおよびセンシングアプリケーションを統合してシステム構築を担うシステムインテグレーターなどのパートナーに向けて、ソリューションの実現に必要なさまざまな機能を提供します。([ソニーのブログ](https://www.sony.com/ja/SonyInfo/blog/2023/06/08/)、[ニュースリリース](https://www.sony-semicon.com/s/sssjp/news/detail/n_2021_2021100601?ima=0000) から引用)

AITRIOS 提供システムの全体像については以下をご参照ください。

https://developer.aitrios.sony-semicon.com/en/edge-ai-sensing/system-overview

AITRIOS ホームページ

https://www.aitrios.sony-semicon.com/


## Local Edition
この AITRIOS のサービスはクラウドで使用することもできますが Local Editionを導入すると AI モデルの開発から推論結果の取得までローカル環境で実行することが可能になります。
画像などのデータをクラウドに上げる必要がないため機密性の高いデータをクラウドにアップロードできない場合にも役立ちます。

Local Edition の詳細については以下をご参照ください。

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

この Local Edition を使用するためのライセンスはチップワンストップなどで購入可能です。

https://www.chip1stop.com/products/Sony/Local-Edition-AIS-ANRBC-ZZDAS-005/SONY*0005078

ライセンスを購入するとメールでライセンスアクティベート用の URL とインストーラなど必要なファイル一式が送られてきます。

## Brain Builder
Brain Builder は Neurala 社が提供しているモデル作成ツールで、分類や物体検出、異常検知タスクの学習モデルをノーコードで作成することができます。

具体的には以下の処理ができます。
* データセットの作成と画像のアップロード
* 学習器 (分類器と検出器、異常認識器) のトレーニング
* 学習モデルのパフォーマンスの評価
* モデルのエクスポート

この Brain Builder を AITRIOS のデバイス向けに構築されたバージョンも提供されています。
機能は通常の Brain Builder と変わりません。

本記事では AITRIOS のデバイス向けのバージョンを使用します。

# Brain Builder のセットアップ
ライセンスを購入後に送られるアクティベート用の URL を使用してアクティベートを行います。
ライセンス管理アプリケーションがない場合はインストールしてください。

https://www.wibu.com/support/user/user-software.html?tx_wibudownloads_downloadlist[action]=index&tx_wibudownloads_downloadlist[controller]=DownloadList&cHash=9589e4298c76dfab073014d6aabdb48b

ライセンスをアクティベートしたら Brain Builder でログインします。
VIA アカウントをお持ちでない場合はここで作成してください。

# モデルの作成
今回はインストーラと一緒にダウンロードできるサンプルデータセット JapaneseCoins_Detector を使用して硬貨の検出タスクを作成します。

## プロジェクトの作成
Brain Builder のホーム画面の右上にある プロジェクトを作成ボタンを押して新規プロジェクトを作成します。
この段階でプロジェクト名を入力します (ここでは Detection Japanese Coin としました)。

![プロジェクトの作成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3104552/61aa3c50-fab1-4fec-90b9-e8c8082b301e.png)


## データセットのインポート
まずはデータセットをアップロードします。
右上の データセットの作成 ボタンを押してデータセットを作成します (ここでは Japanese Coin としました)。
物体検出タスクを作成するため、モデルタイプは Detector を選択します。

![プロジェクトのデータセットの作成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3104552/a1bd500b-f103-41b1-bce5-17b41e83d548.png)

実際に画像データをアップロードします。
右上の アップロードデータを押します。

![プロジェクトのデータセットのインポート前.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3104552/f01666eb-5f5e-4a89-bdf6-294b82b37215.png)


サンプルデータセット JapaneseCoins_Detector.zip を選択し、アップロードの開始を押します。

![プロジェクトのデータセットの選択.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3104552/e4becbe0-ad31-4548-9976-4e1776674ec6.png)

アップロードが完了するとダッシュボードのイメージボックスに画像が表示されます。

![プロジェクトのデータセットのインポート後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3104552/6faaed76-d6b4-4c8c-a815-4e55464e4429.png)

アップロードしたファイルの中の labels フォルダにラベリングデータが入っているため、.zip ファイルをそのままアップロードするとラベリング済みの状態でインポートされます。
手動でアノテーションを行う場合や修正をしたい場合は各画像を選択してラベリング処理を行ってください。

![アノテーションの例.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3104552/0d58abe9-2181-4ff1-b212-2bf7a0c5456d.png)

データセットは動的に学習データと検証データに分割されます。
手動で分割したい場合は学習データアップロードの際に static のオプションを選択してください。
またテストデータは別途用意する必要があります。

## 学習開始

アノテーション作業が完了したら学習を開始させます。
学習タブを選択し、学習方法を選択します。

![学習.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3104552/d984352a-860e-4e9c-8936-c524c9b701b5.png)

それぞれ以下のような方法で学習が開始されます。
* クイック (Quick): いくつかの学習器を使用して最良のモデルを使用して学習
* 徹底的 (Thorough): 用意されているすべての学習器を使用して最良のモデルを使用して学習
* バランス型 (Balance): ある程度 (Quick 以上の数) の学習器を使用して最良のモデルを使用して学習

なお、どの学習器が使用されているかは公開されていません。
https://support.neurala.com/docs/training-detectors
https://support.neurala.com/docs/training-classifiers-and-anomaly-recognizers

今回はクイックモードで学習を行いました。300枚の画像、1956個の物体のデータを渡し、学習と検証を行わせるようにしています。
この場合では約5分程度で学習が完了しました。

## モデルのエクスポート
学習が終了したらモデルを出力します。
エクスポートタブから AI モデルのダウンロード ボタンを押します。

![AIモデルのエクスポート.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3104552/a7eb1f4c-0888-436c-a775-d7fa18a1c961.png)

デフォルトでは (データセット名)-imx500.zip という名前の zip ファイルがダウンロードされます。


# AITRIOS Local Console のセットアップ
Local Console を立ち上げたらまずはカメラデバイスの登録を行います。

デフォルトで1つデバイスが登録されています。これに今回使用するカメラデバイスを紐づけます。
Device タブを見るとデバイス名 Default があります。これを使用しますが、後でわかりやすくする (区別しやすくする) ために名前を変えます。

![デフォルトのデバイス.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3104552/be454c50-1684-42ef-844d-19e788726760.png)


一番右のミートボールメニューから Rename を選択します。
名前は CamMTX001 とします。

この Local Console のデバイス CamMTX001 とカメラデバイスの紐づけを行います。

1台目のカメラデバイスは Provisioning タブから Connect の画面から登録します。
Device Name のプルダウンからデバイス CamMTX001 を選択します。
NTP サーバーや MQTT ブローカーを選択する必要があります。
NTP サーバーはデフォルトの `pool.ntp.org` として、MQTT ブローカーに使用する NIC は Wi-Fi とします。

今回使用するカメラデバイス AIH-IVRW2 は Wi-Fi モデルのため、ここで同時にカメラデバイスの Wi-Fi の設定をします。
Wi-Fi SSID のトグルを ON にして SSID とパスワードを入力します。

:::note info
AIH-IVRW2 は 2.4GHz 帯の Wifi のみの対応のため、SSID は 2.4GHz のものを使用してください。
:::

![デバイスの登録.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3104552/7fc5a463-d1b8-49c0-b90a-fa2c16b11891.png)


情報を一通り入力したら Generate ボタンを押してカメラデバイス登録用の QR コードを発行します。
このとき、カメラデバイスの3つある LED の一番上 (Power Indicator) が橙点滅していることを確認してください (橙点滅が QR コード読み取りモードを意味します)。

発行された QR コードをダウンロードして拡大した状態でカメラを QR コードに読み込ませるとデバイスの登録が完了します。

:::note info
QR コードの読み取りにはコツがいるので以下を参考にしてください。

https://qiita.com/SSS-keijimorikawa/items/240e6243eb9178c59457
:::

# ファームウェアのデプロイ
最新のファームウェアはライセンス購入時に送られる URL から Local Console のインストーラなどと一緒にダウンロードできます。
本記事ではメインチップのファームウェアが `0400FEWS`、センサチップのファームウェアが `020300` のバージョンを使用します。

Local Console の Deployment タブを選択します。

設定するデバイス名 (CamMTX001) を選択し、Firmware Options のトグルを ON にします。
メインチップとセンサチップのファームウェアを選択するボタンが出てくるのでクリックし、ファームウェアのバイナリファイルを選択します。
それぞれのファームウェアのバージョンを下のテキストボックスに入力します。

:::note info
ファームウェアのバージョンはファームウェアと一緒にダウンロードされるテキストファイル Version.txt に記述されています。
:::

![ファームウェアデプロイ準備.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3104552/f3d812dd-6785-46bb-874f-0210127efb57.png)

Deploy ボタンを押すとデプロイが始まります。
ステータスは下の Deployment Status から確認できます。

現在使用しているファームウェアのバージョンは Device タブから確認できます。

![ファームウェアデプロイ完了.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3104552/c25ecef6-6c2a-4a25-b558-121ff794da99.png)

# モデルのデプロイ
Brain Builder で作成したモデルをカメラにデプロイしていきます。

Local Console の Deployment タブを選択します。

設定するデバイス名 (CamMTX001) を選択します。
次に AI モデルとエッジアプリケーションの選択をします。

 Brain Builder から出力されるフォルダに `network.pkg` と `vision_app_objectdetection_v1.1.2.aot` が入っているのでそれを選択してデプロイを行います。

ファームウェアと同様にDeploy ボタンを押すとデプロイが始まります。
ステータスは下の Deployment Status から確認できます。

![AIモデルのデプロイ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3104552/93eae9f0-e184-4ec7-a5c0-f2f8cf1c11d5.png)

エッジアプリケーションは Brain Builder からカメラで使用可能な状態でエクスポートされます。
自分でエッジアプリケーションを作成してデプロイすることも可能です。エッジアプリケーション作成のための SDK も提供されています。

https://developer.aitrios.sony-semicon.com/edge-ai-sensing/documents/edge-application-implementation-guide?#_Creating_and_deploying_the_Edge_Application

# テスト
エッジデバイスと AI モデルが正常に機能しているかも Local Console から確認できます。

Local Console の Interface タブを選択します。
Device から今回使用するカメラデバイス CamMTX001 を選択します。

Label File と PPL Parameter File は Brain Builder からエクスポートされたものを使用します。`labels.txt` と `neurala_detection_ppl_parameters.json` を選択します。
画像データや推論結果のメタデータの保存先も指定できます。

必要な設定が完了したら Apply ボタンを押して設定を反映させます。

![カメラテスト画面.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3104552/b0369345-317f-4483-bd31-2760e14fd905.png)

設定を適用したら Start ボタンを押して実際に推論を開始させます。

![硬貨1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3104552/dd561d09-d9a5-4a08-a6f5-a9134256239d.jpeg)

カメラの画像に bounding box が描画された画像がプレビューできるとともに推論結果を json やテキスト形式でリアルタイムで確認できます。
フレームレートは 2~3 fps 程度と少し遅めですが静止物 (硬貨) の検出には影響はなさそうです。

カメラの位置や光の当て方などを工夫する必要はありますが推論は十分に行えています。


# おわりに
本記事ではサンプルデータセットを使用した動作確認まで行いました。ラベルの定義ファイルも含まれているのでカメラの動作確認としてはライセンスを購入して AI モデルの学習と出力を簡単に行い、カメラにデプロイするだけでした。

エッジデバイス AIH-IVRW2 のセットアップなど基本的な事柄に関してはドキュメントが充実しています。
また Local Edition のライセンス購入時にダウンロードできるドキュメントにはトラブルシューティングに関する FAQ もあるのでそちらも合わせてご確認ください。