AWS Rekognition и подпапки вызова s3 ​​в Python Lambda - PullRequest
0 голосов
/ 09 мая 2018

У меня проблемы с выяснением, как получить доступ к определенной папке внутри корзины в s3 с помощью Python

Допустим, я пытаюсь получить доступ к этой папке в корзине, которая содержит кучу изображений, для которых я хочу запустить rekognition: "myBucket / подпапка / изображения /"

В папке / images / есть:

one.jpg  
two.jpg  
three.jpg  
four.jpg  

Я хочу запустить rekognition dete_labels для этой папки. Тем не менее, я не могу получить доступ к этой папке, но если я изменю имя bucket_name только на корневую папку («myBucket» /), то я смогу получить доступ только к этой папке.

bucket_name = "myBucket/subfolder/images/"  
rekognition = boto3.client('rekognition')  
s3 = boto3.resource('s3')  
bucket = s3.Bucket(name=bucket_name)  

Ответы [ 3 ]

0 голосов
/ 10 мая 2018

Вы можете индексировать в другом месте, что у вас есть в S3, таким образом, вы получаете прямой доступ к тому, что вам нужно.Имейте в виду, что цикл с файлами, хранящимися в корзинах, может дать очень низкую производительность, и он становится очень медленным, если количество ключей у вас велико.

Следуя вашему примеру, можно сделать еще один способ:

bucket_name = "myBucket"  
folder_name = "subfolder/images/"  
rekognition = boto3.client('rekognition')

keys= ['one.jpg','two.jpg','three.jpg','four.jpg']
s3 = boto3.resource('s3')  
for k in keys:
  obj = s3.Object(bucket_name, folder_name+k )
  print(obj.key)

Получить список элементов (keys) из любой таблицы БД в вашей системе.

0 голосов
/ 28 февраля 2019

В случае AWS Rekognition (как было предложено) файл изображения, хранящийся в папке в корзине S3, будет иметь ключ в виде folder_name/subfolder_name/image_name.jpg. Таким образом, поскольку метод boto3 Rekognition detect_labels() имеет такой синтаксис (для https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/rekognition.html#Rekognition.Client.detect_labels):

response = client.detect_labels(
    Image={
        'Bytes': b'bytes',
        'S3Object': {
            'Bucket': 'string',
            'Name': 'string',
            'Version': 'string'
        }
    },
    MaxLabels=123,
    MinConfidence=...
)

где значение Name должно быть именем ключа объекта S3, вы можете просто передать весь путь к папке с изображением в этот словарь в виде строки. Чтобы зациклить несколько изображений, создайте список имен файлов изображений, как рекомендовано в ответе Evhz, и зациклите этот список, вызывая метод detect_labels() выше (или используйте генератор).

0 голосов
/ 10 мая 2018

Это работает, как ожидалось. Имя корзины должно быть , просто имя корзины .

Затем вы можете запустить операцию с корзиной, например:

import boto3

s3 = boto3.resource('s3', region_name='ap-southeast-2')
bucket = s3.Bucket('my-bucket')

for object in bucket.objects.all():
    if object.key.startswith('images'):
        print object.key

Или, используя client вместо resource:

import boto3

client = boto3.client('s3', region_name='ap-southeast-2')
response = client.list_objects_v2(Bucket='my-bucket', Prefix='images/')

for object in response['Contents']:
    print object['Key']
...