Reconhecimento óptico de caracteres (OCR) usando Tesseract em Raspberry Pi
Reconhecimento-optico-de-caracteres--OCR--usando-Tesseract-em-Raspberry-Piblog_image_banner

Reconhecimento óptico de caracteres (OCR) usando Tesseract em Raspberry Pi


A capacidade das máquinas de usar uma câmera para ver o mundo real e interpretar os dados dele teria uma influência maior em suas aplicações. Seja um simples robô de entrega de comida como os Starship Robots ou um carro autodirigido avançado como o Tesla, eles contam com informações obtidas de suas câmeras altamente sofisticadas para tomar decisões.

Neste tutorial, aprenderemos como os detalhes são identificados a partir das imagens, lendo os personagens presentes nelas. Isso é chamado de reconhecimento óptico de caracteres (OCR).


Isso abre portas para muitas aplicações, como ler automaticamente as informações de um cartão de visita, reconhecer uma loja a partir de sua placa de nome ou reconhecer placas de sinalização na estrada e muito mais.

Alguns de nós podem já ter experimentado esses recursos por meio do Google Lens, então hoje vamos construir algo semelhante usando uma ferramenta de reconhecimento óptico de caracteres (OCR) do Google Tesseract-OCR Engine junto com python e OpenCV para identificar personagens de fotos com um Raspberry Pi.


Raspberry pi, sendo um dispositivo portátil e com menos consumo de energia, é usado em muitos aplicativos de processamento de imagem em tempo real, como detecção de rosto, rastreamento de objetos, sistema de segurança residencial, câmera de vigilância, etc.


Pré-requisitos


Como dito anteriormente, usaremos a Biblioteca OpenCV para detectar e reconhecer rostos. Portanto, certifique-se de instalar a biblioteca OpenCV no Raspberry Pi antes de prosseguir com este tutorial. Além disso, alimente seu Pi com um adaptador 2A e conecte-o a um monitor para facilitar a depuração.


Este tutorial não explicará como exatamente o OpenCV funciona. Se você estiver interessado em aprender o processamento de imagens, verifique os fundamentos do OpenCV e os tutoriais avançados de processamento de imagens. Você também pode aprender sobre contornos, detecção de blob, etc, neste tutorial de segmentação de imagens usando OpenCV.


Instalando Tesseract no Raspberry Pi


Para realizar o reconhecimento óptico de caracteres no Raspberry Pi, temos que instalar o mecanismo de OCR Tesseract no Pi. Para fazer isso, primeiro temos que configurar o pacote Debian (dpkg) que nos ajudará a instalar o Tesseract OCR. Use o comando abaixo na janela do terminal para configurar o pacote Debian.


sudo dpkg - -configure –a



Então podemos prosseguir com a instalação do Tesseract OCR (Optical Character Recognition) usando a opção apt-get. O comando para o mesmo é fornecido abaixo.


sudo apt-get install tesseract-ocr



A janela do seu terminal terá a seguinte aparência, demorará cerca de 5 a 10 minutos para que a instalação seja concluída.


Agora que temos o Tesseract OCR instalado, temos que instalar o pacote PyTesseract usando o pacote de instalação pip. Pytesseract é um wrapper python em torno do mecanismo de OCR tesseract, que nos ajuda a usar tesseract com python. Siga o comando abaixo para instalar o pytesseract no python.


Pip install pytesseract



Certifique-se de que Pillow já esteja instalado antes de prosseguir com esta etapa. Pessoas que seguiram o tutorial de reconhecimento facial do Raspberry Pi já o teriam instalado. Outros podem usar esse tutorial e instalá-lo agora. Assim que a instalação do pytesseract estiver concluída, a sua janela terá uma aparência semelhante a esta


Tesseract 4.0 no Windows / Ubuntu

O projeto de reconhecimento óptico de caracteres Tesseract foi originalmente iniciado pela Hewlett Packard em 1980 e, em seguida, foi adotado pelo Google, que mantém o projeto até hoje. Ao longo dos anos, o Tesseract evoluiu, mas ainda funciona bem apenas em ambientes controlados. Se a imagem tiver muito ruído de fundo ou estiver fora de foco, o tesseract não parece funcionar bem aqui.


Para superar isso, a última versão do tesseract, o Tesseract 4.0 usa um modelo de Deep Learning para reconhecer caracteres e até mesmo manuscritos. O Tesseract 4.0 usa Long Short-Term Memory (LSTM) e Recurrent Neural Network (RNN) para melhorar a precisão de seu mecanismo de OCR. Infelizmente, até o momento deste tutorial, o Tesseract 4.0 está disponível apenas para Windows e Ubuntu, mas ainda está em fase beta para o Raspberry Pi. Então decidimos tentar o Tesseract 4.0 no Windows e o Tesseract 3.04 no Raspberry Pi.


Programa Simples de Reconhecimento de Caracteres no Pi


Uma vez que já instalamos os pacotes Tesseract OCR e Pytesseract em nosso PI. Podemos escrever rapidamente um pequeno programa para verificar como o reconhecimento de caracteres está funcionando com uma imagem de teste. A imagem de teste que usei, o programa e o resultado podem ser encontrados na imagem abaixo.


Como você pode ver, o programa é bastante simples e nem mesmo usamos nenhum pacote OpenCV. O programa é dado abaixo


from PIL import Image

img =Image.open (‘1.png’)

text = pytesseract.image_to_string(img, config=’’)

print (text)


No programa acima, estamos tentando ler o texto de uma imagem chamada ‘1.png’ que está localizada dentro do mesmo diretório do programa. O pacote Pillow é usado para abrir esta imagem e salvá-la com o nome de variável img. Em seguida, usamos o método image_to_sting do pacote pytesseract para detectar qualquer texto da imagem e salvá-lo como uma string no texto da variável. Por fim, imprimimos o valor do texto para verificar os resultados.


Como você pode ver, a imagem original contém, na verdade, o texto “Explique essas coisas! 01234567890 ”, que é uma imagem de teste perfeita, pois temos letras, símbolos e números na imagem. Mas a saída que obtemos de pi é “Explique essas coisas! Sdfiosiefoewufv ”isso significa que nosso programa falha em reconhecer qualquer número da imagem.

Para superar esse problema, as pessoas normalmente usam o OpenCV para remover o ruído do programa e, em seguida, configuram o mecanismo de OCR Tesseract com base na imagem para obter melhores resultados. Mas lembre-se de que você não pode esperar uma saída 100% confiável do Tesseract OCR Python.


Configurando o Tesseract OCR para melhores resultados


O Pytesseract nos permite configurar o mecanismo de OCR do Tesseract, definindo os sinalizadores que mudam a maneira como a imagem é pesquisada por caracteres. Os três sinalizadores principais usados na configuração de um OCR Tesseract são idioma (-l), Modo de mecanismo de OCR (--oem) e Modo de segmentação de página (- -psm).

Junto com o idioma inglês padrão, o Tesseract suporta muitos outros idiomas, incluindo hindi, turco, francês etc. Estaremos usando apenas inglês aqui, mas você pode baixar os dados treinados da página oficial do github e adicioná-los ao seu pacote para reconhecer outros idiomas. Também é possível reconhecer dois ou mais idiomas diferentes da mesma imagem. O idioma é definido por flag –l, para defini-lo como um idioma use o código junto com flag, por exemplo, para inglês será –l eng, onde eng é o código para inglês.


O próximo sinalizador é o Modo do mecanismo de OCR, que possui quatro modos diferentes. Cada modo usa um algoritmo diferente para reconhecer os personagens da imagem. Por padrão, ele usa o algoritmo que foi instalado com o pacote. Mas podemos alterá-lo para usar LSTM ou redes neurais. Os quatro modos diferentes do motor são mostrados abaixo. O sinalizador é indicado por --oem, portanto, para defini-lo no modo 1, basta usar - oem 1.


O sinalizador final e mais importante é o sinalizador do modo de segmentação da página. Eles são muito úteis quando sua imagem tem muitos detalhes de fundo junto com os caracteres ou os caracteres são escritos em orientações ou tamanhos diferentes. Existem no total 14 modos de segmentação de página diferentes, todos eles listados abaixo. A bandeira é indicada por –psm, para definir o modo de 11. Será –psm 11.


Usando o oem e psm em Tesseract Raspberry Pi para melhores resultados


Vamos verificar a eficácia desses modos de configuração. Na imagem abaixo, tentei reconhecer os caracteres em uma placa de limite de velocidade que diz “LIMITE DE VELOCIDADE 35”. Como você pode ver, o número 35 está em tamanho grande em comparação com os outros alfabetos, o que confunde o Tesseract e, portanto, obtemos a saída apenas como “LIMITE DE VELOCIDADE” e o número está faltando.


Para superar esse problema, podemos definir os sinalizadores de configuração. No programa acima, o sinalizador de configuração é config = ’’ vazio, agora vamos defini-lo usando os detalhes fornecidos acima. Todo o texto da imagem está em inglês, então a bandeira do idioma é –l eng, o mecanismo de OCR pode ser deixado como padrão, que é o modo 3, então –oem 3. Agora, finalmente, no modo psm, precisamos encontrar mais caracteres da imagem, usamos o modo 11 aqui, que se torna –psm 11. A linha de configuração final será semelhante a


test = pytesseract.image_to_string(gray, config='-l eng --oem 3 --psm 12')


E o resultado para o mesmo pode ser encontrado abaixo. Como você pode ver agora, o Tesseract é capaz de encontrar todos os personagens da imagem, incluindo os números.


Melhorando a precisão com nível de confiança


Outro recurso interessante que está disponível no Tesseract é o método image_to_data. Este método pode nos fornecer detalhes como a posição do personagem na imagem, o nível de confiança de detecção, linha e número da página. Vamos tentar usar isso em uma imagem de amostra


Neste exemplo específico, obtemos muitas informações de ruído junto com as informações originais. A imagem é o nome da placa de um hospital denominado “Hospital Fortis”. Mas junto com o nome, a imagem também tem outros detalhes de fundo, como construção de logotipo etc. Então o Tesseract tenta converter tudo em texto e nos dá muito ruído como “$C” “|” “S _______ S == +” etc.


Agora, nesses casos, o método image_to_data é útil. Como você pode ver aqui, o algoritmo de reconhecimento óptico de caracteres acima retorna o nível de confiança de cada caractere que ele reconheceu e o nível de confiança do Fortis é 64 e para o HOSPITAL é 24. Para as outras informações ruidosas, o valor de confiança é 10 ou inferior de 10. Dessa forma, podemos filtrar as informações úteis e melhorar a precisão usando o valor de confiança.


OCR no Raspberry PI


Embora os resultados não sejam muito satisfatórios no Pi ao usar o Tesseract, ele pode ser combinado com o OpenCV para filtrar o ruído da imagem e outra técnica de configuração pode ser usada para obter resultados decentes se as imagens forem boas.Já tentamos cerca de 7 imagens diferentes com tesseract no Pi e tentamos obter resultados aproximados ajustando os modos de acordo com cada imagem. O arquivo completo do projeto pode ser baixado como Zip para este local, que contém todas as imagens de teste e o código básico.


Vamos tentar mais um sinal de placa de amostra no Raspberry Pi, desta vez um que é muito claro e simples. O código para o mesmo é dado abaixo


import pytesseract

from PIL import Image

import cv2



img = cv2.imread('4.png',cv2.IMREAD_COLOR) #Open the image from which charectors has to be recognized

#img = cv2.resize(img, (620,480) ) #resize the image if required



gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) #convert to grey to reduce detials

gray = cv2.bilateralFilter(gray, 11, 17, 17) #Blur to reduce noise



original = pytesseract.image_to_string(gray, config='')

#test = (pytesseract.image_to_data(gray, lang=None, config='', nice=0) ) #get confidence level if required

#print(pytesseract.image_to_boxes(gray))



print (original)


O programa abre o arquivo do qual precisamos reconhecer os personagens e então os converte em tons de cinza. Isso reduzirá os detalhes da imagem, tornando mais fácil para o Tesseract reconhecer os caracteres. Além disso, para reduzir o ruído de fundo, desfocamos a imagem usando um filtro bilateral que é um método do OpenCV. Por fim, começamos a reconhecer os caracteres da imagem e a imprimimos na tela. O resultado final será algo assim.


Espero que você tenha entendido o tutorial e gostado de aprender algo novo. OCR é usado em muitos lugares como carros que dirigem sozinho, reconhecimento de placa, navegação de reconhecimento de placa de rua, etc. e usá-lo no Raspberry Pi abre portas para muitas outras possibilidades, pois pode ser portátil e compacto. Se você tiver qualquer problema ou dúvida em fazer isso funcionar, fique à vontade para postá-los na seção de comentários abaixo ou use os fóruns para outras questões técnicas. Verifique também nossos outros projetos baseados em processamento de imagem aqui.


O código python completo para este reconhecimento de texto OCR é fornecido abaixo, ele também pode ser baixado aqui com todas as imagens para testar o programa.


import pytesseract

from PIL import Image

import cv2

 

 

img = cv2.imread('4.png',cv2.IMREAD_COLOR) #Open the image from which charectors has to be recognized

#img = cv2.resize(img, (620,480) ) #resize the image if required 

 

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) #convert to grey to reduce detials 

gray = cv2.bilateralFilter(gray, 11, 17, 17) #Blur to reduce noise

 

original = pytesseract.image_to_string(gray, config='')

#test = (pytesseract.image_to_data(gray, lang=None, config='', nice=0) ) #get confidence level if required

#print(pytesseract.image_to_boxes(gray))

 

print (original)

 

'''required = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'

Final = ''

 

for c in original:

    for ch in required:

        if c==ch:

        Final = Final + c 

        break

 

print (test)

 

for a in test:

if a == "\n":

print("found")'''



ENTRE EM CONTATO COM A LOJAMUNDI.

Assine nossa Newsletter! É gratuito!

Cadastre seu nome e email para receber novidades e materiais gratuitos da Lojamundi.