Potente análisis de imágenes con Google Cloud Vision y Python

Publicado: 2022-03-10
Resumen rápido ↬ El abanico de posibilidades para aplicar el servicio Google Cloud Vision es prácticamente infinito. Con la biblioteca de Python disponible, ciertamente puede ayudarlo a generar un interés más profundo en las tecnologías de aprendizaje automático.

Recientemente, construí una aplicación web para administrar los gastos personales de los usuarios. Sus principales características son escanear recibos de compras y extraer datos para su posterior procesamiento. La API de Google Vision resultó ser una gran herramienta para obtener un texto de una foto. En este artículo, lo guiaré a través del proceso de desarrollo con Python en un proyecto de muestra.

Si eres un novato, no te preocupes. Solo necesitará un conocimiento muy básico de este lenguaje de programación, sin necesidad de otras habilidades.

Comencemos, ¿de acuerdo?

¿Nunca has oído hablar de Google Cloud Vision?

Es una API que permite a los desarrolladores analizar el contenido de una imagen a través de datos extraídos. Para este propósito, Google utiliza modelos de aprendizaje automático entrenados en un gran conjunto de datos de imágenes. Todo eso está disponible con una sola solicitud de API. El motor detrás de la API clasifica imágenes, detecta objetos, rostros de personas y reconoce palabras impresas dentro de las imágenes.

Para darle un ejemplo, mencionemos el popular Giphy. Adoptaron la API para extraer datos de subtítulos de GIF, lo que resultó en una mejora significativa en la experiencia del usuario. Otro ejemplo es realtor.com, que utiliza el OCR de Vision API para extraer texto de imágenes de carteles de venta tomados en una aplicación móvil para proporcionar más detalles sobre la propiedad.

Aprendizaje automático de un vistazo

Comencemos respondiendo la pregunta que muchos de ustedes probablemente hayan escuchado antes: ¿qué es el aprendizaje automático?

La idea general es desarrollar un modelo programable que encuentre patrones en los datos proporcionados. Cuanto mayor sea la calidad de los datos que entregue y mejor sea el diseño del modelo que utilice, se producirá un resultado más inteligente. Con el "aprendizaje automático amigable" (como llama Google a su aprendizaje automático a través de servicios API), puede incorporar fácilmente una parte de la inteligencia artificial en sus aplicaciones.

Lectura recomendada : Primeros pasos con el aprendizaje automático

¡Más después del salto! Continúe leyendo a continuación ↓

Cómo comenzar con Google Cloud

Comencemos con el registro en Google Cloud. Google requiere autenticación, pero es simple e indoloro: solo necesitará almacenar un archivo JSON que incluye la clave API, que puede obtener directamente de Google Cloud Platform.

Descargue el archivo y agregue su ruta a las variables de entorno:

 export GOOGLE_APPLICATION_CREDENTIALS=/path/to/your/apikey.json

Alternativamente, en el desarrollo, puede apoyarse con el método from_serivce_account_json() , que describiré más adelante en este artículo. Para obtener más información sobre la autenticación, consulte la documentación oficial de Cloud.

Google proporciona un paquete de Python para manejar la API. Agreguemos la última versión de google-cloud-vision==0.33 a su aplicación. ¡Hora de codificar!

Cómo combinar Google Cloud Vision con Python

En primer lugar, importemos clases de la biblioteca.

 from google.cloud import vision from google.cloud.vision import types

Cuando se solucione eso, ahora necesitará una instancia de un cliente. Para hacerlo, utilizará una función de reconocimiento de texto.

 client = vision.ImageAnnotatorClient()

Si no almacenará sus credenciales en variables de entorno, en esta etapa puede agregarlas directamente al cliente.

 client = vision.ImageAnnotatorClient.from_service_account_file( '/path/to/apikey.json' )

Suponiendo que almacena imágenes para ser procesadas en una carpeta 'imágenes' dentro de su catálogo de proyectos, abramos una de ellas.

Imagen de recibo que podría ser procesado por Google Cloud Vision
Un ejemplo de un recibo simple que Google Cloud Vision podría procesar. (Vista previa grande)
 image_to_open = 'images/receipt.jpg' with open(image_to_open, 'rb') as image_file: content = image_file.read()

El siguiente paso es crear un objeto Vision, que le permitirá enviar una solicitud para continuar con el reconocimiento de texto.

 image = vision.types.Image(content=content) text_response = client.text_detection(image=image)

La respuesta consta de palabras detectadas almacenadas como claves de descripción, su ubicación en la imagen y una predicción de idioma. Por ejemplo, echemos un vistazo más de cerca a la primera palabra:

 [ ... description: "SHOPPING" bounding_poly { vertices { x: 1327 y: 1513 } vertices { x: 1789 y: 1345 } vertices { x: 1821 y: 1432 } vertices { x: 1359 y: 1600 } } ... ]

Como puede ver, para filtrar solo texto, necesita obtener una descripción "en todos los elementos". Afortunadamente, con ayuda viene la poderosa comprensión de listas de Python.

 texts = [text.description for text in text_response.text_annotations] ['SHOPPING STORE\nREG 12-21\n03:22 PM\nCLERK 2\n618\n1 MISC\n1 STUFF\n$0.49\n$7.99\n$8.48\n$0.74\nSUBTOTAL\nTAX\nTOTAL\nCASH\n6\n$9. 22\n$10.00\nCHANGE\n$0.78\nNO REFUNDS\nNO EXCHANGES\nNO RETURNS\n', 'SHOPPING', 'STORE', 'REG', '12-21', '03:22', 'PM', 'CLERK', '2', '618', '1', 'MISC', '1', 'STUFF', '$0.49', '$7.99', '$8.48', '$0.74', 'SUBTOTAL', 'TAX', 'TOTAL', 'CASH', '6', '$9.', '22', '$10.00', 'CHANGE', '$0.78', 'NO', 'REFUNDS', 'NO', 'EXCHANGES', 'NO', 'RETURNS']

Si observa detenidamente, puede notar que el primer elemento de la lista contiene todo el texto detectado en la imagen almacenado como una cadena, mientras que los demás son palabras separadas. Imprimámoslo.

 print(texts[0]) SHOPPING STORE REG 12-21 03:22 PM CLERK 2 618 1 MISC 1 STUFF $0.49 $7.99 $8.48 $0.74 SUBTOTAL TAX TOTAL CASH 6 $9. 22 $10.00 CHANGE $0.78 NO REFUNDS NO EXCHANGES NO RETURNS

Bastante preciso, ¿verdad? Y obviamente bastante útil, así que juguemos más.

¿Qué puede obtener de Google Cloud Vision?

Como mencioné anteriormente, Google Cloud Vision no solo se trata de reconocer texto, sino que también te permite descubrir rostros, puntos de referencia, propiedades de imágenes y conexiones web. Con eso en mente, averigüemos qué puede decirle sobre las asociaciones web de la imagen.

 web_response = client.web_detection(image=image)

Ok Google, ¿realmente sabes lo que se muestra en la imagen que recibiste?

 web_content = web_response.web_detection web_content.best_guess_labels >>> [label: "Receipt"]

¡Buen trabajo, Google! Es un recibo de hecho. Pero vamos a darle un poco más de ejercicio: ¿puede ver algo más? ¿Qué tal más predicciones expresadas en porcentaje?

 predictions = [ (entity.description, '{:.2%}'.format(entity.score))) for entity in web_content.web_entities ] >>> [('Receipt', '70.26%'), ('Product design', '64.24%'), ('Money', '56.54%'), ('Shopping', '55.86%'), ('Design', '54.62%'), ('Brand', '54.01%'), ('Font', '53.20%'), ('Product', '51.55%'), ('Image', '38.82%')]

Muchas ideas valiosas, ¡bien hecho, mi todopoderoso amigo! ¿Puedes averiguar también de dónde proviene la imagen y si tiene alguna copia?

 web_content.full_matching_images >>> [ url: "https://www.rcapitalassociates.com/wp-content/uploads/2018/03/receipts.jpg", url:"https://media.istockphoto.com/photos/shopping-receipt-picture-id901964616?k=6&m=901964616&s=612x612&w=0&h=RmFpYy9uDazil1H9aXkkrAOlCb0lQ-bHaFpdpl76o9A=", url: "https://www.pakstat.com.au/site/assets/files/1172/shutterstock_573065707.500x500.jpg" ]

Estoy impresionado. ¡Gracias, Google! Pero uno no es suficiente, ¿puede darme tres ejemplos de imágenes similares?

 web_content.visually_similar_images[:3] >>>[ url: "https://thumbs.dreamstime.com/z/shopping-receipt-paper-sales-isolated-white-background-85651861.jpg", url: "https://thumbs.dreamstime.com/b/grocery-receipt-23403878.jpg", url:"https://image.shutterstock.com/image-photo/closeup-grocery-shopping-receipt-260nw-95237158.jpg" ]

¡Dulce! Bien hecho.

¿Existe realmente una inteligencia artificial en Google Cloud Vision?

Como puede ver en la imagen a continuación, lidiar con los recibos puede ser un poco emotivo.

Hombre gritando y luciendo estresado mientras sostenía un recibo largo
Un ejemplo de estrés que puede experimentar al obtener un recibo. (Vista previa grande)

Echemos un vistazo a lo que la API de Vision puede decirle sobre esta foto.

 image_to_open = 'images/face.jpg' with open(image_to_open, 'rb') as image_file: content = image_file.read() image = vision.types.Image(content=content) face_response = client.face_detection(image=image) face_content = face_response.face_annotations face_content[0].detection_confidence >>> 0.5153166651725769

No está mal, el algoritmo está más del 50% seguro de que hay una cara en la imagen. Pero, ¿puedes aprender algo sobre las emociones detrás de esto?

 face_content[0] >>> [ ... joy_likelihood: VERY_UNLIKELY sorrow_likelihood: VERY_UNLIKELY anger_likelihood: UNLIKELY surprise_likelihood: POSSIBLE under_exposed_likelihood: VERY_UNLIKELY blurred_likelihood: VERY_UNLIKELY headwear_likelihood: VERY_UNLIKELY ... ]

Sorprendentemente, con un comando simple, puede verificar la probabilidad de algunas emociones básicas, así como las propiedades de la cabeza o la foto.

Cuando se trata de la detección de rostros, debo dirigir su atención a algunos de los posibles problemas que puede encontrar. Debe recordar que está entregando una foto a una máquina y, aunque la API de Google utiliza modelos entrenados en grandes conjuntos de datos, es posible que arroje algunos resultados inesperados y engañosos. En línea puede encontrar fotos que muestran la facilidad con la que se puede engañar a la inteligencia artificial cuando se trata de análisis de imágenes. Algunos de ellos pueden resultar divertidos, pero existe una línea muy fina entre los errores inocentes y los ofensivos, especialmente cuando un error se refiere a un rostro humano.

Sin duda, Google Cloud Vision es una herramienta robusta. Además, es divertido trabajar con él. La arquitectura REST de la API y el paquete de Python ampliamente disponible lo hacen aún más accesible para todos, independientemente de qué tan avanzado esté en el desarrollo de Python. ¡Imagínese cuán significativamente puede mejorar su aplicación utilizando sus capacidades!

Lectura recomendada : Aplicaciones del aprendizaje automático para diseñadores

¿Cómo puede ampliar su conocimiento sobre Google Cloud Vision?

El abanico de posibilidades para aplicar el servicio Google Cloud Vision es prácticamente infinito. Con Python Library disponible, puede utilizarlo en cualquier proyecto según el idioma, ya sea una aplicación web o un proyecto científico. Sin duda, puede ayudarlo a despertar un interés más profundo en las tecnologías de aprendizaje automático.

La documentación de Google proporciona algunas ideas excelentes sobre cómo aplicar las funciones de la API de Vision en la práctica y le brinda la posibilidad de obtener más información sobre el aprendizaje automático. Recomiendo especialmente consultar la guía sobre cómo crear una aplicación de búsqueda avanzada de imágenes.

Se podría decir que lo que has visto en este artículo es como magia. Después de todo, ¿quién hubiera pensado que una API simple y de fácil acceso está respaldada por una herramienta científica tan poderosa? Todo lo que queda por hacer es escribir unas pocas líneas de código, dejar volar su imaginación y experimentar el potencial ilimitado del análisis de imágenes.