# AWS S3 Bucket

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

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

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

### AWS CLI सेटअप

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

* [AWS CLI v2 इंस्टॉल करना](https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2.html)

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

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

   ```bash
   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
   ```

### Option 1: Upload Via Signed URL:

आप Python में boto3 का उपयोग करके S3 बकेट में अपनी इमेज के लिए साइन किए गए URLs जेनरेट कर सकते हैं।

```python
def generate_presigned_url(bucket_name: str, object_name: str, region: str = 'us-east-2') -> str:
    """S3 ऑब्जेक्ट के लिए एक presigned 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 पर अपलोड करे। इस समाधान की रूपरेखा नीचे देखी जा सकती है:

```python
import boto3
import requests
import urllib.parse
from botocore.config import Config

# ************* SET THESE VARIABLES *************
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 ऑब्जेक्ट के लिए एक presigned 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"):
    """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__":
    # उपलब्ध इमेज की सूची प्राप्त करें
    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` [कमान्ड लाइन टूल](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html). यह टूल आपको कमांड लाइन पर आपके AWS अकाउंट के साथ इंटरैक्ट करने की अनुमति देता है। एक बार जब आपके पास कमांड लाइन टूल इंस्टॉल हो जाए, तो निम्नलिखित कमांड चलाएँ:

```bash
aws s3 sync s3://mybucket/folder_path .
```

Replace `mybucket` अपने बकेट के नाम के साथ `folder_path` उस फोल्डर या फ़ाइल के नाम के साथ जिसे आप एक्सपोर्ट करना चाहते हैं। यह कमांड AWS से एक एसेट को आपके वर्तमान वर्किंग डायरेक्टरी में डाउनलोड कर देगा (`.`).

### Upload Data to Roboflow

अब जब हमने डेटा डाउनलोड कर लिया है, तो हम इसे Roboflow पर या तो [Upload Web Interface](https://docs.roboflow.com/roboflow/roboflow-hi/datasets/adding-data/..#upload-data-with-the-web-interface) या [Roboflow CLI](https://app.gitbook.com/s/e5GEiPeDoFksvZv1vH3A/command-line-interface/upload-a-dataset).

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

* [Retrieve a Roboflow project ID](https://docs.roboflow.com/api-reference/workspace-and-project-ids)
