Azure Blob Storage

Azure Blob Storage에서 Roboflow로 이미지 업로드

Azure Blob Storage에 이미지 데이터를 저장하고 Roboflow에 업로드할 때 일반적으로 두 가지 옵션이 있습니다: 서명된 URL을 사용하거나 이미지를 로컬로 수동으로 다운로드(예: Azure CLI를 통해)하여 로컬에서 업로드하는 방법입니다. 이러한 방법 중 어느 것을 선택할지는 데이터 처리 및 관리에 대한 특정 요구 사항에 따라 달라집니다.

  • 서명된 URL: 이 방법은 이미지를 로컬 머신에 다운로드하는 추가 단계와 시간 소모를 피하고자 할 때 특히 유리합니다. 서명된 URL을 사용하면 이미지 데이터를 로컬에 저장하지 않고도 Azure Blob Storage에서 직접 Roboflow API로 업로드할 수 있습니다. 결과적으로 처리 속도가 빨라지고 로컬 시스템의 부담이 줄어듭니다.

  • 로컬 CLI: 경우에 따라 이미지를 먼저 로컬 환경으로 다운로드하는 것을 선호할 수 있습니다. 예를 들어 업로드 전에 이미지를 전처리하거나 수동으로 확인해야 하는 경우 로컬 사본이 있으면 유리합니다.

올바른 방법 선택은 데이터 전송 속도, 전처리 필요성 또는 이미지의 수동 검사와 같은 특정 사용 사례 요구 사항에 따라 달라집니다.

Azure 연결 문자열

Storage Account를 생성한 후 Azure 포털의 "Security + networking" 아래의 "Access keys" 섹션에서 액세스 키 또는 연결 문자열을 찾을 수 있습니다. 이러한 자격 증명은 애플리케이션 인증에 사용됩니다.

옵션 1: 서명된 URL을 통한 업로드:

Azure SDK for Python을 사용하여 Azure Blob Storage에 있는 이미지에 대한 서명된 URL을 생성할 수 있습니다.

def get_blob_sas_url(blob_service_client, container_name: str, blob_name: str) -> str:
    """Azure Blob에 대한 SAS URL을 생성합니다."""
    from azure.storage.blob import generate_blob_sas, BlobSasPermissions
    from datetime import datetime, timedelta

    sas_token = generate_blob_sas(
        blob_service_client.account_name,
        container_name,
        blob_name,
        account_key=blob_service_client.credential.account_key,
        permission=BlobSasPermissions(read=True),
        expiry=datetime.utcnow() + timedelta(hours=1)
    )
    
    blob_url = f"https://{blob_service_client.account_name}.blob.core.windows.net/{container_name}/{blob_name}?{sas_token}"
    return blob_url

위 코드 스니펫에서는 blob service client, 컨테이너 이름 및 blob 이름이 필요합니다. 이미지의 서명된 URL이 생성되어 반환됩니다.

이를 바탕으로 Azure Blob Storage에 있는 모든 사용 가능한 객체를 가져와 API를 통해 Roboflow에 업로드하는 완전한 솔루션을 생성할 수 있습니다. 이 솔루션의 개요는 아래에 나와 있습니다:

from azure.storage.blob import BlobServiceClient
import requests
import urllib.parse

# ************* 이 변수들을 설정하세요 *************
AZURE_CONNECTION_STRING = "YOUR_AZURE_CONNECTION_STRING"
AZURE_CONTAINER_NAME = "YOUR_AZURE_CONTAINER_NAME"
ROBOFLOW_API_KEY = "YOUR_ROBOFLOW_API_KEY"
ROBOFLOW_PROJECT_NAME = "YOUR_ROBOFLOW_PROJECT_NAME"
# ***********************************************

def get_blob_sas_url(blob_service_client, container_name: str, blob_name: str) -> str:
    """Azure Blob에 대한 SAS URL을 생성합니다."""
    from azure.storage.blob import generate_blob_sas, BlobSasPermissions
    from datetime import datetime, timedelta

    sas_token = generate_blob_sas(
        blob_service_client.account_name,
        container_name,
        blob_name,
        account_key=blob_service_client.credential.account_key,
        permission=BlobSasPermissions(read=True),
        expiry=datetime.utcnow() + timedelta(hours=1)
    )
    
    blob_url = f"https://{blob_service_client.account_name}.blob.core.windows.net/{container_name}/{blob_name}?{sas_token}"
    return blob_url

def get_azure_blob_objects(container_name: str) -> list:
    """주어진 Azure Blob 컨테이너에서 blob 이름 목록을 가져옵니다."""
    blob_service_client = BlobServiceClient.from_connection_string(AZURE_CONNECTION_STRING)
    container_client = blob_service_client.get_container_client(container_name)
    
    blobs = []
    blob_list = container_client.list_blobs()
    for blob in blob_list:
        blobs.append(blob.name)
    return blobs

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_blobs = get_azure_blob_objects(AZURE_CONTAINER_NAME)
    
    # 선택 사항: 여기서 블랍을 필터링하세요
    # 예: available_blobs = [blob for blob in available_blobs if "some_condition"]
    
    # Azure Blob Service Client 초기화
    blob_service_client = BlobServiceClient.from_connection_string(AZURE_CONNECTION_STRING)
    
    # 블랍을 Roboflow에 업로드
    for blob in available_blobs:
        blob_url = get_blob_sas_url(blob_service_client, AZURE_CONTAINER_NAME, blob)
        upload_to_roboflow(ROBOFLOW_API_KEY, ROBOFLOW_PROJECT_NAME, blob_url)

옵션 2: Azure에서 데이터 로컬로 다운로드

먼저, azcopy 명령줄 유틸리티를 설치하십시오. 이 유틸리티를 사용하면 Azure Storage에서 파일 및 폴더를 다운로드할 수 있습니다. 그런 다음 Shared Access Signature 토큰을 사용하여 Azure 계정에 인증하십시오. 다음에서 SAS 토큰을 가져오는 방법 azcopy 문서에서 자세히 알아볼 수 있습니다.

설정이 완료되면, 파일이나 폴더를 다운로드하려면 다음 명령을 실행하십시오: azcopy azcopy copy "C:\local\path" <sas-token> --recursive=true

C:\local\path

다음을 교체하세요 다운로드하려는 폴더 또는 파일의 경로로 바꾸십시오. <sas-token> 값을 인증을 위한 SAS 토큰으로 교체하세요. 파일과 폴더를 재귀적으로 다운로드하려면 위와 같이 --recursive=true 인수를 지정하십시오. 그렇지 않으면 이 인수를 제거하세요. with the path of the folder or file you want to download. Replace the <sas-token> value with an SAS token for authentication. If you want to download files and folders recursively, specify the --recursive=true argument as above. Otherwise, remove this argument.

데이터를 Roboflow에 업로드

이제 데이터를 다운로드했으므로 다음을 사용하여 Roboflow에 업로드할 수 있습니다 업로드 웹 인터페이스 또는 Roboflow CLI.

도움을 참조할 수 있습니다

Last updated

Was this helpful?