Améliorer les performances OCR sur les scanners multi-paragraphes

je travaille sur un projet qui implique l'extraction de textes scientifiques stockés en format PDF. Pour la plupart des papiers, Ceci est accompli assez facilement en utilisant PDFMiner, mais certains vieux papiers stockent leur texte comme de grandes images. Essentiellement, un papier est scanné et ce fichier image (typiquement PNG ou JPEG) comprend la page entière.

j'ai essayé d'utiliser le moteur Tesseract à travers il est python-tesseract les reliures, mais les résultats sont assez décevant.

avant de passer en revue les questions que j'ai avec cette bibliothèque, j'aimerais mentionner que je suis ouvert aux suggestions pour les bibliothèques OCR. Il semble y avoir peu de solutions Python natives.

Ici est une image (JPEG) sur laquelle j'essaie d'extraire du texte. I le code exact fourni dans les extraits d'exemple sur la page de code google de python-tesseract à laquelle j'ai fait référence ci-dessus. Je dois mentionner que la documentation est un peu clairsemée, il est donc tout à fait il est possible que l'une des nombreuses options de mon code soit mal configurée. Tout conseil (ou lien vers des tutoriels approfondis) serait très apprécié.

Ici est la sortie de mon essai à OCR.

Mes questions sont les suivantes:

  1. y a-t-il quelque chose de sous-optimal dans le code que j'utilise? Est-il une meilleure manière de faire ceci? Une autre bibliothèque, peut-être?
  2. quel type de prétraitement puis-je effectuer pour améliorer détection? Les images sont toutes en noir et blanc, mais est-ce que je devrais peut-être mettre un seuil et mettre n'importe quoi au-dessus de lui à une couleur noire de valeur simple et tout au-dessous de lui à une couleur blanche de valeur nulle? Quelque chose d'autre?
  3. une question plus spécifique: peut-on améliorer la performance en effectuant la ROC sur des mots simples? Si oui, est-ce que quelqu'un peut suggérer une façon de délimiter des mots simples dans un fichier image (par exemple: celui lié ci-dessus) et de les extraire dans des images séparées qui peuvent être traitées indépendamment?
  4. la présence de graphiques et d'autres images intégrées dans L'image de la page PDF peut-elle interférer avec la ROC? Dois-je enlever ces? Si oui, quelqu'un peut-il suggérer une méthode pour supprimer automatiquement?

EDIT: Pour simplifier, voici le code que j'ai utilisé.

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

et voici le code altératif (dont les résultats ne sont pas montrés dans cette question, bien que la performance semble être tout à fait similaire.)

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()
<!-Est-ce que quelqu'un pourrait expliquer les différences entre ces deux bribes?

22
demandé sur blz 2012-07-25 21:50:51

2 réponses

Tesseract est très bon sur le texte d'entrée propre (comme votre exemple) si vous bricolez un peu. quelques suggestions:

  • avant d'automatiser, commencez par tesseract à la ligne de commande
  • limitez votre jeu de caractères si possible (par exemple, jetez un coup d'oeil dans /usr/local/share/tessdata/configs at ./chiffres - le configurer pour l'anglais caractères majuscules/minuscules, etc) et les offrir comme un argument de ligne de commande
  • utiliser uniquement les images PNG ou TIFF (TIFF pour les versions plus anciennes) comme JPG présente des artefacts
  • sélectionnez L'image pour que votre texte soit plus grand que la police minuscule actuelle. Lignes de Tesseract > 10 pixels de haut caractères (si la mémoire est bonne), il fonctionne certainement pire avec des caractères minuscules
  • Pas besoin de faire un seuillage si vous êtes bi-niveau déjà, mais il ne fera pas de mal si vous le faites et vous pouvez voir exactement la même image que tesseract va voir

je vais revenir ici pour voir si je peux aider plus mais ne rejoignez la liste de diffusion tesseract, ils sont vraiment utile.

Sidenote - j'ai quelques patches pour pytesseract que je devrais publier pour obtenir des caractères et des confidences et des mots via L'API (ce qui n'était pas possible il y a quelques mois). Crier si elle peut être utile.

12
répondu Ian Ozsvald 2012-07-26 22:20:28

le premier exemple lit le fichier comme un tampon et le relaie ensuite à tesseract-ocr sans aucune modification pendant que le second lit le fichier au format opencv qui vous permettra ensuite de faire une retouche d'image comme changer le rapport d'aspect, échelle de gris et etc en utilisant la bibliothèque cv. La seconde méthode est très utile si vous voulez faire la manipulation d'image avant de passer l'image à tesseract.

BTW, je suis le propriétaire de python-tesseract. Si vous voulez poser des questions, vous vous pouvez toujours envoyer votre question à http://code.google.com/p/python-tesseract

Joe

6
répondu FreeToGo 2012-08-13 17:55:11