Google Cloud Storage

Google Cloud Storage에서 Roboflow로 이미지 업로드

Google Cloud Storage에서 이미지 데이터를 저장하고 Roboflow에 업로드할 때 일반적으로 서명된 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을 생성할 수 있습니다.

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이 생성되어 반환됩니다.

이를 기반으로 버킷 내의 모든 객체를 가져와 Roboflow API를 통해 업로드하는 완전한 솔루션을 만들 수 있습니다. 이 솔루션의 개요는 아래와 같습니다:

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에 업로드할 수 있습니다. 웹 업로드 인터페이스 또는 Roboflow CLI.

참고 자료

Last updated

Was this helpful?