Extraer texto de imágenes ha sido durante mucho tiempo un problema habitual en la ingeniería de software. El Reconocimiento Óptico de Caracteres (OCR, Optical Character Recognition) ha sido una tecnología pionera muy utilizada para resolver este problema. Gracias a su capacidad para transformar imágenes que contienen texto en datos legibles por máquina, el OCR ha revolucionado diversos sectores, desde la automatización del procesamiento de documentos hasta la traducción de idiomas.

Aunque existen soluciones comerciales de OCR, crear tu propia API de OCR en Python, un lenguaje de programación versátil y potente, ofrece varias ventajas, como la personalización, el control sobre la privacidad de los datos y la posibilidad de ahorrar costes.

Esta guía te guiará en la creación de tu propia API de OCR utilizando Python. Explora las bibliotecas, técnicas y consideraciones necesarias para desarrollar una API de OCR eficaz, permitiéndote aprovechar el poder del OCR para tus aplicaciones.

Requisitos Previos

Para seguir adelante, necesitas conocimientos básicos de Python y Flask y una copia local de Python instalada en tu sistema.

Creación de la API OCR

En esta guía, aprenderás a construir una aplicación Flask que permita a los usuarios subir imágenes a través de un endpoint POST, que luego carga utilizando Pillow, y procesa utilizando el wrapper PyTesseract (para el motor Tesseract OCR). Finalmente, devuelve el texto extraído como respuesta a la solicitud.

Puedes personalizar aún más esta API para ofrecer opciones como la clasificación basada en plantillas (extraer partidas de facturas, entradas en formularios de impuestos, etc.) u opciones de motor OCR (puedes encontrar más motores OCR aquí).

Para empezar, crea un nuevo directorio para tu proyecto. A continuación, configura un nuevo entorno virtual en la carpeta ejecutando los siguientes comandos:

python3 -m venv env
source env/bin/activate

A continuación, instala Flask, PyTesseract, Gunicorn y Pillow ejecutando el siguiente comando:

pip3 install pytesseract flask pillow gunicorn

Una vez instalados, tienes que instalar el motor Tesseract OCR en tu máquina host. Las instrucciones de instalación de Tesseract variarán en función de tu sistema operativo host. Puedes encontrar las instrucciones adecuadas aquí.

Por ejemplo, en MacOS, puedes instalar Tesseract utilizando Homebrew ejecutando el siguiente comando:

brew install tesseract

Una vez hecho esto, el wrapper PyTesseract podrá comunicarse con el motor OCR y procesar las peticiones OCR.

Ahora estás preparado para escribir la aplicación Flask. Crea un nuevo directorio llamado ocrapi y un nuevo archivo en este directorio con el nombre main.py. Guarda en él el siguiente contenido:

from flask import Flask, request, jsonify
from PIL import Image
import pytesseract

app = Flask(__name__)

@app.route('/ocr', methods=['POST'])
def ocr_process():
    if request.method == 'POST':
        image_file = request.files['image']
        image_data = Image.open(image_file)

        # Perform OCR using PyTesseract
        text = pytesseract.image_to_string(image_data)

        response = {
            'status': 'success',
            'text': text
        }

        return jsonify(response)

El código anterior crea una aplicación Flask básica que tiene un endpoint—/ocr. Cuando envías una solicitud POST a este endpoint con un archivo de imagen, extrae el archivo, utiliza el wrapper pytesseract para realizar el OCR utilizando su método code_to_string(), y devuelve el texto extraído como parte de la respuesta.

Crea un archivo wsgi.py en el mismo directorio ocrapi y guarda en él el siguiente contenido:

from ocrapi.main import app as application

if __name__ == "__main__":
    application.run()

Ahora puedes ejecutar la aplicación utilizando el siguiente comando:

gunicorn ocrapi.wsgi

Tu API de OCR básica está lista, ¡y es hora de probarla!

Probando la API de OCR Localmente

Puedes utilizar la CLI cURL incorporada para enviar solicitudes a tu API o cambiar a una herramienta de prueba de API detallada como Postman. Para probar la API, necesitarás descargar una imagen de muestra que contenga algo de texto. De momento, puedes utilizar esta sencilla o esta escrita a mano.

Descarga cualquiera de ellas en el directorio del proyecto y ponle un nombre sencillo, como simple-image.png o scribbled-image.png, según la imagen que elijas.

A continuación, abre tu terminal y navega hasta el directorio de tu proyecto. Ejecuta el siguiente comando para probar la API:

curl -X POST -F “[email protected]” localhost:5000/ocr

Esto envía una petición a tu API OCR y devuelve una respuesta similar:

{
  "status": "success",
  "text": "This looks like it was written in a hucrynn"
}

Esto confirma que tu API de OCR se ha configurado correctamente. También puedes probar con la imagen simple (simple-image.png), y este es el aspecto que debería tener la respuesta:

{
  "status": "success",
  "text": "This looks like it was written with a steady handnn"
}

Esto también demuestra la precisión del motor OCR de Tesseract. Ahora puedes proceder a alojar tu API de OCR en el Alojamiento de Aplicaciones de Kinsta para que se pueda acceder a ella online.

Desplegando tu API OCR

Para desplegar tu aplicación en Kinsta, primero tienes que enviar el código de tu proyecto a un proveedor Git (Bitbucket, GitHub o GitLab).

Antes de enviar tu código, tienes que configurar Tesseract por separado en tu sistema host para poder utilizar con él el wrapper PyTesseract. Para poder utilizar el wrapper en la plataforma de aplicaciones Kinsta (o en cualquier otro entorno, en general), también tendrás que configurarlo allí.

Si estuvieras trabajando con instancias de computación remotas (como AWS EC2), podrías acceder mediante SSH a la instancia de computación y ejecutar el comando adecuado para instalar el paquete en ella.

Sin embargo, las plataformas de aplicación no te proporcionan acceso directo al host. Tendrás que utilizar una solución como Nixpacks, Buildpacks o Dockerfiles para configurar los requisitos iniciales de los entornos de tu aplicación (lo que incluirá configurar el paquete Tesseract localmente) y luego instalar la aplicación.

Añade un archivo nixpacks.toml en el directorio de tu proyecto con el siguiente contenido:

# nixpacks.toml

providers = ["python"]

[phases.setup]
nixPkgs = ["...", "tesseract"]

[phases.build]
cmds = ["echo building!", "pip install -r requirements.txt", "..."]

[start]
cmd = "gunicorn ocrapi.wsgi"

Esto indicará a la plataforma de compilación que

  1. Utilizar el entorno de ejecución de Python para construir y ejecutar tu aplicación
  2. Configurar el paquete Tesseract en el contenedor de tu aplicación.
  3. Iniciar la aplicación utilizando gunicorn.

Además, ejecuta el siguiente comando para generar un archivo requirements.txt que la plataforma de la aplicación pueda utilizar para instalar los paquetes Python necesarios durante la construcción:

pip3 freeze > requirements.txt

Una vez que tu repositorio Git esté listo, sigue estos pasos para desplegar tu API OCR en Kinsta:

  1. Inicia sesión o crea una cuenta para ver tu panel MyKinsta.
  2. Autoriza a Kinsta con tu proveedor Git.
  3. En la barra lateral izquierda, haz clic en Aplicaciones y luego en Añadir Aplicación.
  4. Selecciona el repositorio y la rama desde la que deseas desplegar.
  5. Selecciona una de las ubicaciones de centros de datos disponibles en la lista de 37 opciones. Kinsta detecta automáticamente la configuración de construcción de tus aplicaciones a través de tu archivo Nixpack — así que deja en blanco el campo de comando de inicio.
  6. Elige los recursos de tu aplicación, como RAM y espacio en disco.
  7. Haz clic en Crear aplicación.

Una vez completado el despliegue, copia el enlace de la aplicación desplegada y ejecuta el siguiente comando en tu CLI:

curl -x POST -F “[email protected]” <your-deployed-app-link>/ocr

Esto debería devolver la misma respuesta que recibiste localmente:

{"status":"success","text":"This looks like it was written with a steady handnn"}

También puedes utilizar Postman para probar la API.

Aplicación Postman que muestra una solicitud POST enviada a la aplicación alojada en Kinsta con su respuesta.
Probar la aplicación en Postman

Esto completa el desarrollo de una API básica de OCR. Puedes acceder al código completo de este proyecto en GitHub.

Resumen

Ya tienes una API de OCR autoalojada que funciona y que puedes personalizar a tu gusto Esta API puede extraer texto de imágenes, proporcionando una valiosa herramienta para la extracción de datos, la digitalización de documentos y otras aplicaciones.

A medida que sigas desarrollando y perfeccionando tu API de OCR, considera la posibilidad de explorar funciones avanzadas como la compatibilidad con varios idiomas, las técnicas de preprocesamiento de imágenes y la integración con servicios de almacenamiento en la nube para guardar y acceder a las imágenes.

¿Qué función crees que es indispensable para una API de OCR autoalojada? Háznoslo saber en los comentarios

Kumar Harsh

Kumar is a software developer and a technical author based in India. He specializes in JavaScript and DevOps. You can learn more about his work on his website.