Criando uma aplicação de OCR com Pytesseract na AWS utilizando Lambdas.

Andre Ruas
Senior Sistemas
Published in
7 min readJun 28, 2023

Neste POST, criaremos uma aplicação na AWS que recebe uma imagem e retorna o texto extraído da imagem para o usuário. Para isso, iremos utilizar o Pytesseract como ferramenta de OCR, a função Lambda da AWS para rodar nossa aplicação, e o CDK como framework para criação e deploy da nossa arquitetura.

Figura 1: Aplicação (Fonte: O Autor)

O POST está estruturado da seguinte forma: primeiro serão apresentadas as ferramentas que foram utilizadas para criação da aplicação e um breve resumo sobre cada uma, na sequência, será demonstrado um passo a passo com a criação da aplicação, e por fim as considerações finais sobre o que foi exposto.

Pytesseract

O Pytesseract é uma biblioteca em Python que fornece uma interface para utilizar o Tesseract OCR (Optical Character Recognition), sendo o Tesseract OCR um mecanismo de reconhecimento óptico de caracteres de código aberto mantido pelo Google.

Nesse tutorial utilizaremos o Pytesseract pois ele simplifica a utilização do Tesseract OCR em projetos Python, fornecendo uma interface simples para realização de tarefas de OCR em imagens.

CDK

O AWS Cloud Development Kit (CDK) é um framework de código aberto desenvolvido pela AWS que permite descrever a infraestrutura da aplicação usando linguagens de programação familiares, como Python, JavaScript e TypeScript. O que é uma vantagem pois facilita a adoção e reduz a curva de aprendizado, já que você pode aproveitar seu conhecimento existente em programação para criar e gerenciar recursos na AWS.

Outras vantagens da utilização do CDK incluem:

  • Abstração de alto nível
  • Produtividade e reutilização de código
  • Simplificação do deploy
  • Gerenciamento de dependências

Utilizaremos nesse tutorial a linguagem Python para criação do CDK que descreve a criação da arquitetura.

Lambda Container Images

A função Lambda da AWS permite executar código sem a necessidade de provisionar ou gerenciar servidores, ou seja, faz parte do modelo de desenvolvimento serverless. Entre as opções fornecidas pela AWS, tem-se a opção de empacotar o código e suas dependências em uma imagem de container Docker, com capacidade de até 10GB, para ser executada dentro de uma função Lambda. Essa imagem é armazenada em um registro de container, como o Amazon Elastic Container Registry (ECR), e quando a função Lambda é invocada, a imagem de container é baixada e executada em um ambiente isolado.

URL Lambda

A Lambda URL é um endpoint fornecido pela AWS que permite invocar a função Lambda através de uma requisição HTTP. Essa URL pode ser utilizada para integrações com outros serviços ou para testar e chamar a função Lambda manualmente.

Dockerfile

O Dockerfile é um arquivo de configuração utilizado para criar uma imagem de container, ele contém instruções que especificam os comandos necessários para configurar e executar o ambiente do container.

Aplicação

Vamos seguir um passo a passo para a criação da aplicação descrita anteriormente.

1) Instalação do CDK

O primeiro passo será a instalação do AWS Cloud Development Kit (AWS CDK) que será o framework para criação e deploy da nossa arquitetura. Para isso instale o AWS CDK utilizando o comando no terminal:

$ npm install -g aws-cdk@1.x

Rode o comando a seguir para verificar se a instalação está correta:

$ cdk --version

1.1) Para que o AWS CDK tenha acesso a sua conta da AWS é necessário configurar suas credenciais. Existem duas opções para essa configuração: exportar as credenciais como variáveis de ambiente ou configurar o arquivo de credenciais da AWS.

2) Criação do Projeto

Com o CDK instalado vamos criar uma pasta vazia chamada ocr_app e dentro dessa pasta utilizar o comando cdk init .

$ mkdir ocr_app
$ cd ocr_app
$ cdk init app --language python

A seguinte estrutura será criada:

.
├── README.md
├── app.py
├── cdk.json
├── ocr_app
│ ├── __init__.py
│ └── ocr_app_stack.py
├── requirements-dev.txt
├── requirements.txt
├── source.bat
└── tests
├── __init__.py
└── unit
├── __init__.py
└── test_ocr_app_stack.py

2.1) Antes de configurarmos os arquivos criados, ative seu ambiente virtual permitindo que as dependências do projeto sejam instaladas localmente na pasta do projeto, em vez de globalmente; e na sequência instale as dependências padrão do CDK. Ainda na pasta raiz do projeto, utilize os seguintes comandos no terminal:

$ source .venv/bin/activate
$ python -m pip install -r requirements.txt

3) Configurando os serviços no CDK

Show! Agora com nosso projeto criado iremos começar a configurar o CDK para criação da aplicação OCR.

Vamos configurar inicialmente o arquivo app.py que é o ponto de entrada da aplicação CDK, onde você define as pilhas (stacks) que compõem sua infraestrutura na AWS. Para esta aplicação definiremos apenas uma stack conforme o código a seguir:

Fonte: O Autor

Definimos uma stack denominada OcrAppStack e configuramos alguns dos seus parâmetros, entre eles o nome da stack e o ambiente de implantação da aplicação na AWS cdk.Environment que vai receber os valores definidos na etapa de configuração das suas credenciais (etapa 1.1).

3.1) Uma stack representa um conjunto de recursos que serão implantados em uma conta da AWS, como instâncias EC2, funções Lambdas, bancos de dados RDS, filas SQS, etc. Para essa aplicação criaremos uma função Lambda e configuraremos seus parâmetros, para isso, entre na pasta ocr_app e copie o código abaixo para o arquivo ocr_app_stack.py .

Fonte: O Autor

Após definir como será a função Lambda, utilizamos a classe add_function_url para declarar que nossa Lambda terá um endpoint externo, podendo ser acionada através de uma requisição HTTP.

4) Lambda Container Image

No arquivo ocr_appy_stack.py definimos uma Lambda com base na classe DockerImageFunction que é fornecida pelo AWS CDK para criar uma função Lambda usando uma imagem Docker como runtime. Além disso, utilizamos a classe DockerImageCode para especificar onde estará o arquivo Dockerfile.

Portanto, criaremos a pasta lambdas e dentro dela os arquivos Dockerfile , com as configurações da imagem de container, requirements.txt contendo as bibliotecas que iremos utilizar e o arquivo handler.py que conterá o código da nossa função Lambda. Dessa forma, teremos a seguinte estrutura de arquivos:

.
├── README.md
├── app.py
├── cdk.json
├── lambdas
│ ├── Dockerfile
│ ├── handler.py
│ └── requirements.txt

├── ocr_app
│ ├── __init__.py
│ └── ocr_app_stack.py
├── requirements-dev.txt
├── requirements.txt
├── source.bat
└── tests
├── __init__.py
└── unit
├── __init__.py
└── test_ocr_app_stack.py

4.1) Dockerfile

Aqui definiremos todas as dependências necessárias para execução da Lambda, note que a maior quantidade de comandos se refere a configuração das dependências para funcionamento do OpenCV e do Pytesseract.

Fonte: O Autor

4.2) requirements.txt

O arquivo requirements.txt foi definido com as seguintes bibliotecas e versões:

opencv-python==4.7.0.72
pytesseract==0.3.10
scipy==1.10.0

4.3) handler.py

Fonte: O Autor

A função lambda_handler será executada quando o endpoint da Lambda for chamado, isso foi definido no CMD do Dockerfile . Esperamos receber no payload o parâmetro img que será uma imagem em base64. Na sequência chamamos a função apply_ocr que converte a imagem e utiliza o Pytesseract para realizar a extração do texto. Se todo processo for bem sucedido retornamos o texto e o status code 200 , caso contrário retornamos o erro e o status code 400.

5) Deploy da aplicação

Para realização dessa etapa será necessário instalar o Docker na sua máquina e manter ele aberto durante o processo de deploy. O CDK irá chamar o Docker para criação da imagem de container conforme as configurações do Dockerfile, na sequência fará o push do contâiner para o ECR da AWS e por fim subirá a stack com os recursos que definimos.

Para tudo isso, basta o simples comando:

$ cdk deploy

6) Testando a aplicação

Para testar a aplicação precisamos primeiro obter o URL do endpoint da Lambda. Ele pode ser obtido no fim da saída do comando cdk deploy ou seguindo os passos descritos a seguir:

Acesse o serviço do CloudFormation na plataforma da AWS:

Fonte: O Autor

Clique na stack criada:

Fonte: O Autor

E por fim, acesse a aba Outputs:

Fonte: O Autor

Após obter a ULR, é só utilizar alguma ferramenta como Postman ou Insomnia e realizar um POST para a aplicação enviando um JSON com o parâmetro img e uma imagem convertida para base64.

Fonte: O Autor

Conclusão

É isso! Criamos uma aplicação na nuvem que recebe uma imagem e utiliza o Pytesseract para retornar o texto da imagem. Para isso definimos um Dockerfile com os comandos necessários para configurar o container que serviu como ambiente de execução da Lambda e realizamos a criação da arquitetura utilizando o AWS CDK, que facilitou muito a criação dos serviços já que pudemos aproveitar das classes prontas que ele implementa e apenas alterar os parâmetros.

Projetos semelhantes podem ser feitos alterando a biblioteca de OCR, o que pode simplificar as dependências no Dockerfile e deixar o container mais leve, além disso, para possíveis melhorias na velocidade de extração do texto, pode ser considerado o aumento da memória da Lambda, ou ainda, alterar a arquitetura, incluindo nela a utilização do serviço Amazon Elastic File System (EFS) para manter em memória o modelo de machine learning utilizado pelo OCR, diminuindo o tempo de execução da Lambda.

--

--