Implementando AWS Rekognition con Node.JS

Flavio AAndres
Condor Labs Engineering
4 min readJun 7, 2020

Hace poco más de un año podía pensar que necesitamos ser Seniors para conocer e implementar tan robustos servicios como los de AWS.

Nos ofrecen IA, Servidores, Procesamiento, Satélites y más… a muy poco costo. Como ya he comentado en otros posts, existe una capa gratuita por un año más que suficiente para probar e implementar sus servicios.

Empecemos con un poco de IA. ¿Imágenes?

Amazon tiene a nuestra disposición experiencias de inteligencia artificial entrenadas para cumplir tareas interesantes. Amazon Rekognition ofrece Reconocimiento facial, de objetos, texto, expresiones faciales y más información de las imágenes.

Vamos a implementar rápidamente el servicio de Amazon Rekognition para que nos entregue información de la imagen. Podemos usar cualquiera de las opciones de reconocimiento (Texto, expresiones, sentimientos y objetos).

Antes de iniciar con el código, estemos seguros que tenemos lo necesario:

  1. Cuenta de AWS y acceso a la Consola de servicios de Amazon.
  2. Usuario IAM con permisos de para lanzar Solicitudes/Requests hacia AWS Rekognition. Puedes usar este permiso para el usuario IAM: AmazonRekognitionFullAccess
  3. Fotos para reconocer :D

Implementando AWS Rekognition con Node.JS

Amazon nos entrega aws-sdk, un package para Node.JS que nos permitirá acceder desde nuestro código a los servicios de AWS y manejarlos como queramos.

Con un npm i aws-sdk es suficiente.

Podemos solicitar el reconocimiento de imágenes de dos formas, usando imágenes ya almacenadas en Buckets S3 o enviandole un FileStream a la instancia de Rekognition.

En mi caso, he creado un Servidor Express para enviarle fotos a AWS y me entregué los resultados, este es su handler:

Esta que ven arriba, es una de las formas más rápidas y sencillas para implementar el servicio de reconocimiento de Imágenes. Paso a explicar un poco qué podemos encontrar ahí…

Inicialmente creamos la instancia con AWS.Rekognition() y le enviamos las credenciales necesarias de nuestro usuario IAM con permisos.

Ahora, el objeto paramsnos ayuda a recopilar la información necesaria para enviar a AWS y reconocer la imagen, en este caso estamos usando un FileStream que enviamos con nombre Bytes, de esta forma le indicamos que está recibiendo un Archivo en lugar de un Objeto S3.

y, esto nos lleva a lo siguiente, no solo puedes enviar imágenes como un archivo, también, puedes usar tus imágenes ya localizadas en S3 e indicarle a Rekognition que vaya al recurso del S3 y reconozca lo que queremos de esa imagen.

Para usar S3 como source de las imágenes, debes añadir al usuario permisos de lectura a Buckets S3 en AWS IAM. Puedes usar: AmazonS3FullAccess

Los parámetros para solicitar reconocimiento desde un Bucket son los siguientes:

Como ves, solo es Reemplazar Bytes por un S3Object que contiene la información del Bucket S3 donde va a localizar los datos y por supuesto, el Nombre o la ruta del archivo.

Algo a tener en cuenta es que, no tenemos la posibilidad de enviarle la región del Bucket. Al inicializar el Rekognition le enviamos una región predeterminada, es esta la que va a usar la instancia para buscar el bucket. (puede ser una razón para que tengas un error de BUCKET_NOT_FOUND)

Después de tener configurados todos los parámetros, simplemente llamamos a rekognition.detectText(params).promise()

Así como usamos detectText, podemos usar muchas más de sus funcionalidades. Más adelante seguiré con otros ejemplos de como implementarlos. Por lo pronto… Aquí tienes la documentación

¿Por qué es necesario el promise()?

Realmente esto no es necesario, el método detectText(params[, callback]) acepta una función como segundo parámetro, en la que puedes enviarle un callback que procese y maneje la respuesta, sea un error o una respuesta exitosa.

En este caso, .promise() me permite tener un código más legible usando async/await para el manejo de promesas.

Ahora sí, la imagen procesada y el texto reconocido

Cuando AWS Procesa la imagen, pueden suceder ciertos errores, uno de los más comunes es el MAX_LENGTH_SIZE, solo puedes usar imágenes hasta 5MB.

AWS responde con los resultados y nos envía un objeto de este tipo:

Este Objeto tiene una Lista de TextDetections y es aquí donde está toda la información procesada y detectada en la imagen.

Cada elemento de esta lista puede ser de dos tipos LINE o WORD, en resumen, LINE es un texto que AWS reconoció en conjunto y considera como una Línea o Frase. WORD puede ser una palabra aislada que no pudo encontrar junto a otras palabras. Pueden ser simplemente textos intermedios que están entre las frases.

Otro dato importante que nos devuelve AWS es la ubicación de la palabra o frase dentro de la imagen, esta información está contenida en el Array Geometry, que no son más que cuatro puntos en la imagen que encierran al Texto. No siempre puede que lo necesites pero para que te hagas una idea, puedes lograr algo como esto:

Conclusión:

No necesitamos demasiados conocimientos avanzados para comenzar a enriquecer nuestras aplicaciones y servicios con herramientas modernas y en constante avance. Gracias a la abstracción que se ha hecho para los servicios de AWS su implementación es sencilla y rápida.

Hay muchas más características de AWS Rekognition, en él puedes detectar el recorrido de personas, comparar rostros, buscar objetos en la imagen y más, sin duda es una tecnología que puede adaptarse a cualquier contexto y lógica de negocio que necesites.

Si quieres implementar el servidor express que he construido para este proyecto, acá el repo.

Twitter: @FlavioAandres

--

--

Flavio AAndres
Condor Labs Engineering

I like to experiment with all. Backend developer at @condorlabs.io. NodeJS/AWS/Serverless/+