Tesseract com LSTM – sua própria rede neural

Há pouco fui agraciado com a informação de que algumas páginas do blog não estavam carregando. Tomara tenha sido por conta do tema usado anteriormente, mas se vocês notarem que a página fica toda branca, por favor, me avisem pela página DobitAoByte no facebook. O tema que trouxe a informação até mim foi o LPR desse artigo e também desse outro. Um deles não estava carregando. O assunto encaminhou para o reconhecimento dos caracteres, onde recomendei um dataset ou alguma tentativa utilizando o tesseract com LSTM ,  uma rede neural dele próprio, disponível desde a versão 4.0.

Como usar o Tesseract com LSTM

Tem duas formas básicas; uma é instalando o pytesseract pelo pip e a outra é diretamente pelo shell. Vou mostrar a instalação de ambos e exemplificar o uso.

Como instalar o tesseract com LSTM com pip

Basicamente, instale o programa python3-pip e depois instale o pytesseract:

sudo apt-get install python3-pip
sudo pip3 install pytesseract

Vamos instalar o programa para teste.

Como instalar o tesseract com LSTM no shell

Para utilizá-lo sem programar nada mais, podemos utilizar o programa por linha de comando. Para isso, instale os seguintes pacotes:

sudo apt-get install tesseract-ocr tesseract-ocr-por

Agora vamos ver um pouco da saída de help

Como usar o tesseract com LSTM por linha de comando

Claro que será ideal experimentar antes de desenvolver. Para alguns casos pode ser a solução perfeita, mas inviável para outros. Quando me perguntaram se funcionava, fiz um exemplo simples e mostrei na hora o resultado, no messenger, pelo facebook:

Tesseract com LSTM - teste

O texto branco sobre o fundo azul não funcionou. O que fazer nesse caso? Bem, se fosse necessário, poderíamos inverter as cores, converter para grayscale e ajustar o contraste, tudo isso usando o OpenCV. Não tem mágica, se quiser um bom resultado, precisará ter um pouco de trabalho. Mas considerando o contraste da letra escura (que não é preto) sobre um cinza acentuado, já deu pra ver que o programa funciona bem:

Tesseract com LSTM - teste - resultado

Quando escolher o nome de saída, dispense a extensão; ele cria automaticamente como txt, por isso que o nome do arquivo de saída ficou output.txt.txt.

Parâmetros para o Tesseract com LSTM

Para pegar os parâmetros, precisamos chamar o programa com –help-extras como parâmetro. Temos 4 modos de operação; legado, somente com rede neural, legado + rede neural ou padrão conforme o que estiver instalado.

esseract -l por --help-extra
Usage:
  tesseract --help | --help-extra | --help-psm | --help-oem | --version
  tesseract --list-langs [--tessdata-dir PATH]
  tesseract --print-parameters [options...] [configfile...]
  tesseract imagename|imagelist|stdin outputbase|stdout [options...] [configfile...]

OCR options:
  --tessdata-dir PATH   Specify the location of tessdata path.
  --user-words PATH     Specify the location of user words file.
  --user-patterns PATH  Specify the location of user patterns file.
  --dpi VALUE           Specify DPI for input image.
  -l LANG[+LANG]        Specify language(s) used for OCR.
  -c VAR=VALUE          Set value for config variables.
                        Multiple -c arguments are allowed.
  --psm NUM             Specify page segmentation mode.
  --oem NUM             Specify OCR Engine mode.
NOTE: These options must occur before any configfile.

Page segmentation modes:
  0    Orientation and script detection (OSD) only.
  1    Automatic page segmentation with OSD.
  2    Automatic page segmentation, but no OSD, or OCR.
  3    Fully automatic page segmentation, but no OSD. (Default)
  4    Assume a single column of text of variable sizes.
  5    Assume a single uniform block of vertically aligned text.
  6    Assume a single uniform block of text.
  7    Treat the image as a single text line.
  8    Treat the image as a single word.
  9    Treat the image as a single word in a circle.
 10    Treat the image as a single character.
 11    Sparse text. Find as much text as possible in no particular order.
 12    Sparse text with OSD.
 13    Raw line. Treat the image as a single text line,
       bypassing hacks that are Tesseract-specific.

OCR Engine modes: (see https://github.com/tesseract-ocr/tesseract/wiki#linux)
  0    Legacy engine only.
  1    Neural nets LSTM engine only.
  2    Legacy + LSTM engines.
  3    Default, based on what is available.

Single options:
  -h, --help            Show minimal help message.
  --help-extra          Show extra help for advanced users.
  --help-psm            Show page segmentation modes.
  --help-oem            Show OCR Engine modes.
  -v, --version         Show version information.
  --list-langs          List available languages for tesseract engine.
  --print-parameters    Print tesseract parameters.

No exemplo utilizei –oem 1, que faz uso exclusivamente do LSTM. Podemos fazer segmentação, mas ele tentará deduzir a palavra se for por uma base invés de LSTM. A placa da Merdosul não devolveu nenhum resultado com a fonte escrota européia, mas com uma fonte diferente o resultado foi perfeito.

Tesseract com LSTM na placa da Mercosul

 

Vale salientar que o isolamento da placa foi muito bem explicado nos artigos anteriores relacionados, citados no começo desse artigo.

O resultado foi:

Tesseract com LSTM OCR placa Mercosul

Enfim, podemos aplicar diversos filtros diferentes do OpenCV para achatar a letra, modificar os cantos para ficar como acima e coisas do tipo que poderão lhe levar a um resultado muito satisfatório. Cabe estudo.

Se quiser usar com Python (e certamente quererá), recomendo seguir o exemplo do PySearchImage.

É isso por enquanto.

Djames Suhanko

Djames Suhanko é Perito Forense Digital. Já atuou com deployer em sistemas de missão critica em diversos países pelo mundão. Programador Shell, Python, C, C++ e Qt, tendo contato com embarcados ( ora profissionalmente, ora por lazer ) desde 2009.