Aprende a utilizar OCR con Amazon Textract

Si siempre has querido utilizar técnicas de OCR, pero no sabes cómo hacerlo, AWS te proporciona un servicio con todas las funcionalidades que puedas necesitar. A continuación te lo explico para que puedas utilizarlo en tus proyectos.

¿Qué es OCR?

El OCR (Optical Character Recognition), consiste en técnicas para identificar todos aquellos caracteres que se encuentran en una imagen. El OCR es ampliamente utilizado en exámenes tipo test, donde se identifica la respuesta que el usuario ha marcado. Pero si vamos más allá, podemos utilizar estos métodos para digitalizar cualquier tipo de archivo que incluya texto, ya sean imágenes o pdfs.

¿Qué es Amazon Textract?

En un post anterior, hablamos de los servicios de Machine Learning que se pueden utilizar en Amazon Web Services. Pues bien, Amazon Textract, pertenece a este conjunto de servicios. Como habrás deducido, es el servicio encargado de proveer funcionalidades de OCR.

¿Pero qué puedo hacer con Textract?

  • Reconocimiento óptico de caracteres – Detecta automáticamente texto y números en un documento.
  • Extracción de formularios – Permite detectar parejas clave-valor de un formulario. Dicho de otra forma, permite identificar el valor que contiene cada campo del formulario.
Imagen obtenida de la web oficial .
  • Extracción de tablas – Textract identifica el contenido que se estructura en tablas dentro de un documento, para que luego pueda ser subido a una base de datos relacional de forma sencilla.
  • Reconocimiento de escritura – Además de detectar texto escrito a máquina, Textract puede leer perfectamente aquellos caracteres escritos a mano.
  • Bounding boxes – Todos los datos extraídos de una imagen, proporcionan las coordenadas de su respectivo bounding box.
  • Umbrales de confianza ajustables – Al igual que con el bounding box, Textract también proporciona una puntuación de confianza, de manera que para tipos de datos en los que se tiene que estar realmente seguro de su identificación, pueda indicarse qué datos deben ser revisados por personas físicas.

Precios de Textract

Los precios de Amazon Textract varían en función de la región que elijas. Para todos los servicios, se suele cobrar un precio fijo por el primer millón de páginas escaneadas y se hace una reducción a partir de este primer millón. Los servicios por los que Amazon cobra son los siguientes:

  • API para detectar texto de un documento (OCR)
  • API para analizar documentos para páginas con tablas
  • API para analizar documentos para páginas con formularios
  • API para analizar documentos para páginas con tablas y formularios

Si eres un nuevo cliente de AWS (primeros 12 meses), tienes acceso a la capa gratuita de Amazon Textract. Esto significa que puedes escanear hasta 1000 páginas por mes utilizando la API para detectar texto de un documento y hasta 100 páginas por mes utilizando la API para analizar documentos, durante los primeros tres meses.

Caso práctico – Utilizando la API para leer texto de imágenes

A continuación te mostraré un ejemplo de cómo usar la API para detectar texto de un documento utilizando Python y Google Colab. El ejemplo consistirá en descargar una imagen de Google, cargarla en Textract y obtener el texto de la imagen.

Instalación del SDK

El primer pasó consistirá en la instalación del SDK (Software Development Kit) de AWS para Python en nuestro entorno.

!pip install boto3

Si estás siguiendo el tutorial en Google Colab, te pedirá que reinices el entorno de ejecución, así que haremos esto. Para hacer esto, en la barra de navegación pulsa en Entorno de ejecución > Reiniciar entorno de ejecución.

Importación de librerías

import boto3
from IPython.display import Image
import requests

En primer lugar importamos las librerías que necesitaremos a lo largo del proyecto. Usaremos el SDK de AWS que acabamos de instalar (boto3).

Declaración de variables

A continuación, declaramos el nombre con el que vamos a guardar la imagen, la url desde donde la vamos a descargar y nuestras credenciales de Amazon.

FILE_NAME = 'texto.png'
URL = 'https://upload.wikimedia.org/wikipedia/commons/4/4c/Texto_I_de_Gil_%281799%29.png'
# aws credentials
ACCESS_KEY = <ACCESS_KEY>
SECRET_KEY = <SECRET_KEY>

La idea es que sustituyas <ACCESS_KEY> y <SECRET_KEY> con tus credenciales. Si no las tienes, es tan sencillo como ir a tu consola de aws. Pulsar en tu usuario, arriba en la barra de navegación y luego en ‘Mis credenciales de seguridad‘.

Debajo de ‘Claves de acceso para CLI, SDK y API‘, pulsa en crear una clave de acceso. Descarga el archivo .csv. Si no lo haces, no tendrás opción de volver a hacerlo, tendrás que eliminar la clave y crear una nueva.

Si abres el excel, ahí tienes tus credenciales.

Descarga de la imagen

Ahora creamos una función para descargar la imagen y posteriormente la descargamos.

def download_image(url, image_name):
  with open(image_name, 'wb') as handle:
          response = requests.get(url, stream=True)
          if not response.ok:
              print(response)
          for block in response.iter_content(1024):
              if not block:
                  break
              handle.write(block)
download_image(URL, FILE_NAME)

La cargamos y la mostramos.

image = Image(FILE_NAME, width=100, height=100)
image

La imagen no se ve con mucha calidad, ya que he puesto que sea de 100×100 píxeles. Si quieres puedes cambiarle el tamaño para verlo diferente. En mi caso solo quería comprobar que fuera la imagen correcta.

Detección de texto

Ahora sí que pasamos a la parte divertida. Te sorprenderá lo sencillo que va a ser detectar el texto de la imagen.

En primar lugar, nos conectamos a Amazon Textract con nuestras credenciales.

client = boto3.client('textract',
                      aws_access_key_id=ACCESS_KEY,
                      aws_secret_access_key=SECRET_KEY,
                      region_name='eu-west-1',)

A continuación leemos el archivo, lo cargamos en formato bytearray (es simplemente una lista de bytes) y lanzamos la API de detección de texto.

with open(FILE_NAME, 'rb') as document:
    imageBytes = bytearray(document.read())
# Call Amazon Textract
response = client.detect_document_text(Document={'Bytes': imageBytes})

La variable response contiene el resultado de esta detección. Esta respuesta contiene una lista de ‘Bloques’, que se corresponden con todos los elementos que ha detectado en la imagen. A nosotros lo que nos interesa son aquellos en los que el tipo de bloque sea ‘LINE‘, porque se corresponden con texto de la imagen. Así que ahora imprimiremos todos aquellos textos dentro de la imagen.

for item in response["Blocks"]:
    if item["BlockType"] == "LINE":
        print(item["Text"])

Podemos ver que ha detectado el texto perfectamente, si bien en alguna ocasión se ha saltado alguna tilde. Pero ha sido muy sencillo utilizar este servicio.

Conclusiones

En este post hemos visto lo fácil que es utilizar la API de Textract para poder detectar texto en una imagen. Te animo a que lo pruebes con otras imágenes y compares resultados. Si te ha gustado este post y quieres otros del mismo estilo, déjalo en los comentarios o escríbenos.