AITRIOSで外部ストレージ(Azure Blob)連携を使ってみた

ソニーセミコンダクタソリューションズの大橋です。

AITRIOSの推論時に得られる画像と推論結果メタデータは、保存場所を変更することができます。この記事では、画像と推論結果をAzureのBlob Storageに保存する方法について解説します。

## はじめに
　初期設定では、AITRIOSで推論を実行するとConsoleのCheck dataで画像と推論結果メタデータを確認することができます。しかし、以下のような点に不満を持つ場合もあるかもしれません。
- 推論結果メタデータは2週間で自動削除されてしまう
- 画像や推論結果メタデータをローカルにダウンロードするのが面倒(APIが用意されているが手間がかかる)

また、大量の画像や推論結果メタデータを取得する場合はAPIコール数が増加してしまうため、外部ストレージの使用が推奨されています。
本記事では画像と推論結果メタデータを、自分が用意したBlob Storageに保存する方法について解説します。これにより、推論結果メタデータは永続的に保存でき、デバイスやフォルダ単位(1回の推論開始/停止で作成される単位)で画像データを扱うことも容易になります。(Blobデータを扱うためのツール類については本記事では紹介しません)

## 注意点
　画像、推論結果メタデータの保存先の変更は、同一プロジェクトに存在するエッジデバイス全てに影響します。一部のエッジデバイスのみを指定して保存先を変更することはできません。
 
　また、本記事ではAITRIOS Developer Editionを利用しています。

## 前提
　本記事では、以下の環境構築ができていること、知識があることを前提にしています。
- AIモデルやEdgeAppがエッジデバイスに適切にデプロイされており、推論を実行するとConsoleのCheck dataで画像と推論結果メタデータを確認できること
- REST APIの実行方法がわかること
- Microsoft Azureアカウントを持っており、Blob Storageを作成できること  
なお、AIモデルやAdeAppのデプロイや推論結果メタデータの出力などの基本的な操作については  
[AITRIOS のデバイスで Object Detection してメタデータを取得してみた（① デバイスセッティング編）](https://qiita.com/SSS-NorimitsuTakahashi/items/3c11544610fcc8f8d4c1)  
[AITRIOS のデバイスで Object Detection してメタデータを取得してみた（② 推論編）](https://qiita.com/SSS-NorimitsuTakahashi/items/b5f62607325d34aa40d7)  
を参考にしてみてください。

## 画像、推論結果の出力先を変更する
　Blob Storageに画像と推論結果メタデータを保存するために必要な操作は以下の２つです。
1. REST APIのUpdateStorageConnectorを実行し、保存先のBlob Storageを登録する
2. Command Parameterファイルを編集し、推論結果メタデータの保存方式をBlob Storageに変更する

まずは1を実施します。  
REST APIの各パラメータには次の値を設定します。REST APIの実行方法が分からないという方は、[AITRIOSのConsole REST APIを利用してメタデータを取得してみた](https://qiita.com/SSS-izumuhosoi/items/51008a971ce8041392a4)が参考になるでしょう。
- type:AZURE
- mode:1
- endpoint:※1
- connection_string:※2
- container_name:※3

modeは0:画像の設定変更、1:画像と推論結果メタデータの設定変更、2:推論結果メタデータの設定変更です。画像と推論結果メタデータの保存先を個別に設定したい場合は、mode0で画像の保存先を設定し、mode2で推論結果メタデータの保存先を指定することになります。ここでは画像と推論結果メタデータの保存先を同じにしているので、mode1でまとめて設定変更をしているわけです。

※1～3は図で示す情報をAzureから取得して入力します。
※1 endpointの値

![endpointの値](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3724906/0850ac8c-0de9-2e0b-0365-4f2debe0736d.png)

※2 connection_stringの値
![connection_stringの値](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3724906/498da8d4-be7a-e074-cf2a-aad18fa4eb40.png)

※3 container_nameの値(ここではoohashicnt1という名前をつけています。自分で作成したコンテナー名を指定してください)
![container_nameの値](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3724906/626f0409-0235-442c-e3c7-165020ce86b9.png)

次に2のCommandParameterの編集を実施します。初期の設定ではUploadMethodIFの値が"MQTT"になっていると思いますが、"BlobStorage"に変更します。

![CommandParameter](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3724906/3f9856ea-4416-003d-bb00-8e14ee18406d.png)

CommandParameterの修正を行ったら、対象のエッジデバイスへのバインドを忘れずに実施しましょう。

これで準備完了です。早速推論を実行してみましょう。
用意したコンテナーの直下に、デバイスID名のフォルダが作成されているはずです。
![デバイスIDフォルダ生成](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3724906/fa7c8385-6787-5e79-4377-60df8109d297.png)

さらに下層を参照すると、imageフォルダに画像が、metadataフォルダに推論結果メタデータが保存されているのが確認できました。
![画像、推論結果メタデータの保存](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3724906/5ff9cb0f-9b9e-7127-03a2-0fd5e5365bcd.png)
これで無事にBlob Storage上に画像と推論結果メタデータが保存されるようになりました。

## 出力先を元に戻す
さて、画像と推論結果メタデータの保存先を変えると、ConsoleのCheck Dataからは推論結果メタデータを確認することはできなくなります。
再びConsoleで画像と推論結果メタデータを管理したい場合は設定を元に戻す必要があります。具体的には以下の操作を実施します。
1. REST APIのUpdateStorageConnectorを実行し、保存先を初期化する
2. Command Parameterファイルを編集し、推論結果メタデータの保存方式をMQTTに変更する

1では、「画像、推論結果メタデータ出力先変更作業変更」のときに指定した5つの各パラメータの指定は不要(全てのパラメータの値を空文字にする)です。そうすることにより、設定が初期化されます。

これで無事に元の設定に戻すことができました。

## おわりに
今回は推論時の画像と推論結果メタデータを両方ともBlob Storageに保存する方法について解説しました。
本文で解説したように、REST APIとCommandParameterの設定により、どちらか片方だけを指定したBlob Storageに保存することもできます。
用途に合わせて設定してみてください。

また、ローカルに用意したhttpサーバに直接画像と推論結果メタデータを保存することも可能です。こちらはまた別の記事で紹介できればと思います。

# 困った時は

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

- [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)