README.md

Projecto de digitalização e transcrição

Projecto encontra-se ainda em desenvolvimento, sendo esta uma versão 2, com módulos ainda por desenvolver

espaço

Changelog v2

Melhoramentos na estrutura modular:

Melhoramentos gerais:

  • Melhor organização da estrutura de ficheiros na saída. Fluxogramas do processo aqui e aqui
  • Melhor informação do estado do processamento no terminal.
  • Melhoria na gestão de erros.

Melhoramentos especificos

  • image_segment.py - melhoramentos no cálculo da segmentação, introdução de parâmetros regulaveis (em settings.py) de modo a adaptar a segmentação a casos especificos.
  • ocr.py - melhoria na gestão da estrutura de directórios e ficheiros, introdução da opção (em settings.py) da codificação da resposta JSON em bytes de modo a reduzir o tamanho do ficheiro.
  • Introdução da opção (em settings.py) de eliminação, ao longo do processamento, de pastas não desejadas no resultado final de modo a poupar espaço em disco.

Novos módulos na estrutura modular:

  • json_to_text.py - converte a resposta JSON do serviço da Google num ficheiro txt. Opção de eliminação de quebras de linha e hifens em settings.py.
  • json_to_hocr.py - Cria a partir da resposta JSON um ficheiro HOCR para futura conversão juntamente com a imagem num PDF pesquisável
  • hocr_merge.py - Junção dos hocrs gerados das páginas segmentadas num único hocr reprentatico da página inteira.
  • hocr_to.pdf.py - Conversão das imagens com o ficheiro hocr correspondente num PDF pesquisável.

Novas ferramentas de desenvolvimento

Interface gráfico para efectuar pesquisas

  • search_app.py - Interface gráfico de teste para pesquisa - permite, através dos ficheiros gerados pela estrutura modular, fazer uma pesquisa simples de termos e abrir os PDFs correspondentes aos resultados da pesquisa. Ver adiante.

Ferramenta de comparação ground_truth

  • ground_truth.py - script para geração de tabelas comparativas entre a resposta do serviço OCR da google com o mesmo texto corrigido manualmente, e assim obter uma avaliação mais realista da eficácia do reconhecimento de caracteres.

  • compare_tables.py - interface gráfico que permite o carregamento das tabelas geradas pelo ground_thruth.py e visualizar, clicando nas várias linhas da tabela, o carácter e a palavra e avaliar a causa do erro do reconhecimento de caracteres. Ver adiante.

Desenvolvimentos Futuros

  • Aperfeiçoamento do processo de segmentação de modo a torná-lo mais flexível na adaptação a casos mais específicos
  • Melhoramento do reconhecimento de caracteres: a montante, com a aplicação de algoritmos de edição gráfica de modo a melhor otimizar as imagens; a jusante, com a aplicação de modelos de Machine Learning.
  • Melhoria da app de pesquisa: aplicação de pesquisa indexada; introdução de pesquisa combinada (AND, OR, NOT); introdução de wildcards.
espaço

Introdução

Este projecto utiliza serviços cloud e open-source, com o objectivo de extrair texto de jornais antigos. Foi efectuado benchmarking de vários serviços cloud de OCR (nomeadamente Amazon, Google e Azure) e open-source (Tesseract), tendo sido escolhido o serviço da Google Cloud entitulado Google Cloud Vision para o reconhecimento inicial de caracteres, visto que era o que apresentava melhor performance na lingua portuguesa e com mais informação contextual.

Durante o desenvolvimento foram efectuadas experiências de processamento de imagem, para se estabelecerem heurísticas e recomendações de como efectuar um tratamento de digitalizações de modo a obter o melhor resultado possível na identificação de caracteres. Métodos de aumento da resolução de imagem e segmentação de conteúdo (identificações automática de colunas, um layout típico de jornais antigos), foram desenvolvidos e aplicados com sucesso.

Requisitos

É necessária uma instalação Python 3.7 ou superior. A versão mais recente pode ser descarregada em python.org.

É necessário uma conta google para poder criar uma chave de acesso à API Google Cloud Vision.
Pode encontrar ajuda para a criação da chave de acesso no ficheiro API_KEY_tutorial.pdf.

Após obter o ficheiro JSON que contém a chave da API, defina o caminho do ficheiro na constante API_KEY do ficheiro settings.py.

Instalação

Todas as bibliotecas necessárias podem ser instaladas com o comando:
make install

Utilizadores macOS necessitam instalar a biblioteca poppler. Pode ser instalado via Homebrew. Caso não tenha o Homebrew instalado, escrever no terminal:
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

Depois instale o poppler:
brew install poppler

Acerca do código

O processo de transformação de imagens digitalizadas de um jornal para um PDF pesquisável tem os seguintes módulos e são executados conforme são necessários:

  1. Conversão de imagens digitalizadas em PDF
  2. Extracção de imagens de documentos PDF
  3. Aumento de resolução de imagem
  4. Segmentação de conteúdos
  5. OCR (Optical Caracter Recognition - Reconhecimento Óptico de Caracteres)
  6. Gerador de PDF pesquisável (com imagem original e texto)

Esta estrutura modular (ainda em desenvolvimento) possibilita a análise de layout e reconhecimento óptico de caracteres em jornais do final do séc XIX, com o objectivo de um no final gerar um ficheiro PDF pesquisável.

Na pasta apps encontram-se quatro interfaces gráficos desenvolvidos para análise e experimentação dos processos. O funcionamento dos quatro aplicações é independente do programa principal. Essas aplicações (com GUI), tem as seguintes funções:

Instruções

O programa está divido em vários módulos, que representam as diferentes fases do processo. Os módulos encontram-se na pasta lib.

Os vários parâmetros do programa são atribuidos no ficheiro settings.py.

Para uma listagem dos módulos e respectivo número, executar:
python3 main.py

Para executar os vários módulos usar o argumento opcional -e ou --exe seguido dos números correspondentes aos módulos que se pretende utilizar, por exemplo:
python3 main.py -e 1 2 3 4 5.1

No ficheiro settings.py pode defenir a variável job_id para identificar diferentes lotes de ficheiros. Em caso da pasta já existir quando o código é executado é perguntado no terminal se deseja continuar e substituir a antiga pela nova pasta.

Descrição dos módulos

  1. img_to_pdf.py

    Converte as imagens em pdf.
    O nº de páginas por pdf pode ser defenido em setings.py na constante NUM_PAGES.
    Por exemplo, se se desejar que um grupo de imagens seja agrupado em vários pdfs com 4 páginas cada um: NUM_PAGES=4. Para agrupar todas as imagens num único pdf: NUM_PAGES=0.

  2. pdf_to_img.py

    Separa as páginas de cada pdf em imagens jpeg.

  3. image_scale.py

    Redimensiona as imagens de acordo com o factor escolhido em setings.py na constante IMG_SCALE_RATIO e com o método de interpolação escolhido em IMG_INTERPOLATION

  4. image_segment.py

    Procede à detecção das linhas divisórias das colunas e efectua o corte nos pontos detetados. Retorna todas as colunas detectadas em imagens separadas.

  5. ocr.py.py
    Submete as imagens pretendidas ao serviço de ocr da google cloud-vision e retorna um ficheiro json por cada imagem.

  6. json_to_txt.py

    Extração do texto na resposta JSON da google num ficheiro txt

  7. json_to_hocr.py

    Criação de um ficheiro hocr através dos dados da resposta JSON da google.

  8. hocr_merge.py

    Em caso do uso de segmentação, efectua a junção dos vários segmentos num ficheiro hocr representativo da página inteira

  9. hocr_to_pdf.py

    Transformação do ficheiro hocr da página, juntamente com a imagem que representa, num PDF pesquisável.

Aplicações

Além das bibliotecas/módulos desenvolvidos, também se tem experimentado com interfaces gráficos baseados nas mesmas, de modo a facilitar a utilização de ferramentas por utilizadores finais.

image-processing

Interface gráfico (GUI) para experimentação de redimensionamento, segmentação e corte das colunas das páginas dos jornais.
Instalação das bibliotecas necessárias: make install
Para a execução do GUI correr no terminal: python3 apps/image-procesing/process.py

Interface Gráfico

image processing app

Funcionalidades:

  • single process processa uma única página à escolha.

  • batch process
    processa um grupo de páginas numa pasta.

  • input
    local do ficheiro(single proces) ou pasta (batch process) a ser processado.

  • output
    local de gravação da página inteira (redimensionada ou não) e das colunas cortadas

  • Resize
    Activa as opções de redimensionamento

  • Enlarge Factor(%)
    factor de redimensionamento da página (100% representa o tamanho original)

  • interpolation
    Selecção do algorítmo de interpolação

  • Crop mode
    Definição do modo de corte aplicado na imagem.

    Tight a área total da imagem corresponde ao tamanho da coluna detectada

    Full a área total da imagem corresponde ao tamanho da página, apresentando a coluna na sua posição original.

  • FLD (fast line detector)
    Activação da defenição de parâmetros para a detecção de linhas

  • length_threshold
    Segmentos com comprimento inferior ao definido serão excluídos

  • distance_threshold
    Qualquer ponto que se apresente mais afastado do que este valor de um hipotético segmento é considerado fora do cálculo

  • canny1 e canny2
    Primeiro e segundo limite, respectivamente, para o procedimento de histerese na função canny()

  • Canny aperture size
    Tamanho de abertura do operado sobel na função canny(). Para um valor de 0 a função canny() não é executada, e só são considerados os contornos da imagem

  • do merge
    Se selecionado é executado uma junção incremental dos segmentos.

  • Preview
    (Só em 'single process') Pré-visualização das linhas onde será efectuada a separação das colunas

lines detection

Processo:

  1. A(s) página(s) escolhida(s) é(são) redimensionada(s) e gravada(s) numa nova pasta no caminho escolhido em 'output'. À pasta criada e à nova página é atribuido o mesmo nome do ficheiro da página original, acrescentando-se o sufixo '_s-n', onde n corresponde ao valor escolhido como factor de redimensionamento.
  2. Na página redimensionada são detectadas as linhas que fazem as divisões de colunas.
  3. A partir da segmentação é efectuado o corte como determinado em 'Crop mode'.
  4. As colunas são gravadas na pasta criada com o prefixo 'col_n', onde n corresponde ao número da coluna, e com o mesmo sufixo atribuido à pasta e à página redimensionada.

column crops

ocr-analytics

GUI para análise estatistica das respostas do serviço Google Cloud Vision.
Instalação das bibliotecas necessárias: make install
Para a execução do GUI correr: python3 apps/ocr-analytics/ocr_analytics.py

Descrição do interface gráfico

ocr analytics

  • img file / Browse
    Selecção da imagem a analisar

  • json file / Browse
    Selecção do ficheiro de resposta json. Esta caixa é automaticamente preenchida quando se submete uma imagem aos serviços da google.

  • Send File
    Submissão da imagem aos serviços da google.

  • ymbols/ Words
    Selecção dos dados a anlisar — por simbolo (caracter) ou palavra.

  • Load data
    Carrega os dados para a tabela.

  • Plot Page
    Exibe a imagem do documento em análise.

  • Plot HM_S
    Heat-Map simbolos. Exibe uma distribuição das incidências dos caractere reconhecidos por número de confiança.

    imagem de exemplo

  • Plot HM_W
    Heat-Map palavras. Exibe uma distribuição das incidências das palavras reconhecidas por número de confiança.

    imagem de exemplo

  • Plot HM_B
    Heat-Map Quebras. Exibe uma distribuição das incidências das quebras de linhas e parágrafos.

    imagem de exemplo

  • Plot LineBrks
    Exibe a localização na imagem em análise das quebras de linha detectadas.

    imagem de exemplo

  • preview text
    Mostra no quadro imediatamente abaixo o texto reconhecido pelo serviço ocr.

  • clear breaks
    Apaga as quebras de linha e condensa todo o texto num só parágrafo.

  • save txt
    Grava o texto reconhecido para um ficheiro txt.

  • describe data
    Descrição dos dados estatísticos obtidos.

  • Confidence abs
    Dados em números absolutos por escalões de confiança dos caracteres ou palavras reconhecidos.

  • Confidence %
    Dados em percentagem por escalões de confiança dos caracteres ou palavras reconhecidos.

  • Unique Values
    Contagem de valores únicos nos símbolos reconhecidos.

  • Unique cf mean
    Média do nível de confiança para cada valor único

  • Reset
    Limpa todos os campos e a app fica pronta para novo processamento.

  • tabela
    Os valores da tabela podem ser ordenados de forma ascendente ou descendente clicando no cabeçalho da coluna. Clicando em qualquer linha de caracter ou palavra é exibida uma janela com a sua localização na imagem do documento.

gcv-ocr

GUI básico para a submissão de documentos em imagem ou pdf aos serviços Google Cloud Vision. Instalação das bibliotecas necessárias: make install
Para a execução do GUI correr: python3 apps/gcv-ocr/gcv_ocr.py

Descrição do interface gráfico

gcv-ocr

  • PDF / Image
    Selecionar o tipo de ficheiros a processar

  • Merge
    Só activo para "image". Quando selecionado agrega o texto de todas as imagens num único ficheiro txt.

  • Load files
    Carregar ficheiro(s) selecionado(s).

  • output/Browse
    Selecção de pasta para gravação do(s) ficheiro(s) txt.

  • Reset
    Limpa todos os campos e a app fica pronta para novo processamento.

  • Process
    Executa o código

search_app

search-app

Descrição do interface gráfico

  • Folder/Browse - Escolha da pasta onde executar a pesquisa. A pesquisa é feita em todos os ficheiros de texto em todas as subpastas.

  • Exact match - Executa uma pesquisa com correspondência exacta ao termo introduzido. Se esta caixa não estiver selecionada a pesquisa retornará qualquer resultado onde o termo apareça. Por exemplo, na pequisa por 'porto' poderão aparecer resultados como 'desporto'.

  • Case Sensitive - Executa uma pesquisa com correspondência a maiúsculas e minúsculas do termo introduzido.

  • Janela de resultados - Apresenta os resultados numa tabela onde indica respectivamente o ano, mês(dependente das nomenculaturas das pastas na estrutura dos ficheiros), o ficheiro pdf, o posicionamento do termo pesquisado no layout da página e um pequeno excerto de 5 linha que contextualiza o termo pesquisado. Clicando num dos resultados abre automaticamete o pdf correspondente.

compare_tables

compare1

compare2

Descrição do interface gráfico

  • image file/Browse - escolha da imagem que foi sujeita a ocr

  • csv table - selecção da tabela comparativa gerada por ground_truth.py

  • Plot Image - Vizualização da imagem selecionada

  • Load Table - Carrega a tabela para a janela inferior

  • context view - vizualização do caracter/palavra no contexto da página

  • detail view - vizualização do caracter em duas vistas aproximadas