Sto lavorando a un progetto che comporta l'estrazione di documenti scientifici di testo archiviati in formato PDF. Per la maggior parte dei documenti, questo si ottiene facilmente usando PDFMiner, ma alcuni vecchi documenti memorizzano il loro testo come immagini grandi. In sostanza, una carta viene scansionata e quel file di immagine (in genere PNG o JPEG) comprende l'intera pagina.Miglioramento delle prestazioni OCR nelle scansioni multi-paragrafo
Ho provato a utilizzare il motore Tesseract tramite le associazioni python-tesseract, ma i risultati sono piuttosto deludenti.
Prima di immergermi nelle domande che ho con questa libreria, vorrei menzionare che sono aperto a suggerimenti per le librerie OCR. Sembrano esserci poche soluzioni Python native.
Here è una di queste immagini (JPEG) su cui sto cercando di estrarre testo. Ho il codice esatto fornito nei frammenti di esempio sulla pagina di codice google python-tesseract che ho collegato sopra. Devo dire che la documentazione è un po 'scarsa, quindi è abbastanza probabile che una delle molte opzioni nel mio codice non sia configurata correttamente. Qualsiasi consiglio (o link a tutorial approfonditi) sarebbe molto apprezzato.
Here è l'output dal mio tentativo di OCR.
Le mie domande sono le seguenti:
- C'è qualcosa non ottimale nel codice che sto utilizzando? C'è un modo migliore per farlo? Una biblioteca diversa forse?
- Che tipo di preelaborazione posso eseguire per migliorare il rilevamento? Le immagini sono tutte B & W, ma dovrei forse impostare una soglia e impostare qualcosa sopra ad un colore nero a valore singolo e tutto ciò che si trova sotto ad un colore bianco a valore nullo? Qualunque altra cosa?
- Una domanda più specifica: è possibile migliorare le prestazioni eseguendo l'OCR su singole parole? In tal caso, qualcuno può suggerire un modo per delimitare singole parole in un file immagine (ad esempio quello collegato sopra) ed estrarle in immagini separate che possono essere trattate in modo indipendente?
- La presenza di grafici e altre immagini incorporati nell'immagine della pagina PDF può interferire con l'OCR? Dovrei rimuovere questi? Se sì, qualcuno può suggerire un metodo per rimuoverli automaticamente?
EDIT: Per semplicità, ecco il codice che ho usato.
import tesseract
api = tesseract.TessBaseAPI()
api.Init(".","eng",tesseract.OEM_DEFAULT)
api.SetPageSegMode(tesseract.PSM_AUTO)
mImgFile = "eurotext.jpg"
mBuffer=open(mImgFile,"rb").read()
result = tesseract.ProcessPagesBuffer(mBuffer,len(mBuffer),api)
print "result(ProcessPagesBuffer)=",result
E qui è il codice alterativa (i cui risultati non sono mostrati in questa questione, anche se le prestazioni sembra essere molto simile).
import cv2.cv as cv
import tesseract
api = tesseract.TessBaseAPI()
api.Init(".","eng",tesseract.OEM_DEFAULT)
api.SetPageSegMode(tesseract.PSM_AUTO)
image=cv.LoadImage("eurotext.jpg", cv.CV_LOAD_IMAGE_GRAYSCALE)
tesseract.SetCvImage(image,api)
text=api.GetUTF8Text()
conf=api.MeanTextConf()
Qualcuno potrebbe spiegare le differenze tra questi due snippet?
Ozvald, consigli Impressionante, grazie! Sarei davvero interessato a verificare il tuo codice. Hai un repository github o qualcosa del genere? Per quanto riguarda il tipo di file immagine, è accettabile convertire le immagini JPEG in PNG, o il danno è già stato fatto? Chiedo perché molti dei PDF che ho incontrato memorizzano le immagini come JPEG internamente, quindi se il problema è di compressione lossy, allora sono un po 'bloccato con quello che ho. – blz
Nessun repo github, mandami una mail (ian at ianozsvald com) e lo scaverò (ho davvero intenzione di github ...). –
Se è già JPEG, lo salverò come TIFF per evitare di aggiungere alcuni * artefatti * extra. L'aggiunta di rumore aggiuntivo è ciò che si desidera evitare. –