Ferramenta renomeadora de Termos de Responsabilidade do BUPi

Esta página foi desenvolvida com vista a revelar especificações - técnicas e não só - do programa desenvolvido para renomear automaticamente os Termos de Responsabilidade do BUPi. Esta necessidade surgiu para dar um ênfase particular ao programa, evitando detalhá-lo numa página que se prende mais com metodologias de trabalho do BUPi.
 
Como mencionado na página que traz o leitor até aqui, este programa teve como objetivo automatizar procedimentos essencialmente manuais, que podem dar azo a erro humano e, acima de tudo, morosos, de edição manual dos nomes de ficheiro. Depreendeu-se a necessidade deste programa para quando se trate da conclusão de procedimentos do BUPi que a nova Plataforma permite, "cadastrando" vários prédios no mesmo procedimento (logo, diferentes Processos) e carregando duma vez só todos os Termos de Responsabilidade de acordo com as regras: o nome do ficheiro deverá conter o número do Processo.
 
Como tal, nas primeiras versões de testes e aquando do desenvolvimento de requisitos, à luz da anterior versão da Plataforma do BUPi o programa estava direcionado para reconhecer padrões de texto com base nalgum tipo de OCR (Optical Character Recognition) pré-feito, fosse a partir dos softwares nativos das scanners/multifunções dos respetivos gabinetes ou, que daria mais trabalho e poderia levar ao desinteresse em usar o programa, por softwares (proprietários, logo pagos) de terceiros e plataformas da Web. Na indisponibilidade desses softwares proprietários, a alternativa da Web é sempre mais atrativa correndo, no entanto, o risco de haver fugas de informação (bastante sensível) ao fazer upload para esses sites, onde é desconhecido o destino da informação. Como diz o velho ditado, "o cai na internet FICA na internet".
 
Inicialmente, ainda em testes, foram testadas digitalizações provenientes de uma máquina da Canon que tem a opção de OCR ativada aquando da digitalização, e foram testados (nos mesmos Termos de Responsabilidade) a partir de uma máquina que não produz OCR, aos quais se aplicou OCR externamente. Nestes usou-se:
  • Software NitroPDF, a ferramenta de reconhecimento de caracteres (OCR) ao conjunto de todos os Termos num só ficheiro, e sucessiva separação através da ferramenta split;
  • O favorito de muitos, no site  I❤PDF, usando a ferramenta OCR acessível através do link ao ficheiro com todos os Termos, que devolveu um ficheiro muito mais pesado (em Mb) que aquele produzido pelo software NitroPDF; separou-se o ficheiro em vários PDFs usando o mesmo site.
Assim, na primeira versão do programa, usando três versões diferentes de ficheiros PDF (OCR da Canon vs. NitroPDF vs. I❤PDF) em três diferentes pastas, executou-se o programa, como apresento em print da sua interface:
Versão original do programa (versão 1.2) - versão anterior mantinha a mesma interface mas foi descartada por apresentar imensos bugs.

NOVA VERSÃO DO PROGRAMA

As duas últimas versões do programa apresentam-se iguais quanto ao procedimento lógico, apenas diferindo quanto à possibilidade de poder fazer no próprio programa o reconhecimento ótico de caracteres.
 

Vamos a factos

Versão 1.3

Esta versão sofreu um ajuste radical às funcionalidades e à própria interface. Com inspiração na aplicação que desenvolvi para manipular ficheiros PDF, não só se alterou a interface como foi ajustada a novos reconhecimentos de padrões de texto, seleção de ficheiros livre e com adaptação à nova plataforma do BUPi, para carregamento em série de termos de responsabilidade.
 
Esta versão encontra-se perfeitamente funcional e assume que o OCR deve estar feito de antemão, especialmente para quem lida com máquinas que já aplicam OCR aos Termos de Responsabilidade digitalizados.
 
O tamanho do programa é também mais reduzido, ficando-se pelos 26 MB, onde maior parte do seu conteúdo diz respeito às dependências Python - as bibliotecas - necessárias para correr sob a forma de um executável.

Versão 1.4

A versão mais recente do Renomeador de Processos BUPi passou a incluir funcionalidades avançadas de reconhecimento ótico de caracteres (OCR), com integração da biblioteca EasyOCR. Esta alteração traz enormes vantagens funcionais, mas também justifica o aumento significativo no tamanho final do executável compilado. Eis os principais motivos:
 
1.  Inclusão de bibliotecas pesadas (EasyOCR, PyTorch, etc.)

A funcionalidade de OCR é suportada por bibliotecas como:

  • EasyOCR: requer várias dependências.
  • PyTorch: uma das mais pesadas, usada em segundo plano para suporte a modelos de deep learning (mesmo sem GPU).
  • TorchVision, Scipy, Shapely, Numpy, entre outras: todas são incluídas automaticamente devido às dependências diretas ou indiretas.

Estas bibliotecas trazem ficheiros compilados (.pyd, .dll, .so) e modelos pré-treinados, aumentando drasticamente o volume.

2. Modelos de machine learning incluídos no bundle

O EasyOCR vem com dois modelos de base:

  • Detection model (para localizar o texto).
  • Recognition model (para identificar os caracteres).

Estes modelos são ficheiros binários .pth e .onnx, e são automaticamente incorporados quando se gera o executável; só estes dois modelos já podem ultrapassar os 100 MB quando combinados!

Quanto a esta particularidade, o programa descarrega da internet ainda outros dois ficheiros para uma pasta dentro do root do utilizador, localizando-se em

<Letra do disco>:\Users\<utilizador>\.EasyOCR em sistemas operativos Windows.

Estes ficheiros são descarregados uma vez que o compilador Python não embute automaticamente os modelos pré-treinados do EasyOCR; o que ele embute são os módulos de código e bibliotecas, mas não os ficheiros binários dos modelos usados pelo EasyOCR.

Assim, sempre que o EasyOCR é executado:

  • Verifica se os modelos de deteção e reconhecimento já existem localmente
  • Se não existirem, faz download automático a partir dos servidores oficiais.
  • Guarda-os no disco para uso futuro — assim, só descarrega uma vez.
Consola embutida no programa para dar a conhecer ao utilizador o progresso dos trabalhos a ser executados em segundo plano - de outra forma, o programa pode parecer congelado.

Os dois ficheiros em específico são:

  • Modelo CRAFT → craft_mtl_25k.pth (para detetar regiões de texto nas imagens) - cerca de 81 MB.
  • Modelo de reconhecimento correspondente → latin_g2.pth (para converter as regiões detetadas em texto) enquanto modelo de reconhecimento de texto para línguas latinas do grupo 2, definido como tal pelos programadores do EasyOCR - cerca de 15 MB.

3. Distribuição independente do Python

Como o objetivo foi gerar um .EXE que funcione em qualquer computador sem necessidade de instalar o Python, o PyInstaller inclui:

  • O interpretador Python completo embutido.
  • Todas as bibliotecas standard.
  • As bibliotecas de terceiros (inclusive aquelas que não seria preciso usar se o script corresse num ambiente virtual com o Python instalado).

RESULTADO: o .EXE torna-se autossuficiente mas pesado.

4. Tkinter, PIL e outras bibliotecas gráficas

A interface gráfica baseada em Tkinter, com suporte a imagens e manipulação de PDFs, também exige incluir:

  • Pillow (PIL): para imagens das páginas dos PDFs (OCR).
  • fitz/PyMuPDF: para conversão das páginas dos PDFs em imagens para o OCR.

Mesmo que visualmente o programa seja simples, estas bibliotecas gráficas são grandes em termos de ficheiros internos.

Em género de conclusão...

O aumento do tamanho não é desperdício — é consequência da autonomia que o programa ganhou: não depende de nada externo, pode ser executado em qualquer Windows moderno, e realiza OCR com tecnologia de ponta localmente. É nada mais que o preço justo por conveniência, autonomia e funcionalidade profissional!

O programa, totaliza assim 247 MB, e encontra-se pronto a utilizar sem precisar de ser instalado.

Algumas particularidades:

  • Ao executar o programa, pode simplesmente executar como acontecia na versão 1.3 usando o botão "RENOMEAR (já com OCR feito)";
  • O novo botão, e por enquanto "(EXPERIMENTAL) Realizar OCR e renomear" é denominado como experimental pois com o uso e as críticas de quem usa o programa é que se pode vir a entender se é funcional ou não, isto é, se o OCR foi verdadeiramente bem aplicado e/ou se os padrões de reconhecimento de caracteres se encontram bem aplicados
Janela principal do programa na sua versão 1.4, apresentando a nova funcionalidade e botão, bem como avisos ao utilizador

  • O programa sempre que for executado usando a ferramenta de OCR recorre à CPU (processador) da máquina para fazer o reconhecimento de caracteres. O uso da CPU foi escolhido, apesar de mais lento, em relação à GPU (placa gráfica) uma vez que o EasyOCR usa, por defeito, a GPU para aplicar os modelos de machine learning. Assim, a razão para não usar prende-se com as máquinas que os técnicos BUPi têm, em regra, ao seu dispor, pelo que quem desenvolveu o EasyOCR alavancou o poder das placas gráficas para esse trabalho de reconhecimento de caracteres tendo em conta as placas da NVIDIA com tecnologia CUDA. Sabendo que nos balcões municipais, em regra, nem placas gráficas independentes há (muitas vezes são chipsets na própria motherboard), não mudar o processamento para a CPU poderia causar erros graves, especialmente se não estivermos também a ter em conta máquinas com hardware modesto ou de baixa gama.
  • O tempo de execução do OCR é somente dependente das capacidades da CPU e da qualidade da digitalização dos Termos de Responsabilidade. Durante o tempo em que o reconhecimento de caracteres está a ser feito, o programa fica irresponsivo, pelo que a maior ou menor demora, para além dos motivos supra-citados, dever-se-á também ao número de ficheiros PDF a ser processados. No final, o programa liberta uma caixa de informações a dizer que n ficheiros foram renomeados.
  • O programa não edita os PDF, isto é, não lhes aplica e neles guarda o reconhecimento de caracteres, mas apenas faz reconhecimento para consumo próprio e renomeia os ficheiros com o número do Processo.
  • Este procedimento cria cópias dos ficheiros originais, agora com os nomes de ficheiro corretos e prontos a ser carregados em série para a plataforma.

LINK PARA DESCARREGAR AS DUAS DIFERENTES VERSÕES

De futuro, partilharei o código fonte para a construção do programa, pelo que os eventuais interessados dever-me-ão contactar para o devido efeito.

Em todo o caso, o objetivo desta ferramenta é só alavancar, mais uma vez, as potencialidades do BUPi, não tendo este programa sido desenvolvido com qualquer interesse financeiro, de reconhecimento, ligação ou filiação ao projeto BUPi, nem muito menos com vista a causar danos aos equipamentos dos técnicos. Assim, ao descarregar, o técnico está a reconhecer que qualquer dano ocorrido, não poderá ser incutida a mim a responsabilidade pelo incidente. De facto, não tem como haver incidente algum, a não ser que a manutenção dos computadores de trabalho não seja feita, e qualquer sobreaquecimento é só culpa dessa irresponsabilidade!

Mais uma vez apelo: critiquem, comentem, partilhem sugestões, usem o meu e-mail no botão de informações do programa, porque sem feedback todo o meu esforço pode parecer uma grande missão, mas se não prestar, não serve a ninguém!