AWS S3 बकेट

AWS S3 बकेट से रोबोफ्लो में छवियाँ अपलोड करें

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

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

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

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

AWS CLI सेटअप

स्क्रिप्ट का उपयोग करने से पहले, सुनिश्चित करें कि आपने आवश्यक प्रमाणीकरण क्रेडेंशियल्स के साथ AWS CLI सेटअप कर लिया है। इससे आप वांछित S3 बकेट को एक्सेस और प्रबंधित कर सकेंगे।

AWS CLI को कॉन्फ़िगर करना

  1. एक बार जब आपने AWS CLI इंस्टॉल कर लिया, तो टर्मिनल या कमांड प्रॉम्प्ट खोलें।

  2. निम्नलिखित कमांड चलाएँ:

    aws configure
  3. आपसे आपके AWS क्रेडेंशियल्स दर्ज करने के लिए कहा जाएगा:

    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 बकेट में उपलब्ध सभी ऑब्जेक्ट्स को खींचता है, और फिर उन्हें API के माध्यम से Roboflow पर अपलोड करता है। इस समाधान की रूपरेखा नीचे देखी जा सकती है:

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?