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:
- Czy jest coś panującymi w kodzie używam? Czy jest lepszy sposób na zrobienie tego? Może inna biblioteka?
- 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?
- 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?
- 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?
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
Brak repozytorium github, wyślij mi e-mail (ian na ianozsvald com), a ja go wykopię (naprawdę chcę to zrobić ...). –
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ąć. –