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?