Azure Blob Storage
Azure Blob StorageからRoboflowに画像をアップロード
Azure Blob Storageでの画像データの保存とRoboflowへのアップロードを扱う場合、一般的に署名付きURLを使用する方法と、Azure CLIを使って画像をローカルにダウンロードしてからローカルでアップロードする方法の2つの選択肢があります。どちらの方法を選ぶかは、データ処理や管理に関するあなたの具体的なニーズによります。
署名付きURLこの方法は、画像をローカルマシンにダウンロードする手間や時間を避けたい場合に特に有利です。署名付きURLを使えば、Azure Blob StorageからRoboflow APIへ直接画像データをアップロードでき、ローカルに保存する必要がありません。これにより、処理が速くなり、ローカルシステムへの負荷も軽減されます。
CLIローカル:まず画像をローカル環境にダウンロードしたい場合もあります。例えば、画像を前処理したり、Roboflowにアップロードする前に手動で確認したい場合は、ローカルコピーがあると便利です。
どちらの方法を選択するかは、データ転送の速度、前処理の必要性、画像の手動検査など、あなたの具体的なユースケース要件によって決まります。
Azure接続文字列
ストレージアカウントを作成した後、Azureポータルの「セキュリティ + ネットワーク」内の「アクセスキー」セクションでアクセスキーまたは接続文字列を見つけることができます。これらの認証情報はアプリケーションの認証に使用されます。
オプション1:署名付きURL経由でアップロード:
Azure SDK for Pythonを使って、Azure Blob Storage内の画像の署名付きURLを生成できます。
def get_blob_sas_url(blob_service_client, container_name: str, blob_name: str) -> str:
"""Azure BlobのSAS URLを生成します。"""
from azure.storage.blob import generate_blob_sas, BlobSasPermissions
from datetime import datetime, timedelta
sas_token = generate_blob_sas(
blob_service_client.account_name,
container_name,
blob_name,
account_key=blob_service_client.credential.account_key,
permission=BlobSasPermissions(read=True),
expiry=datetime.utcnow() + timedelta(hours=1)
)
blob_url = f"https://{blob_service_client.account_name}.blob.core.windows.net/{container_name}/{blob_name}?{sas_token}"
return blob_url
上記のコードスニペットでは、Blobサービスクライアント、コンテナ名、Blob名が必要です。画像の署名付きURLが生成され、返されます。
これを基に、Azure Blob Storage内の利用可能なすべてのオブジェクトを取得し、それらをAPI経由でRoboflowにアップロードする完全なソリューションを作成できます。このソリューションの概要は以下の通りです。
from azure.storage.blob import BlobServiceClient
import requests
import urllib.parse
# ************* これらの変数を設定してください *************
AZURE_CONNECTION_STRING = "YOUR_AZURE_CONNECTION_STRING"
AZURE_CONTAINER_NAME = "YOUR_AZURE_CONTAINER_NAME"
ROBOFLOW_API_KEY = "YOUR_ROBOFLOW_API_KEY"
ROBOFLOW_PROJECT_NAME = "YOUR_ROBOFLOW_PROJECT_NAME"
# ***********************************************
def get_blob_sas_url(blob_service_client, container_name: str, blob_name: str) -> str:
"""Azure BlobのSAS URLを生成します。"""
from azure.storage.blob import generate_blob_sas, BlobSasPermissions
from datetime import datetime, timedelta
sas_token = generate_blob_sas(
blob_service_client.account_name,
container_name,
blob_name,
account_key=blob_service_client.credential.account_key,
permission=BlobSasPermissions(read=True),
expiry=datetime.utcnow() + timedelta(hours=1)
)
blob_url = f"https://{blob_service_client.account_name}.blob.core.windows.net/{container_name}/{blob_name}?{sas_token}"
return blob_url
def get_azure_blob_objects(container_name: str) -> list:
"""指定したAzure Blobコンテナ内のBlob名リストを取得します。"""
blob_service_client = BlobServiceClient.from_connection_string(AZURE_CONNECTION_STRING)
container_client = blob_service_client.get_container_client(container_name)
blobs = []
blob_list = container_client.list_blobs()
for blob in blob_list:
blobs.append(blob.name)
return blobs
def upload_to_roboflow(api_key: str, project_name: str, presigned_url: str, img_name='', split="train"):
"""画像をRoboflowにアップロードします。"""
API_URL = "https://api.roboflow.com"
if img_name == '':
img_name = presigned_url.split("/")[-1]
upload_url = "".join([
API_URL + "/dataset/" + project_name + "/upload",
"?api_key=" + api_key,
"&name=" + img_name,
"&split=" + split,
"&image=" + urllib.parse.quote_plus(presigned_url),
])
response = requests.post(upload_url)
# レスポンスコードを確認
if response.status_code == 200:
print(f"{img_name} を {project_name} に正常にアップロードしました")
return True
else:
print(f"{img_name} のアップロードに失敗しました。エラー: {response.content.decode('utf-8')}")
return False
if __name__ == "__main__":
# 利用可能なblobのリストを取得
available_blobs = get_azure_blob_objects(AZURE_CONTAINER_NAME)
# オプション:ここでblobをフィルタリング
# 例:available_blobs = [blob for blob in available_blobs if "some_condition"]
# Azure Blobサービスクライアントの初期化
blob_service_client = BlobServiceClient.from_connection_string(AZURE_CONNECTION_STRING)
# blobをRoboflowにアップロード
for blob in available_blobs:
blob_url = get_blob_sas_url(blob_service_client, AZURE_CONTAINER_NAME, blob)
upload_to_roboflow(ROBOFLOW_API_KEY, ROBOFLOW_PROJECT_NAME, blob_url)
オプション2:Azureからデータをローカルにダウンロード
まず、 azcopy
コマンドラインユーティリティをインストールします。このユーティリティを使うと、Azure Storageからファイルやフォルダをダウンロードできます。その後、 共有アクセス署名(SAS) トークンを使ってAzureアカウントに認証します。詳細は SASトークンの取得方法 についてazcopyのドキュメントで確認できます。
準備ができたら、 azcopy
次のコマンドを実行してファイルやフォルダをダウンロードします。
azcopy copy "C:\local\path" <sas-token> --recursive=true
置き換え C:\local\path
は、ダウンロードしたいフォルダやファイルのパスに置き換えてください。 <sas-token>
の値は認証用のSASトークンに置き換えてください。ファイルやフォルダを再帰的にダウンロードしたい場合は、 --recursive=true
引数を上記のように指定します。再帰的にしない場合はこの引数を削除してください。
Roboflowへのデータアップロード
データをダウンロードしたので、次のいずれかの方法でRoboflowにアップロードできます: アップロードWebインターフェース または Roboflow CLI.
関連情報
Last updated
Was this helpful?