AWS Rekognition

Amazon Rekognition упрощает добавление анализа изображений и видео к вашим приложениям с помощью проверенной, хорошо масштабируемой технологии глубокого обучения, не требующей опыта машинного обучения.

Мы увидим, как использовать этот сервис для определения лиц и эмоций на этих лицах по изображению.

Распознавание лиц

Сначала мы увидим, как распознавать лица на изображении. Для доступа к AWS Rekognition мы будем использовать пакет python boto3. Ins

Установите boto3, используя следующую команду:

pip install boto3

Чтобы использовать службу Rekognition,

import boto3
rekognition = boto3.client('rekognition',aws_access_key_id=AWS_ACCESS_KEY,
             aws_secret_access_key=AWS_SECRET_KEY,
             region_name=AWS_REGION)

Мы собираемся использовать изображение из нашего локального хранилища. В Rekogntion есть функция detect_faces () для обнаружения всех лиц на изображении.

with open('file.png', 'rb') as image_data:
     response_content = image_data.read()
rekognition_response =
rekognition.detect_faces(Image={'Bytes':response_content}, Attributes=['ALL'])

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

rekognition_response = rekognition.detect_faces(Image={'S3Object': {'Bucket': BUCKET_NAME, 'Name': file_key}}, Attributes=['ALL'])

Функция detect_faces () возвращает следующий ответ.

{
    'FaceDetails': [
        {
            'BoundingBox': {
                'Width': ...,
                'Height': ...,
                'Left': ...,
                'Top': ...
            },
            'AgeRange': {
                'Low': 123,
                'High': 123
            },
            'Smile': {
                'Value': True|False,
                'Confidence': ...
            },
            'Eyeglasses': {
                'Value': True|False,
                'Confidence': ...
            },
            'Sunglasses': {
                'Value': True|False,
                'Confidence': ...
            },
            'Gender': {
                'Value': 'Male'|'Female',
                'Confidence': ...
            },
            'Beard': {
                'Value': True|False,
                'Confidence': ...
            },
            'Mustache': {
                'Value': True|False,
                'Confidence': ...
            },
            'EyesOpen': {
                'Value': True|False,
                'Confidence': ...
            },
            'MouthOpen': {
                'Value': True|False,
                'Confidence': ...
            },
            'Emotions': [
                {
                    'Type': 'HAPPY'|'SAD'|'ANGRY'|'CONFUSED'|'DISGUSTED'|'SURPRISED'|'CALM'|'UNKNOWN'|'FEAR',
                    'Confidence': ...
                },
            ],
            'Landmarks': [
                {
                    'Type': 'eyeLeft'|'eyeRight'|'nose'|'mouthLeft'|'mouthRight'|'leftEyeBrowLeft'|'leftEyeBrowRight'|'leftEyeBrowUp'|'rightEyeBrowLeft'|'rightEyeBrowRight'|'rightEyeBrowUp'|'leftEyeLeft'|'leftEyeRight'|'leftEyeUp'|'leftEyeDown'|'rightEyeLeft'|'rightEyeRight'|'rightEyeUp'|'rightEyeDown'|'noseLeft'|'noseRight'|'mouthUp'|'mouthDown'|'leftPupil'|'rightPupil'|'upperJawlineLeft'|'midJawlineLeft'|'chinBottom'|'midJawlineRight'|'upperJawlineRight',
                    'X': ...,
                    'Y': ...
                },
            ],
            'Pose': {
                'Roll': ...,
                'Yaw': ...,
                'Pitch': ...
            },
            'Quality': {
                'Brightness': ...,
                'Sharpness': ...
            },
            'Confidence': ...
        },
    ],
    'OrientationCorrection': 'ROTATE_0'|'ROTATE_90'|'ROTATE_180'|'ROTATE_270'
}

Как вы можете видеть выше, Rekognition предоставляет множество атрибутов для каждого лица, обнаруженного на изображении.

Здесь мы собираемся использовать атрибут Bounding Boxes для размеров лиц, обнаруженных на изображении.

Чтобы использовать его, сначала нам нужно найти точную ширину и высоту используемого изображения. Для этого воспользуемся пакетом Python Pillow (PIL).

pip install Pillow

from PIL import Image
image = Image.open('file.png')
image_width, image_height = image.size

Мы обрежем все лица изображения. Rekogntion возвращает значения граничной рамки в десятичной дроби от 0 до 1 (например, 0,391559898853302). Итак, мы собираемся преобразовать значения в целые числа.

i = 1
for item in rekognition_response.get('FaceDetails'):
    bounding_box = item['BoundingBox']
    print('Bounding box {}'.format(bounding_box))
    width = image_width * bounding_box['Width']
    height = image_height * bounding_box['Height']
    left = image_width * bounding_box['Left']
    top = image_height * bounding_box['Top']

    left = int(left)
    top = int(top)
    width = int(width) + left
    height = int(height) + top

    box = (left, top, width, height)
    box_string = (str(left), str(top), str(width), str(height))
    print(box)
    cropped_image = image.crop(box)
    thumbnail_name = '{}.png'.format(i)
    i += 1
    cropped_image.save(thumbnail_name, 'PNG')

Обнаружение эмоций

Теперь мы обнаружим эмоции на лицах. В том же ответе Rekognition от функции detect_faces () мы получили значения эмоций. Мы проанализируем атрибут FaceDetails, чтобы получить эмоции. Он вернет 7 типов эмоций - СЧАСТЬЕ, СПОКОЙСТВИЕ, ПЕЧАТЬ, ЗЛОЙ, УДИВЛЕНИЕ, ЗАМЕТКА и ОТНОШЕНИЕ, а также их значения уверенности для каждого лица.

Например,

'Emotions': [{
   'Type': 'CALM',
   'Confidence': 21.520294189453125
  }, {
   'Type': 'ANGRY',
   'Confidence': 1.0282570123672485
  }, {
   'Type': 'HAPPY',
   'Confidence': 1.2899268865585327
  }, {
   'Type': 'DISGUSTED',
   'Confidence': 0.8267041444778442
  }, {
   'Type': 'SAD',
   'Confidence': 0.14941808581352234
  }, {
   'Type': 'FEAR',
   'Confidence': 0.3257277309894562
  }, {
   'Type': 'CONFUSED',
   'Confidence': 3.0882787704467773
  }, {
   'Type': 'SURPRISED',
   'Confidence': 71.7713851928711
  }]

Мы проанализируем этот ответ и возьмем эмоцию с максимальной достоверностью.

i = 1
for item in rekognition_response.get('FaceDetails'):
    bounding_box = item['BoundingBox']
    print('Bounding box {}'.format(bounding_box))
    width = image_width * bounding_box['Width']
    height = image_height * bounding_box['Height']
    left = image_width * bounding_box['Left']
    top = image_height * bounding_box['Top']

    left = int(left)
    top = int(top)
    width = int(width) + left
    height = int(height) + top

    box = (left, top, width, height)
    box_string = (str(left), str(top), str(width), str(height))
    print(box)
    cropped_image = image.crop(box)
    thumbnail_name = '{}.png'.format(i)
    i += 1
    cropped_image.save(thumbnail_name, 'PNG')

    face_emotion_confidence = 0
    face_emotion = None
    for emotion in item.get('Emotions'):
        if emotion.get('Confidence') >= face_emotion_confidence:
            face_emotion_confidence = emotion['Confidence']
            face_emotion = emotion.get('Type')
    print('{} - {}'.format(thumbnail_name, face_emotion))

Мы получаем следующие значения эмоций на лицах.

Надеюсь, этот урок будет вам полезен. Повеселись.

Продолжайте кодировать !!!