Como o Reconhecimento Funciona
Como o Reconhecimento Funciona
Esta página percorre o que AsposeOcr.Recognize() realmente faz internamente, da validação de entrada ao RecognitionResult final. Chamar AsposeOcr.Recognize(OcrInput) executa um pipeline fixo de oito etapas. Cada etapa abaixo está baseada na própria implementação da biblioteca — não há estágios configuráveis.
1. Validação de Entrada
Antes que qualquer modelo seja carregado, Recognize() valida o OcrInput: ele rejeita uma entrada null (ArgumentNullException), um InputType não suportado (NotSupportedException) e qualquer caminho enfileirado que não exista no disco (FileNotFoundException). Nenhuma sessão ONNX é criada até que todas as entradas passem.
2. Renderização de PDF ou Carregamento de Raster
Para InputType.PDF, cada página é renderizada para uma imagem RGB de 24 bits em 150 DPI using Aspose.PDF.FOSS. Para InputType.SingleImage, o arquivo raster é carregado diretamente. A resolução de renderização de 150 DPI é fixa e não configurável.
3. Pré-processamento do Detector
A imagem é convertida para escala de cinza usando pesos de luma Rec. 709, que preservam o brilho percebido de forma mais precisa do que uma simples média de canais. Se o lado mais longo da imagem exceder 1000 pixels, ele é reduzido com um Lanczos-8 filtrar (duas passagens unidimensionais) para corresponder ao pré-processamento durante o treinamento do modelo detector. Uma faixa branca de 32 pixels é adicionada à parte inferior da imagem pelo mesmo motivo.
4. Detecção de Região
A imagem pré-processada é passada pelo primeiro modelo ONNX incorporado, que produz mapas de probabilidade de texto e recursos visuais intermediários. Um segundo modelo ONNX — o modelo de refinamento — reforça os vínculos entre caracteres adjacentes de modo que uma linha de texto completa seja detectada como uma única região, e não como vários fragmentos. Ambos os modelos são executados na CPU com Microsoft.ML.OnnxRuntime configurado para 8 threads de trabalho intra-operação.
5. Pós-Processamento de Região
Os mapas de probabilidade de texto e de ligação do detector são limiares, então agrupados com um preenchimento de inundação (flood fill) em largura-primeiro de quatro conexões. Cada região resultante é dilatada, ajustada a um retângulo de área mínima, redimensionada de volta para as coordenadas da imagem original e reduzida a retângulos de linha não aninhados e alinhados aos eixos. Esses retângulos são o que RecognitionResult.LinesResult.Line retorna finalmente.
6. Reconhecimento de Linha
Cada retângulo detectado recebe um preenchimento de dois pixels, é recortado da imagem fonte e redimensionado — preservando sua proporção — para um 1200×32 canvas branco. O resultado é convertido em um tensor em escala de cinza NHWC e passado ao modelo de reconhecimento.
7. Decodificação CTC
A saída bruta do modelo de reconhecimento é decodificada de forma gananciosa CTC (Classificação Temporal Conexista) decodificação: classes previstas repetidas são colapsadas, a classe em branco é removida e as classes restantes são mapeadas através do alfabeto latino incorporado ao modelo para produzir o texto reconhecido da linha.
8. Montagem do Resultado
As linhas reconhecidas são pareadas com seus retângulos de imagem de origem para construir cada RecognitionResult.LinesResult. Todas as linhas não vazias são unidas com quebras de linha da plataforma para produzir RecognitionResult.RecognitionText.
Trabalho Sequencial vs. Paralelo
Os arquivos de entrada e, para PDFs, páginas individuais são processados sequentially — não há multithreading ao nível de entrada API. O paralelismo existe apenas dentro de cada chamada de inferência ONNX, onde Microsoft.ML.OnnxRuntime paralleliza a execução do grafo em suas 8 threads intra-operação configuradas.