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?