Skip to content

Prova de Conceito para ocerização de imagens e PDFs usando Tesseract em português

License

Notifications You must be signed in to change notification settings

luizanisio/Servico-OCR

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

68 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Serviço OCR

  • Prova de Conceito para ocerização de imagens e PDFs usando Tesseract em português

Projeto implementado em python, com o uso do Tesseract

  • O objetivo é analisar qualidade, performance e regiões identificadas pelo Tesseract para permitir a criação de regras ou treinamento de modelos para identificar regiões como Citações, Estampas laterais, Cabeçalho e Rodapé. A identificação pode ser feita por regras simples, como margens em páginas padronizadas (A4, Carta, Legal etc). E também pode ser identificado por repetições de textos em áreas específicas, como cabeçalhos e rodapés.

O que está disponível

  • Foi criado um serviço flask que recebe imagens ou PDFs e processa eles em batch, permitindo acompanhar a fila de tarefas e visualizar os arquivos da extração (html) ou baixar uma versão Markdown ou PDF da análise realizada.
  • As regiões estão sendo identificadas por posicionamento (estampas e citações) ou repetição e posicionamento (cabeçalhos e rodapés).
  • A tela apresenta o motivo da identificação do tipo da região
  • Pode-se filtrar o retorno, removendo regiões não desejadas
  • O arquivo config.json contém configurações do serviço como o nome das pastas, DPIs para as análises, número de workers, dentre outros. Caso não exista, ele será criado com o padrão de cada configuração.
  • O campo token do serviço é usado para listar as tarefas do usuário, podendo ser digitado livremente ou será criado ao enviar um arquivo a primeira vez. A ideia é o usuário enviar vários arquivos no mesmo token. O usuário precisa dele para acompanhar as tarefas enviadas. Não é garantida a segurança com esse token, apenas restringe um pouco o livre acesso às tarefas entre usuários pois é só uma poc.
  • O serviço instancia a classe ProcessarOcr disponível no arquivo util_processar_pasta.py para processar continuamente as tarefas de OCR enviadas pela tela.
  • Pode-se acionar o serviço de processamento contínuo independente do serviço flask chamando python util_processar_pasta.py usando o config.json para ajustar as configurações desejadas.
    • O processo em background realiza o OCR de PDF para PDF (pasta entrada) ou PDF/PNG/JPG/TIF para HTML/MD (pasta entrada_img) e atualiza o status das tarefas em arquivos nome_arquivo_entrada.status.json
      • .\entrada
      • .\entrada_img (processa imagens ou PDFs com a saída no formato json de análise, MD e/ou HTML
      • .\processamento
      • .\processamento_img
      • .\erro
      • .\erro_img
      • .\saida
      • .\saida_img

💡 Nota: é feito um controle de todos os arquivos enviados e status de cada um para acompanhamento, tanto no caso de PDF para PDF como PDF para MD/HTML. O arquivo fica na pasta saida ou saida_img dependendo do tipo de processamento solicitado.
Caso um arquivo seja enviado novamente para OCR, será identificado pelo hash e não será processado duas vezes. Para sobrepor o processamento anterior, basta selecionar a opção "ignorar-cache" ao enviar o arquivo.

exemplo recorte tela serviço

Exemplo de extração e metadados gerados

 [ {'pagina'     : 0 ...n número da página 
    'box'        : 0 ...n reinicia a cada página
    'id'         : 0 ...n até o último box (na ordem para leitura)
    'pagina_la' : [500,75], -> largura e altura da página
    'pagina_tipo' : A4, Legal .. -> tipo da página identificado
    'box_xyla'     : [10,14,30,45], -> x,y  largura, altura da caixa
    'alt_linhas'   : 23, -> média da altura das linhas do box
    'alt_linhas_med' : 30  -> média da altura das linhas da página
    'qtd_linhas'   : 3,  -> linhas da caixa
    'qtd_boxes'    : 2,  -> boxes na página
    'qtd_letras'   : 44, -> letras únicas
    'qtd_palavras' : 22, -> palavras únicas
    'margens_edsi' : [5,5,3,7] -> margens até a caixa mais próxima - esquerda, direita, superior, inferior
    'bordas'     : [D,E,S,I..] -> Direita, Esquerda, Superior, Inferior (está em uma ou mais bordas)
    'texto' : 'bla bla bla',
    'tipo_sugerido': ... descrição do motivo do tipo sugerido (bordas, repetição etc)
    'tipo': C, R, T... Cabeçalho, Rodapé, Título, Folha, Citação ...
     },
  ]

TODO

  • apresentação da análise feita nas imagens enviadas para o Tesseract
    • em util_ocr.py tem um exemplo funcional, falta apresentar no serviço
  • exportação de trechos para fine tunning do Tesseract
  • acionamento por api para uso em outros projetos
  • criação de componente para reaproveitamento
  • aplicação de extrações de entidade nas caixas de texto, respeitando o posicionamento
  • identificar início e fim de caracteres de cada box, para melhor posicionamento de extrações
  • melhor compactação de arquivos PDF com OCR
  • análise se o PDF de entrada precisa de OCR ou pode ser analisado (estampas, cabeçalho, rodapé, citações) com o texto existente
  • possibilidade de recriar a camada de OCR no pdf original sem precisar criar um novo que pode ficar maior

dependências para o linux - Testado WSL com Debian

  • sudo apt-get update

  • para a manipulação de imagens pelo Pillow

    • sudo apt-get install poppler-utils
  • tesseract

    • sudo apt-get install tesseract-ocr tesseract-ocr-por
    • sudo apt-get install libtesseract-dev -y
    • sudo apt-get install -y libleptonica-dev

Ghostscript para compactação

  • nem sempre resolve compactar o PDF gerado, mas para imagens muito simples (PB) pode compactar bem
  • é usado pelo serviço de processamento em background após gerar um PDF com camada de OCR
    • sudo apt-get install ghostscript

About

Prova de Conceito para ocerização de imagens e PDFs usando Tesseract em português

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published