Azure Blob Storage

Azure Blob Storage से इमेज Roboflow में अपलोड करें

Azure Blob Storage में इमेज डेटा स्टोरेज और Roboflow पर अपलोड करने के मामले में आपके पास आम तौर पर दो विकल्प होते हैं: साइन किए गए URLs का उपयोग करना या मैन्युअली इमेजेज़ को स्थानीय रूप से (Azure CLI के माध्यम से) डाउनलोड करके स्थानीय रूप से अपलोड करना। इन तरीकों में से किसे चुनना है यह आपके डेटा प्रोसेसिंग और प्रबंधन की विशिष्ट आवश्यकताओं पर निर्भर करता है।

  • Signed URLsयह विधि विशेष रूप से फायदेमंद है यदि आप अपनी स्थानीय मशीन पर इमेजेज़ डाउनलोड करने से जुड़ा अतिरिक्त चरण और समय बचाना चाहते हैं। साइन किए गए URL के साथ, आप Azure Blob Storage से सीधे Roboflow API पर इमेज डेटा अपलोड कर सकते हैं बिना इसे कभी लोकली स्टोर किए। इसका परिणाम तेज प्रोसेसिंग और आपके स्थानीय सिस्टम पर कम लोड होता है।

  • CLI Locally: कुछ परिदृश्यों में आप पहले इमेज को अपनी लोकल एनवायरनमेंट में डाउनलोड करना पसंद कर सकते हैं। उदाहरण के लिए, यदि आपको इमेजेस को प्रीप्रोसेस करना है या Roboflow पर अपलोड करने से पहले मैन्युअल रूप से चेक करना है, तो लोकल कॉपी होना लाभप्रद होगा।

सही विधि का चयन आपकी विशेष उपयोग-केस आवश्यकताओं पर निर्भर करेगा, जैसे डेटा ट्रांसफर की गति, प्रीप्रोसेसिंग की आवश्यकता, या इमेजेस का मैन्युअल निरीक्षण।

Azure Connection String

Storage Account बनाने के बाद, आप Azure पोर्टल में "Security + networking" के अंतर्गत "Access keys" सेक्शन में access keys या connection string पा सकते हैं। ये क्रेडेंशियल्स आपके एप्लिकेशन को प्रमाणित करने के लिए उपयोग किए जाते हैं।

Option 1: Upload Via Signed URL:

आप Azure SDK in Python द्वारा Azure Blob Storage में अपनी इमेजेज़ के लिए साइन किए गए URLs जनरेट कर सकते हैं।

def get_blob_sas_url(blob_service_client, container_name: str, blob_name: str) -> str:
    """Generate a SAS URL for an Azure Blob."""
    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, container name, और blob name की आवश्यकता है। इमेज का साइन किया गया URL जनरेट करके रिटर्न किया जाता है।

इसके आधार पर हम एक पूर्ण समाधान जनरेट कर सकते हैं जो Azure Blob Storage में उपलब्ध सभी ऑब्जेक्ट्स को खींचता है, और फिर उन्हें API के माध्यम से Roboflow पर अपलोड करता है। इस समाधान का एक रूपरेखा नीचे देखा जा सकता है:

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

# ************* SET THESE VARIABLES *************
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:
    """Generate a SAS URL for an Azure Blob."""
    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:
    """Fetch the list of blob names in the given Azure Blob container."""
    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"):
    """Upload an image to 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)

    # Check response code
    if response.status_code == 200:
        print(f"Successfully uploaded {img_name} to {project_name}")
        return True
    else:
        print(f"Failed to upload {img_name}. Error: {response.content.decode('utf-8')}")
        return False

if __name__ == "__main__":
    # Fetch list of available blobs
    available_blobs = get_azure_blob_objects(AZURE_CONTAINER_NAME)
    
    # Optional: Filter the blobs here
    # e.g., available_blobs = [blob for blob in available_blobs if "some_condition"]
    
    # Initialize Azure Blob Service Client
    blob_service_client = BlobServiceClient.from_connection_string(AZURE_CONNECTION_STRING)
    
    # Upload blobs to 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 से फाइलें और फोल्डर्स डाउनलोड करने की अनुमति देती है। फिर, अपने Azure अकाउंट के साथ प्रमाणीकृत करने के लिए एक Shared Access Signature token का उपयोग करें। आप इसके बारे में और जान सकते हैं कि how to retrieve an SAS token azcopy दस्तावेज़ में।

एक बार जब आप azcopy सेटअप कर लें, तो किसी फ़ाइल या फ़ोल्डर को डाउनलोड करने के लिए निम्न कमांड चलाएं:

azcopy copy "C:\local\path" <sas-token> --recursive=true

Replace C:\local\path उस फ़ोल्डर या फ़ाइल के पथ के साथ जिसे आप डाउनलोड करना चाहते हैं। <sas-token> मान को प्रमाणीकरण के लिए एक SAS token से बदलें। --recursive=true यदि आप फ़ाइलों और फ़ोल्डरों को पुनरावर्ती रूप से डाउनलोड करना चाहते हैं, तो ऊपर के रूप में --recursive=true तर्क निर्दिष्ट करें। अन्यथा, इस तर्क को हटा दें।

Upload Data to Roboflow

अब जब हमने डेटा डाउनलोड कर लिया है, तो हम इसे Roboflow पर या तो Upload Web Interface या Roboflow CLI.

पर भी पोस्ट कर सकते हैं

Last updated

Was this helpful?