A extração de texto de imagens tem sido um problema popular na engenharia de software há muito tempo. O reconhecimento óptico de caracteres (OCR) foi uma tecnologia pioneira amplamente utilizada para resolver esse problema. Com sua capacidade de transformar imagens contendo texto em dados legíveis por máquina, o OCR revolucionou vários setores, desde a automação do processamento de documentos até a tradução de idiomas.

Embora existam soluções comerciais de OCR, a criação de sua própria API OCR no Python, uma linguagem de programação versátil e avançada, oferece várias vantagens, incluindo personalização, controle sobre a privacidade dos dados e a possibilidade de economia de custos.

Este guia orientará você na criação da sua própria API OCR usando Python. Ele explora as bibliotecas, técnicas e considerações necessárias para o desenvolvimento de uma API OCR eficaz, permitindo que você aproveite o poder do OCR em seus aplicativos.

Pré-requisitos

Para acompanhar, você precisa ter um entendimento básico de Python e Flask, além de uma cópia local do Python instalada em seu sistema.

Como criar a API OCR

Neste guia, você aprenderá a criar um aplicativo Flask que permite que os usuários carreguem imagens por meio de um endpoint POST, que é carregado usando o Pillow e processado usando o wrapper PyTesseract (para o mecanismo de OCR do Tesseract). Por fim, ele retorna o texto extraído como resposta à solicitação.

Você pode personalizar ainda mais essa API para oferecer opções como classificação baseada em modelo (extração de itens de linha de faturas, entradas em formulários de impostos, etc.) ou opções de mecanismo de OCR (você pode encontrar mais mecanismos de OCR aqui).

Para começar, crie um novo diretório para o seu projeto. Em seguida, configure um novo ambiente virtual na pasta, executando os seguintes comandos:

python3 -m venv env
source env/bin/activate

Em seguida, instale o Flask, o PyTesseract, o Gunicorn e o Pillow executando o seguinte comando:

pip3 install pytesseract flask pillow gunicorn

Depois de instalados, você precisa instalar o mecanismo de OCR do Tesseract no computador host. As instruções de instalação do Tesseract variam de acordo com o sistema operacional do seu host. Você pode encontrar as instruções apropriadas aqui.

Por exemplo, no MacOS, você pode instalar o Tesseract usando o Homebrew, executando o seguinte comando:

brew install tesseract

Quando isso for feito, o wrapper do PyTesseract poderá se comunicar com o mecanismo de OCR e processar solicitações de OCR.

Agora, você está pronto para escrever o aplicativo Flask. Crie um novo diretório chamado ocrapi e um novo arquivo nesse diretório com o nome main.py. Salve o seguinte conteúdo nele:

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)

O código acima cria um aplicativo básico do Flask que tem um endpoint—/ocr. Quando você envia uma solicitação POST para esse endpoint com um arquivo de imagem, ele extrai o arquivo, usa o wrapper pytesseract para executar o OCR usando seu método code_to_string() e envia de volta o texto extraído como parte da resposta.

Crie um arquivo wsgi.py no mesmo diretório ocrapi e salve o seguinte conteúdo nele:

from ocrapi.main import app as application

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

Agora você pode executar o aplicativo usando o seguinte comando:

gunicorn ocrapi.wsgi

Sua API básica de OCR está pronta e é hora de você testá-la!

Testando a API OCR localmente

Você pode usar a CLI cURL integrada para enviar solicitações à sua API ou mudar para uma ferramenta de teste de API detalhada, como o Postman. Para testar a API, você precisará fazer download de uma imagem de amostra que contenha algum texto. Você pode usar esta imagem simples ou esta imagem escrita à mão por enquanto.

Faça o download de qualquer uma delas para o diretório do projeto e dê a ela um nome simples, como simple-image.png ou scribbled-image.png, dependendo da imagem que você escolher.

Em seguida, abra o terminal e navegue até o diretório do projeto. Execute o seguinte comando para testar a API:

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

Isso envia uma solicitação à sua API de OCR e retorna uma resposta semelhante:

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

Isso confirma que sua API OCR foi configurada corretamente. Você também pode tentar com a imagem simples, e aqui está a aparência da resposta:

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

Isso também demonstra a precisão do mecanismo de OCR do Tesseract. Agora você pode continuar a hospedar sua API OCR na Hospedagem de Aplicativos da Kinsta, possibilitando o seu acesso on-line.

Implantação da API OCR

Para implantar seu aplicativo na Kinsta, primeiro você precisa enviar o código do projeto para um provedor Git (Bitbucket, GitHub ou GitLab).

Antes de enviar seu código, você precisa configurar o Tesseract separadamente em seu sistema host para poder usar o wrapper PyTesseract com ele. Para poder usar o wrapper na plataforma de aplicativos Kinsta (ou em qualquer outro ambiente, em geral), você precisará configurá-lo lá também.

Se você estiver trabalhando com instâncias de computação remotas (como o AWS EC2), poderá fazer o SSH na instância de computação e executar o comando apropriado para instalar o pacote nela.

No entanto, as plataformas de aplicativos não fornecem a você acesso direto ao host. Você precisará usar uma solução como Nixpacks, Buildpacks ou Dockerfiles para configurar os requisitos iniciais dos ambientes do seu aplicativo (o que incluirá a configuração do pacote Tesseract localmente) e, em seguida, instalar o aplicativo.

Adicione um arquivo nixpacks.toml no diretório do seu projeto com o seguinte conteúdo:

# nixpacks.toml

providers = ["python"]

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

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

[start]
cmd = "gunicorn ocrapi.wsgi"

Isso instruirá a plataforma de build a:

  1. Usar o tempo de execução do Python para construir e executar seu aplicativo
  2. Configurar o pacote Tesseract no contêiner do seu aplicativo.
  3. Iniciar o aplicativo usando gunicorn.

Além disso, execute o seguinte comando para gerar um arquivo requirements.txt que a plataforma do aplicativo pode usar para instalar os pacotes Python necessários durante a build:

pip3 freeze > requirements.txt

Quando seu repositório Git estiver pronto, siga estas etapas para implantar sua API OCR na Kinsta:

  1. Faça login ou crie uma conta para visualizar seu painel MyKinsta.
  2. Autorize a Kinsta no seu provedor Git.
  3. Na barra lateral esquerda, clique em Aplicativos e, em seguida, clique em Adicionar aplicativo.
  4. Selecione o repositório e a branch a partir da qual você deseja implantar.
  5. Selecione um dos 36 locais de centros de dados disponíveis na lista de opções. A Kinsta detecta automaticamente as configurações de build de seus aplicativos por meio do arquivo Nixpack – portanto, deixe o campo de comando start em branco.
  6. Escolha os recursos do seu aplicativo, como RAM e espaço em disco.
  7. Clique em Criar aplicativo.

Quando a implantação estiver concluída, copie o link do aplicativo implantado e execute o seguinte comando em sua CLI:

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

Isso deve retornar a mesma resposta que você recebeu localmente:

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

Você também pode usar o Postman para testar a API.

Experimentando o aplicativo no Postman.
Experimentando o aplicativo no Postman.

Com isso, você conclui o desenvolvimento de uma API básica de OCR. Você pode acessar o código completo deste projeto no GitHub.

Resumo

Agora você tem uma API OCR auto-hospedada em funcionamento que pode personalizar conforme desejar! Essa API pode extrair texto de imagens, fornecendo uma ferramenta valiosa para extração de dados, digitalização de documentos e outros aplicativos.

À medida que você continuar a desenvolver e refinar sua API OCR, considere explorar recursos avançados, como suporte a vários idiomas, técnicas de pré-processamento de imagens e integração com serviços de armazenamento em nuvem para armazenar e acessar imagens.

Que recurso você acha indispensável para uma API OCR auto-hospedada? Compartilhe sua opinião nos comentários abaixo!

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.