Google Cloud Storage

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

Google Cloud Storage にある画像データを管理して Roboflow にアップロードする際、一般的に 2 つの選択肢があります: サイン付き URL を使用するか、(gsutil CLI などを使って)画像をローカルに手動でダウンロードしてからローカル経由でアップロードする方法です。どちらを選ぶかは、データ処理や管理に関する具体的な要件によります。

  • サイン付き URL : 画像をローカルにダウンロードするという追加ステップや時間を避けたい場合に特に有利な方法です。サイン付き URL を使えば、画像データを一度もローカルに保存することなく Google Cloud Storage から直接 Roboflow API にアップロードできます。これにより処理が速くなり、ローカルシステムへの負荷も軽減されます。

  • CLI ローカル : 画像をまずローカル環境にダウンロードしたい状況もあります。例えば、Roboflow にアップロードする前に画像を前処理したり手動で確認したりする必要がある場合、ローカルコピーを持っていることが有益です。

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

Google Cloud JSON キー

バケットに対して適切な権限を持つサービスアカウントを作成し、JSON キー ファイルをダウンロードしてください。このファイルにはアプリケーションの認証に使用される資格情報が含まれます。

オプション 1: サイン付き URL 経由でのアップロード:

Google Cloud SDK を Python で使用して、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 バケットの名前とブロブ名が必要です。画像のサイン付き 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"Successfully uploaded {img_name} to {project_name}")
        return True
    else:
        print(f"Failed to upload {img_name}. Error: {response.content.decode('utf-8')}")
        return False

if __name__ == "__main__":
    # 利用可能なブロブの一覧を取得
    available_blobs = get_gcs_objects(GCS_BUCKET_NAME)
    
    # 任意: ここでブロブをフィルタリングできます
    # 例: available_blobs = [blob for blob in available_blobs if "some_condition"]
    
    # ブロブを 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 にアップロードできます、 Upload Web Interface または Roboflow CLI.

で投稿することもできます。

Last updated

Was this helpful?