# Google Cloud Storage

Google Cloud Storage で画像データを保存し、Roboflow にアップロードする場合、一般的には 2 つの選択肢があります。署名付き URL を使う方法、または画像をローカルに手動でダウンロードする方法（gsutil CLI 経由）で、ローカルからアップロードする方法です。どちらを選ぶかは、データ処理と管理に対する具体的なニーズによります。

* **署名付き URL**：この方法は、画像をローカルマシンにダウンロードする際に発生する追加の手順や時間を避けたい場合に特に有利です。署名付き URL を使えば、画像データを Google Cloud Storage から Roboflow API に直接アップロードでき、ローカルに保存する必要がありません。その結果、処理が速くなり、ローカルシステムへの負荷も軽減されます。
* **CLI でローカルに**：画像をまずローカル環境にダウンロードしたい、というケースもあるでしょう。たとえば、Roboflow にアップロードする前に画像を前処理したり、手動で確認したりする必要がある場合は、ローカルコピーがあると便利です。

適切な方法の選択は、データ転送速度、前処理の必要性、画像の手動確認など、特定のユースケース要件によって決まります。

### Google Cloud JSON キー

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

### オプション 1: 署名付き URL 経由でアップロード：

Python で Google Cloud SDK を使用すると、Google Cloud Storage バケット内の画像に対する署名付き URL を生成できます。

```python
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 にアップロードする完全なソリューションを作成できます。このソリューションの概要は以下のとおりです。

```python
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__":
    # 利用可能な 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 ユーザーアカウントで認証します。

画像または画像フォルダをダウンロードするには、次のコマンドを使用します。

```bash
gsutil cp -r gs://mybucket/folder .
```

置き換えてください `mybucket` を GCP ストレージバケットの名前に、そして `folder` をコピーしたいファイルまたはフォルダの保存先にします。このコマンドは、対象のファイルまたはフォルダを現在の作業ディレクトリ（`.`).

### Roboflow にデータをアップロード

データをダウンロードしたので、Roboflow には次のいずれかを使ってアップロードできます。 [Upload Web Interface](/roboflow/roboflow-jp/datasets/adding-data.md#upload-data-with-the-web-interface) または [Roboflow CLI](/developer/command-line-interface/upload-a-dataset.md).

### も参照

* [Roboflow のプロジェクト ID を取得する](https://docs.roboflow.com/api-reference/workspace-and-project-ids)


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.roboflow.com/roboflow/roboflow-jp/datasets/adding-data/upload-data-from-aws-gcp-and-azure/google-cloud-storage.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
