Google Cloud Storage
Google Cloud StorageからRoboflowに画像をアップロード
Google Cloud Storageで画像データを保存し、Roboflowにアップロードする際には、一般的に署名付きURLを使用する方法と、gsutil CLIを使って画像をローカルにダウンロードしてからアップロードする方法の2つの選択肢があります。どちらの方法を選ぶかは、データ処理や管理に関するあなたの具体的なニーズによります。
署名付きURL:この方法は、画像をローカルマシンにダウンロードする手間や時間を避けたい場合に特に有利です。署名付きURLを使えば、Google Cloud StorageからRoboflow APIへ直接画像データをアップロードでき、ローカルに保存する必要がありません。これにより、処理が高速化され、ローカルシステムへの負荷も軽減されます。
CLIローカル:まず画像をローカル環境にダウンロードしたい場合もあります。例えば、画像を前処理したり、Roboflowにアップロードする前に手動で確認したい場合は、ローカルコピーがあると便利です。
どちらの方法を選択するかは、データ転送の速度、前処理の必要性、画像の手動検査など、あなたの具体的なユースケース要件によって決まります。
Google Cloud JSONキー
バケットに適切な権限を持つサービスアカウントを作成し、JSONキー ファイルをダウンロードします。このファイルにはアプリケーションの認証に使用する認証情報が含まれます。
オプション1:署名付きURL経由でアップロード:
PythonのGoogle Cloud SDKを使って、Google Cloud Storageバケット内の画像の署名付きURLを生成できます。
def get_gcs_signed_url(bucket_name: str, blob_name: str) -> str:
"""GCSオブジェクトの署名付きURLを生成します。"""
storage_client = storage.Client.from_service_account_json(GOOGLE_APPLICATION_CREDENTIALS)
bucket = storage_client.get_bucket(bucket_name)
blob = bucket.get_blob(blob_name)
url = blob.generate_signed_url(
version="v4",
expiration=3600, # 秒単位で1時間
method="GET"
)
return url
上記のコードスニペットでは、Google Cloud Storageバケット名とblob名が必要です。画像の署名付きURLが生成され、返されます。
これを基に、バケット内の利用可能なすべてのオブジェクトを取得し、それらをAPI経由でRoboflowにアップロードする完全なソリューションを作成できます。このソリューションの概要は以下の通りです:
from google.cloud import storage
import requests
import urllib.parse
# ************* これらの変数を設定してください *************
GCS_BUCKET_NAME = "YOUR_GCS_BUCKET_NAME"
ROBOFLOW_API_KEY = "YOUR_ROBOFLOW_API_KEY"
ROBOFLOW_PROJECT_NAME = "YOUR_ROBOFLOW_PROJECT_NAME"
GOOGLE_APPLICATION_CREDENTIALS = "path/to/your-service-account-file.json"
# ***********************************************
def get_gcs_signed_url(bucket_name: str, blob_name: str) -> str:
"""GCSオブジェクトの署名付きURLを生成します。"""
storage_client = storage.Client.from_service_account_json(GOOGLE_APPLICATION_CREDENTIALS)
bucket = storage_client.get_bucket(bucket_name)
blob = bucket.get_blob(blob_name)
url = blob.generate_signed_url(
version="v4",
expiration=3600, # 秒単位で1時間
method="GET"
)
return url
def get_gcs_objects(bucket_name: str) -> list:
"""指定したGCSバケット内のオブジェクトキーのリストを取得します。"""
storage_client = storage.Client.from_service_account_json(GOOGLE_APPLICATION_CREDENTIALS)
bucket = storage_client.get_bucket(bucket_name)
blobs = bucket.list_blobs()
object_names = []
for blob in blobs:
object_names.append(blob.name)
return object_names
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_gcs_objects(GCS_BUCKET_NAME)
# オプション:ここでblobをフィルタリング
# 例:available_blobs = [blob for blob in available_blobs if "some_condition"]
# blobをRoboflowにアップロード
for blob in available_blobs:
blob_url = get_gcs_signed_url(GCS_BUCKET_NAME, blob)
upload_to_roboflow(ROBOFLOW_API_KEY, ROBOFLOW_PROJECT_NAME, blob_url)
オプション2:GCPからデータをローカルにダウンロード
GCPからデータをダウンロードするには、まずGCP CLIをインストールします。その後、GCPユーザーアカウントで認証します。
画像または画像フォルダをダウンロードするには、次のコマンドを使用します:
gsutil cp -r gs://mybucket/folder .
置き換え mybucket
をGCPストレージバケット名に、 folder
をコピーしたいファイルまたはフォルダのパスに置き換えてください。このコマンドは、対象のファイルまたはフォルダを現在の作業ディレクトリ(.
).
Roboflowへのデータアップロード
データをダウンロードしたので、次のいずれかの方法でRoboflowにアップロードできます: アップロードWebインターフェース または Roboflow CLI.
関連情報
Last updated
Was this helpful?