AWS S3バケット
AWS S3バケットからRoboflowに画像をアップロード
AWS S3での画像データの保存とRoboflowへのアップロードを扱う際、一般的に2つの選択肢があります:署名付きURLを使用する方法、またはAWS CLIを使って画像をローカルにダウンロードし、ローカルからアップロードする方法です。どちらの方法を選ぶかは、データ処理や管理の具体的なニーズによります。
署名付きURL:この方法は、画像をローカルマシンにダウンロードする手間や時間を避けたい場合に特に有利です。署名付きURLを使えば、S3からRoboflow APIへ直接画像データをアップロードでき、ローカルに保存する必要がありません。これにより、処理が高速化され、ローカルシステムへの負荷も減ります。
CLIローカル:画像をまずローカル環境にダウンロードしたい場合もあります。たとえば、アップロード前に画像を前処理したり手動で確認したい場合は、ローカルコピーがあると便利です。
どちらの方法を選ぶかは、データ転送速度、前処理の必要性、画像の手動検査など、具体的なユースケースの要件によって決まります。
AWS CLIのセットアップ
スクリプトを使用する前に、必要な認証情報でAWS CLIを設定してください。これにより、目的のS3バケットへアクセス・管理が可能になります。
AWS CLIの設定
AWS CLIをインストールしたら、ターミナルまたはコマンドプロンプトを開きます。
次のコマンドを実行します:
aws configure
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経由でアップロード:
Pythonの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にアップロードできます: アップロードWebインターフェース または Roboflow CLI.
もご覧ください
Last updated
Was this helpful?