Google Cloud Storage

Google Cloud Storage から画像を Roboflow にアップロードします

Google Cloud Storageで画像データを保存し、Roboflowにアップロードする際には、一般的に署名付きURLを使用する方法と、gsutil CLIを使って画像をローカルにダウンロードしてからローカルでアップロードする方法の2つの選択肢があります。どちらの方法を選ぶかは、データ処理や管理に関する具体的なニーズによって異なります。

  • 署名付きURL:この方法は、画像をローカルマシンにダウンロードする手間や時間を省きたい場合に特に有利です。署名付きURLを使えば、Google Cloud StorageからRoboflow APIに直接画像データをアップロードでき、ローカルに保存する必要がありません。これにより、処理が高速化され、ローカルシステムへの負荷も軽減されます。

  • CLIローカル:画像をまずローカル環境にダウンロードしたい場合もあります。たとえば、アップロード前に画像を前処理したり手動で確認したい場合は、ローカルコピーがあると便利です。

どちらの方法を選ぶかは、データ転送速度、前処理の必要性、画像の手動検査など、具体的なユースケースの要件によって決まります。

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?