> For the complete documentation index, see [llms.txt](https://docs.roboflow.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.roboflow.com/datasets/ja/toappurdo/adding-data/upload-data-from-aws-gcp-and-azure/google-cloud-storage.md).

# Google Cloud Storage

{% hint style="warning" %}
Google Cloud Storage では、使用してください [データソース](/datasets/ja/toappurdo/adding-data/datasources.md) および Bucket Mirror。明示的に 1 回限りまたはアドホックなインポートが必要な場合を除きます。Datasources は、スクリプト、署名付き URL、またはローカルダウンロードなしで、画像とメタデータを同期させます。参照してください [Google Cloud Storage の認証情報](/datasets/ja/toappurdo/adding-data/datasource-credentials/gcs.md) でアクセスを設定してください。
{% endhint %}

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"{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 ユーザーアカウントで認証します。

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

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

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

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

データをダウンロードしたので、これを Roboflow にアップロードできます。方法としては、 [アップロード Web インターフェース](/datasets/ja/toappurdo/adding-data.md#upload-data-with-the-web-application) または [Roboflow CLI](/datasets/ja/toappurdo/adding-data.md#upload-datasets-with-the-command-line).

## 関連項目

* [データソース（Bucket Mirror）](/datasets/ja/toappurdo/adding-data/datasources.md) - スクリプトなしで GCS から継続的に自動同期
* [Roboflow のプロジェクト ID を取得](https://docs.roboflow.com/reference/authentication/authentication/workspace-and-project-ids)
