LoginSignup
5
2

AITRIOS のデバイスで Object Detection してメタデータを取得してみた(② 推論編)

Last updated at Posted at 2024-03-08

前編はこちら!


こんにちは!
ソニーセミコンダクタソリューションズ の高橋と申します。

前編で無事に 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 上で作成していきます。

このパートに役立つマニュアルは以下になります。

詳細は上記マニュアルを参照いただきながら、手順を書き下すと下記のようになります。

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.
自分は以下のような犬の絵が描かれたエコバッグの写真を撮影しました。
Pictures for study

3. 4.
以下のように操作します。
Create model

5.
Upload を押すのを忘れずに。
Import pictures

6. 7.
Upload -> Next を実施すると Labeling & Training が表示されるので、クリックしてラベリング作業に移ります。
Labelling

クリックすると別のタブでラベリング用のページが表示されます。
Untagged の画像に対してこれからタグをつける作業を実施します。
画面右側に表示された画像の一覧から、ある画像ををダブルクリックすると、その画像中のある範囲に対してタグをつける作業を開始できます。
Pictures to be labelled

図のように、対象範囲を選択して、ラベリングが初めてであればタグをまず入力し、add します。今回はdogとしました。
Region proposal が ON になっていると、それらしい領域を自動的に区切ってくれます。便利!
この作業をアップロードしたすべての画像に対して実施します。
Labelling

そうして、Untagged の画像がなくなったことを確認したら、右上の Train をクリックします。
学習には2つのタイプがあります。精度を必要とする場合には Advanced Train が必要となりますが、今回は検証目的なので Quick Train を選択します。
Training types

すると学習中になります。しばらく待ちましょう。
Training

しばらく待つと学習結果が表示されます。
Training result

学習が完了したら、元のタブに戻って Next をクリックすると、モデルの名前や説明、バージョン情報を入力できるのでそれらを入力し、Finish をクリックし、モデルの作成は終了です。
Model information

8.
モデルの作成が終了したら、続いてデバイス用に変換します。
これは、作成したモデルを選択すると、Status: Before conversion となっているので、右メニューで Convert を選択します。
そうすると確認のメニューが出てくるので、もう一度 Convert を選択すると、モデルの返還作業が始まります。
こちらも少し時間がかかるので、画面上部の Reload を押しながら Status が Add to configuration complete に変わるのを待ちましょう。
Status が変わったら、無事 AI モデルが作成できました!
Model information

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 へ登録します。

 
このパートで参考になるマニュアルは以下のものになります。

詳細は上記マニュアルを参照いただきながら、本パートの手順を書き下すと下記のようになります。

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 でした。

Object Detection sample app

2.
Console の左メニュー Settings を選択し Application タブをクリックしましょう。
Settings - Application

右下の Import を選択し、先ほどダウンロードした vision_app_objectdetection_v1.1.1.wasm を選択し、名前やバージョンは適当に記入し、Next を押して (Metadata Format IDの欄は入力しないで問題ありません)、Create を選択すると Edge App が登録されます。
Import Edge App

3. 4.
ここは少し作業が必要になります。

推論実行時には Command Parameter という JSON ファイルが必要になります。
これは、推論実施時にメタデータだけ送るのか、画像も送るのか、といった設定や、画像のクロップを実施するか、ファイルのフォーマット、保存先、そして Edge App がアプリ内で利用する各種パラメータを記載したものになります。

2. でダウンロードした Object Detection のサンプルアプリケーションのファイルの中には CustomVisionPPLParameterSample.json というファイルがあります。これをもとに、以下のリンク内に存在する Command Parameter の仕様を参照しながら Command Parameter を作成しましょう。

今回私は以下のようなファイルを作成しました。基本的には上記リンク中で紹介されている例を基にしていますが、以下のような変更をしています

  • Mode2 にして推論時にメタデータだけを送信
  • NumberOfImages5 にして、1 回の撮影で 5 回の推論を実施
  • UploadInterval30 にして、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 に登録することができます。

Import Command Parameter

5. AI モデル、Edge App のデプロイ、Command Parameter のデバイスとの紐づけ

さて、作成/登録した AI モデル、Edge App、Command Parameter をついにデバイスにデプロイ/紐づけしましょう。

引き続き参考になるマニュアルは以下です。

手順は下記のとおりです。

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 を作成します。
Create deploy config for AI Model

2.
Deploy to device で作成したデプロイ用の Config を選択し、右メニューの Deploy を選択します。
続いて、AI モデルをデプロイしたいデバイスにチェックマークを入れます。
その次の画面では、Add new AI Model を選択し、Deploy で AI モデルのデプロイが実行されます。
Config List
Choose device
Add new AI Modelza

3.
同じく Deploy to device の画面で、画面中央上部の ConfigApplication のタブを Application に切り替え、先に Console に登録した Edge App を選択します。
その後、右メニューの Deploy を選択し、デプロイしたいデバイスを選択して Deploy を選択することで、Edge App がデバイスにデプロイされます。
なお、こちらもデプロイの状況は Manage device より自分のデバイスを選択し、右メニューの Status -> Deployment で確認できます。
Deploy Edge App

4.
Manage Device を選択し、AI モデルや Edge App をデプロイしたデバイスを選択します。
右メニューで Settings -> Command Parameter File と選択し、先の手順でアップロードした Command parameter のファイルを選択し、Bind でデバイスとそのファイルを紐づけましょう。
Bind Command Parameter

6. 撮影 & 推論

ここまでお付き合いいただいた皆様、大変お疲れ様でした。

それでは実際にこれまで準備してきたデバイス、AI モデル、Edge App、コマンドパラメーターを利用して、 SZP123S-001 で Object Detection を実行しましょう。

ここまで準備ができていれば、実はとても簡単に推論が実行できます。

とりあえず、引き続き参考になるマニュアルは以下です。

手順は下記のとおりです。

1. セットアップしたデバイスで推論を実行する
2. 出力されたメタデータを確認する
   * なお、ここで出力される推論結果のメタデータはシリアライズ + BASE64 エンコードされているので、まだ推論結果は人間が読めません

それでは各手順について補足説明をします。

1.
Manage device から、セットアップしたデバイスを選択します。
右メニューの Settings -> Inference Control を選択し、Get Inference Data のスイッチを ON にすることで、推論が実施されます。
Get Inference

2.
Check data から、セットアップしたデバイスを選択します。
推論が正しく実行されていれば、デバイスを選択すると Meta Data のフォルダが存在します。 (画像も同時に取得するなら Image フォルダも存在します)
Meta Data フォルダを選択し、推論した時間のファイルをクリックすると、デバイスが取得したメタデータが表示されます。

Meta data

上記画像だと、"Inferences" 内の "O" が推論結果になりますが、先述のとおり BASE64 エンコードとシリアライズされているため、この時点では意味のある情報になりません。
次のステップでは、このデータを人間が理解できるデータに変換します。

7. メタデータのデコードとデシリアライズ

さて、推論を実行してシリアライズされたメタデータをついに出力することができたので、それを活用できるようにデシリアライズしていきます。

ただ、最初にも述べたように、ここまでは特にプログラミングの知識等は必要ありませんでしたが、デシリアライズを実行するためにプログラミングの知識が必要となります。
この記事では GitHub に公開されている Python 製のデシリアライズのサンプルプログラムを利用するので、GitPython について多少知識が必要になりますので、ご留意ください。

手順は下記のとおりです。

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 が最も参考になります。
もしくは、以下も参考になるかもしれません。

それでは各手順について補足説明をします。

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_id0 のもの (=犬のエコバッグ) が 84.4% のスコアで検出されたという結果になります。

といったところで、メタデータが無事出力されました!
前後編にわたっての長い記事になりましたが、少しでも皆様の AITRIOS の体験が楽になっていれば、私としてもとてもうれしく思います。

困った時は

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

また、記事の内容以外で AITRIOS についてお困りごとなどあれば以下よりお問い合わせください。

終わりに

私としては、出力されたメタデータをどう活用するのか、外部からどうやってこのメタデータを取得できるのか、などの記事も書きたいなと思っていますので、ぜひ AITRIOS の Qiita Organization をフォローいただければ幸いです。

同時に、#AITRIOS のタグをつけての AITRIOS で何かやってみた、のような記事の投稿も大歓迎のでこちらもぜひよろしくお願いいたします!!

最後に、今後こういった記事を読んでみたい、などあればコメントで教えていただければ大変幸いです。

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

あらためて記事をお読みいただきありがとうございました!

5
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
2