В этом посте мы исследуем AWS Rekognition, облачный сервис Amazon для анализа изображений и видео. Рекогниция имеет ряд различных функций, обнаружение лица, экстракции текста, маркировку объекта и т. Д. Для этого поста мы сосредоточимся на способности Rekognition идентифицировать знаменитостей на изображениях, используя знаменитые селфи знаменитостей в качестве наших вкладов. В этом посте вы будете:
- Узнайте, как отправить изображение в рекознание с помощью
BOTO3.
- Как определить знаменитостей на изображении
- Аннотайте изображения с именами знаменитостей
- Нарисуйте ограничительные коробки, используя выходной вывод
- Используйте ориентиры рекогниции для улучшения изображений
Давайте начнем!
Обработка изображений с помощью переоценка
Ввод AWS Rekognition может быть либо изображением, хранящимся в S3 или на изображении байтов. В этом примере мы охватим случай, когда ваше изображение хранится в ведре S3. Я покажу, как вы можете прочитать изображение от S3 с рекознанием и определить знаменитостей на изображении. Первый селфи, на котором мы посмотрим, – это исковый селфи Beyonce/Jay-Z.
Теперь посмотрим, кто перезнан в этом изображении!
Если изображение, которое вы хотите обработать, загружено в S3, вы можете использовать Boto3
Чтобы пройти изображение в рекогниции, указав имя ведра и ключа для изображения.
import boto3 rek = boto3.client('rekognition') response = rek.recognize_celebrities( Image={ "S3Object": { "Bucket": "", "Name": " " } } )
распознать_celberites
Функция возьмет входное изображение и позвонит в алгоритме для определения знаменитостей на изображении. Аккуратный! Давайте посмотрим на некоторые из рекогниции данных предусматривают о каждом изображении.
Ответ от распознать_celberites
Включает тонну данных об изображении. Boto3
Документация является феноменальной, поэтому, если вы заинтересованы в том, чтобы узнать обо всех спецификах, я призываю вас прочитать Документация BOTO3 Rekognition Для всех деталей о распознать_celberites
отклик. Мы будем проходить много этого, но это хорошая ссылка на руку!
Два части вывода в Ответ
являются Знаменитость
и НеузнаниеФыргас
, в котором перечислены все лица, определенные как знаменитости на изображении вместе с другими лицами на изображении, которые не были определены как знаменитость. В этом первом изображении давайте суммируем эти поля, чтобы увидеть, сколько выявляют знаменитостей и непризнанные лица были на изображении.
face_counts = {k: len(v) for k, v in response.items() if k in ["CelebrityFaces", "UnrecognizedFaces"]}
Рекознание определило одно лицо как знаменитость на изображении, и было определено еще одно лицо, которое не может быть определено как знаменитость. Итак, кто был идентифицирован?
Каждый предмет в Знаменитость
Список будет содержать имя знаменитости, которая была идентифицирована. Давайте анализировать вывод, чтобы увидеть, кто был идентифицирован рекознанием.
for celeb in response["CelebrityFaces"]: print(celeb["Name"])
Результат Бейонсе! Рекогниция определила, что на изображении было другое лицо, но не в состоянии конкретно идентифицировать это лицо как у Jay-Z.
Возможность назвать знаменитостей в изображении аккуратно, но давайте сделаем немного больше с рекознанием, чтобы аннотировать наши знаменитости, чтобы легче определить, кто в том, кто.
Аннотирование Selfies.
В предыдущем изображении у нас были только два лица, которые нужно распознать, но как насчет случая, когда у вас есть несколько признанных и непризнанных граней на изображении? Выявление того, кто может быть трудным, но рекознание может помочь с этим процессом. Невозможно иметь пост о Selfies Selfies без небольшого влияния Кардашьяна, поэтому наши следующие селфи – Selfie Kylie Jenner от GALA MET.
Что весело в этом изображении, так это объем узнаваемых лиц, которые включены. Чтобы помочь определить, чья кто на изображении мы собираемся использовать больше ответа на переоценку. Для каждого лица, знаменитости и непризнанного, рекогниция предоставляет координаты, обрамляющие каждое лицо на изображении. Используя эти ограничивающие координаты Box, вы можете аннотировать изображение для названий маркировки и указать, неизвестно ли лицо. Для селфи Кайли мы будем аннотировать узнаваемых знаменитостей зеленой коробкой, помеченной их именем, и непризнанные лица, будут созданы серой ограничивающей коробкой.
В предыдущем примере изображение было загружено непосредственно из S3. Вы также можете обрабатывать локальные изображения с рекогницией, преобразовав изображение в BytesArray, который показан ниже.
import io import boto3 from PIL import Image # Load image and convery to bytes array. img = Image.open(open(img_path, 'rb')) img_byte_arr = io.BytesIO() img.save(img_byte_arr, format='PNG') # Pass the byte array to Rekognition rek = boto3.client("rekognition") response = rek.recognize_celebrities( Image={ "Bytes": img_byte_arr.getvalue() } )
Чтобы нарисовать ограничительную коробку, нам нужно получить доступ к Ограничительная коробка
Координаты, связанные с каждым лицом. Координаты ограничительной коробки предоставляются в качестве соотношений к общему размеру изображения, которые должны будут масштабироваться до размера изображения. Чтобы сделать масштаб, я создал функцию, Рассчитайте_bounding_coordinates
, это будет масштабировать выходной вывод на изображение. Мы будем использовать Пили
Библиотека для аннотации изображения. Рисование Изображение требует вывода рекогниции, а также исходное изображение, IMG
, объект.
Для каждого лица в Знаменитость
и НеузнаниеФыргас
Подходящая ограничивающая коробка будет нарисована либо именем знаменитости или универсальным «неизвестным» для НеузнаниеФыргас
Отказ
from PIL import Image, ImageDraw, ImageFont # Prepare image for drawing. img_width, img_height = img.size draw = ImageDraw.Draw(img) font = ImageFont.truetype('/Library/Fonts/Arial.ttf', 30) def calculate_bounding_coordinates(img_width, img_height, box): """ Calculates the location of the bounding box in the image. :param img_width: Width of the image. :param img_height: Height of the base image. :param box: Bounding box coordinates from Rekognition. :return: Tuple of points to frame the bounding box. """ # Calculate box location. left = img_width * box['Left'] top = img_height * box['Top'] width = img_width * box['Width'] height = img_height * box['Height'] points = ( (left, top), (left + width, top), (left + width, top + height), (left, top + height), (left, top) ) return points # Identified Celebrities will be drawn w a Green bounding box w their name. for celeb in response["CelebrityFaces"]: box_coords = calculate_bounding_coordinates(img_width, img_height, celeb["Face"]["BoundingBox"]) draw.line(box_coords, fill="#00d400", width=2) draw.text(box_coords[0], text=celeb["Name"], fill="#00d400", font=font) # Unrecognized faces are framed with grey boxes. for i, face in enumerate(response["UnrecognizedFaces"]): box_coords = calculate_bounding_coordinates(img_width, img_height, face["BoundingBox"]) draw.line(box_coords, fill="#989695", width=2) draw.text(box_coords[0], text=f"Unknown{str(i)}", fill="#989695", font=font)
После применения аннотации новый IMG
Теперь выглядит так:
Это намного проще определить, кто есть кто!
Теперь давайте пойдем на один уровень глубже с выходом рекогниции!
Особенности лица в AWS Rekognition
Рекознание не останавливается с обрамляющими лицами. Для каждого рекознания для каждого лица также предоставит подробную информацию об индивидуальных особенностях лица, глаза, рот, нос, ушах и т. Д. Чтобы продемонстрировать эти функции, мы будем добавлять черные цензуры на глазах каждого лица в селфи.
Для этого необходима еще пара больших функций. Первый это get_facial_landmark_location
Это извлекает координаты XY определенного ориентира лица (левый и правый глаз в этом случае). Вторая функция – calculate_eye_mask
Это рассчитает координаты цензурной строки, используя места ориентир ориентиров на лице.
Давайте подведем цензурный бар вместе с аннотацией ограничивающей коробки из предыдущего селфи, чтобы полностью аннотировать изображение. И чтобы продемонстрировать это, давайте будем использовать знаменитый Selfe Ellen Selfie! Полный код выглядит следующим образом:
import io import boto3 from PIL import Image, ImageDraw, ImageFont # Load image and convery to bytes array. img = Image.open(open(img_path, 'rb')) img_byte_arr = io.BytesIO() img.save(img_byte_arr, format='PNG') # Pass the byte array to Rekognition rek = boto3.client("rekognition") response = rek.recognize_celebrities( Image={ "Bytes": img_byte_arr.getvalue() } ) # Prepare image for drawing. img_width, img_height = img.size draw = ImageDraw.Draw(img) font = ImageFont.truetype('/Library/Fonts/Arial.ttf', 30) def calculate_bounding_coordinates(img_width, img_height, box): """ Calculates the location of the bounding box in the image. :param img_width: Width of the image. :param img_height: Height of the base image. :param box: Bounding box coordinates from Rekognition. :return: Tuple of points to frame the bounding box. """ # Calculate box location. left = img_width * box['Left'] top = img_height * box['Top'] width = img_width * box['Width'] height = img_height * box['Height'] points = ( (left, top), (left + width, top), (left + width, top + height), (left, top + height), (left, top) ) return points def get_facial_landmark_location(rek_obj, landmark): """ Retrieves the XY coordinates for a specified facial landmark in the Rekognition response. :param rek_obj: A Rekognition response object. :param landmark: Name of the facial landmark to retrieve. :return: XY coordinates for the landmark. """ facial_landmark = next((item for item in rek_obj["Landmarks"] if item["Type"] == landmark), None) return facial_landmark["X"], facial_landmark["Y"] def calculate_eye_mask(image_width, image_height, rek_obj): """ Calcualtes the coordinates for the eye mask given the location of the eyes. :param image_width: Width of the image. :param image_height: Height of the image. :param rek_obj: :return: Tuple of coordinates defining the location of the eye mask. """ # Get eye landmarks eye_left = get_facial_landmark_location(rek_obj, "eyeLeft") eye_right = get_facial_landmark_location(rek_obj, "eyeRight") # Get the pixel location of the eyes in the image. eye_left_x = eye_left[0] * image_width eye_left_y = eye_left[1] * image_height eye_right_x = eye_right[0] * image_width eye_right_y = eye_right[1] * image_height # Build the coordinates for the rectangle to be drawn. poly_coords = ( (eye_right_x + 50, eye_right_y - 20), (eye_left_x - 50, eye_left_y - 20), (eye_left_x - 50, eye_left_y + 20), (eye_right_x + 50, eye_right_y + 20), ) return poly_coords # Identified Celebrities will be drawn w a Green bounding box w their name. for celeb in response["CelebrityFaces"]: box_coords = calculate_bounding_coordinates(img_width, img_height, celeb["Face"]["BoundingBox"]) draw.line(box_coords, fill="#00d400", width=2) draw.text(box_coords[0], text=celeb["Name"], fill="#00d400", font=font) eye_coords = calculate_eye_mask(img_width, img_height, celeb["Face"]) draw.polygon(eye_coords, fill="#000000") # Unrecognized faces are framed with grey boxes. for i, face in enumerate(response["UnrecognizedFaces"]): box_coords = calculate_bounding_coordinates(img_width, img_height, face["BoundingBox"]) draw.line(box_coords, fill="#989695", width=2) draw.text(box_coords[0], text=f"Unknown{str(i)}", fill="#989695", font=font) eye_coords = calculate_eye_mask(img_width, img_height, face) draw.polygon(eye_coords, fill="#000000")
И полученное изображение выглядит так:
Упаковка
Там у тебя это есть! В этом руководстве у вас есть:
- Узнал два слова изображения могут быть использованы с AWS Rekognition
- Как определить знаменитостей на изображении
- Нарисуйте ограничительные коробки, используя выходной вывод
- Используйте ориентиры рекогниции для улучшения изображений
Может сделать так много рекознания! Хотя в центре внимания этого руководства было на распознать_celberites
Функция Многие из тех же подходов могут быть использованы и с другими функциями переоценка.
Спасибо за чтение! У вас большой день!
Оригинал: “https://dev.to/matthewvielkind/learning-aws-rekognition-with-celebrity-selfies-1pak”