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
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.
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:
- Conversão de imagens digitalizadas em PDF
- Extracção de imagens de documentos PDF
- Aumento de resolução de imagem
- Segmentação de conteúdos
- OCR (Optical Caracter Recognition - Reconhecimento Óptico de Caracteres)
- 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
-
img_to_pdf.py
Converte as imagens em pdf.
O nº de páginas por pdf pode ser defenido em setings.py na constanteNUM_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
. -
pdf_to_img.py
Separa as páginas de cada pdf em imagens jpeg.
-
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 emIMG_INTERPOLATION
-
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.
-
ocr.py.py
Submete as imagens pretendidas ao serviço de ocr da google cloud-vision e retorna um ficheiro json por cada imagem. -
json_to_txt.py
Extração do texto na resposta JSON da google num ficheiro txt
-
json_to_hocr.py
Criação de um ficheiro hocr através dos dados da resposta JSON da google.
-
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
-
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
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 detectadaFull
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
ecanny2
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
Processo:
- 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.
- Na página redimensionada são detectadas as linhas que fazem as divisões de colunas.
- A partir da segmentação é efectuado o corte como determinado em 'Crop mode'.
- 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.
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
-
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. -
Plot HM_W
Heat-Map palavras. Exibe uma distribuição das incidências das palavras reconhecidas por número de confiança. -
Plot HM_B
Heat-Map Quebras. Exibe uma distribuição das incidências das quebras de linhas e parágrafos. -
Plot LineBrks
Exibe a localização na imagem em análise das quebras de linha detectadas. -
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
-
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
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
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