AWS S3 버킷
AWS S3 버킷에서 Roboflow로 이미지 업로드
AWS S3에 이미지 데이터를 저장하고 Roboflow에 업로드할 때 일반적으로 두 가지 옵션이 있습니다: 서명된 URL을 사용하거나 이미지를 로컬로 수동으로 다운로드(예: AWS CLI 사용)하여 로컬에서 업로드하는 방법입니다. 어떤 방법을 선택할지는 데이터 처리 및 관리에 대한 특정 요구사항에 따라 다릅니다.
서명된 URL: 이 방법은 이미지를 로컬 머신에 다운로드하는 추가 단계와 시간 소모를 피하고자 할 때 특히 유리합니다. 서명된 URL을 사용하면 이미지를 로컬에 저장할 필요 없이 S3에서 Roboflow API로 직접 이미지 데이터를 업로드할 수 있습니다. 이는 더 빠른 처리와 로컬 시스템에 대한 부담 감소로 이어집니다.
로컬 CLI: 경우에 따라 이미지를 먼저 로컬 환경으로 다운로드하는 것을 선호할 수 있습니다. 예를 들어 업로드 전에 이미지를 전처리하거나 수동으로 확인해야 하는 경우 로컬 사본이 있으면 유리합니다.
올바른 방법 선택은 데이터 전송 속도, 전처리 필요성 또는 이미지의 수동 검사와 같은 특정 사용 사례 요구 사항에 따라 달라집니다.
AWS CLI 설정
스크립트를 사용하기 전에 필요한 인증 자격 증명을 사용하여 AWS CLI를 설정했는지 확인하세요. 이렇게 하면 원하는 S3 버킷에 접근하고 관리할 수 있습니다.
AWS CLI 구성
AWS CLI를 설치한 후 터미널이나 명령 프롬프트를 엽니다.
다음 명령을 실행하세요:
aws configureAWS 자격 증명을 입력하라는 메시지가 표시됩니다:
AWS Access Key ID [None]: YOUR_ACCESS_KEY AWS Secret Access Key [None]: YOUR_SECRET_ACCESS_KEY Default region name [None]: YOUR_PREFERRED_REGION (예: us-west-1) Default output format [None]: json
옵션 1: 서명된 URL을 통한 업로드:
boto3을 사용하여 S3 버킷에 있는 이미지에 대한 서명된 URL을 생성할 수 있습니다.
def generate_presigned_url(bucket_name: str, object_name: str, region: str = 'us-east-2') -> str:
"""S3 객체에 대한 프리사인드 URL을 생성합니다."""
s3 = boto3.client('s3', region_name=region, config=Config(signature_version='s3v4'))
url = s3.generate_presigned_url('get_object',
Params={'Bucket': bucket_name, 'Key': object_name},
ExpiresIn=3600)
return url위 코드 스니펫에서는 S3 버킷 이름, S3 버킷 내 이미지의 객체 이름 및 aws 리전이 필요합니다. 이미지의 서명된 URL이 생성되어 반환됩니다.
이를 바탕으로 S3 버킷의 모든 사용 가능한 객체를 가져와 Roboflow API를 통해 업로드하는 완전한 솔루션을 생성할 수 있습니다. 이 솔루션의 개요는 아래와 같습니다:
import boto3
import requests
import urllib.parse
from botocore.config import Config
# ************* 이 변수들을 설정하세요 *************
S3_BUCKET_NAME = "YOUR_S3_BUCKET_NAME"
ROBOFLOW_API_KEY = "YOUR_ROBOFLOW_API_KEY"
ROBOFLOW_PROJECT_NAME = "YOUR_ROBOFLOW_PROJECT_NAME"
# ***********************************************
def generate_presigned_url(bucket_name: str, object_name: str, region: str = 'us-east-2') -> str:
"""S3 객체에 대한 프리사인드 URL을 생성합니다."""
s3 = boto3.client('s3', region_name=region, config=Config(signature_version='s3v4'))
url = s3.generate_presigned_url('get_object',
Params={'Bucket': bucket_name, 'Key': object_name},
ExpiresIn=3600)
return url
def get_s3_objects(bucket_name: str) -> list:
"""주어진 S3 버킷의 객체 키 목록을 가져옵니다."""
s3 = boto3.client('s3')
objects = []
response = s3.list_objects_v2(Bucket=bucket_name)
for obj in response['Contents']:
objects.append(obj['Key'])
return objects
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__":
# 사용 가능한 이미지 목록 가져오기
available_images = get_s3_objects(S3_BUCKET_NAME)
# 선택 사항: 여기서 이미지를 필터링할 수 있습니다
# 예: available_images = [img for img in available_images if "some_condition"]
# 이미지를 Roboflow로 업로드
for image in available_images:
presigned_url = generate_presigned_url(S3_BUCKET_NAME, image)
upload_to_roboflow(ROBOFLOW_API_KEY, ROBOFLOW_PROJECT_NAME, presigned_url)
옵션 2: AWS에서 데이터 로컬로 다운로드
AWS에서 데이터를 업로드하려면 먼저 awscli 명령줄 도구를 설치하세요. 이 도구를 사용하면 명령줄에서 AWS 계정과 상호작용할 수 있습니다. 명령줄 도구를 설치한 후 다음 명령을 실행하세요:
aws s3 sync s3://mybucket/folder_path .다음을 교체하세요 mybucket 버킷 이름과 함께 folder_path 내보내려는 폴더 또는 파일의 이름을 사용하세요. 이 명령은 AWS에서 현재 작업 디렉터리로 자산을 다운로드합니다 (.).
데이터를 Roboflow에 업로드
이제 데이터를 다운로드했으므로 다음을 사용하여 Roboflow에 업로드할 수 있습니다 업로드 웹 인터페이스 또는 Roboflow CLI.
도움을 참조할 수 있습니다
Last updated
Was this helpful?