L’estrazione di testo dalle immagini è un problema molto diffuso nell’ingegneria del software. Il riconoscimento ottico dei caratteri (OCR) è una tecnologia pionieristica ampiamente utilizzata per risolvere questo problema. Grazie alla sua capacità di trasformare le immagini contenenti testo in dati leggibili dalla macchina, l’OCR ha rivoluzionato diversi settori, dall’automazione dell’elaborazione dei documenti alla traduzione linguistica.

Sebbene esistano soluzioni OCR commerciali, la creazione di una propria API OCR in Python, un linguaggio di programmazione versatile e potente, offre diversi vantaggi, tra cui la personalizzazione, il controllo sulla privacy dei dati e il potenziale risparmio economico.

Questa guida mostra come creare la propria API OCR utilizzando Python. Esploreremo le librerie, le tecniche e le considerazioni necessarie per sviluppare un’API OCR efficace, per poter sfruttare al meglio la potenza dell’OCR per le nostre applicazioni.

Prerequisiti

Per seguirci, è necessario avere una conoscenza di base di Python e Flask e una copia locale di Python installata sul sistema.

Creare l’API OCR

In questa guida impareremo a costruire un’applicazione Flask che permetta agli utenti di caricare le immagini attraverso un endpoint POST, che viene poi caricato utilizzando Pillow ed elaborato utilizzando il wrapper PyTesseract (per il motore OCR di Tesseract ). Infine, restituisce il testo estratto come risposta alla richiesta.

Si può personalizzare ulteriormente questa API per fornire opzioni come la classificazione basata su modelli (per estrarre le voci delle fatture, gli input dei moduli fiscali, ecc.

Per iniziare, creiamo una nuova directory per il nostro progetto. Quindi, creiamo un nuovo ambiente virtuale nella cartella eseguendo questi comandi:

python3 -m venv env
source env/bin/activate

Successivamente, installiamo Flask, PyTesseract, Gunicorn e Pillow eseguendo il comando:

pip3 install pytesseract flask pillow gunicorn

Una volta installati questi programmi, dovremo installare il motore OCR Tesseract sul computer host. Le istruzioni per l’installazione di Tesseract variano a seconda del sistema operativo host, e possiamo trovare quelle più appropriate qui.

Ad esempio, su MacOS, possiamo installare Tesseract utilizzando Homebrew eseguendo questo comando:

brew install tesseract

Una volta fatto questo, il wrapper PyTesseract sarà in grado di comunicare con il motore OCR e di elaborare le richieste OCR.

Ora siamo pronti a scrivere l’applicazione Flask. Creiamo una nuova directory chiamata ocrapi e un nuovo file in questa directory con il nome main.py. Salviamo i contenuti qui sotto:

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)

Il codice precedente crea un’applicazione Flask di base che ha un unico endpoint:/ocr. Quando inviamo una richiesta POST a questo endpoint con un file immagine, l’applicazione estrae il file, utilizza il wrapper pytesseract per eseguire l’OCR utilizzando il metodo code_to_string() e invia il testo estratto come parte della risposta.

Creiamo un file wsgi.py nella stessa directory di ocrapi e salviamo i contenuti qui di seguito:

from ocrapi.main import app as application

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

Ora possiamo eseguire l’applicazione con il seguente comando:

gunicorn ocrapi.wsgi

La nostra API OCR di base è pronta ed è ora di testarla!

Testare l’API OCR in locale

Possiamo utilizzare la CLI cURL integrata per inviare richieste all’API o passare a uno strumento di test API dettagliato come Postman. Per testare l’API, dovremo scaricare un’immagine campione con del testo. Per ora possiamo utilizzare questa semplice immagine o questa scritta “a mano”.

Scarichiamo una delle due nella cartella del progetto e diamole un nome semplice, come simple-image.png o scribbled-image.png, a seconda dell’immagine scelta.

Quindi, apriamo il terminale e navighiamo nella directory del progetto. Eseguiamo questo comando per testare l’API:

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

Questo comando invia una richiesta all’API OCR e restituisce una risposta simile:

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

Questo conferma che l’API OCR è stata configurata correttamente. Possiamo anche provare con un’immagine semplice: ecco come dovrebbe apparire la risposta:

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

Questo dimostra anche l’accuratezza del motore OCR di Tesseract. Ora possiamo procedere a ospitare la nostra API OCR sull’Hosting di Applicazioni di Kinsta in modo da potervi accedere online.

Distribuzione dell’API OCR

Per distribuire l’applicazione su Kinsta, dobbiamo prima inviare il codice del progetto a un provider Git (Bitbucket, GitHub o GitLab).

Prima di inviare il codice, dobbiamo configurare Tesseract separatamente sul sistema host per poter utilizzare il wrapper PyTesseract. Per poter utilizzare il wrapper sulla piattaforma di applicazioni di Kinsta (o su qualsiasi altro ambiente, in generale), dovremo configurarlo anche lì.

Se state lavorando con istanze di calcolo remote (come AWS EC2), potete accedere via SSH all’istanza di calcolo ed eseguire il comando appropriato per installare il pacchetto su di essa.

Tuttavia, le piattaforme applicative non consentono l’accesso diretto all’host. Dovremo utilizzare una soluzione come Nixpacks, Buildpacks o Dockerfiles per impostare i requisiti iniziali degli ambienti dell’applicazione (che comprenderanno la configurazione del pacchetto Tesseract a livello locale) e poi installare l’applicazione.

Aggiungiamo un file nixpacks.toml nella directory del progetto con i seguenti contenuti:

# nixpacks.toml

providers = ["python"]

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

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

[start]
cmd = "gunicorn ocrapi.wsgi"

In questo modo la piattaforma di build verrà istruita a

  1. Utilizzare il runtime Python per costruire ed eseguire l’applicazione
  2. Impostare il pacchetto Tesseract nel contenitore dell’applicazione.
  3. Avviare l’applicazione utilizzando gunicorn.

Inoltre, eseguiamo il comando qui sotto per generare un file requirements.txt che la piattaforma applicativa può utilizzare per installare i pacchetti Python necessari durante la build:

pip3 freeze > requirements.txt

Quando il repository Git è pronto, seguiamo questi passaggi per distribuire l’API OCR su Kinsta:

  1. Accediamo o creiamo un account per visualizzare la dashboard MyKinsta.
  2. Autorizziamo Kinsta con il provider Git.
  3. Nella barra laterale di sinistra, clicchiamo su Applicazioni e poi su Aggiungi applicazione.
  4. Selezioniamo il repository e il ramo da cui desideriamo effettuare il deploy.
  5. Selezioniamo uno dei data center disponibili tra le 37 opzioni in lista. Kinsta rileva automaticamente le impostazioni di build delle applicazioni attraverso il file Nixpack, quindi lascia vuoto il campo del comando di avvio.
  6. Scegliamo le risorse dell’applicazione, come la RAM e lo spazio su disco.
  7. Clicchiamo su Crea applicazione.

Una volta completata la distribuzione, copiamo il link dell’applicazione distribuita ed eseguiamo questo comando sulla CLI:

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

Questo dovrebbe restituire la stessa risposta che abbiamo ricevuto in locale:

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

Possiamo anche utilizzare Postman per testare l’API.

L'applicazione Postman mostra una richiesta POST inviata all'applicazione ospitata su Kinsta con la relativa risposta.
Prova l’applicazione in Postman

Questo completa lo sviluppo di un’API OCR di base. È possibile accedere al codice completo di questo progetto su GitHub.

Riepilogo

Ora avete un’API OCR funzionante e self-hosted che potrete personalizzare a vostro piacimento! Questa API è in grado di estrarre il testo dalle immagini, fornendo uno strumento prezioso per l’estrazione di dati, la digitalizzazione di documenti e altre applicazioni.

Se continuate a sviluppare e perfezionare la vostra API OCR, considerate la possibilità di esplorare funzionalità avanzate come il supporto multilingue, le tecniche di pre-elaborazione delle immagini e l’integrazione con i servizi di cloud storage per l’archiviazione e l’accesso alle immagini.

Quale caratteristica ritenete indispensabile per un’API OCR self-hosted? Fatecelo sapere nei commenti qui sotto!

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.