OCR com Pytesseract e Streamlit
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!
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 :-)