Come funziona il riconoscimento
Come funziona il riconoscimento
Questa pagina illustra ciò che AsposeOcr.Recognize() fa realmente internamente, dalla convalida dell’input fino al RecognitionResult finale. L’invocazione di AsposeOcr.Recognize(OcrInput) esegue una pipeline fissa di otto passaggi. Ogni passaggio di seguito è basato sull’implementazione stessa della libreria — non ci sono fasi configurabili.
1. Convalida dell’input
Prima che venga caricato qualsiasi modello, Recognize() convalida il OcrInput: rifiuta un input null (ArgumentNullException), un InputType non supportato (NotSupportedException) e qualsiasi percorso in coda che non esiste sul disco (FileNotFoundException). Nessuna sessione ONNX viene creata finché tutti gli input non superano la convalida.
2. Rendering PDF o caricamento raster
Per InputType.PDF, ogni pagina è renderizzata in un’immagine RGB a 24-bit a 150 DPI using Aspose.PDF.FOSS. Per InputType.SingleImage, il file raster viene caricato direttamente. La risoluzione di rendering di 150 DPI è fissa e non configurabile.
3. Preelaborazione del rilevatore
L’immagine viene convertita in scala di grigi usando pesi di luma Rec. 709, che preservano la luminosità percepita più accuratamente rispetto a una semplice media dei canali. Se il lato più lungo dell’immagine supera i 1000 pixel, viene ridimensionato con un separabile Lanczos-8 filtrare (due passaggi unidimensionali) per corrispondere al preprocessing eseguito durante l’addestramento del modello di rilevamento. Una striscia bianca di 32 pixel viene aggiunta al fondo dell’immagine per lo stesso motivo.
4. Rilevamento della regione
L’immagine pre-elaborata viene passata attraverso il primo modello ONNX incorporato, che produce mappe di probabilità del testo e caratteristiche visive intermedie. Un secondo modello ONNX — il modello di raffinamento — rafforza i collegamenti tra caratteri adiacenti in modo che una riga di testo completa venga rilevata come una singola regione anziché come diversi frammenti. Entrambi i modelli vengono eseguiti sulla CPU con Microsoft.ML.OnnxRuntime configurato per 8 thread di lavoro intra-operazione.
5. Post-elaborazione della regione
Le mappe di probabilità di testo e di collegamento del rilevatore vengono soggette a soglia, quindi raggruppate con un four-connected breadth-first flood fill. Ogni regione risultante viene dilatata, adattata con un rettangolo di area minima, riportata alle coordinate dell’immagine originale e ridotta a rettangoli di linea non nidificati e allineati agli assi. Questi rettangoli sono ciò che RecognitionResult.LinesResult.Line restituisce infine.
6. Riconoscimento della riga
Ogni rettangolo rilevato viene imbottito di due pixel, ritagliato dall’immagine sorgente e ridimensionato — preservando il suo rapporto d’aspetto — su una 1200×32 tela bianca. Il risultato viene convertito in un tensore in scala di grigi NHWC e passato al modello di riconoscimento.
7. Decodifica CTC
L’output grezzo del modello di riconoscimento viene decodificato con una strategia greedy CTC (Classificazione Temporale Connessionista) decodifica: le classi previste ripetute vengono consolidate, la classe vuota viene rimossa e le classi rimanenti vengono mappate attraverso l’alfabeto latino incorporato nel modello per produrre il testo riconosciuto della riga.
8. Assemblaggio del risultato
Le righe riconosciute sono accoppiate con i loro rettangoli dell’immagine sorgente per costruire ogni RecognitionResult.LinesResult. Tutte le righe non vuote sono unite con interruzioni di riga della piattaforma per produrre RecognitionResult.RecognitionText.
Lavoro sequenziale vs. parallelo
I file di input e, per i PDF, le pagine individuali vengono elaborati sequentially — non esiste il multithreading a livello di input API. Il parallelismo esiste solo all’interno di ogni chiamata di inferenza ONNX, dove Microsoft.ML.OnnxRuntime parallelizza l’esecuzione del grafo su 8 thread intra-operazione configurati.