AWS S3 Bucket

AWS S3 バケットから Roboflow に画像をアップロードします

AWS S3での画像データ保存とRoboflowへのアップロードを扱う際、一般的に2つの選択肢があります: サイン付き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をPythonで使用して、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"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 コマンドラインツールをインストールします。このツールを使うとコマンドライン上でAWSアカウントとやり取りできます。コマンドラインツールをインストールしたら、次のコマンドを実行してください:

aws s3 sync s3://mybucket/folder_path .

置き換えてください mybucket バケット名と folder_path エクスポートしたいフォルダまたはファイルの名前を指定します。このコマンドはAWSから現在の作業ディレクトリにアセットをダウンロードします(.).

Roboflow にデータをアップロード

データをダウンロードしたら、以下を使用して Roboflow にアップロードできます、 Upload Web Interface または Roboflow CLI.

で投稿することもできます。

Last updated

Was this helpful?