本記事は過去記事のアーカイブです。
ソニーセミコンダクタソリューションズの大橋です。
本記事ではREST API"GetImages"を使ってConsoleに保存されている画像を取得する方法について紹介します。
はじめに
AITRIOSではエッジデバイスから推論結果メタデータのみを送信することにより、ネットワーク通信量を抑制したり、個人の画像を取得しないことによりプライバシーを守れるなどのメリットを得ることができます。しかし用途や実験段階では画像データを同時に出力することもあるでしょう。出力された画像はConsoleのCheck Dataで確認することができますが、ローカルへのダウンロードしたい場合もあると思います。そのような場合はREST APIを使用してConsoleから画像を取得することができます。
REST APIのリファレンスを参照すると、画像を取得するためのAPIがいくつか用意されています。本記事では"GetImages"を用いて画像を取得してみます。他の方法も随時記事にしていきますので是非ご覧ください。
前提
- ConsoleのCheck Dataで画像が表示される状態であること。
- Pythonで、AITRIOSのREST APIを実行できること。
REST APIを実行する方法については、公式マニュアル「Console REST API 使い方ガイド」に記載がありますので、詳細についてはこちらを参照してください。簡単に流れを説明すると、
- 使用するAITRIOSプロジェクトのClient ID, Client SecretをPortalエンドポイントに送信する。
- 認証が成功すると、アクセストークンが発行される。
- ConsoleエンドポイントにREST APIコマンド (HTTPリクエスト) を送信する。このとき、ヘッダにアクセストークンを設定する。
のようになります。こちらについてはブラウザでREST APIを実行してエッジデバイスを制御してみたにも関連記事を掲載していますので是非ご覧ください。
GetImagesの仕様の確認
では、GetImagesの仕様をREST APIのリファレンスで確認しておきましょう。
※リファレンスに記載のとおり、GetImagesよりもGetImages Stableの使用が推奨されています。しかし使い方が全く異なるため、GetImages Stableの使い方については別記事で紹介する予定です。
さて、必須パラメータとして"device_id"と"sub_directory_name"があります。つまり、このAPIで画像を取得する場合は1デバイスごとに取得する必要があり、また、事前にフォルダ名を取得しておく必要があります。フォルダ名の取得はGetImageDirectoriesを用いることで可能ですが、本記事では詳細を省略します。
GetImagesを利用した画像の取得の流れは以下のようになります。
- デバイスID、フォルダ名、取得枚数 (初期値は50) 、skip数 (初期値は0) を指定してGetImages APIを呼び出す。
- APIから返り値としてbase64エンコード化された画像データを受け取る。
- 画像データをデーコードして保存する。
- 取得した画像以外の画像を引き続き取得する場合、取得済み枚数をskip数に指定してAPI呼び出しを繰り返す。
以下のサンプルでは取り扱っていませんが、パラメータ"from_datetime"と"to_datetime"を指定することにより、画像データが出力された時間を絞ることができます。また、Consoleからエッジデバイスを削除するとCheckDataで確認することができなくなりますが、パラメータ"include_deleted_device"をtrueに設定することで削除されたエッジデバイスの画像も取得することが可能です。
以下はinclude_deleted_deviceをtrueに設定したときのレスポンスの抜粋です。削除されたエッジデバイスはdeletedというgroup_idに属するエッジデバイスとして出力されます。
{"group_id":"deleted","devices":[
{"device_id":"Aid-XXXXXXXXXXXXXXXX",
"device_name":"device_name1",
"Image":["20240805033007610","20240805062059126","20240805062459773"]},
{"device_id":"Aid-YYYYYYYYYYYYYYYY",
"device_name":"device_name2",
"Image":[]},
Consoleからエッジデバイスを削除しても、保存されている画像データは削除されません。該当のエッジデバイスを再度同じプロジェクトにEnrollすると、再びCheckDataで画像を確認することができるようになります。
GetImagesサンプルコードの作成と実行
以下にサンプルコードを示します。取得対象のフォルダ名、client_id、secret、デバイスID情報はお使いの環境に合わせて指定してください。
本サンプルでは、指定したフォルダに1000枚以上の画像が保存されていることを想定し、直近1,000件分の画像データのみを取得 (200枚の画像取得 × 5回) するようにしました。
ユースケースによっては、より多くの画像をローカルで管理したいこともあるかもしれません。
全ての画像データをローカルで管理したいということであれば、初めから外部ストレージに保存してしまうという選択肢もあります。
AITRIOSで外部ストレージ(Azure Blob)連携を使ってみたや、AITRIOSで外部ストレージ(Local Storage)連携を使ってみたもご覧ください。
import requests
import base64
import json
import os
def get_images(console_endpoint,access_token,device_id, skip = 0):
headers = {'Authorization': 'Bearer {}'.format(access_token)}
sub_directory_name = 'xxxxxxxxx'#取得対象のフォルダ名
get_images_url = console_endpoint + '/devices/' + device_id + '/images/directories/'+ sub_directory_name
response = requests.get(get_images_url, headers=headers, params={'number_of_images': '200', 'skip': skip},)
json_data = response.json()
#ファイルの保存場所を指定する。指定ディレクトリが存在しない場合は作成する。
if not os.path.exists('./GetImages/' + device_id + '/' + sub_directory_name +'/images'):
os.makedirs('./GetImages/' + device_id + '/' + sub_directory_name +'/images')
for d in json_data['images']:
#base64エンコード化された画像データをデコードし、画像ファイルとして保存する
image = base64.b64decode(d['contents'])
with open('./GetImages/' + device_id + '/' + sub_directory_name +'/images/' + d['name'],mode='wb') as f:
f.write(image)
return json_data['total_image_count']
if __name__ == "__main__":
#client_id:secretをbase64エンコード
authorization = base64.b64encode(("xxxxxxxx" + ':' + "xxxxxxxx").encode()).decode()
#token取得
headers = {'accept': 'application/json',
'authorization': 'Basic {}'.format(str(authorization)),
'cache-control': 'no-cache',
'content-type': 'application/x-www-form-urlencoded'
}
data = 'grant_type=client_credentials&scope=system'
response = requests.post("https://auth.aitrios.sony-semicon.com/oauth2/default/v1/token", headers=headers, data=data)
json_data = response.json()
token = str(json_data['access_token'])
total_image_count = 1
roop_count = 0
while total_image_count > 200*roop_count and roop_count < 5:
total_image_count = get_images("https://console.aitrios.sony-semicon.com/api/v1",token,"xxxxxxxxxx", 200*roop_count) #取得対象のデバイスIDを指定する
roop_count += 1
それでは実行してみましょう。
無事に1,000件の画像データが保存されました。

GetImagesは、画像枚数が多い場合にはエラーになることがあります。目安として1台当たり10万枚程度を越えないように定期的に画像を削除してください。
おわりに
本記事では、AITRIOSで画像を取得するAPIの一つである"GetImages"を使用して画像を取得する方法について紹介しました。他の画像取得方法についても今後記事にしていきたいと思います。
困った時は
もし、記事の途中でうまくいかなかった場合は、気軽にこの記事にコメントをください。以下のサポートサイトもご覧ください。
コメントのお返事にはお時間を頂く可能性がありますが、ご了承ください。
また、記事の内容以外で AITRIOS についてお困りごとなどあれば以下よりお問い合わせください。
