Hoje fui desafiado a escanear e reconhecer algumas páginas no Linux. Vai acontecer um congresso de magnetismo aqui na UFF e o diretor tinha uma relação impressa (em má qualidade) dos bares e restaurantes de Niterói. Ele queria apenas a informação pois iria redigir uma outra relação para seguir os moldes do folder e cartaz do evento.
Eu já havia tentado o gocr e o ocrad mas não tinha gostado do resultado. Com algum tempo livre e muita disposição consegui resultados bastante satisfatórios. Deu trabalho, mas acho que vocês terão menos do que eu :)
Para um bom aproveitamento do programa de ocr é importante preparar a imagem a ser reconhecida. Para o meu caso, 350dpi foi o de melhor aproveitamento: menos de 200 nem pensar e mais de 600 também não melhorou muito. O texto estava em fontes de 14pt, é possível que um texto em 10 ou 12pt necessitem de uma maior resolução. O scanner é o da multifuncional HP PSC 1510. Eu escaneei em 350 dpi usando o plugin sane do Gimp. Um detalhe do que foi escaneado ( antes que alguém critique o português, a frase completa é Bares e Chopperias
) :
Note que há muitas manchas cinzas, principalmente no entorno das letras. Vamos retirá-las. No Gimp, vá para Camadas → Cores → Limite. Esta operação vai transformar a figura escaneada em tons de cinza em uma figura preto e branco. O triângulo preto do meio, na janela Limite determina quem será branco e quem será preto. Escolha um valor bem alto: eu movi para 220 (o máximo 255):
Ainda restam pontos isolados e as letras estão cheias de ruído. Para minimizar estes efeitos, vamos para Filtros → Desfocar → Desfocagem Gaussiana. Eu escolhi um raio pequeno para a desfocagem (3, no caso)
Está quase bom. Para ficar melhor ainda, podemos repetir os dois passos anteriores (Limite e Desfocagem Gaussiana). Use um valor menor para o Limite agora (eu usei o default 127). Finalmente, temos:
Salve o arquivo como .png, por exemplo (o programa de reconhecimento só trabalha com tiff, mas achei melhor convertê-los pelo ImageMagick):
tjpp@~
Agora vamos compilar o Tesseract-OCR. A versão nos pacotes debian é a 1.02. No site já estamos na 2.0, que é muito melhor. Baixei o pacote http://tesseract-ocr.googlecode.com/files/tesseract-2.00.tar.gz, embora eu recomende que você visite o site e veja se tem alguma versão mais nova: programas no code.google estão em desenvolvimento. Os mais afoitos podem ainda instalar a versão svn. Na seção de downloads, baixe os pacotes de linguagens spa (Espanhol) e eng (inglês). Sim, não temos português ainda, mas vou mostrar como eu fiz. Não há como fugir do configure;make;make install. Depois desta famosa sequência, o pacote vai ser instalado no /usr/local. Descompacte os arquivos de linguagens em /usr/local/share/tessdata/. Verifique se o diretório e os arquivos tem permissão de leitura para qualquer usuário (o que eu baixei, não dava estas permissões). Faça
tjpp@~
Vamos criar um pacote para a língua portuguesa, a partir do pacote para espanhol. Copie os oito arquivos spa.* para por.*
tjpp@~
Boa parte destes arquivos dizem respeito ao reconhecimento de caracteres, por exemplo, os arquivos eng. não tem informação sobre caracteres acentuados. Como os caracteres na língua portuguesa são um subconjunto dos caracteres espanhóis, podemos usá-los sem grande problemas. O que precisamos é criar dois dicionários (palavras frequentes e outras nem tão frequentes) para uso pelo OCR (que usa palavras como desempate). O arquivo /usr/local/share/tessdata/por.user-words contém palavras próprias de uso frequente por você, mas não por outras pessoas (depende do seu ramo de atividade, por exemplo. O arquivo é ASCII, com uma palavra por linha. Para criar o arquivo de palavras frequentes, não é preciso ser professor de português, basta procurar no Google por “lista palavras frequentes português”. O primeiro resultado te leva à página http://linguateca.di.uminho.pt/Paulo/stopwords/ que contém três arquivos com as 100, 200 e 300 palavras mais usadas e, acreditem, no formato uma palavra por linha. Baixei a de trezentas palavras. Só que o arquivo está em ISO8859-1 e precisamos dele em UTF-8, para depois convertê-lo para o formato do tesseract-OCR. Os comando usados foram
tjpp@~
O comando wordlist2dawg pertence ao pacote do tesseract-OCR que você compilou. Necessitamos de uma lista maior de palavras em português e em formato UTF-8. Eu fiz
tjpp@~
Copie os dois arquivos por.* para o /usr/local/share/tessdata. Agora você já tem todo o suporte. Para o reconhecimento rode
tjpp@~
Isto vai criar um arquivo texto.txt com o texto reconhecido. No meu teste, o acerto é maior que 99% (errou 10 caracteres em 1124, a grande maioria trocando l por i ou |).
Para quem achou complicado criar o dicionário, eu disponibilizo o arquivo com os oito arquivos para o suporte à nossa língua: tesseract-por.tgz.
Descompacte-o na pasta /usr/local/share/tessdata.
Discussão
Sera que existe algum programa (ou dois) em modo texto que faz essa desfocagem e limpeza do arquivo? Valeu
Grande jogada: o modo texto é mais eficiente para conversões de grandes quantidades de páginas. Eu recomendaria usar o Gimp até achar os parâmetros ideiais. Uma saída seria usar o scripting do Gimp (Script-Fu) para realizar as operações em linha de comando, mas eu descobri outra mais rápida: o imagemagick. Fiz os testes aqui para descobrir como converter os parâmetros de um para o outro. O Threshold/Limite do Gimp é o
-black-thresholddoconvert. No Gimp, os valores variam de 1 a 255. No ImageMagick vai de 0 a 100%. O outro é o-blur, cujo o default do Gimp ésigma=2. Assim fiz o seguinte:$ convert -black-threshold 86% ocr1.png ocr2.png
$ convert -blur 3×2 ocr2.png ocr3.png
$ convert -black-threshold 50% ocr3.png ocr4.png
O resultado é idêntico…
Tadeu,
Valeu pelo tudo. Segui o passo-a-passo e deu tudo certo. Depois só para comparar usei o Kooka que faz uso do gocr e do ocrad, e realmente a diferença é bem perceptível.
Grato.
Simplesmente excelente esta dica!
Tesseract-OCR instalado da forma como é sugerido pelo Thadeu Penna, para gerar um melhor resultado no reconhecimento dos textos em português, destrói a idéia de não ser possível fazer, no Linux, OCR com qualidade.
Colaborarei com o projeto, e parabenizo ao autor da dica.
Tadeu, você sabe me dizer em que nível o Tesseract-OCR já esta pra chars não padrões? Por exemplo, eu estudo Linguística e gostaria muito de poder usá-lo com símbolos fonéticos do IPA: http://en.wikipedia.org/wiki/International_Phonetic_Alphabet
Tem alguma idéia ou sugestão de referência do Tesseract-OCR pra eu pesquisar?
Oi Caio,
sim, o Tesseract é bastante usado pelos indianos (e seus vários alfabetos), por exemplo. Se me recordo bem, existem dificuldades com o Arábico e outras escritas do tipo esquerda-para-direita. Como não é o seu caso, você pode treinar o Tesseract como uma nova linguagem, já que não creio que vá reconhecer frases ou parágrafos inteiros. O manual de treinamento está em http://code.google.com/p/tesseract-ocr/wiki/TrainingTesseract.
Outra dica que pode ser valiosa para você, caso você use o LaTeX com os símbolos fonéticos é a discussão neste link http://groups.google.com/group/tesseract-ocr/browse_thread/thread/ea3c0ba4bc81f9ab/f8115d08a64b1a15?#. O pessoal usa o LaTeX para treinar o tesseract em vietnamês (???) e kannada (indiano).
Boa sorte e , por favor, me mantenha informado dos seus resultados.
Olá, tenho encontrado um problema chato no Tesseract que é o seguinte:
Unable to load unicharset file /usr/local/share/tessdata/eng.unicharset
Ficaria muito grato se você pudesse me indicar uma solução.
Oi Manoel
como comentei no post acima, pode ser que o diretório não tenha permissão de leitura. Use o comando sudo chmod -R a+r /usr/local/share/tessdata/
para mudar as permissões. Caso o erro persista, pode se rque você não tenha baixado o pacote de línguas, o arquivo solicitado é exatamente o conjunto para inglês.
Cara, usei o Tesseract mas simplesmente ele não reconhece nem 0,1% dos caracteres… está trazendo seqüências de caracteres estranhos… Uso ele com o gscan2pdf. O que poderia estar acontecendo. Meus pais precisam usar um software OCR no PC e estão ficando irritados por não conseguirem. Não vou instalar o windows por conta de um OCR. Estou usando UBUNTU 9.10 com o tesseract; tesseract-por e o GOCR instalado. Por favor, responda por email, se possível.
Obrigado e parabéns pelo projeto
Olá! Na verdade o que havia acontecido foi um erro na instalação, o “tar.gz” que baixei havia sido corrompido. Baixei outro, reinstalei o Tesseract e ele funciona maravilhosamente bem. Só falta agora eu aprender a melhorar as imagens para digitalização, pois o material com o qual trabalho são jornais antigos, e isso dá muito trabalho para qualquer programa de reconhecimento ótico ler sem gerar ruído. Muito obrigado!
Gostaria de conversar sobre OCR. Você quem escreveu o descritivo acima ? Pode me contatar ? Grato
Muito bom artigo amigo… gostaria de dizer que estou animado em compilar uma versão do tesseract para windows… tive testando sua eficiencia, e notei que ele supera muitos ocr's que tem pra windows… acredito que ele faria um sucesso legal pra windows
Cara …. achei legal .
pena que meu Arch Linux não suporta a Scanner que tenho .
minha é scanner é uma HP
Muito obrigado. Estou com um trabalho enorme para fazer e agora vou poder agilizar bastante. Acabei de copilar o Tesseract e vou usá-lo agora mesmo. Muito agradecido.
Como abre o programa Tesseract? Eu já compilei, mas não acho o executável. Como faço Thadeu Penna?
Oi Edson,
este artigo não é o mais atual. Veja este outro que torna as coisas muito mais fáceis: OCR de qualidade no Linux: agora é fácil
Não consigo usar os programas que copilei. Nem o Tesseract, e nem o Gscan2pdf. O primeiro nem sei onde esta o executável. Não sei o que pode ter dado errado. Alguém me ajuda?
parabéns pelo excelente trabalho!!!
obrigado pelo post, muito bom.
cara… para ser sincero… testei varias palavras… ele não acertou nenhuma… :/ sabe o que pode ser? Ainda tem palavras que ele não escreve nada no arquivo de texto. Se puder entrar em contato comigo por e-mail eu agradeceria, estou fazendo um script em shell bash e preciso de uma ajuda com ele…
obrigado por enquanto!
Abraços!
Testei todos os citados neste post, mas acabei ficando com o YAGF, que é um frontend para o cuneiform. Simplesmente perfeito! Pouquíssimos erros.
http://symmetrica.net/cuneiform-linux/yagf-en.html
O meu conselho é este: Instalem o adobe acrobat pro extended, pelo wine! Sem comparação com os restantes programas…
Nunca encontrei programas de ocr para Linux como exitems para MS. Por exemplo, quem conhece o ABBYY sabe que ele é simplesmente imbatível. Para quem não conhece e só para ter uma idéia, ele ecaneia uma pagina de jornal ou revista, identifica o texto, recorta e separa as imagens, remonta a página em doc e ainda, no idioma em que estiver, faz a correção e sugestão de correção gramatical. Para quem depende muito destes recursos diariamente, vale a pena o preço.
Thadeu,
Boa noite.
O que eu fiz de errado? Tentei com uma imagem .jpg e não funcionou, usei o Gimp e passei para .tif. Mesmo assim não funcionou.
root@cleberv-ubutun:/home/cleberv# ls Documentos/ Imagens tesseract-por.tgz teste2.jpg teste.jpg teste.odt teste.tif teste.txt Thumbs.db root@cleberv-ubutun:/home/cleberv# tesseract /cleberv/home/Documentos/teste.jpg /cleberv/home/Documentos/teste.txt -l por Tesseract Open Source OCR Engine name_to_image_type:Error:Unrecognized image type:/cleberv/home/Documentos/teste.jpg IMAGE::read_header:Error:Can't read this image type:/cleberv/home/Documentos/teste.jpg tesseract:Error:Read of file failed:/cleberv/home/Documentos/teste.jpg Falha de segmentação root@cleberv-ubutun:/home/cleberv# tesseract /cleberv/home/Documentos/teste.tif /cleberv/home/Documentos/teste.txt -l por Tesseract Open Source OCR Engine TIFFOpen: /cleberv/home/Documentos/teste.tif: Cannot open. tesseract:Error:Read of file failed:/cleberv/home/Documentos/teste.tif Falha de segmentação root@cleberv-ubutun:/home/cleberv#
ops… desculpe eu coloquei o caminho errado.
Funcionou, mas o índice de acerto foi muito baixo, creio que a causa foi o tipo de imagem que está colorida.
São centenas de imagens que eu terei que processar, existe como 'treinar' o programa ou configurar o dicionário para melhorar o índice de acerto?
Não funcionou com jpg, mas o OCRfeeder funciona com arquivos jpg. E o OCRfeeder usa o tesseract.
t+
Olá bem ineterssante o posto, estou tendo um problema com a instalação da linguagem quando descompacto o arquivo ele só tem um único arquivo chamado por.trainedata como eu uso esse arquivo como você citou acima?
Abraços
seja simples isso ai não resolve nada no windows eu faço o download e clico em executar e pronto é mais direto que esse monte de comandos