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))
Мы получаем следующие значения эмоций на лицах.
Надеюсь, этот урок будет вам полезен. Повеселись.
Продолжайте кодировать !!!