Рубрики
Без рубрики

Обучение AWS Rekognition с Selfies знаменитости

Начало работы Руководство для AWS Rekognition, используя Selfies Generity, чтобы исследовать его возможности. Помечено с AWS, Python, Облако.

В этом посте мы исследуем 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”