Recorte automático de imágenes con Amazon Rekognition

Recorte automático de imágenes con Amazon Rekognition

Los editores digitales buscan continuamente formas de optimizar y automatizar sus flujos de trabajo de medios para generar y publicar contenido nuevo lo más rápido posible.

Muchos editores tienen una gran biblioteca de imágenes de archivo que utilizan para sus artículos. Estas imágenes se pueden reutilizar muchas veces para diferentes historias, especialmente cuando el editor tiene imágenes de celebridades. Muy a menudo, un periodista puede necesitar recortar una celebridad deseada de una imagen para usarla en su próxima historia. Esta es una tarea manual y repetitiva que debe automatizarse. A veces, un autor puede querer usar una imagen de una celebridad, pero contiene dos personas y la celebridad principal debe recortarse de la imagen. Otras veces, es posible que sea necesario reformatear las imágenes de celebridades para publicarlas en una variedad de plataformas, como dispositivos móviles, redes sociales o noticias digitales. Además, es posible que un autor necesite cambiar la relación de aspecto de la imagen o poner a la celebridad en un enfoque nítido.

En esta publicación, demostramos cómo usar Reconocimiento de amazonas para realizar análisis de imágenes. Amazon Rekognition facilita agregar esta capacidad a sus aplicaciones sin ninguna experiencia en aprendizaje automático (ML) y viene con varias API para cumplir con casos de uso como detección de objetos, moderación de contenido, detección y análisis de rostros y reconocimiento de texto y celebridades, que nosotros utilizar en este ejemplo.

La función de reconocimiento de celebridades in Reconocimiento de amazonas reconoce automáticamente decenas de miles de personalidades conocidas en imágenes y videos usando ML. El reconocimiento de celebridades puede detectar no solo la presencia de la celebridad dada, sino también la ubicación dentro de la imagen.

Resumen de la solución

En esta publicación, demostramos cómo podemos pasar una foto, el nombre de una celebridad y una relación de aspecto para la imagen de salida para poder generar una imagen recortada de la celebridad dada capturando su rostro en el centro.

Cuando se trabaja con el API de detección de celebridades de Amazon Rekognition, se devuelven muchos elementos en la respuesta. Los siguientes son algunos elementos clave de la respuesta:

  • Igualar la confianza – Una puntuación de confianza de coincidencia que se puede utilizar para controlar el comportamiento de la API. Recomendamos aplicar un umbral adecuado a esta puntuación en su aplicación para elegir su punto de operación preferido. Por ejemplo, al establecer un umbral del 99 %, puede eliminar los falsos positivos, pero puede perder algunas coincidencias potenciales.
  • Nombre, ID y URL – El nombre de la celebridad, un ID único de Amazon Rekognition y una lista de URL, como el enlace IMDb o Wikipedia de la celebridad para obtener más información.
  • Cuadro delimitador – Coordenadas de la ubicación del cuadro delimitador rectangular para cada cara de celebridad reconocida.
  • Género conocido – Identidad de género conocida para cada celebridad reconocida.
  • Emociones – Emoción expresada en el rostro de la celebridad, por ejemplo, feliz, triste o enojado.
  • Pose – Pose de la cara de la celebridad, utilizando tres ejes de balanceo, cabeceo y guiñada.
  • Smile – Si la celebridad está sonriendo o no.

Parte de la respuesta de la API de Amazon Rekognition incluye el siguiente código:

{ "CelebrityFaces": [ { "Urls": [ "www.wikidata.org/wiki/Q2536951" ], "Name": "Werner Vogels", "Id": "23iZ1oP", "Face": { "BoundingBox": { "Width": 0.10331031680107117, "Height": 0.20054641366004944, "Left": 0.5003396272659302, "Top": 0.07391933351755142 }, "Confidence": 99.99765014648438,
...

En este ejercicio, demostramos cómo usar el elemento de cuadro delimitador para identificar la ubicación de la cara, como se muestra en la siguiente imagen de ejemplo. Todas las dimensiones se representan como proporciones del tamaño total de la imagen, por lo que los números en la respuesta están entre 0 y 1. Por ejemplo, en la respuesta API de muestra, el ancho del cuadro delimitador es 0.1, lo que implica que el ancho de la cara es el 10 % del ancho total de la imagen.

Cuadro delimitador de Werner Vogels

Con este cuadro delimitador, ahora podemos usar la lógica para asegurarnos de que la cara permanezca dentro de los bordes de la nueva imagen que creamos. Podemos aplicar algo de relleno alrededor de este cuadro delimitador para mantener la cara en el centro.

En las siguientes secciones, mostramos cómo crear la siguiente salida de imagen recortada con Werner Vogels en un enfoque nítido.

Lanzamos un Amazon SageMaker notebook, que proporciona un entorno de Python donde puede ejecutar el código para pasar una imagen a Amazon Rekognition y luego modificar automáticamente la imagen con la celebridad enfocada.

Werner Vogels recortado

El código realiza los siguientes pasos de alto nivel:

  1. Haga una solicitud a la recognize_celebrities API con la imagen dada y el nombre de la celebridad.
  2. Filtre la respuesta para la información del cuadro delimitador.
  3. Agregue algo de relleno al cuadro delimitador para que capturemos parte del fondo.

Requisitos previos

Para este tutorial, debe tener los siguientes requisitos previos:

Sube la imagen de muestra

Cargue su imagen de celebridad de muestra en su depósito S3.

Ejecuta el código

Para ejecutar el código, usamos una computadora portátil SageMaker; sin embargo, cualquier IDE también funcionaría después de instalar Python, pillow y Boto3. Creamos un cuaderno SageMaker así como el Gestión de identidades y accesos de AWS (IAM) con los permisos necesarios. Complete los siguientes pasos:

  1. crear el cuaderno y nombrarlo automatic-cropping-celebrity.

La política de ejecución predeterminada, que se creó cuando se creó el cuaderno de SageMaker, tiene una política simple que otorga permisos al rol para interactuar con Amazon S3.

  1. Actualizar el Resource restricción con el nombre del depósito S3:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:GetObject", "s3:PutObject", "s3:DeleteObject", "s3:ListBucket" ], "Resource": [ "arn:aws:s3::: # your-s3-bucket-name " ] } ]
}

  1. Cree otra política para agregar a la función de IAM del cuaderno de SageMaker para poder llamar al reconocercelebridades API:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "rekognition:RecognizeCelebrities", "Resource": "*" } ]
}

permisos de gestión de identidades y accesos

  1. En la consola de SageMaker, elija Instancias de cuaderno en el panel de navegación.
  2. Localice el automatic-cropping-celebrity cuaderno y elige Jupyter abierto.
  3. Elige Nuevo y conda_python3 como el núcleo de su portátil.

Cuaderno Jupyter

Para los siguientes pasos, copie los bloques de código en su cuaderno Jupyter y ejecútelos eligiendo Ejecutar.

  1. Primero, importamos funciones auxiliares y bibliotecas:
import boto3
from PIL import Image

  1. Establecer variables
bucket = '<YOUR_BUCKET_NAME>' file = '<YOUR_FILE_NAME>'
celeb = '<CELEBRITY_NAME>'
aspect_ratio = <ASPECT_RATIO_OF_OUTPUT_IMAGE, e.g. 1 for square>

  1. Crear un cliente de servicio
rek = boto3.client('rekognition')
s3 = boto3.client('s3')

  1. Función para reconocer a los famosos
def recognize_celebrity(photo): with open(photo, 'rb') as image: response = rek.recognize_celebrities(Image={'Bytes': image.read()}) image=Image.open(photo) file_type=image.format.lower() path, ext=image.filename.rsplit(".", 1) celeb_faces = response['CelebrityFaces'] print(f'Detected {len(celeb_faces)} faces for {photo}') return celeb_faces, image, path, file_type 

  1. Función para obtener el cuadro delimitador de la celebridad dada:
def get_bounding_box(celeb_faces, img_width, img_height, celeb): bbox = None for celebrity in celeb_faces: if celebrity['Name'] == celeb: box = celebrity['Face']['BoundingBox'] left = img_width * box['Left'] top = img_height * box['Top'] width = img_width * box['Width'] height = img_height * box['Height'] print('Left: ' + '{0:.0f}'.format(left)) print('Top: ' + '{0:.0f}'.format(top)) print('Face Width: ' + "{0:.0f}".format(width)) print('Face Height: ' + "{0:.0f}".format(height)) #dimenions of famous face inside the bounding boxes x1=left y1=top x2=left+width y2=top+height bbox = [x1,y1,x2,y2] print(f'Bbox coordinates: {bbox}') if bbox == None: raise ValueError(f"{celeb} not found in results") return bbox

  1. Función para agregar algo de relleno al cuadro delimitador, para que capturemos algo de fondo alrededor de la cara
def pad_bbox(bbox, pad_width=0.5, pad_height=0.3): x1, y1, x2, y2 = bbox width = x2 - x1 height = y2 - y1 #dimenions of new image with padding x1= max(x1 - (pad_width * width),0) y1= max(y1 - (pad_height * height),0) x2= max(x2 + (pad_width * width),0) y2= max(y2 + (pad_height * height),0) #dimenions of new image with aspect ratio, 1 is square, 1.5 is 6:4, 0.66 is 4:6 x1= max(x1-(max((y2-y1)*max(aspect_ratio,1)-(x2-x1),0)/2),0) y1= max(y1-(max((x2-x1)*1/(min((aspect_ratio),1))-(y2-y1),0)/2),0) x2= max(x2+(max((y2-y1)*max((aspect_ratio),1)-(x2-x1),0)/2),0) y2= max(y2+(max((x2-x1)*1/(min((aspect_ratio),1))-(y2-y1),0)/2),0) print('x1-coordinate after padding: ' + '{0:.0f}'.format(x1)) print('y1-coordinate after padding: ' + '{0:.0f}'.format(y1)) print('x2-coordinate after padding: ' + "{0:.0f}".format(x2)) print('y2-coordinate after padding: ' + "{0:.0f}".format(y2)) return [x1,y1,x2,y2]

  1. Función para guardar la imagen en el almacenamiento del portátil y en Amazon S3
def save_image(roi, image, path, file_type): x1, y1, x2, y2 = roi image = image.crop((x1,y1,x2,y2)) image.save(f'{path}-cropped.{file_type}') s3.upload_file(f'{path}-cropped.{file_type}', bucket, f'{path}-cropped.{file_type}') return image

  1. Usa Python main() función para combinar las funciones anteriores para completar el flujo de trabajo de guardar una nueva imagen recortada de nuestra celebridad:
def main(): # Download S3 image to local s3.download_file(bucket, file, './'+file) #Load photo and recognize celebrity celeb_faces, img, file_name, file_type = recognize_celebrity(file) width, height = img.size #Get bounding box bbox = get_bounding_box(celeb_faces, width, height, celeb) #Get padded bounding box padded_bbox = pad_bbox(bbox) #Save result and display result = save_image(padded_bbox, img, file_name, file_type) display(result) if __name__ == "__main__": main()

Cuando ejecuta este bloque de código, puede ver que encontramos a Werner Vogels y creamos una nueva imagen con su rostro en el centro.

Werner Vogels recortado

La imagen se guardará en la computadora portátil y también se cargará en el depósito S3.

Salida del cuaderno Jupyter

Podría incluir esta solución en un mayor flujo de trabajo; por ejemplo, una editorial puede querer publicar esta capacidad como punto final para reformatear y cambiar el tamaño de las imágenes sobre la marcha al publicar artículos de celebridades en múltiples plataformas.

Limpiar

Para evitar incurrir en cargos futuros, elimine los recursos:

  1. En la consola de SageMaker, seleccione su computadora portátil y en el Acciones menú, seleccione Detener.
  2. Después de detener el portátil, en el Acciones menú, seleccione Borrar.
  3. En la consola de IAM, elimine el rol de ejecución de SageMaker que creó.
  4. En la consola de Amazon S3, elimine la imagen de entrada y cualquier archivo de salida de su depósito S3.

Conclusión

En esta publicación, mostramos cómo podemos usar Amazon Rekognition para automatizar una tarea manual de modificar imágenes para admitir flujos de trabajo de medios. Esto es particularmente importante dentro de la industria editorial, donde la velocidad es importante para publicar contenido nuevo rápidamente y en múltiples plataformas.

Para obtener más información sobre cómo trabajar con recursos multimedia, consulte La inteligencia de medios ahora es más inteligente con Media2Cloud 3.0


Sobre la autora

Recorte automático de imágenes con Amazon Rekognition PlatoBlockchain Data Intelligence. Búsqueda vertical. Ai.

Mark Watkins es Arquitecto de Soluciones dentro del equipo de Medios y Entretenimiento. Ayuda a los clientes a crear soluciones de inteligencia artificial/aprendizaje automático que resuelven sus desafíos comerciales con AWS. Ha estado trabajando en varios proyectos de IA/ML relacionados con la visión artificial, el procesamiento del lenguaje natural, la personalización, el ML en el perímetro y más. Lejos de la vida profesional, le encanta pasar tiempo con su familia y ver crecer a sus dos pequeños.

Sello de tiempo:

Mas de Aprendizaje automático de AWS