Jak OCR za pomocą Tesseract, OpenCV i Python PlatoBlockchain Data Intelligence. Wyszukiwanie pionowe. AI.

Jak wykonać OCR za pomocą Tesseracta, OpenCV i Pythona

Jak wykonać OCR za pomocą Tesseracta, OpenCV i Pythona

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

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.

Jak wykonać OCR za pomocą Tesseracta, OpenCV i Pythona
Proces optycznego rozpoznawania znaków (dzięki uprzejmości)

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ę


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.

Jak wykonać OCR za pomocą Tesseracta, OpenCV i Pythona
porównanie trendów google dla różnych narzędzi OCR typu open source

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.

Jak wykonać OCR za pomocą Tesseracta, OpenCV i Pythona
Przepływ procesu OCR w celu zbudowania interfejsu API za pomocą Tesseract z pliku blogu

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.

Jak wykonać OCR za pomocą Tesseracta, OpenCV i Pythona
Proces Tesseract 3 OCR z papier

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.

Jak wykonać OCR za pomocą Tesseracta, OpenCV i Pythona
Jak Tesseract wykorzystuje model LSTM presentation

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.

Jak wykonać OCR za pomocą Tesseracta, OpenCV i Pythona
Wynik działania silnika Tesseract OCR

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 –

Jak wykonać OCR za pomocą Tesseracta, OpenCV i Pythona
System pisma Aurebesh

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.

Jak wykonać OCR za pomocą Tesseracta, OpenCV i Pythona
Obraz po wstępnym przetworzeniu

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.

Jak wykonać OCR za pomocą Tesseracta, OpenCV i Pythona

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.

Jak wykonać OCR za pomocą Tesseracta, OpenCV i Pythona


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.

Jak wykonać OCR za pomocą Tesseracta, OpenCV i Pythona

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 -
Jak wykonać OCR za pomocą Tesseracta, OpenCV i Pythona
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 -
Jak wykonać OCR za pomocą Tesseracta, OpenCV i Pythona
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 -
Jak wykonać OCR za pomocą Tesseracta, OpenCV i Pythona
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.

Jak wykonać OCR za pomocą Tesseracta, OpenCV i Pythona

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

Jak wykonać OCR za pomocą Tesseracta, OpenCV i Pythona

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

Jak wykonać OCR za pomocą Tesseracta, OpenCV i Pythona

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%.

Jak wykonać OCR za pomocą Tesseracta, OpenCV i Pythona

Dodatki zawarte

  1. Śledź prognozy, które są poprawne
  2. Śledź, które są złe
  3. Wprowadź poprawki do niedokładnych
  4. Usuń te, które są błędne
  5. Uzupełnij brakujące prognozy
  6. Filtruj obrazy według zakresów dat
  7. 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

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 z d['text']. Rysuje ramkę tylko wtedy, gdy wzór pasuje. Możesz po prostu wyodrębnić wartości z d['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.

Znak czasu:

Więcej z AI i uczenie maszynowe