前編はこちら!
こんにちは!
ソニーセミコンダクタソリューションズ の高橋と申します。
前編で無事に AITRIOS の Console にデバイスを登録できたので、後編では実際に AI モデルなどをデバイスにデプロイし、推論を実行、メタデータをデコードして実際に取得するまでを行います!
そもそもの記事の概要などに関しては、ぜひ上記の前編をご確認ください。
この記事は2024年02月29日時点の情報に基づいて作成されています。
本文
(再掲) 0. 今回の作業の流れ
1. Console にデバイスを登録
2. デバイスのファームウェアを最新版に更新
------------- (↑ 前編 / ↓ 後編) --------------
3. Custom Vision で手持ちの画像を 15 枚(以上)使い Object Detection の AI モデルを作成し、デバイス用に変換 + 作成した AI モデルのデプロイ用の Config を作成
4. デバイス上で動作する Object Detection 用の Vision and Sensing App (Edge App) と、推論時のパラメータ指定する Command Parameterを入手し、Console に登録
5. AI モデル、Edge App をデバイス本体にデプロイ、Command Parameter をデバイスと紐づける
6. 撮影 + 推論の実施
7. 推論結果のメタデータのデコード、デシリアライズを実施
今回は 3.
から作業をしていきます。
3. Custom Vision での Object Detection 用の AI モデルの作成 + AI モデルのデプロイ用 Config の作成
ここまでは少し地味な作業が続きましたが、ここからより楽しい作業になります!
ですが、1 点先にお伝えすると、この章で紹介する AI モデルの変換や学習には費用が発生するのでご注意ください。
参考: https://www.aitrios.sony-semicon.com/services/edge-ai/products-and-services
さて、このステップでは今回の目的でもある Object Detection のための AI モデルを Custom Vision というツールを使って作成します。
AITRIOS のデバイスで Object Detection を実施するには、① AI モデル と、② Vision and Sensing Application をデバイスにデプロイする必要があります。
なお、Vision and Sensing Application は VnS App や Edge App と呼ばれますが、本記事中では Edge App と記述します。
AI モデルそのものは、画像を数値データとして入力として受け取り、演算を行ったうえで出力を行います。
AI モデルの出力そのものはメタデータの形式ではないので、この出力をメタデータに成型し、AITRIOS の Consoleに送信する、という動作が必要になり、それを担うのが Edge App になります。
今回、Object Detection 用の Edge App は公式でダウンロードできるサンプルを利用する(次のパートで説明します)ので、AIモデルを Console 上で作成していきます。
このパートに役立つマニュアルは以下になります。
- Custom Vision AIモデルデプロイガイド
-
Console ユーザーマニュアル
- 3.4.1. 登録済みAIモデル/ファームウェアのデプロイ
- 3.5. Create model
- 3.6. Train model
- 3.7. Labeling & Training
詳細は上記マニュアルを参照いただきながら、手順を書き下すと下記のようになります。
1. 認識させたいモノの写真を 15 枚以上お手持ちのスマートフォンなどで様々な角度から撮影する
2. 撮影した画像を Console にログインする端末に送信する
3. その端末で AITRIOS Console にログインし、“Create Model” を選択、"+ Create" をクリック
4. "Model Type" は “CustomVision-ObjectDetection” を選択
5. "Import Local Image" を選択し、`1.`で撮影した画像をアップロードする
6. "Labelling & Training" を選択し、撮影した画像内の対象物を四角で囲んで、タグを付ける (=ラベリング)
7. モデルの学習をし、モデルを作成する
8. 作成したモデルをデバイス用に Convert する
9. AI モデルデプロイ用の Config を作成する
各手順について補足説明をします。
1. 2.
自分は以下のような犬の絵が描かれたエコバッグの写真を撮影しました。
6. 7.
Upload -> Next
を実施すると Labeling & Training
が表示されるので、クリックしてラベリング作業に移ります。
クリックすると別のタブでラベリング用のページが表示されます。
Untagged
の画像に対してこれからタグをつける作業を実施します。
画面右側に表示された画像の一覧から、ある画像ををダブルクリックすると、その画像中のある範囲に対してタグをつける作業を開始できます。
図のように、対象範囲を選択して、ラベリングが初めてであればタグをまず入力し、add
します。今回はdog
としました。
Region proposal
が ON になっていると、それらしい領域を自動的に区切ってくれます。便利!
この作業をアップロードしたすべての画像に対して実施します。
そうして、Untagged
の画像がなくなったことを確認したら、右上の Train
をクリックします。
学習には2つのタイプがあります。精度を必要とする場合には Advanced Train
が必要となりますが、今回は検証目的なので Quick Train
を選択します。
学習が完了したら、元のタブに戻って Next
をクリックすると、モデルの名前や説明、バージョン情報を入力できるのでそれらを入力し、Finish
をクリックし、モデルの作成は終了です。
8.
モデルの作成が終了したら、続いてデバイス用に変換します。
これは、作成したモデルを選択すると、Status: Before conversion
となっているので、右メニューで Convert
を選択します。
そうすると確認のメニューが出てくるので、もう一度 Convert
を選択すると、モデルの返還作業が始まります。
こちらも少し時間がかかるので、画面上部の Reload
を押しながら Status が Add to configuration complete
に変わるのを待ちましょう。
Status が変わったら、無事 AI モデルが作成できました!
9.
AI モデルをデプロイするにはデプロイ用の Config
を作成する必要があります。
これは、デバイスのファームウェアの更新の際に実施した作業とほぼ同じなので、そちらを参照ください。
その際には各種ファームウェアを指定して Config
を作成しましたが、今回はこのパートで作成した AI モデルを指定し、作成しましょう。
ファームウェアの欄は選択不要 (= None
) です。
4. Vision and Sensing App (Edge App) および Command Parameter の入手と Console への登録
さて、AI モデルを手に入れたのであとは撮影するだけ!
と思いきや、もう少し準備するものがあります。
まずは AI モデルの出力をメタデータに加工したりするカメラ内で動作するプログラム、Edge App を入手する必要があります。
これは、動作させる AI モデルに対応したものが必要となります。
今回は Console 上の Custom Vision を使って Object Detection 用の AI モデルを前のパートで作成したので、そのための Edge App を準備します。
また、推論を行う際のパラメータを設定した Command Parameter ファイルも同時に必要となるので、このパートで合わせて作成、および Console へ登録します。
このパートで参考になるマニュアルは以下のものになります。
-
Custom Vision AIモデルデプロイガイド
-
3.
Vns ApplicationのデプロイとPPLパラメータの適用
-
-
Console ユーザーマニュアル
- 3.9.2. エッジAIデバイスのCommand Parameterファイル管理
- 3.9.4. Vision and Sensing Applicationの管理
詳細は上記マニュアルを参照いただきながら、本パートの手順を書き下すと下記のようになります。
1. Custom Vision を利用した Object Detection 用の Edge App のサンプルをダウンロードする
2. ダウンロードした Edge App を Console に登録する
3. 推論実行時のパラメータを指定した Command Parameter ファイルを作成する
4. 作成した Command Parameter ファイルを Console に登録する
今回も各手順について補足説明をします。
1.
Custom Vision を利用した Object Detection 用のサンプルアプリケーションは AITRIOS Developer Site 上に公開されています
上記リンクより、Vision and Sensing Application (サンプル)
内の Sample Object Detection Application {バージョン}
をダウンロードして解凍しましょう。
記事執筆時点での最新バージョンは v1.1.1.2
でした。
2.
Console の左メニュー Settings を選択し Application
タブをクリックしましょう。
右下の Import
を選択し、先ほどダウンロードした vision_app_objectdetection_v1.1.1.wasm
を選択し、名前やバージョンは適当に記入し、Next
を押して (Metadata Format ID
の欄は入力しないで問題ありません)、Create
を選択すると Edge App が登録されます。
3. 4.
ここは少し作業が必要になります。
推論実行時には Command Parameter という JSON ファイルが必要になります。
これは、推論実施時にメタデータだけ送るのか、画像も送るのか、といった設定や、画像のクロップを実施するか、ファイルのフォーマット、保存先、そして Edge App がアプリ内で利用する各種パラメータを記載したものになります。
2.
でダウンロードした Object Detection のサンプルアプリケーションのファイルの中には CustomVisionPPLParameterSample.json
というファイルがあります。これをもとに、以下のリンク内に存在する Command Parameter の仕様を参照しながら Command Parameter を作成しましょう。
今回私は以下のようなファイルを作成しました。基本的には上記リンク中で紹介されている例を基にしていますが、以下のような変更をしています
-
Mode
を2
にして推論時にメタデータだけを送信 -
NumberOfImages
を5
にして、1 回の撮影で 5 回の推論を実施 -
UploadInterval
を30
にして、30 フレーム(30fps換算) = 1 秒ごとに推論を実施
{
"commands": [
{
"command_name": "StartUploadInferenceData",
"parameters": {
"Mode": 2,
"UploadMethod": "BlobStorage",
"FileFormat": "JPG",
"UploadMethodIR": "MQTT",
"CropHOffset": 0,
"CropVOffset": 0,
"CropHSize": 4056,
"CropVSize": 3040,
"NumberOfImages": 5,
"UploadInterval": 30,
"NumberOfInferencesPerMessage": 1,
"PPLParameter": {
"header" :
{
"id" : "00",
"version" : "01.01.00"
},
"dnn_output_detections" : 64,
"max_detections" : 5,
"threshold" : 0.3,
"input_width" : 320,
"input_height" : 320
}
}
}
]
}
そして、作成した Command Parameter を Console の Settings -> Command Parameter
より Import
することで、Console に登録することができます。
5. AI モデル、Edge App のデプロイ、Command Parameter のデバイスとの紐づけ
さて、作成/登録した AI モデル、Edge App、Command Parameter をついにデバイスにデプロイ/紐づけしましょう。
引き続き参考になるマニュアルは以下です。
-
Console ユーザーマニュアル
- 3.3.4. エッジAIデバイスへのCommand Parameterファイル適用
- 3.4 Deploy to device
手順は下記のとおりです。
1. (AI モデル) 作成した AI モデルを指定したデプロイ用の Config を作成する
2. (AI モデル) 作成したデプロイ用 Config を利用して、デバイスに AI モデルをデプロイする
3. (Edge App) Console に登録した Edge App をデプロイする
4. (Command Parameter) Console に登録した Command Parameter をデバイスと紐づける
それでは各手順について補足説明をします。
1.
Console にログインし Deploy to device -> New Config
より、作成した AI モデル(=DNN Model
)を指定して、その他のファームウェアは None
のまま Create
でデプロイ用の Config を作成します。
2.
Deploy to device
で作成したデプロイ用の Config を選択し、右メニューの Deploy
を選択します。
続いて、AI モデルをデプロイしたいデバイスにチェックマークを入れます。
その次の画面では、Add new AI Model
を選択し、Deploy
で AI モデルのデプロイが実行されます。
3.
同じく Deploy to device
の画面で、画面中央上部のタブを Edge App
に切り替え、先に Console に登録した Edge App を選択します。
その後、右メニューの Deploy
を選択し、デプロイしたいデバイスを選択して Deploy
を選択することで、Edge App がデバイスにデプロイされます。
なお、こちらもデプロイの状況は Manage device より自分のデバイスを選択し、右メニューの Status -> Deployment で確認できます。
4.
Manage Device
を選択し、AI モデルや Edge App をデプロイしたデバイスを選択します。
右メニューで Settings -> Command Parameter File
と選択し、先の手順でアップロードした Command parameter のファイルを選択し、Bind
でデバイスとそのファイルを紐づけましょう。
6. 撮影 & 推論
ここまでお付き合いいただいた皆様、大変お疲れ様でした。
それでは実際にこれまで準備してきたデバイス、AI モデル、Edge App、コマンドパラメーターを利用して、 SZP123S-001 で Object Detection を実行しましょう。
ここまで準備ができていれば、実はとても簡単に推論が実行できます。
とりあえず、引き続き参考になるマニュアルは以下です。
-
Console ユーザーマニュアル
- 3.3.6. エッジAIデバイス操作 (推論開始、再起動、リセット
- 3.8 Check data
手順は下記のとおりです。
1. セットアップしたデバイスで推論を実行する
2. 出力されたメタデータを確認する
* なお、ここで出力される推論結果のメタデータはシリアライズ + BASE64 エンコードされているので、まだ推論結果は人間が読めません
それでは各手順について補足説明をします。
1.
Manage device
から、セットアップしたデバイスを選択します。
右メニューの Settings -> Inference Control
を選択し、Get Inference Data
のスイッチを ON にすることで、推論が実施されます。
2.
Check data
から、セットアップしたデバイスを選択します。
推論が正しく実行されていれば、デバイスを選択すると Meta Data
のフォルダが存在します。 (画像も同時に取得するなら Image
フォルダも存在します)
Meta Data
フォルダを選択し、推論した時間のファイルをクリックすると、デバイスが取得したメタデータが表示されます。
上記画像だと、"Inferences"
内の "O"
が推論結果になりますが、先述のとおり BASE64 エンコードとシリアライズされているため、この時点では意味のある情報になりません。
次のステップでは、このデータを人間が理解できるデータに変換します。
7. メタデータのデコードとデシリアライズ
(追記) 2024/11
最近追加された Data Hub 使うと簡単に可視化できるのでデータの確認までは非常に簡単になりました!
さて、推論を実行してシリアライズされたメタデータをついに出力することができたので、それを活用できるようにデシリアライズしていきます。
ただ、最初にも述べたように、ここまでは特にプログラミングの知識等は必要ありませんでしたが、デシリアライズを実行するためにプログラミングの知識が必要となります。
この記事では GitHub に公開されている Python 製のデシリアライズのサンプルプログラムを利用するので、Git と Python について多少知識が必要になりますので、ご留意ください。
手順は下記のとおりです。
1. GitHub に公開されているデシリアライズサンプルプログラムのレポジトリを Python が動く環境に Clone
2. Requirements に沿って必要なライブラリをインストール (Flatbuffers, numpy)
3. Console に保存されたメタデータを、レポジトリ内部の `ObjectDetection_encoded.json` にコピー
4. `sample/Python/ObjectDetection/decode.py` を実行
5. レポジトリのルートディレクトリに作られる `decoded_result_ObjectDetection.json` にデシリアライズ/デコード済みのデータが出力され完了
なお、マニュアルですがレポジトリの Tutorial が最も参考になります。
もしくは、以下も参考になるかもしれません。
-
Custom Vision AIモデルデプロイガイド
- 4.3. デシリアライズサンプルコードを使用した推論結果の確認
それでは各手順について補足説明をします。
1.
対象のレポジトリはこちらです。
https://github.com/SonySemiconductorSolutions/aitrios-sdk-deserialization-sample
これを Clone してください。
2.
Python 版のサンプルコードで必要なライブラリはレポジトリ内の requirements.txt
に記されています。
記事執筆時点でこちらのサンプルコードを動作させるのに必要なライブラリは、シリアライズで利用している Flatbuffers
と、数値計算用の numpy
です。
なお、私は Python 3.12 系を使ったところ numpy のインストールでハマりました。。
以下の記事に助けられました。ありがとうございます。
3.
前のステップで手に入れた推論結果を、Console からコピペで、ObjectDetection_encoded.json
の中に貼りましょう。
4.
ルートディレクトリから python sample/Python/ObjectDetection/decode.py
を実行します。
5.
ルートディレクトリの decoded_result_ObjectDetection.json
に、デシリアライズ/デコードされたメタデータが出力されるのを確認します。
私の場合には、以下のメタデータが出力されました。
(IDなどは XXX
としてマスクしています。)
{
"DeviceID": "XXX",
"ModelID": "XXX",
"Image": false,
"Inferences": [
{
"T": "20240219045908670",
"1": {
"class_id": 0,
"score": 0.84375,
"left": 76,
"top": 0,
"right": 219,
"bottom": 133
}
}
],
"project_id": "XXX",
"id": "XXX",
"_rid": "XXX",
"_self": "XXX",
"_etag": "XXX",
"_attachments": "attachments/",
"_ts": 1708318750
}
この結果を日本語で解釈すると、今回利用した AI モデルは、入力の画像の大きさが 320x320 なので、左上を (0,0)
とすると、(76,0)
と (219,133)
の長方形で囲まれる領域に、class_id
が 0
のもの (=犬のエコバッグ) が 84.4% のスコアで検出されたという結果になります。
といったところで、メタデータが無事出力されました!
前後編にわたっての長い記事になりましたが、少しでも皆様の AITRIOS の体験が楽になっていれば、私としてもとてもうれしく思います。
困った時は
もし、記事の途中でうまくいかなかった場合は、気軽にこの記事にコメントいただいたり、以下のサポートのページもご覧ください。
コメントのお返事にはお時間を頂く可能性もありますがご了承ください。
また、記事の内容以外で AITRIOS についてお困りごとなどあれば以下よりお問い合わせください。
終わりに
私としては、出力されたメタデータをどう活用するのか、外部からどうやってこのメタデータを取得できるのか、などの記事も書きたいなと思っていますので、ぜひ AITRIOS の Qiita Organization をフォローいただければ幸いです。
同時に、#AITRIOS のタグをつけての AITRIOS で何かやってみた、のような記事の投稿も大歓迎のでこちらもぜひよろしくお願いいたします!!
最後に、今後こういった記事を読んでみたい、などあればコメントで教えていただければ大変幸いです。
また、AITRIOS についての最新情報は X、LinkedIn で配信中なのでこちらのフォローも何卒よろしくお願いいたします!
あらためて記事をお読みいただきありがとうございました!