Ocr - Riconoscimento documenti

di il
11 risposte

Ocr - Riconoscimento documenti

Buon giorno a tutti.
Vorrei delle vostre idee in merito al seguente problema.

Immaginiamo di avere uno scontrino, una fattura oppure un preventivo in formato immagine.
Utilizzando i classici OCR tipo Tesseract, immaginiamo di avere recuperato il testo dall'immagine.

Il problema è questo, come da testo riesco a recuperare le varie informazioni suddivise per tipologia.
Per esempio, partendo dal caso più semplice, se io ho il testo di uno scontrino, come faccio a far capire qual'è il totale dello scontrino, oppure il nome dell'azienda che l'ha emesso?
Avete delle idee in merito per recuperare queste informazioni o delle metodologie da seguire?

11 Risposte

  • Re: Ocr - Riconoscimento documenti

    Scrivi un parser. non è difficile
  • Re: Ocr - Riconoscimento documenti

    +m2+ ha scritto:


    Scrivi un parser. non è difficile
    Sapete se ci sono già dei parser da poter utilizzare senza dover partire da 0?
  • Re: Ocr - Riconoscimento documenti

    Normalmente si parte proprio da zero, basta poco (al max un'oretta per tipologia di file).
    anche meno, se hai un minimo di esperienza.

    se utilizzi windows, ed hai un budget modesto, ti consiglio abby finereader 12 professional (proprio la versione 12, perchè c'è il finecmd).
    le versioni più vecchie usano meccanismi diversi (molto più brigosi, cioè le cartelle hot), mentre le nuove... non le sto usando

    parsa bene, in modalità multithread (cosa non scontata) e soprattutto puoi lanciarlo "a file" (cosa indispensabile per OCR massivi, poniamo di 5.000 pagine, che altrimenti spesso saturano lo spazio temp, o vanno in crash eccetera).
    Fondamentale infatti prevedere la possibilità che l'OCR fallisca per 10.000 motivi, ed è banale in questo caso (basta controllare che il file .txt non esiste, come nell'esempio che ti metto)
    22/05/2017 16:16:06 Eseguo OCR 000032 c:\ocr_pdf\1313202371401534.pdf => c:\ocr_pdf\1313202371401534.txt
    22/05/2017 16:16:39 OK carico testo OCR c:\ocr_pdf\1313202371401534.txt
    22/05/2017 16:16:39 Eseguo OCR 000033 c:\ocr_pdf\1313662361161377.pdf => c:\ocr_pdf\1313662361161377.txt
    22/05/2017 16:17:24 OK carico testo OCR c:\ocr_pdf\1313662361161377.txt
    22/05/2017 16:17:24 Eseguo OCR 000034 c:\ocr_pdf\1326340068699892.pdf => c:\ocr_pdf\1326340068699892.txt
    22/05/2017 16:19:16 ERRORE non esiste c:\ocr_pdf\1326340068699892.txt
    22/05/2017 16:19:16 Eseguo OCR 000035 c:\ocr_pdf\1334289190183255.pdf => c:\ocr_pdf\1334289190183255.txt
    ancor meglio se killi i processi abby prima di lanciare un OCR (utilissimo se crasha e rimane "stuck")

    ce ne sono anche altri (di buoni ocr), ma ormai mi sono standardizzato su quest'ultimo

    operativamente lancia l'OCR, aspetta che termini (waitexecute), e fagli scrivere un file di testo (un banale TXT).
    poi carichi quest'ultimo, e lo parsi come più ti aggrada (io uso delphi, ma questione di gusti), e poi alimenta che so un DB e poi... quello che ti pare

    personalmente uso una macchina virtuale windows dedicata che fa quello (cioè l'OCR) senza disturbare gli operatori e dover dedicare una macchina Windows fisica.


    tesseract (versione 4 beta) è buono e giusto, ma dipende pesantemente dalla qualità dell'input, e non parsa i PDF (devi prima convertirli in TIFF ad esempio con imagemagick), e in generale è lento, molto lento, e in generale peggiore di abby.
    lo uso essenzialmente da linux.
  • Re: Ocr - Riconoscimento documenti

    ... mi son dimenticato...
    se sei pigro quanto me dai i "superpoteri" all'utente che stai usando (meglio ancora esegui-sempre-come-amministratore con la relativa policy) e poi superbrutalmente dai un
    taskkill /f /im finereader.exe
    prima di ogni esecuzione
    cancella i file elaborati (o spostali in altra cartella), così man mano vedi come svuoti i lavori accodati e puoi ri-elaborare più volte come ti aggrada
  • Re: Ocr - Riconoscimento documenti

    Grazie mille per la dritta.

    Una domanda sul parser.
    Per la scrittura di un parser mi baso sulle espressioni regolari?
    Devo quindi prevedere ogni possibile caso.....
    Per uno scontrino la vedo abbastanza fattibile, ma il riconoscimento di un'intera fattura.... la vedo piuttosto complessa...
    non ho ancora ben chiaro come far capire alcune differenze, come per esempio tra il nome della società e il nome del prodotto....
    L'unica cosa che mi viene in mente è la posizione in cui si trovano.
  • Re: Ocr - Riconoscimento documenti

    > L'unica cosa che mi viene in mente è la posizione in cui si trovano.
    se usi windows e .net ti può fare comodo tessnet per usare tesseract
  • Re: Ocr - Riconoscimento documenti

    morriluca ha scritto:


    Grazie mille per la dritta.

    Una domanda sul parser.
    Per la scrittura di un parser mi baso sulle espressioni regolari?
    Devo quindi prevedere ogni possibile caso.....
    Per uno scontrino la vedo abbastanza fattibile, ma il riconoscimento di un'intera fattura.... la vedo piuttosto complessa...
    non ho ancora ben chiaro come far capire alcune differenze, come per esempio tra il nome della società e il nome del prodotto....
    L'unica cosa che mi viene in mente è la posizione in cui si trovano.
    ma che espressioni regolari, "olio di gomito".
    leggi il file di testo in una qualche struttura dati che ti consenta di accedere alle singole righe, poi le parsi e via.
    nel caso del nome della società è banale, tipicamente avrai (tra questo e l'elenco dei prodotti) una scritta, esempio DESCRIZIONE o PREZZO.
    Il "dramma" in realtà nasce con gli OCR imperfetti, cosa del tutto normale, dove ti servirà un approccio... lazy o comunque rilassato per riconoscere "intelligentemente" porzioni di dati riconosciuti in modo erroneo.
    Spesso si adottano strategie a "cascata", ne ho messe anche 5, che sono via via meno restrittive.

    Se operi in modo batch, cioè con riconoscimento di un numero elevati di documenti, ricorda di mettere timer per chiudere i programmi "zombi" o stuck.
    Normalmente basta enumerare le finestre child e testare i text mostrati, per poi fare un bel taskkill (o qualcosa del genere).
    Altrimenti rischi concretamente che l'OCR si blocchi alle 3 di notte, e il giorno dopo il lavoro non è stato portato a termine.

    =========
    Se la qualità dei documenti è buona il parser è banale: per una fattura tipica non impiego più di un 20 minuti.
    Se invece è bassa possono volerci anche settimane, di messe a punto successive, per gestire i vari casi che si presentano
  • Re: Ocr - Riconoscimento documenti

    Quello che dici te è corretto, ma ti sfugge un punto, o non ho ben precisato io una questione.
    Le fatture da riconoscere non sono basate su un template prestabilito, non so in anticipo che struttura avranno, perchè ogni azienda se la crea a modo suo.
    Stesso discorso per gli scontrini, anche se qui in generale questi hanno più o meno la stessa struttura.
  • Re: Ocr - Riconoscimento documenti

    morriluca ha scritto:


    Quello che dici te è corretto, ma ti sfugge un punto, o non ho ben precisato io una questione.
    Le fatture da riconoscere non sono basate su un template prestabilito, non so in anticipo che struttura avranno, perchè ogni azienda se la crea a modo suo.
    Stesso discorso per gli scontrini, anche se qui in generale questi hanno più o meno la stessa struttura.
    Non mi sfugge affatto: fai un riconoscitore diverso per ogni tipologia.
    E' normale farne una dozzina o anche più
    Ecco un frammentino
    if pos('Dichiarazione Imponibile',s)>0 then
    begin
    myshowmessage('Penso sia un PDF UNIPOLSAI');
    s:=tagliaultimaparola(sl.strings[riga],ss);
    if s='Dichiarazione' then
    s:=tagliaultimaparola(sl.strings[riga-6],ss);

    ss:=stringreplace(ss,'.','',[rfreplaceall]);
    try
    totalone:=strtofloat(ss);
    except
    end;
    Che pensavi, di trovare un "magico" programma che dato qualsasi documenti ti ritornava magicamente il contenuto?

    E non ti dico poi per l'OCR
  • Re: Ocr - Riconoscimento documenti

    Speravo ci fosse gia un qualche framework dove impostare dei template di ricerca e lui faceva tutto il resto.
    Mi sa che mi conviene prima cercare o farmi un framework di ricerca e poi impostare i vari template per processare il testo, altrimenti
    diventa troppo macchinoso.

    .....o magari già degli algoritmi scritti per recuperare da una fattura le vari informazioni, come intestatario, totale, lista prodotti ecc...
    Nel web c'è sempre la regola che c'è qualcuno che ci ha già pensato prima di te, l'ha già fatto e funziona sicuramente meglio
  • Re: Ocr - Riconoscimento documenti

    morriluca ha scritto:


    Speravo ci fosse gia un qualche framework dove impostare dei template di ricerca e lui faceva tutto il resto.
    Mi sa che mi conviene prima cercare o farmi un framework di ricerca e poi impostare i vari template per processare il testo, altrimenti
    diventa troppo macchinoso.

    .....o magari già degli algoritmi scritti per recuperare da una fattura le vari informazioni, come intestatario, totale, lista prodotti ecc...
    Nel web c'è sempre la regola che c'è qualcuno che ci ha già pensato prima di te, l'ha già fatto e funziona sicuramente meglio
    purtroppo devo darti una brutta notizia: difficilmente troverai un parser per le fatture della ditta Automan di Serenara di sotto, che poi te lo rilasci addirittura opensource.

    magari troverai qualcosa che so per le fatture amazon, o zalando.
    resta il "piccolo" particolare che se parliamo di OCR allora dubito troverai niente.

    Ribadisco che per una fattura italiana media, supponendo di avere un PDF testo e non un OCR, in massimo massimo, ma proprio massimo, 2 ore si fa (ne ho fatte a dozzine).
    Se parliamo invece di OCR, come detto, la questione cambia (dozzine anche di questi).

    Magari mi sbaglio, se trovi qualcosa... postalo
Devi accedere o registrarti per scrivere nel forum
11 risposte