W tym poście postaramy się wyjaśnić technologię stojącą za najczęściej używanym silnikiem Tesseract Engine, który został zaktualizowany o najnowszą wiedzę badaną w zakresie optycznego rozpoznawania znaków. Ten artykuł będzie również służyć jako przewodnik po tym, jak wdrożyć OCR w Pythonie przy użyciu silnika Tesseract. Będziemy przechodzić przez następujące moduły:
- Funkcje Tesseract OCR
- Wstępne przetwarzanie dla OCR przy użyciu OpenCV
- Uruchamianie Tesseract z CLI i Pythonem
- Ograniczenia silnika Tesseract
Spis treści
- Wprowadzenie
- Narzędzia OCR typu open source
- Tesseract OCR
- OCR z Pytesseract i OpenCV
- Szkolenie Tesseract na danych niestandardowych
- Ograniczenia Tesseract
- OCR z Nanonets
- Wnioski
Wprowadzenie
OCR = Optyczne rozpoznawanie znaków. Innymi słowy, systemy OCR przekształcają dwuwymiarowy obraz tekstu, który może zawierać tekst drukowany maszynowo lub odręczny z jego reprezentacji graficznej w tekst do odczytu maszynowego. OCR jako proces zazwyczaj składa się z kilku podprocesów, które mają być wykonywane jak najdokładniej. Podprocesy to:
- Wstępne przetwarzanie obrazu
- Lokalizacja tekstu
- Segmentacja postaci
- Rozpoznawanie postaci
- Przetwarzanie końcowe
Podprocesy na powyższej liście oczywiście mogą się różnić, ale są to z grubsza kroki potrzebne do podejścia do automatycznego rozpoznawania znaków. W oprogramowaniu OCR głównym celem jest identyfikacja i uchwycenie wszystkich unikalnych słów używających różnych języków z pisanych znaków tekstowych.
Od prawie dwudziestu lat systemy optycznego rozpoznawania znaków są szeroko stosowane w celu automatycznego wprowadzania tekstu do systemów komputerowych. Jednak przez cały ten czas konwencjonalne systemy OCR (takie jak strefowy OCR) nigdy nie przezwyciężyły swojej niezdolności do czytania więcej niż garstki czcionek i formatów stron. Czcionka proporcjonalnie rozmieszczona (obejmująca praktycznie wszystkie kopie składu), czcionki drukarek laserowych, a nawet wiele nieproporcjonalnych czcionek maszyn do pisania, pozostały poza zasięgiem tych systemów. W rezultacie konwencjonalny OCR nigdy nie osiągnął więcej niż marginalny wpływ na całkowitą liczbę dokumentów wymagających konwersji do postaci cyfrowej.
Silniki OCR nowej generacji bardzo dobrze radzą sobie z wymienionymi powyżej problemami, wykorzystując najnowsze badania w dziedzinie głębokiego uczenia. Wykorzystując połączenie głębokich modeli i ogromnych publicznie dostępnych zbiorów danych, modele osiągają najnowocześniejsze dokładności w zadaniach. Obecnie jest to również możliwe generować syntetyczne dane z różnymi czcionkami przy użyciu generatywnych sieci przeciwstawnych i kilku innych podejść generatywnych.
Optyczne rozpoznawanie znaków pozostaje trudny problem gdy tekst występuje w nieograniczonych środowiskach, takich jak naturalne scenyze względu na zniekształcenia geometryczne, złożone tła i różne czcionki. Technologia ta nadal ma ogromny potencjał ze względu na różne przypadki użycia OCR opartego na głębokim uczeniu się
- budowanie czytników tablic rejestracyjnych
- digitalizacja faktur
- digitalizacja menu
- digitalizacja dowodów osobistych
Masz na myśli problem z OCR? Chcesz obniżyć koszty wprowadzania danych w swojej organizacji? Udaj się do Nanonet i buduj modele OCR, aby wyodrębnij tekst z obrazów or wyodrębniać dane z plików PDF z opartą na sztucznej inteligencji OCR PDF!
Narzędzia OCR typu open source
Istnieje wiele optyczne rozpoznawanie znaków dostępne oprogramowanie. Nie znalazłem żadnego porównania jakości między nimi, ale napiszę o niektórych z nich, które wydają się najbardziej przyjazne dla programistów.
Tesseract - silnik OCR typu open source, który zyskał popularność wśród programistów OCR. Mimo że czasami wdrażanie i modyfikowanie może być bolesne, najdłużej na rynku nie było zbyt wielu darmowych i potężnych alternatyw OCR. Tesseract zaczynał jako doktorat. projekt badawczy w HP Labs, Bristol. Zyskał popularność i został opracowany przez HP w latach 1984–1994. W 2005 r. HP wypuścił Tesseract jako oprogramowanie typu open source. Od 2006 roku jest rozwijany przez Google.
OCRopus - OCRopus to system OCR typu open source, umożliwiający łatwą ocenę i ponowne wykorzystanie komponentów OCR zarówno przez naukowców, jak i firmy. Zbiór programów do analizy dokumentów, a nie system OCR pod klucz. Aby zastosować go do dokumentów, może być konieczne wstępne przetworzenie obrazu, a być może także wyszkolenie nowych modeli. Oprócz samych skryptów rozpoznawania, istnieje kilka skryptów do edycji i poprawiania danych podstawowych, pomiaru współczynników błędów, określania macierzy pomyłki, które są łatwe w użyciu i edycji.
Okular - Ocular działa najlepiej w przypadku dokumentów drukowanych za pomocą prasy ręcznej, w tym dokumentów napisanych w wielu językach. Działa za pomocą wiersza poleceń. Jest to najnowocześniejszy historyczny system OCR. Jego główne cechy to:
- Uczenie się nieznanych czcionek bez nadzoru: wymaga tylko obrazów dokumentów i korpusu tekstu.
- Umiejętność obsługi hałaśliwych dokumentów: niespójne pisanie odręczne, odstępy, wyrównanie w pionie
- Obsługa dokumentów wielojęzycznych, w tym tych, które mają znaczną zmianę kodu na poziomie słów.
- Uczenie się bez nadzoru wzorców odchylenia ortograficznego, w tym archaicznej pisowni i skrótu drukarskiego.
- Jednoczesna, wspólna transkrypcja zarówno w formie dyplomatycznej (dosłownej), jak i znormalizowanej
Szybki OCR - Wspomnę również o silniku OCR napisanym w języku Swift, ponieważ trwają prace nad rozwojem języka Swift jako języka programowania programistycznego używanego do głębokiego uczenia się. Sprawdzić blog aby dowiedzieć się więcej, dlaczego. SwiftOCR to szybka i prosta biblioteka OCR, która wykorzystuje sieci neuronowe do rozpoznawania obrazu. SwiftOCR twierdzi, że ich silnik przewyższa dobrze znaną bibliotekę Tessaract.
W tym poście na blogu umieścimy skoncentruj się na Tesseract OCR i dowiedz się więcej o tym, jak to działa i jak jest używane.
Tesseract OCR
Tesseract to silnik rozpoznawania tekstu (OCR) typu open source, dostępny na licencji Apache 2.0. Można go używać bezpośrednio lub (w przypadku programistów) za pomocą interfejsu API w celu wyodrębnienia drukowanego tekstu z obrazów. Obsługuje wiele różnych języków. Tesseract nie ma wbudowanego interfejsu GUI, ale dostępnych jest kilka z nich Strona trzeciej strony. Tesseract jest kompatybilny z wieloma językami programowania i frameworkami dzięki opakowaniom, które można znaleźć tutaj. Może być używany z istniejącą analizą układu do rozpoznawania tekstu w dużym dokumencie lub może być używany w połączeniu z zewnętrznym wykrywaczem tekstu do rozpoznawania tekstu z obrazu pojedynczej linii tekstu.
Tesseract 4.00 zawiera nowy podsystem sieci neuronowej skonfigurowany jako rozpoznawanie linii tekstu. Ma swój początek w LSTM oparty na Pythonie OCRopus implementację, ale został przeprojektowany dla Tesseract w C ++. System sieci neuronowych w Tesseraccie poprzedza TensorFlow, ale jest z nim kompatybilny, ponieważ istnieje język opisu sieci o nazwie Variable Graph Specification Language (VGSL), który jest również dostępny dla TensorFlow.
Aby rozpoznać obraz zawierający pojedynczy znak, zwykle używamy konwolucyjnej sieci neuronowej (CNN). Tekst o dowolnej długości jest ciągiem znaków, a takie problemy są rozwiązywane za pomocą numerów RNN, a LSTM jest popularną formą RNN. Przeczytaj ten post, aby dowiedzieć się więcej LSTM.
Technologia - jak to działa
LSTM świetnie radzą sobie z uczeniem się sekwencji, ale znacznie zwalniają, gdy liczba stanów jest zbyt duża. Istnieją wyniki empiryczne, które sugerują, że lepiej jest poprosić LSTM o nauczenie się długiej sekwencji niż krótkiej sekwencji wielu zajęć. Tesseract opracowany na podstawie modelu OCRopus w Pythonie, który był rozwidleniem LSMT w C ++, zwanym CLSTM. CLSTM to implementacja modelu rekurencyjnej sieci neuronowej LSTM w języku C ++, wykorzystująca bibliotekę Eigen do obliczeń numerycznych.
Legacy Tesseract 3.x był zależny od wieloetapowego procesu, w którym możemy wyróżnić kroki:
- Znajdowanie słów
- Wyszukiwanie linii
- Klasyfikacja postaci
Wyszukiwanie słów odbywało się poprzez organizowanie wierszy tekstu w kropki, a linie i obszary są analizowane pod kątem tekstu o stałej szerokości lub proporcjonalnej. Wiersze tekstu są dzielone na słowa w różny sposób, w zależności od rodzaju odstępów między znakami. Rozpoznawanie przebiega wówczas jako proces dwuprzebiegowy. W pierwszym przebiegu usiłuje się po kolei rozpoznać każde słowo. Każde zadowalające słowo jest przekazywane do klasyfikatora adaptacyjnego jako dane uczące. Klasyfikator adaptacyjny ma wtedy szansę dokładniejszego rozpoznania tekstu w dolnej części strony.
Modernizacja narzędzia Tesseract polegała na czyszczeniu kodu i dodaniu nowego modelu LSTM. Obraz wejściowy jest przetwarzany w polach (prostokąt) linia po linii, wprowadzając go do modelu LSTM i dając wynik. Na poniższym obrazku możemy wizualizować, jak to działa.
Po dodaniu nowego narzędzia szkoleniowego i przeszkoleniu modelu przy użyciu dużej ilości danych i czcionek, Tesseract osiąga lepszą wydajność. Jednak nie jest wystarczająco dobry, aby pracować nad tekstem odręcznym i dziwnymi czcionkami. Możliwe jest dostrojenie lub przekwalifikowanie górnych warstw do eksperymentów.
Instalowanie Tesseract
Instalacja tesseract w systemie Windows jest łatwa dzięki znalezionym wstępnie skompilowanym plikom binarnym tutaj. Nie zapomnij edytować zmiennej środowiskowej „path” i dodać ścieżkę tesseract. W przypadku instalacji w systemie Linux lub Mac jest instalowany z kilka poleceń.
Po instalacji sprawdź, czy wszystko działa, wpisując polecenie w terminalu lub cmd:
$ tesseract --version
Zobaczysz wyniki podobne do:
tesseract 4.0.0
leptonica-1.76.0
libjpeg 9c : libpng 1.6.34 : libtiff 4.0.9 : zlib 1.2.8
Found AVX2
Found AVX
Found SSE
Możesz później zainstalować opakowanie Pythona dla tesseract za pomocą pip.
$ pip install pytesseract
Biblioteka Tesseract jest dostarczana z poręcznym narzędziem wiersza poleceń o nazwie tesseract. Możemy użyć tego narzędzia do wykonania OCR na obrazach, a wynik jest przechowywany w pliku tekstowym. Jeśli chcemy zintegrować Tesseract z naszym kodem C ++ lub Python, użyjemy API Tesseract.
Uruchamianie Tesseract z CLI
Wywołaj silnik Tesseract na obrazie za pomocą ścieżka_obrazu i przekonwertuj obraz na tekst, wpisując wiersz po wierszu w wierszu polecenia, wpisując:
$ tesseract image_path stdout
Aby zapisać tekst wyjściowy w pliku:
$ tesseract image_path text_result.txt
Aby określić nazwę modelu języka, wpisz skrót językowy po -l flaga, domyślnie pobiera język angielski:
$ tesseract image_path text_result.txt -l eng
Domyślnie Tesseract podczas segmentowania obrazu oczekuje strony tekstu. Jeśli chcesz tylko OCR małego regionu, wypróbuj inny tryb segmentacji, używając –Psm argument. Dostępnych jest 14 trybów, które można znaleźć tutaj. Domyślnie Tesseract w pełni automatyzuje segmentację stron, ale nie przeprowadza orientacji ani wykrywania skryptów. Aby określić parametr, wpisz:
$ tesseract image_path text_result.txt -l eng --psm 6
Jest jeszcze jeden ważny argument, tryb silnika OCR (oem). Tesseract 4 ma dwa silniki OCR - silnik Legacy Tesseract i silnik LSTM. Istnieją cztery tryby pracy wybrane za pomocą opcji –oem.
0 Tylko starszy silnik.
1 Tylko silnik sieci neuronowych LSTM.
2 silniki Legacy + LSTM.
3 Domyślne, w oparciu o to, co jest dostępne.
OCR z Pytesseract i OpenCV
Pytesseract to opakowanie dla silnika Tesseract-OCR. Jest również przydatny jako samodzielny skrypt wywołujący tesseract, ponieważ może odczytywać wszystkie typy obrazów obsługiwane przez biblioteki obrazowania Pillow i Leptonica, w tym jpeg, png, gif, bmp, tiff i inne. Więcej informacji o podejściu do Pythona przeczytaj tutaj. Kod tego samouczka można znaleźć w tym składnica.
import cv2 import pytesseract img = cv2.imread('image.jpg') # Adding custom options
custom_config = r'--oem 3 --psm 6'
pytesseract.image_to_string(img, config=custom_config)
Przetwarzanie wstępne dla Tesseract
Aby uniknąć wszystkich przypadków, w których dokładność wyniku tesseraktu może spaść, musisz upewnić się, że obraz jest odpowiedni wstępnie przetworzone.
Obejmuje to przeskalowanie, binaryzację, usuwanie szumów, prostowanie itp.
Aby wstępnie przetworzyć obraz pod kątem OCR, użyj dowolnej z następujących funkcji języka Python lub postępuj zgodnie z instrukcjami Dokumentacja OpenCV.
import cv2
import numpy as np img = cv2.imread('image.jpg') # get grayscale image
def get_grayscale(image): return cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # noise removal
def remove_noise(image): return cv2.medianBlur(image,5) #thresholding
def thresholding(image): return cv2.threshold(image, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)[1] #dilation
def dilate(image): kernel = np.ones((5,5),np.uint8) return cv2.dilate(image, kernel, iterations = 1) #erosion
def erode(image): kernel = np.ones((5,5),np.uint8) return cv2.erode(image, kernel, iterations = 1) #opening - erosion followed by dilation
def opening(image): kernel = np.ones((5,5),np.uint8) return cv2.morphologyEx(image, cv2.MORPH_OPEN, kernel) #canny edge detection
def canny(image): return cv2.Canny(image, 100, 200) #skew correction
def deskew(image): coords = np.column_stack(np.where(image > 0)) angle = cv2.minAreaRect(coords)[-1] if angle < -45: angle = -(90 + angle) else: angle = -angle (h, w) = image.shape[:2] center = (w // 2, h // 2) M = cv2.getRotationMatrix2D(center, angle, 1.0) rotated = cv2.warpAffine(image, M, (w, h), flags=cv2.INTER_CUBIC, borderMode=cv2.BORDER_REPLICATE) return rotated #template matching
def match_template(image, template): return cv2.matchTemplate(image, template, cv2.TM_CCOEFF_NORMED)
Posłużmy się przykładem, aby lepiej zobaczyć sytuację. Tak wygląda nasz oryginalny obraz –
Po wstępnym przetworzeniu za pomocą następującego kodu
image = cv2.imread('aurebesh.jpg') gray = get_grayscale(image)
thresh = thresholding(gray)
opening = opening(gray)
canny = canny(gray)
i wykreślając powstałe obrazy, otrzymujemy następujące wyniki.
Wynik dla oryginalnego obrazu wygląda następująco:
GALACTIC BASIC
(AUREBESH) RE HFVMEVEIiZwoyv Ze
ABC DE F GH I JK LM
N—0- PQ RST Uv WX
2 | Ff 8 G& Pf fF § 5 op 7
ee
5, jf FF Ty ee ee
=
334 477 OED
Oto jak wygląda wynik dla różnych wstępnie przetworzonych obrazów –
Sprytny obraz krawędzi (niezbyt dobry) -
CAE Cn Cae AS
(AUREBESE) EA Na
oe SS
(Ne CI (ENE
a, ee oe ea
2
a a A: rc
|, |
a
Sear eo/e ecm emclomt Cia cuoomct mi im
Obraz progowy -
GALACTIC BASIC
(AVREBESH)
RS 7FVMeEVEi1iFf o£
A B C D EF GH IJ K LM
AOoder7Nnvroroava
N O P Q@R S$ TU VW XK Y¥ Z
7 ee For 8 Ro Pf F Boao om #
0 12 3 4 5 6 7 8 9 , . !
>» 1kr7 @ by FEN
2? S$ ( Por Foy of ee
ASGSANDIE
CH AE EO KH NG OO SH TH
Obraz początkowy -
GALACTIC BASIC
(AUREZEBELSH)
KEE VTMEUOU EB iw oN es
A BC D EF F @ H | J K LT Ww
AOGdrcrT7WTt HYOAVa4
WO P Q R BS T U VW WK y Z
i J
Oo 1 2 3 46 8 7 SC Ps,
VY ir- -rp,ptUuY?
a a a
AGoOAnNnoOID
CH AE BO KH ®@ OO SH TH
Tworzenie ramek wokół tekstu
Korzystając z Pytesseract, możesz uzyskać informacje o obwiedni dla wyników OCR, korzystając z poniższych kod.
Poniższy skrypt poda informacje o obwiedni dla każdego znaku wykrytego przez tesserakt podczas OCR.
import cv2
import pytesseract img = cv2.imread('image.jpg') h, w, c = img.shape
boxes = pytesseract.image_to_boxes(img) for b in boxes.splitlines(): b = b.split(' ') img = cv2.rectangle(img, (int(b[1]), h - int(b[2])), (int(b[3]), h - int(b[4])), (0, 255, 0), 2) cv2.imshow('img', img)
cv2.waitKey(0)
Jeśli chcesz mieć ramki wokół słów zamiast znaków, funkcja image_to_data
przyda się. Możesz użyć image_to_data
funkcja z typem wyjścia określonym za pomocą pytesseract Output
.
Masz na myśli problem z OCR? Chcesz zdigitalizować faktury, pliki PDF lub tablice rejestracyjne? Udaj się do Nanonet i buduj modele OCR za darmo!
Użyjemy powyższego przykładowego obrazu faktury, aby przetestować nasze wyniki tesseraktu.
import cv2
import pytesseract
from pytesseract import Output img = cv2.imread('invoice-sample.jpg') d = pytesseract.image_to_data(img, output_type=Output.DICT)
print(d.keys())
Powinno to dać następujący wynik -
dict_keys(['level', 'page_num', 'block_num', 'par_num', 'line_num', 'word_num', 'left', 'top', 'width', 'height', 'conf', 'text'])
Korzystając z tego słownika, możemy uzyskać informacje o każdym wykrytym słowie, jego obwiedni, zawartym w nich tekście i wynikach ufności każdego z nich.
Możesz wykreślić pola za pomocą poniższego kodu -
n_boxes = len(d['text'])
for i in range(n_boxes): if int(d['conf'][i]) > 60: (x, y, w, h) = (d['left'][i], d['top'][i], d['width'][i], d['height'][i]) img = cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2) cv2.imshow('img', img)
cv2.waitKey(0)
Oto jak by to wyglądało w przypadku obrazu przykładowej faktury.
Dopasowanie szablonu tekstowego
Weź przykład próby znalezienia daty na obrazie. Tutaj nasz szablon będzie wzorem wyrażenia regularnego, który dopasujemy do naszych wyników OCR, aby znaleźć odpowiednie obwiednie. Będziemy używać regex
moduł i image_to_data
funkcja do tego.
import re
import cv2
import pytesseract
from pytesseract import Output img = cv2.imread('invoice-sample.jpg')
d = pytesseract.image_to_data(img, output_type=Output.DICT)
keys = list(d.keys()) date_pattern = '^(0[1-9]|[12][0-9]|3[01])/(0[1-9]|1[012])/(19|20)dd$' n_boxes = len(d['text'])
for i in range(n_boxes): if int(d['conf'][i]) > 60: if re.match(date_pattern, d['text'][i]): (x, y, w, h) = (d['left'][i], d['top'][i], d['width'][i], d['height'][i]) img = cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2) cv2.imshow('img', img)
cv2.waitKey(0)
Zgodnie z oczekiwaniami na obrazie otrzymujemy jedno pole wokół daty faktury.
Tryby segmentacji stron
Istnieje kilka sposobów analizy strony tekstu. Interfejs API tesseract udostępnia kilka trybów segmentacji stron, jeśli chcesz uruchomić OCR tylko na małym obszarze lub w różnych orientacjach itp.
Oto lista obsługiwanych trybów segmentacji strony przez tesseract –
0 Tylko orientacja i wykrywanie skryptów (OSD).
1 Automatyczna segmentacja strony z OSD.
2 Automatyczna segmentacja stron, ale bez OSD ani OCR.
3 W pełni automatyczna segmentacja stron, ale bez OSD. (Domyślna)
4 Załóżmy, że jest to jedna kolumna tekstu o różnych rozmiarach.
5 Załóżmy, że jest to pojedynczy jednolity blok tekstu wyrównanego w pionie.
6 Załóżmy, że jest to jeden jednolity blok tekstu.
7 Traktuj obraz jako pojedynczą linię tekstu.
8 Traktuj obraz jako jedno słowo.
9 Traktuj obraz jako pojedyncze słowo w okręgu.
10 Traktuj obraz jako pojedynczy znak.
11 Rzadki tekst. Znajdź jak najwięcej tekstu w dowolnej kolejności.
12 Rzadki tekst z OSD.
13 Surowa linia. Traktuj obraz jako pojedynczą linię tekstu, omijając hacki specyficzne dla Tesseract.
Aby zmienić tryb segmentacji stron, zmień plik --psm
argument w niestandardowym ciągu konfiguracyjnym do dowolnego z wyżej wymienionych kodów trybu.
Wykryj orientację i skrypt
Możesz wykryć orientację tekstu na obrazie, a także skrypt, w którym jest napisany. Poniższy obraz -
po wykonaniu następującego kodu -
osd = pytesseract.image_to_osd(img)
angle = re.search('(?<=Rotate: )d+', osd).group(0)
script = re.search('(?<=Script: )d+', osd).group(0)
print("angle: ", angle)
print("script: ", script)
wydrukuje następujące dane wyjściowe.
angle: 90
script: Latin
Wykrywaj tylko cyfry
Weźmy na przykład ten obraz -
Tekst wyodrębniony z tego obrazu wygląda następująco.
‘Customer name Hallium Energy services
Project NEHINS-HIB-HSA
lavoice no 43876324
Dated 17%h Nov2018
Pono 76496234
Możesz rozpoznać tylko cyfry, zmieniając konfigurację na następującą
custom_config = r'--oem 3 --psm 6 outputbase digits'
print(pytesseract.image_to_string(img, config=custom_config))
Wynik będzie wyglądał następująco.
-- . 43876324
172018
0 76496234
Białe znaki
Powiedzmy, że chcesz wykryć tylko określone znaki z podanego obrazu i zignorować resztę. Możesz określić swoją białą listę znaków (tutaj użyliśmy tylko małych liter od a do z), używając następującej konfiguracji.
custom_config = r'-c tessedit_char_whitelist=abcdefghijklmnopqrstuvwxyz --psm 6'
print(pytesseract.image_to_string(img, config=custom_config))
Wynik -
customername
roject
tnvoleeno
ated alliumenergyservices
e
thovo
Postacie na czarnej liście
Jeśli jesteś pewien, że niektóre znaki lub wyrażenia na pewno nie pojawią się w twoim tekście (w przeciwnym razie OCR zwróci niewłaściwy tekst zamiast znaków z czarnej listy), możesz dodać te znaki do czarnej listy, używając następującej konfiguracji.
custom_config = r'-c tessedit_char_blacklist=0123456789 --psm 6'
pytesseract.image_to_string(img, config=custom_config)
Wynik -
Customer name Hallium Energy services
Project NEHINS-HIB-HSA
lavoice no
Dated %h Nov%
Pono
Wykrywaj w wielu językach
Możesz sprawdzić dostępne języki, wpisując to w terminalu
$ tesseract --list-langs
Aby pobrać tesseract do użytku w określonym języku
$ sudo apt-get install tesseract-ocr-LANG
gdzie LANG to trzyliterowy kod języka, którego potrzebujesz. Możesz znaleźć wartości LANG tutaj.
Możesz pobrać .traindata
plik dla języka, którego potrzebujesz tutaj i umieść go w $TESSDATA_PREFIX
katalog (powinien być taki sam, jak gdzie tessdata
jest zainstalowany) i powinien być gotowy do użycia.
Note - Tylko języki, które mają rozszerzenie .traineddata
formaty plików są obsługiwane przez tesseract.
Aby określić język, w którym chcesz uzyskać wyjście OCR, użyj rozszerzenia -l LANG
argument w konfiguracji, gdzie LANG to 3-literowy kod języka, którego chcesz używać.
custom_config = r'-l eng --psm 6'
pytesseract.image_to_string(img, config=custom_config)
Weźmy na przykład ten obraz -
Możesz pracować z wieloma językami, zmieniając parametr LANG jako taki -
custom_config = r'-l grc+tha+eng --psm 6'
pytesseract.image_to_string(img, config=custom_config)
a otrzymasz następujący wynik -
Here’s some Greek: Οδιο διστα ιμπεδιτ φιμ ει, αδ φελ αβχορρεανθ ελωκυενθιαμ, εξ εσε εξερσι γυ-
βεργρεν ηας. Ατ μει σολετ σριπτορεμ. ἴυς αλια λαβωρε θε. Σιθ κυωτ νυσκυαμ
τρασυνδια αν, ὠμνιυμ ελιγενδι τιν πρι. Παρτεμ φερθερεμ συσιπιαντὺυρ εξ ιυς,ναμ
%0790 แ ร เง ๑ ๕ 80 ๕ 6 ๑ อ 06 ส 0 เง น อ ๓ , πρω πρωπριαε σαεφολα ιδ. Ατ πρι δολορ νυ-
σκυαμ. 6 Thai Here’s some Thai: ν᾿ ค อ ร ั ป ซั น จ ุ ้ ย โป ร ด ิ ว เซ อ ร ์ ส ถา ป ั ต ย ์ จ ๊ า บ แจ ็ ก พ ็ อ ต ม ้ า ห ิ น อ ่ อ น ซา ก ุ ร ะ ค ั น ถ ธ ุ ร ะ ฟิ ด ส ต า ร ์ ท ง ี ้ บ อ ย
ค อ ต อ ื ่ ม แป ร ั ส ั ง โฆ ค ํ า ส า ป แฟ น ซี ศิ ล ป ว ั ฒ น ธร ร ม ไฟ ล ท ์ จ ิ ๊ ก โก ๋ ก ั บ ด ั ก เจ ล พ ล ็ อ ต ม า ม ่ า ซา ก ุ ร ะ ด ี ล เล อ
ร ์ ซี น ด ั ม พ ์ แฮ ป ป ี ้ เอ ๊ ้ า ะ อ ุ ร ั ง ค ธา ต ุ ซิ ม ฟิ น ิ ก ซ์ เท ร ล เล ่ อ ร ์ อ ว อ ร ์ ด แค น ย อ น ส ม า พ ั น ธ์ ค ร ั ว ซอ ง ฮั ม อ า
ข่ า เอ ็ ก ซ์ เพ ร ส
Note - język określony jako pierwszy w -l
parametr jest językiem podstawowym.
Niestety tesseract nie ma funkcji automatycznego wykrywania języka tekstu na obrazie. Alternatywne rozwiązanie zapewnia inny moduł Pythona o nazwie langdetect
które można zainstalować za pomocą pip.
$ pip install langdetect
Ten moduł ponownie nie wykrywa języka tekstu za pomocą obrazu, ale wymaga wprowadzenia ciągu, aby wykryć język. Najlepszym sposobem na to jest użycie najpierw tesseraktu, aby uzyskać tekst OCR we wszystkich językach, które według Ciebie są, używając langdetect
aby znaleźć języki zawarte w tekście OCR, a następnie ponownie uruchom OCR ze znalezionymi językami.
Powiedzmy, że mamy tekst, który naszym zdaniem był w języku angielskim i portugalskim.
custom_config = r'-l eng+por --psm 6'
txt = pytesseract.image_to_string(img, config=custom_config) from langdetect import detect_langs
detect_langs(txt)
Powinno to dać listę języków w tekście i ich prawdopodobieństw.
[en:0.714282468983554, es:0.2857145605644145]
Kody języków używane przez langdetect
postępuj zgodnie z kodami ISO 639-1. Aby porównać, sprawdź to i to. Okazuje się, że zamiast tego językiem używanym w tekście są angielski i hiszpański.
Otrzymujemy tekst ponownie, zmieniając config na
custom_config = r'-l eng+spa --psm 6'
txt = pytesseract.image_to_string(img, config=custom_config)
Note – Tesseract działa źle, gdy na obrazie z wieloma językami języki określone w konfiguracji są nieprawidłowe lub w ogóle nie są wymienione. Może to również wprowadzić w błąd moduł langdetect.
Korzystanie z tessdata_fast
Jeśli zależy Ci na szybkości, możesz zastąpić modele języka tessdata modelami tessdata_fast, które są 8-bitowymi wersjami modeli tessdata w postaci liczb całkowitych.
Zgodnie z tessdata_fast GitHub -
To repozytorium zawiera szybkie wersje liczb całkowitych przeszkolonych modeli dla Silnik Tesseract Open Source OCR.
Te modele działają tylko z silnikiem LSTM OCR Tesseract 4.
- Stanowią one kompromis między szybkością a dokładnością, oferujący najlepszy stosunek jakości do ceny w zakresie szybkości i dokładności.
- W przypadku niektórych języków jest to nadal najlepsze, ale w większości nie.
- Następnie w celu zwiększenia szybkości połączono konfigurację sieci o „najlepszym stosunku jakości do ceny”.
- Większość użytkowników będzie chciała używać tych wyszkolonych plików danych do wykonywania OCR i będą one dostarczane jako część dystrybucji Linuksa, np. Ubuntu 18.04
- Precyzyjne / stopniowe szkolenie będzie NIE być możliwe z tych
fast
modele, ponieważ są 8-bitowymi liczbami całkowitymi. - Podczas korzystania z modeli w tym repozytorium obsługiwany jest tylko nowy silnik OCR oparty na LSTM. Dziedzictwo
tesseract
silnik nie jest obsługiwany z tymi plikami, więc tryby OEM Tesseract „0” i „2” nie będą z nimi działać.
Aby korzystać z tessdata_fast
modele zamiast tessdata
, wszystko, co musisz zrobić, to pobrać plik tessdata_fast
plik danych językowych z tutaj i umieść go w swoim $TESSDATA_PREFIX
katalogiem.
Chcesz zdigitalizować dokumenty, pokwitowania lub faktury, ale jesteś zbyt leniwy, aby kodować? Udaj się do Nanonet i buduj modele OCR za darmo!
Szkolenie Tesseract na danych niestandardowych
Tesseract 4.00 zawiera nowy silnik rozpoznawania oparty na sieci neuronowej, który zapewnia znacznie większą dokładność w przypadku obrazów dokumentów. Sieci neuronowe wymagają znacznie więcej danych szkoleniowych i trenują znacznie wolniej niż podstawowy Tesseract. W przypadku języków opartych na alfabecie łacińskim istniejące dane modelu zostały przeszkolone dla około 400000 wierszy tekstu obejmujących około 4500 czcionek.
Aby pomyślnie uruchomić samouczek szkoleniowy Tesseract 4.0 LSTM, musisz mieć działającą instalację narzędzi szkoleniowych Tesseract 4 i Tesseract 4, a także skrypty szkoleniowe i wymagane pliki danych przeszkolonych w niektórych katalogach. Wizyta repozytorium github na pliki i narzędzia.
Tesseract 4.00 trenuje od zera od kilku dni do kilku tygodni. Dlatego nawet przy tych wszystkich nowych danych treningowych jest kilka opcji treningu:
- Dostroić - Zaczynając od istniejącego wyszkolonego języka, trenuj na określonych dodatkowych danych. Na przykład szkolenie na odręcznym zestawie danych i kilku dodatkowych czcionkach.
- Odetnij górną warstwę – z sieci i przeszkolić nową, najwyższą warstwę, korzystając z nowych danych. Jeśli dostrajanie nie zadziała, najprawdopodobniej jest to kolejna najlepsza opcja. Analogię, dlaczego jest to przydatne, weźmy na przykład modele instancji przeszkolone w zestawie danych ImageNet. Celem jest zbudowanie klasyfikatora kota lub psa. Niższe warstwy modelu dobrze radzą sobie z abstrakcją na niskim poziomie, jak narożniki, linie poziome i pionowe, ale wyższe warstwy modelu łączą te cechy i wykrywają uszy, oczy, nos kota lub psa i tak dalej. Przekwalifikowując tylko najwyższe warstwy, korzystasz z wiedzy z niższych warstw i łączysz ją z nowym, innym zbiorem danych.
- Trenuj ponownie od zera - To bardzo powolne podejście, chyba że masz bardzo reprezentatywny i wystarczająco duży zestaw treningowy dla swojego problemu. Najlepszym źródłem informacji na temat szkolenia od podstaw jest przestrzeganie tego repozytorium github.
Przewodnik, jak trenować z niestandardowymi danymi i tworzyć .traineddata
pliki można znaleźć tutaj, tutaj i tutaj.
W tym poście na blogu nie będziemy omawiać kodu do szkolenia przy użyciu Tesseract.
Ograniczenia Tesseract
Tesseract działa najlepiej, gdy istnieje wyraźna segmentacja tekstu pierwszego planu od tła. W praktyce zagwarantowanie tego typu konfiguracji może być niezwykle trudne. Istnieje wiele powodów, dla których możesz nie uzyskać dobrej jakości obrazu z Tesseract, np. Jeśli obraz ma szum w tle. Im lepsza jakość obrazu (rozmiar, kontrast, oświetlenie), tym lepszy wynik rozpoznawania. Wymaga trochę wstępnego przetwarzania, aby poprawić wyniki OCR, obrazy muszą być odpowiednio przeskalowane, mieć jak największy kontrast obrazu, a tekst musi być wyrównany w poziomie. Tesseract OCR jest dość potężny, ale ma następujące ograniczenia.
Ograniczenia Tesseract podsumowane na liście.
- OCR nie jest tak dokładny, jak niektóre dostępne nam rozwiązania komercyjne.
- Nie radzi sobie dobrze z obrazami, na których występują artefakty, w tym częściowa okluzja, zniekształcona perspektywa i złożone tło.
- Nie jest w stanie rozpoznać pisma ręcznego.
- Może znaleźć bełkot i zgłosić to jako wyjście OCR.
- Jeśli dokument zawiera języki inne niż podane w argumentach -l LANG, wyniki mogą być słabe.
- Nie zawsze dobrze jest analizować naturalną kolejność czytania dokumentów. Na przykład może nie rozpoznać, że dokument zawiera dwie kolumny i może próbować łączyć tekst w kolumnach.
- Skany o niskiej jakości mogą powodować rozpoznawanie OCR o niskiej jakości.
- Nie ujawnia informacji o tym, do jakiej rodziny czcionek należy tekst.
Istnieje oczywiście lepszy, znacznie prostszy i bardziej intuicyjny sposób wykonywania zadań OCR.
OCR z Nanonets
Połączenia Nanonet OCR API pozwala z łatwością budować modele OCR. Nie musisz martwić się o wstępne przetwarzanie swoich obrazów, dopasowywanie szablonów lub budowanie silników opartych na regułach, aby zwiększyć dokładność modelu OCR.
Możesz przesyłać dane, dodawać do nich adnotacje, ustawiać model do trenowania i czekać na otrzymanie prognoz za pośrednictwem interfejsu użytkownika opartego na przeglądarce bez pisania ani jednej linii kodu, martwienia się o GPU lub znajdowania odpowiednich architektur dla modeli uczenia głębokiego. Możesz także uzyskać odpowiedzi JSON dla każdej prognozy, aby zintegrować ją z własnymi systemami i tworzyć aplikacje oparte na uczeniu maszynowym, oparte na najnowocześniejszych algorytmach i silnej infrastrukturze.
Korzystanie z GUI: https://app.nanonets.com/
Możesz również skorzystać z interfejsu API Nanonets-OCR, wykonując poniższe czynności:
Krok 1: Sklonuj repozytorium, zainstaluj zależności
git clone https://github.com/NanoNets/nanonets-ocr-sample-python.git
cd nanonets-ocr-sample-python
sudo pip install requests tqdm
Krok 2: Uzyskaj darmowy klucz API
Uzyskaj bezpłatny klucz API od http://app.nanonets.com/#/keys
Krok 3: Ustaw klucz API jako zmienną środowiskową
export NANONETS_API_KEY=YOUR_API_KEY_GOES_HERE
Krok 4: Utwórz nowy model
python ./code/create-model.py
Uwaga: Generuje to MODEL_ID, którego potrzebujesz do następnego kroku
Krok 5: Dodaj identyfikator modelu jako zmienną środowiskową
export NANONETS_MODEL_ID=YOUR_MODEL_ID
Uwaga: otrzymasz YOUR_MODEL_ID z poprzedniego kroku
Krok 6: Prześlij dane treningowe
Dane szkoleniowe znajdują się w images
(pliki graficzne) i annotations
(adnotacje do plików graficznych)
python ./code/upload-training.py
Krok 7: Wytrenuj model
Po przesłaniu obrazów rozpocznij szkolenie Modela
python ./code/train-model.py
Krok 8: Uzyskaj stan modelu
Trenowanie modelu zajmuje około 2 godzin. Otrzymasz wiadomość e-mail, gdy model zostanie przeszkolony. W międzyczasie sprawdzasz stan modelu
python ./code/model-state.py
Krok 9: Dokonaj prognozy
Po przeszkoleniu modelu. Możesz tworzyć prognozy za pomocą modelu
python ./code/prediction.py ./images/151.jpg
Nanosieci i ludzie w pętli
Ekran „Umiarkowane” wspomaga procesy poprawiania i wprowadzania danych oraz zmniejsza obciążenie pracy recenzenta ręcznego o prawie 90% i zmniejsza koszty organizacji o 50%.
Dodatki zawarte
- Śledź prognozy, które są poprawne
- Śledź, które są złe
- Wprowadź poprawki do niedokładnych
- Usuń te, które są błędne
- Uzupełnij brakujące prognozy
- Filtruj obrazy według zakresów dat
- Zliczaj obrazy moderowane w porównaniu z tymi, które nie są moderowane
Wszystkie pola są zorganizowane w łatwy w użyciu graficzny interfejs użytkownika, który pozwala użytkownikowi korzystać z technologii OCR i pomagać w ulepszaniu jej na bieżąco, bez konieczności wpisywania kodu lub zrozumienia, jak działa ta technologia.
Masz na myśli problem z OCR? Chcesz obniżyć koszty wprowadzania danych w swojej organizacji? Udaj się do Nanonet i buduj modele OCR, aby wyodrębnij tekst z obrazów or wyodrębniać dane z plików PDF!
Wnioski
Tak jak głębokie uczenie wpłynęło na prawie każdy aspekt widzenia komputerowego, to samo dotyczy rozpoznawania znaków i rozpoznawania pisma ręcznego. Modele oparte na głębokim uczeniu zdołały uzyskać bezprecedensową dokładność rozpoznawania tekstu, znacznie wykraczającą poza tradycyjne ekstrakcja informacji i przetwarzanie obrazu przez uczenie maszynowe awanse.
Tesseract działa dobrze, gdy obrazy dokumentów są zgodne z następującymi wytycznymi:
- Czysta segmentacja tekstu pierwszego planu od tła
- Wyrównane w poziomie i odpowiednio przeskalowane
- Wysokiej jakości obraz bez rozmazań i szumów
Najnowsza wersja Tesseract 4.0 obsługuje OCR oparty na głębokim uczeniu się, który jest znacznie dokładniejszy. Sam silnik OCR jest zbudowany w oparciu o sieć pamięci długoterminowej (LSTM), rodzaj rekurencyjnej sieci neuronowej (RNN).
Tesseract jest idealny do skanowania czystych dokumentów i zapewnia dość dużą dokładność i zmienność czcionek, ponieważ jego szkolenie było wszechstronne. Powiedziałbym, że Tesseract jest narzędziem, do którego się wybierasz, jeśli Twoim zadaniem jest skanowanie książek, dokumentów i drukowanego tekstu na czystym białym tle.
Inne dokumenty
- Najlepiej wyszkolony model dla LSTM Tesseract 4.0
- Podejście Dropbox do OCR 4.2017
- Przegląd starszego silnika Tesseract OCR
- Forum dla programistów Tesseract
- Forum dla użytkowników Tesseract
- Porównanie dokładności OCR w przypadku wczesnych druków książek przy użyciu narzędzia
Silniki Open Source Calamari i OCRopus - Wydajny, pozbawiony leksykonów OCR wykorzystujący głębokie uczenie się
- Przydatność silników OCR w systemach ekstrakcji informacji – ocena porównawcza
- Test porównawczy DeepTexta
- Lista projektów OCR
- Najnowsze wydanie Tesseract Github
- CVPR 2019 – Świadomość regionu znaku na potrzeby wykrywania tekstu (CRAFT)
- OCR karty kredytowej z OpenCV i Pythonem
- Wstępne przetwarzanie obrazu
- Wstępne przetwarzanie obrazu w OpenCV
- OCR przy użyciu Tesseract na Raspberry Pi
- Tesseract OCR dla języków innych niż angielski
- Jak wykonać OCR z wiersza poleceń systemu Linux za pomocą Tesseract
- Przegląd silnika Tesseract OCR
aktualizacja:
Wiele osób pytało nas, w jaki sposób mogą uzyskać datę w postaci tekstu lub użyć, gdy wykryje datę lub inne konkretne dane, aby mogli dołączyć do listy.
Oto odpowiedź:
W kodzie do narysowania prostokąta ograniczającego wokół pola daty zauważysz linię, która pasuje do wzorca wyrażenia regularnego zd['text']
. Rysuje ramkę tylko wtedy, gdy wzór pasuje. Możesz po prostu wyodrębnić wartości zd['text']
po dopasowaniu wzoru i dołącz je do listy.
Aktualizacja 2:
Aby odpowiedzieć na pytania dotyczące rozpoznawania OCR w języku innym niż angielski, zaktualizowaliśmy dalsze listy lektur.
- 100
- 2019
- 7
- 9
- O nas
- Stosownie
- dokładny
- osiągnięty
- nabyć
- w poprzek
- Dodatkowy
- adres
- Korzyść
- AI
- AIDS
- Algorytmy
- Wszystkie kategorie
- Pozwalać
- wśród
- analiza
- Inne
- api
- podejście
- mobilne i webowe
- POWIERZCHNIA
- argumenty
- na około
- Sztuka
- artykuł
- zautomatyzowane
- dostępny
- świadomość
- jest
- BEST
- Bit
- Blog
- Książki
- granica
- Pudełko
- przeglądarka
- budować
- wbudowany
- Może uzyskać
- CD
- zmiana
- Okrągłe
- roszczenia
- Sprzątanie
- CNN
- kod
- kolekcja
- Kolumna
- połączenie
- handlowy
- Firmy
- kompleks
- pewność siebie
- systemu
- zamieszanie
- zawiera
- Konwersja
- Korekty
- Koszty:
- mógłby
- Para
- dane
- sprawa
- wykryte
- Wykrywanie
- określaniu
- rozwinięty
- deweloperzy
- oprogramowania
- ZROBIŁ
- różnić się
- różne
- cyfrowy
- digitalizować
- cyfry
- dokumenty
- na dół
- Spadek
- Dropbox
- Wcześnie
- krawędź
- Punkt końcowy
- energia
- Angielski
- Środowisko
- wszystko
- przykład
- spodziewany
- oczekuje
- członków Twojej rodziny
- FAST
- Cecha
- Korzyści
- Łąka
- i terminów, a
- pływ
- obserwuj
- następujący
- widelec
- Nasz formularz
- format
- formularze
- znaleziono
- Darmowy
- funkcjonować
- miejsce
- git
- GitHub
- Dający
- cel
- dobry
- szary
- Grayscale
- wspaniały
- poprowadzi
- wytyczne
- hacki
- mający
- głowa
- tutaj
- Wysoki
- posiada
- W jaki sposób
- How To
- HTTPS
- olbrzymi
- Ludzie
- zidentyfikować
- obraz
- Rezultat
- wdrożenia
- ważny
- podnieść
- W innych
- włączony
- Włącznie z
- Zwiększać
- Informacje
- Informacja
- Infrastruktura
- integrować
- intuicyjny
- IT
- przystąpić
- Klawisz
- Klawisze
- wiedza
- znany
- Labs
- język
- Języki
- duży
- firmy
- UCZYĆ SIĘ
- nauka
- Biblioteka
- Licencja
- błyskawica
- Linia
- linux
- Lista
- wykazy
- długo
- mac
- maszyna
- uczenie maszynowe
- poważny
- Dokonywanie
- podręcznik
- rynek
- Mecz
- Pamięć
- nic
- model
- modele
- większość
- sieć
- oparty na sieci
- sieci
- Hałas
- koncepcja
- open source
- otwarcie
- Option
- Opcje
- zamówienie
- organizowanie
- Inne
- Inaczej
- Wzór
- Ludzie
- jest gwarancją najlepszej jakości, które mogą dostarczyć Ci Twoje monitory,
- perspektywa
- biedny
- Popularny
- możliwy
- mocny
- przepowiednia
- Przewidywania
- naciśnij
- bardzo
- pierwotny
- Problem
- wygląda tak
- procesów
- produkować
- Programiści
- Programowanie
- języki programowania
- Programy
- projekt
- zapewniać
- zapewnia
- jakość
- ceny
- Surowy
- RE
- Czytający
- Przyczyny
- zmniejszyć
- regularny
- pozostał
- raport
- składnica
- wymagać
- wymagany
- Badania naukowe
- Zasób
- REST
- Efekt
- run
- bieganie
- skanowanie
- Ekran
- segmentacja
- Usługi
- zestaw
- Short
- podobny
- Prosty
- Rozmiar
- mały
- So
- Tworzenie
- Rozwiązania
- hiszpański
- specyfikacja
- prędkość
- Stan
- Zjednoczone
- silny
- Z powodzeniem
- Utrzymany
- podpory
- SWIFT
- system
- systemy
- zadania
- Technologia
- terminal
- test
- Przez
- czas
- narzędzia
- Top
- tradycyjny
- Trening
- Przekształcać
- leczyć
- Trendy
- Ubuntu
- ui
- zrozumieć
- wyjątkowy
- us
- posługiwać się
- przypadków użycia
- Użytkownicy
- wartość
- wizja
- W
- czekać
- chodzący
- Co
- Co to jest
- whitelist
- Wikipedia
- okna
- w ciągu
- bez
- słowa
- Praca
- pracujący
- działa
- pisanie
- X