OCR com Pytesseract e Streamlit

Guilherme Donizetti
7 min readAug 13, 2021

Olá, espero que esteja tudo bem com você! Já ouviu sobre Optical Character Recognition (OCR)? É a técnica de reconhecer caracteres em imagens e fotos, assim você pode manipular esses caracteres de diversas formas para encontrar dados específicos e fazer análise de texto, entre outros. Nesse artigo vamos desenvolver um programa que aplica OCR utilizando Python de forma muito simples!

Photo by Hitesh Choudhary on Unsplash

Optical Character Recognition (OCR):

O reconhecimento ótico de caracteres é uma tecnologia não nova para identificar caracteres em imagens. Assim, poderíamos tirar foto de um livro e copiar os caracteres reconhecidos ao invés de digitar as páginas, automatizar análise de imagens, etc. OCR não tem muito mistério e vem sendo desenvolvido desde 1953, então hoje podemos explorar mais sobre esse assunto de forma bem simples.

Objetivo do artigo:

Queremos construir um programa que faça o reconhecimento de caracteres em fotos de algum livro, documento, print de alguma notícia, coisas assim. Também queremos que após o reconhecimento o programa seja capaz de buscar por CPFs, datas e realize uma pequena análise das palavras do texto extraído da imagem. O programa já está desenvolvido, mas aqui vamos fazer juntos!

Programa: ocr_python.py

Repositório: OCR_Python

Ferramentas:

Vamos utilizar a linguagem Python 3, framework Streamlit e a biblioteca Pytesseract entre outras auxiliares. Caso tenha problemas com a instalação, sugiro que consulte a documentação das ferramentas.

Início: caso você ainda não possua instalado as seguintes ferramentas, acompanhe os comandos de instalação

  • pip3 install streamlit
  • pip3 install pillow
  • pip3 install pytesseract

STREAMLIT: com as ferramentas em mãos, vamos primeiro criar nossa página e depois implementar as funcionalidades. Crie um arquivo chamado main.py, nele vamos inserir o seguinte código:

Isso irá importar os métodos para construir a página, manipular as imagens, reconhecer os caracteres e métodos auxiliares que ainda vamos desenvolver.

Em seguida insira:

Com isso vamos criar nossa classe OCR e no método construtor (__init__) inicializamos algumas coisas: definimos o título da página como “Python OCR”, e criamos as variáveis texto e analisar_texto que serão usadas por diferentes métodos em seguida, mas inicialmente precisam serem string e False respectivamente.

O próximo passo é adicionar:

O código acima cria o método inicial, isso porque ele é o que será apresentado na página assim que ela for carregada, uma entrada de imagens apenas dos tipos PNG e JPG (podemos usar outras extensões) aguarda a ação do usuário. Se alguma imagem compatível for selecionada, a imagem será devidamente carregada e será enviada para o método que faz o reconhecimento de caracteres que faremos em seguida. Depois que os caracteres forem reconhecidos aparece a opção de analisar o texto.

Em seguida fazemos:

Esse método acima é o que faz o reconhecimento dos caracteres e retorna o texto. No parâmetro “lang=” definimos “por” para dizer que vamos reconhecer caracteres em Português. Isso não significa que não poderemos enviar imagens com textos em outros idiomas, pois OCR é o reconhecimento de caracteres e os caracteres do nosso alfabeto existe em muitas outras línguas. Porém, se uma palavra em Espanhol (ex.: pequeño) for enviada, o resultado será “pequeno” porque no Português não existe o caracter “ñ” e com isso ele tentará alguma sugestão mais próxima. Agora entenda isso em outros idiomas além do Espanhol.

Tendo feito isso, precisamos inserir em seguida:

O código acima cria o método mostrar_analise que chama outros métodos auxiliares que vamos implementar para retornar na página algumas análises do texto: se existe CPF, se existe datas e quantos por cento as palavras são boas ou más (ex.: discurso de ódio, elogios). Aqui peço que inclua uma linha em branco entre os blocos de IF/ELSE, pois no print estão juntos para caber na imagem ;-)

Para concluir a primeira parte, inclua:

Aqui temos metade do programa feito. Porém, ainda não funciona muito bem, alguns métodos não foram implementados. Faça uma pausa estratégica e vamos terminar isso!

2º PARTE

No mesmo diretório onde criou o arquivo acima, main.py, crie também um diretório chamado functions e dentro dele crie um arquivo chamado functions.py. Nele vamos incluir as funções que auxiliam o funcionamento do programa, chamamos esse arquivo então de módulo. Primeira coisa a fazer nele é:

Primeiro identificamos para o nosso próprio conhecimento que esse arquivo é um módulo, usando um comentário. Em seguida importamos a biblioteca re para usar Regex nos nossos próximos códigos. Agora, vamos criar a função a seguir:

O código acima cria a função buscar_cpf que recebe o texto extraído da imagem como parâmetro e busca CPFs usando expressões regulares. Se existir pelo menos 1 CPF encontrado, a função retorna uma lista com os valores, se não ela retorna um False. Depois, a próxima função:

Não muito diferente da função anterior, esse código acima busca por datas. No entanto, usando Regex dizemos aqui que a data estará no formato xx/xx/xxxx, ou seja, se existir 07/09/2021 ele será identificado, mas “07 de Setembro de 2021” não. Em seguida inserimos:

Esse método busca palavras consideradas “más” e retorna a quantidade e quantos por cento do texto são de palavras desse tipo. O que ele faz é criar uma lista com as palavras consideradas ruins (ex.: desagradável), criamos uma lista com todas as palavras do texto extraído da imagem e removemos as repetidas. Com isso verificamos se alguma palavra retirada da imagem faz parte do conjunto de coisas ruins e solicitamos um percentual de quantos por cento do texto elas representam.

Agora vamos criar um método oposto:

A função buscar_palavras_boas realiza a mesma tarefa que a função anterior, mas com palavras consideradas do bem (ex.: amigável). Agora vamos incluir:

O código acima cria o método que calcula o percentual que as palavras boas e más representam no texto extraído. Agora, vamos criar as duas últimas funções:

Ambas transformam a lista (de CPF e data) em string para ser exibido na página para o usuário.

Finalizando

Nas duas funções que criamos para buscar palavras boas ou más, o código se baseia em um conjunto de palavra que nós mesmos vamos criar para servir na análise. Considere uma coisa: vamos inserir 30 palavras para cada conjunto, uma em cada linha e todas em maiúsculo! Okay?

No diretório functions, crie um arquivo chamado palavras_mas.txt e insira dentre deste arquivo:

Dentro do mesmo diretório crie o arquivo chamado palavras_boas.txt e nele insira:

PRONTO!

Agora nosso programa OCR está feito. Antes de executar, lembre-se: o arquivo main.py e o diretório functions devem estar na mesma pasta, e dentro de functions deve estar os arquivos functions.py, palavras_boas.txt e palavras_mas.txt.

Usando seu terminal, siga até o diretório onde está o arquivo main.py e execute:

  • streamlit run main.py

Nossa aplicação estará rodando!

OBSERVAÇÕES:

Nomenclatura: o código foi explicado por partes, mas é um programa só, então se atente aos nomes das variáveis, métodos, arquivos, pois qualquer diferença no nome pode haver falhas na execução, recomendo que siga o código estritamente do jeito que está antes de fazer modificações.

Código: ao copiar, pode acontecer de você ignorar os comentários que explicam as funções, ignorar espaçamento entre as linhas, entre outras. Recomendo que mantenha essas características para manter o código no padrão de programação em Python (PEP8).

DICAS:

Agora que a aplicação está funcionando, experimente adicionar novas funcionalidades. Lembre-se, o projeto está no GitHub!

GitHub:

Aplicação em funcionamento: ocr_python.py

Obrigado! Ótimos estudos :-)

--

--

Guilherme Donizetti

Programador. Graduado em ADS. Pós em IA e M. Learning. AI-900 Certified. CyberOps Associate - CISCO. Bolsista PIBITI/CNPq-CPS. Membro DevProgram Mercado Pago.