0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Consoleから画像を取得する GetImages Stable編

Last updated at Posted at 2025-11-12

本記事は過去記事のアーカイブです。

ソニーセミコンダクタソリューションズの大橋です。
本記事ではREST API"GetImagesStable"を使ってConsoleに保存されている画像を取得する方法について紹介します。

はじめに

AITRIOSではエッジデバイスから推論結果メタデータのみを送信することにより、ネットワーク通信量の抑制や、個人の画像を取得しないことによりプライバシーを守れるなどのメリットを得ることができます。しかし用途や実験段階では画像データを同時に出力することもあるでしょう。出力された画像はConsoleのCheck Dataで確認することができますが、ローカルへのダウンロードしたい場合もあると思います。そのような場合はREST APIを使用してConsoleから画像を取得することができます。

REST APIのリファレンスを参照すると、画像を取得するためのAPIがいくつか用意されています。本記事では"GetImagesStable"を用いて画像を取得してみます。

前提

  • ConsoleのCheck Dataで画像が表示される状態であること。
  • Pythonで、AITRIOSのREST APIを実行できること。

REST APIを実行する方法については、公式マニュアル「Console REST API 使い方ガイド」に記載がありますので、詳細についてはこちらを参照してください。簡単に流れを説明すると、

  1. 使用するAITRIOSプロジェクトのClient ID, Client SecretをPortalエンドポイントに送信する。
  2. 認証が成功すると、アクセストークンが発行される。
  3. ConsoleエンドポイントにREST APIコマンド (HTTPリクエスト) を送信する。このとき、ヘッダにアクセストークンを設定する。

のようになります。こちらについてはブラウザでREST APIを実行してエッジデバイスを制御してみたにも関連記事を掲載していますので是非御覧ください。

GetImagesStableの仕様の確認

では、GetImagesStableの仕様をREST APIのリファレンスで確認しておきましょう。

GetImagesStableのAPIリファレンス
GetImagesStableリファレンス.png

さて、必須パラメータとしてdevice_idsub_directory_nameがあります。つまり、このAPIで画像を取得する場合は1デバイスごとに取得する必要があり、また、事前にフォルダ名を取得しておく必要があります。フォルダ名の取得はGetImageDirectoriesを用いることで可能ですが、本記事では詳細を省略します。この仕様はGetImagesと変わりません。

リファレンスに記載の通り、このAPIでは画像が保存されているAITRIOS内部ストレージから画像をダウンロードするためのSAS URLが返されます。したがって、GetImagesを利用した画像の取得の流れは以下のようになります。

  1. デバイスID、フォルダ名、取得枚数 (初期値は50)、starting_after (取得したい枚数が取得枚数を越えた時、2回目以降のAPI実行時に指定する)、name_starts_with (ファイル名の前方一致検索に使用する)、を指定してGetImages Stable APIを呼び出す。
  2. APIから返り値としてSAS URLを取得する。
  3. 取得したSAS URLにアクセスし、画像をダウンロードする。
  4. ダウンロードした画像ファイルを保存する。
  5. 取得した画像以外の画像を引き続き取得する場合、APIの返り値のcontinuation_tokenをstarting_afterに指定してAPI呼び出しを繰り返す。

以下のサンプルでは取り扱っていませんが、name_starts_withを指定することにより、ある程度画像データが出力された時間を絞ることができます。下図のように、メタデータと画像データは、メタデータに出力されているTの値と画像ファイル名で紐づけることができます。

そしてTの値は日付形式 (yyyyMMddHHmmssffff) となっています。
yyyy:4桁の年を表す文字列
MM:2桁の月を表す文字列
dd:2桁の日を表す文字列
HH:2桁の時間を表す文字列
mm:2桁の分を表す文字列
ss:2桁の秒を表す文字列
ffff:3桁のミリ秒を表す文字列

したがって、2025年4月17日15時以降の画像を取得したい場合、name_starts_withに"2025041715"を指定すれば良いことになります。ただし日付はUTCタイムゾーンとなりますので注意してください。

GetImages Stableサンプルコードの作成と実行

以下にサンプルコードを示します。
本サンプルでは、指定したフォルダに大量の画像が保存されていることを想定し、直近1000枚分の画像データのみを取得 (200枚の画像取得 × 5回) をするようにしました。

ユースケースによっては、より多くの画像をローカルで管理したいこともあるかもしれません。
全ての画像データをローカルで管理したいということであれば、初めから外部ストレージに保存してしまうという選択肢もあります。
AITRIOSで外部ストレージ(Azure Blob)連携を使ってみたや、AITRIOSで外部ストレージ(Local Storage)連携を使ってみたも御覧ください。

import requests
import base64
import json
import os

get_images_total_time = 0
save_images_total_time = 0

def get_images_stable(console_endpoint,access_token,device_id, continuation_token = None):
  headers = {'Authorization': 'Bearer {}'.format(access_token)}
  sub_directory_name = 'xxxxxxxxx' #取得対象のフォルダ名

  get_images_url = console_endpoint + '/images/devices/' + device_id + '/directories/'+ sub_directory_name
  response = requests.get(get_images_url, headers=headers, params={'limit': '200', 'starting_after': continuation_token},)
  json_data = response.json()

  if not os.path.exists('./GetImages_stable/' + device_id + '/' + sub_directory_name +'/images'):
    os.makedirs('./GetImages_stable/' + device_id + '/' + sub_directory_name +'/images')
  for d in json_data['data']:
    image_data = requests.get(d['sas_url']).content
    with open('./GetImages_stable/' + device_id + '/' + sub_directory_name +'/images/' + d['name'],mode='wb') as f:
      f.write(image_data)
  return json_data['continuation_token']

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'])

    continuation_token = get_images_stable("https://console.aitrios.sony-semicon.com/api/v1",token,"sxxxxxxxxxx") #取得対象のデバイスIDを指定する
    roop_count = 1
    while continuation_token != None and roop_count < 5:
      continuation_token = get_images_stable("https://console.aitrios.sony-semicon.com/api/v1",token,"xxxxxxxxxx", continuation_token) #取得対象のデバイスIDを指定する
      roop_count += 1

それでは実行してみましょう。
GetImagesStable結果.png

無事に1,000件の画像データが保存されました。

GetImagesとGetImages Stableの違い

GetImagesについては別記事にて紹介しています。どちらも画像を取得するためのAPIですが指定するパラメータには違いがありました。取得する画像の期間を指定する場合はGetImagesの方が使い勝手が良さそうです。また、GetImagesでは画像をBese64エンコード化したデータを返すのに対し、GetImages StableではSAS URLを返すため、データ量としては少なく、APIの実行速度はGetImages Stableの方が速いです。
ただし、SAS URLを使用して画像をダウンロードする時間まで考えると、GetImagesの方が速いです。ネットワーク環境やPCスペック、取得する画像サイズによって結果は異なりますが、筆者の環境では以下のような結果になりました。また、筆者が考えるメリット、デメリットについても記載しました。

GetImages Stable GetImages
APIの実行時間(1000枚取得) 約2秒 約25秒
画像保存までの時間(APIの実行時間を除く) 約200秒 約0秒
メリット API実行時間が短い 取得する画像の期間の指定が容易
画像を保存するまでの時間がGetImages Stableより速い
デメリット 取得する画像の期間の指定にコツが必要
SAS URLから画像を取得するのに時間がかかる
API自身のデータ通信量が多くなり、レスポンスがGetImages Stableより遅い
ディレクトリに対する画像枚数が増えるほどレスポンスが遅くなる

1,000枚程度の画像処理の場合、base64デコードする時間はほとんどかからないため、GetImagesではAPIの実行時間がほぼ画像保存までの時間と同じになりました。

おわりに

本記事では、AITRIOSで画像を取得するAPIの一つである"GetImages Stable"を使用して画像を取得する方法について紹介しました。他の方法についても記事にしていますので、用途に合わせて使ってみてください。

困った時は

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

  • Support Site
    また、記事の内容以外で AITRIOS についてお困りごとなどあれば以下よりお問い合わせください。
  • Contact Us
0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?