2012-07-25 14 views
21

Pracuję nad projektem, który polega na wydobywaniu tekstów naukowych przechowywanych w formacie PDF. W przypadku większości prac jest to całkiem łatwe przy użyciu PDFMiner, ale niektóre starsze dokumenty przechowują swój tekst jako duże obrazy. W istocie, papier jest skanowany, a plik obrazu (zazwyczaj PNG lub JPEG) zawiera całą stronę.Poprawianie wydajności OCR w skanach wielostopniowych

Próbowałem używać silnika Tesseract przez jego powiązania python-tesseract, ale wyniki są dość rozczarowujące.

Zanim przejdę do pytań, które mam z tą biblioteką, chciałbym wspomnieć, że jestem otwarty na sugestie dotyczące bibliotek OCR. Wydaje się, że jest niewiele rodzimych rozwiązań Pythona.

Here to jedno takie zdjęcie (JPEG), na którym próbuję wyodrębnić tekst. Dokładny kod podany w przykładowych fragmentach na stronie kodowej google'a Pythona-tesseract, do którego linkowałem powyżej. Powinienem wspomnieć, że dokumentacja jest nieco skąpa, więc jest całkiem możliwe, że jedna z wielu opcji w moim kodzie jest źle skonfigurowana. Wszelkie porady (lub linki do dogłębnych samouczków) będą mile widziane.

Here to wynik mojej próby rozpoznania OCR.

moje pytania są następujące:

  1. Czy jest coś panującymi w kodzie używam? Czy jest lepszy sposób na zrobienie tego? Może inna biblioteka?
  2. Jaki rodzaj wstępnego przetwarzania mogę wykonać, aby poprawić wykrywanie? Wszystkie obrazy są B & W, ale czy powinienem ustawić próg i ustawić wszystko ponad nim na jednokrotność czarnego koloru i wszystko pod nim na biały kolor o wartości zerowej? Coś jeszcze?
  3. Bardziej szczegółowe pytanie: czy wydajność można poprawić, wykonując OCR w pojedynczych słowach? Jeśli tak, to czy ktoś może zaproponować sposób wytyczenia pojedynczych słów w pliku obrazu (np. Ten powiązany powyżej) i wyodrębnić je na osobne obrazy, które można traktować niezależnie?
  4. Czy obecność wykresów i innych obrazów osadzonych w obrazie strony PDF może zakłócać OCR? Czy powinienem je usunąć? Jeśli tak, czy ktoś może zaproponować metodę automatycznego ich usunięcia?

EDIT: Dla uproszczenia, oto kod użyłem.

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 

I tutaj jest kod alternatywny (którego wyniki nie są wyświetlane w tym pytaniu, chociaż wydajność wydaje się być dość podobna).

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() 

Czy ktoś mógłby wyjaśnić różnice między tymi dwoma fragmentami?

Odpowiedz

12

Tesseract jest bardzo dobry w czystym tekście wejściowym (jak na przykład), jeśli trochę majstrujesz. Niektóre propozycje:

  • Przed automatyzację, zacznij tesserakt w wierszu poleceń
  • zawęzić zestaw znaków, jeśli to możliwe (na przykład spojrzeć w/usr/local/share/tessdata/configs w./ cyfry - skonfiguruj dla angielskich znaków wielkich/małych liter itp.) i podaj je jako argument wiersza poleceń.
  • Używaj tylko obrazów PNG lub TIFF (TIFF dla starszych wersji), ponieważ JPG wprowadza artefakty
  • Powiększ obraz tak, aby twój tekst jest większy niż obecna drobna czcionka. Linie Tesseract> Wysokie znaki o wielkości 10 pikseli (jeśli obsługuje pamięć), to z pewnością działa gorzej z małymi znakami
  • Nie musisz robić progów, jeśli jesteś już dwupoziomowy, ale nie zaszkodzi, jeśli to zrobisz i możesz zobaczyć dokładnie ten sam obraz, który tesseract zobaczy

Sprawdzę tutaj, czy mogę pomóc więcej, ale dołącz do listy mailingowej tesseract, są naprawdę pomocni.

Sidenote - Mam kilka poprawek na pytesseract, które muszę opublikować, aby uzyskać postacie & confidences & słów za pośrednictwem API (co nie było możliwe kilka miesięcy wstecz). Krzyczeć, jeśli mogą być przydatne.

+0

Ozvald, Awesome porady, dzięki! Byłbym naprawdę zainteresowany sprawdzeniem twojego kodu. Czy masz repozytorium github czy coś takiego? Co się tyczy typu pliku graficznego, czy można przekonwertować obrazy JPEG na PNG, czy uszkodzenie już zostało zrobione? Pytam, ponieważ wiele napotkanych plików PDF zapisuje obrazy w formacie JPEG wewnętrznie, więc jeśli problem dotyczy kompresji stratnej, to utknąłem w tym, co mam. – blz

+1

Brak repozytorium github, wyślij mi e-mail (ian na ianozsvald com), a ja go wykopię (naprawdę chcę to zrobić ...). –

+0

Jeśli jest to już JPEG, po prostu zapisałbym go jako TIFF, aby uniknąć dodawania * dodatkowych * artefaktów. Dodanie dodatkowego hałasu jest tym, czego chcesz uniknąć. –

6

Pierwszy przykład odczytuje plik jako bufor, a następnie przekazuje go do tesseract-ocr, nie wykonując żadnych modyfikacji, podczas gdy drugi odczytuje plik do formatu opencv, co pozwala na zmianę wyglądu obrazu, np. Zmianę proporcji obrazu , skali szarości itp. za pomocą biblioteki cv. Druga metoda jest bardzo przydatna, jeśli chcesz zrobić manipulację obrazem przed przekazaniem obrazu do tesseract.

BTW, jestem właścicielem python-tesseract. Jesli chcesz zadać pytanie, można zawsze mile widziane do przekazania zapytanie do http://code.google.com/p/python-tesseract

Joe

+0

wielkie dzięki za wyjaśnienie. Zastanawiałem się, gdzie przyszedł opencv! Przekażę Ci wszelkie pytania, dzięki! – blz