Сравните изображения и сохраните в Dynamodb AWS - PullRequest
0 голосов
/ 05 июня 2018

Привет, я хочу написать лямбда-функцию, которая будет работать как.У меня есть две папки в ведре s3.в 1-й ячейке есть «владелец», а во 2-й случайные картинки.Я хочу сравнить все изображения с владельцем, а затем сохранить в динамоде с именем владельца против каждого изображения.Я потерян в API распознавания лиц и делаю что-то вроде этого

    BUCKET = "ais-django"
KEY = "20180530105812.jpeg"
FEATURES_BLACKLIST = ("Landmarks", "Emotions", "Pose", "Quality", "BoundingBox", "Confidence")


def detect_faces(bucket, key, attributes=['ALL'], region="eu-west-1"):
    rekognition = boto3.client("rekognition", region)
    response = rekognition.detect_faces(
        Image={
            "S3Object": {
                "Bucket": bucket,
                "Name": key,
            }
        },
        Attributes=attributes,
    )
    return response['FaceDetails']


for face in detect_faces(BUCKET, KEY):
    print
    "Face ({Confidence}%)".format(**face)
    # emotions
    for emotion in face['Emotions']:
        print
        "  {Type} : {Confidence}%".format(**emotion)
    # quality
    for quality, value in face['Quality'].iteritems():
        print
        "  {quality} : {value}".format(quality=quality, value=value)
    # facial features
    for feature, data in face.iteritems():
        if feature not in FEATURES_BLACKLIST:
            print
            "  {feature}({data[Value]}) : {data[Confidence]}%".format(feature=feature, data=data)

1 Ответ

0 голосов
/ 06 июня 2018

Вы можете использовать операцию сравнения_файлов клиента Rekognition.Вот псевдокод, отражающий операцию (Примечание: этот код не тестируется и предназначен только для демонстрации концепций).Вы можете настроить порог сходства в соответствии с вашими потребностями.

client = boto3.client('rekognition', region_name='eu-west-1')
keyNamesInsideRandomFolder=['1.jpg','2.jpg']
for key in keyNamesInsideRandomFolder:
    response = client.detect_faces(
        'S3Object': {
           'Bucket': "bucketname",
           'Name': "randomfolder/"+key
        }
    )
    faceDetails = response['FaceDetails']
    hasFace = len(faceDetails) > 0
    if hasFace:
        response = client.compare_faces(
            SimilarityThreshold=90,
            SourceImage={
                'S3Object': {
                    'Bucket': "bucketname",
                    'Name': "ownerfolder/ownerimage.jpg"
                }
            },
            TargetImage={
                'S3Object': {
                    'Bucket': "bucketname",
                    'Name': "randomfolder/"+key
                },
            }
        )
        faceMatch= response['FaceMatches']
        similarity = faceMatch['Similarity']
        if similarity>90:
             #write to dynamodb

Отредактировано: чтобы получить список объектов из папки с префиксом / папка random, используйте операцию list_objects клиента s3.

response = client.list_objects(
    Bucket='bucketname',
    Prefix='random'
)
numberofobjects=len(response['Contents'])
keyNamesInsideRandomFolder=[]
for x in range(1, numberofobjects):
    keyNamesInsideRandomFolder.append(response['Contents'][x]['Key'])

Примечание. Ответ ['Contents'] [x] ['Key'] возвращает имя ключа объекта вместе с префиксом.Например,Если внутри случайной папки есть изображение с именем img.jpg, оно возвращает «random / img.jpg».Обратите внимание, что я запустил цикл for с 1, потому что первый элемент, возвращаемый в качестве ответа, является просто именем ключа папки, то есть «random /» в этом случае.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...