Zephyrnet-logo

OCR gebruiken met Tesseract, OpenCV en Python

Datum:

In deze blogpost zullen we proberen de technologie uit te leggen achter de meest gebruikte Tesseract Engine, die is geüpgraded met de nieuwste kennis die is onderzocht op het gebied van optische tekenherkenning.

Dit artikel zal ook dienen als een handleiding/zelfstudie over hoe te implementeren OCR in python met behulp van de Tesseract-engine. We doorlopen de volgende modules:

  • Tesseract OCR-functies
  • Voorverwerking voor OCR met OpenCV
  • Tesseract uitvoeren met CLI en Python
  • Beperkingen van de Tesseract-engine

Introductie

OCR = Optical Character Recognition. Met andere woorden, OCR-systemen transformeren een tweedimensionaal beeld van tekst, dat machinaal gedrukte of handgeschreven tekst kan bevatten van de afbeeldingsrepresentatie in machineleesbare tekst. OCR als proces bestaat over het algemeen uit meerdere deelprocessen om zo nauwkeurig mogelijk uit te voeren. De deelprocessen zijn:

  • Voorbewerking van de afbeelding
  • Tekstlokalisatie
  • Tekensegmentatie
  • Karakterherkenning
  • Nabewerking

De subprocessen in de bovenstaande lijst kunnen natuurlijk verschillen, maar dit zijn ruwweg stappen die nodig zijn om automatische karakterherkenning te benaderen. In OCR-software is het belangrijkste doel om alle unieke woorden te identificeren en vast te leggen in verschillende talen van geschreven teksttekens.

Al bijna twee decennia worden optische tekenherkenningssystemen op grote schaal gebruikt om geautomatiseerde tekstinvoer in geautomatiseerde systemen mogelijk te maken. Maar in al die tijd, conventioneel online-OCR systemen (zoals zonale OCR) hebben nooit hun onvermogen overwonnen om meer dan een handvol lettertypen en pagina-indelingen te lezen. Proportioneel gespreide lettertypen (waaronder vrijwel alle gezette kopieën), laserprinterlettertypen en zelfs veel niet-proportionele typemachinelettertypen zijn buiten het bereik van deze systemen gebleven. En als gevolg daarvan heeft conventionele OCR nooit meer dan een marginale impact gehad op het totale aantal documenten dat moet worden omgezet in digitale vorm.

Optisch tekenherkenningsproces (beleefdheid)

OCR-engines van de volgende generatie gaan deze bovengenoemde problemen heel goed aan door gebruik te maken van het nieuwste onderzoek op het gebied van deep learning. Door gebruik te maken van de combinatie van diepgaande modellen en enorme datasets die openbaar beschikbaar zijn, bereiken modellen ultramoderne nauwkeurigheid voor bepaalde taken. Tegenwoordig is het ook mogelijk synthetische gegevens genereren met verschillende lettertypen die generatieve vijandige netwerken gebruiken en weinig andere generatieve benaderingen.

Optische tekenherkenning blijft een uitdagend probleem wanneer tekst voorkomt in ongedwongen omgevingen, zoals natuurlijke scènes, vanwege geometrische vervormingen, complexe achtergronden en diverse lettertypen. De technologie heeft nog steeds een enorm potentieel vanwege de verschillende use-cases van op deep learning gebaseerde OCR-achtig


Heeft u een OCR-probleem in gedachten? Wilt u de gegevensinvoerkosten van uw organisatie verlagen? Ga naar Nanonetten en OCR-modellen te bouwen om extraheer tekst uit afbeeldingen or extraheer gegevens uit pdf's met AI gebaseerd PDF OCR!


Er zijn een heleboel optische tekenherkenning beschikbare software. Ik heb geen kwaliteitsvergelijking tussen beide gevonden, maar ik zal er een paar schrijven die het meest ontwikkelvriendelijk lijken.

Tesseract - een open source OCR-engine die populair is geworden bij OCR-ontwikkelaars. Hoewel het soms pijnlijk kan zijn om het te implementeren en aan te passen, waren er lang niet al te veel gratis en krachtige OCR-alternatieven op de markt. Tesseract begon als een Ph.D. onderzoeksproject in HP Labs, Bristol. Het werd populair en werd door HP ontwikkeld tussen 1984 en 1994. In 2005 bracht HP Tesseract uit als open-source software. Sinds 2006 is het ontwikkeld door Google.

google trends vergelijking voor verschillende open source OCR-tools

OCRopus - OCRopus is een open source OCR-systeem dat gemakkelijke evaluatie en hergebruik van de OCR-componenten door zowel onderzoekers als bedrijven mogelijk maakt. Een verzameling documentanalyseprogramma's, geen kant-en-klaar OCR-systeem. Om het op uw documenten toe te passen, moet u mogelijk een aantal afbeeldingen voorbewerken en mogelijk ook nieuwe modellen trainen. Naast de herkenningsscripts zelf, zijn er verschillende scripts voor het bewerken en corrigeren van grondwaarheden, het meten van foutenpercentages, het bepalen van verwarringsmatrices die gemakkelijk te gebruiken en te bewerken zijn.


oculair - Ocular werkt het beste bij documenten die met een handpers zijn afgedrukt, inclusief documenten die in meerdere talen zijn geschreven. Het werkt via de opdrachtregel. Het is een state-of-the-art historisch OCR-systeem. De belangrijkste kenmerken zijn:

  • Ongecontroleerd leren van onbekende lettertypen: vereist alleen documentafbeeldingen en een corpus tekst.
  • Mogelijkheid om luidruchtige documenten te verwerken: inconsistente inkt, spatiëring, verticale uitlijning
  • Ondersteuning voor meertalige documenten, inclusief documenten met veel codewisseling op woordniveau.
  • Onbewaakt leren van orthografische variatiepatronen, waaronder archaïsche spelling en printerafkorting.
  • Gelijktijdige, gezamenlijke transcriptie in zowel diplomatieke (letterlijke) als genormaliseerde vormen.

SwiftOCR - Ik zal ook de OCR-engine vermelden die in Swift is geschreven, aangezien er een enorme ontwikkeling wordt gemaakt om het gebruik van de Swift als de programmeertaal voor ontwikkeling die wordt gebruikt voor diep leren te bevorderen. Uitchecken blog om meer te weten te komen waarom. SwiftOCR is een snelle en eenvoudige OCR-bibliotheek die neurale netwerken gebruikt voor beeldherkenning. SwiftOCR beweert dat hun engine beter presteert dan de bekende Tessaract-bibliotheek.

In deze blogpost zetten we focus op Tesseract OCR en lees meer over hoe het werkt en hoe het wordt gebruikt.


Tesseract OCR

Tesseract is een open source tekstherkenning (OCR) Engine, beschikbaar onder de Apache 2.0-licentie. Het kan direct worden gebruikt of (voor programmeurs) met behulp van een API om afgedrukte tekst uit afbeeldingen te extraheren. Het ondersteunt een grote verscheidenheid aan talen. Tesseract heeft geen ingebouwde GUI, maar er zijn er verschillende beschikbaar vanaf de 3e partij pagina. Tesseract is compatibel met veel programmeertalen en frameworks door middel van wrappers die te vinden zijn hier. Het kan worden gebruikt met de bestaande lay-outanalyse om tekst in een groot document te herkennen, of het kan worden gebruikt in combinatie met een externe tekstdetector om tekst te herkennen van een afbeelding van een enkele tekstregel.

OCR Process Flow om API te bouwen met Tesseract van een blogpost

Tesseract 4.00 bevat een nieuw neuraal netwerksubsysteem dat is geconfigureerd als tekstregelherkenner. Het heeft zijn oorsprong in OCRopus 'Python-gebaseerde LSTM implementatie, maar is opnieuw ontworpen voor Tesseract in C ++. Het neurale netwerksysteem in Tesseract dateert van vóór TensorFlow, maar is ermee compatibel, omdat er een netwerkbeschrijvingstaal is genaamd Variable Graph Specification Language (VGSL), die ook beschikbaar is voor TensorFlow.

Om een ​​afbeelding met een enkel teken te herkennen, gebruiken we meestal een Convolutional Neural Network (CNN). Tekst van willekeurige lengte is een reeks tekens en dergelijke problemen worden opgelost met RNN's en LSTM is een populaire vorm van RNN. Lees dit bericht voor meer informatie LSTM.


Technologie - hoe het werkt

LSTM's zijn geweldig in het leren van reeksen, maar vertragen veel wanneer het aantal toestanden te groot is. Er zijn empirische resultaten die suggereren dat het beter is om een ​​LSTM te vragen een lange reeks te leren dan een korte reeks van veel klassen. Tesseract is ontwikkeld op basis van het OCRopus-model in Python, een vork van een LSMT in C ++, genaamd CLSTM. CLSTM is een implementatie van het LSTM recurrent neural network model in C ++, met gebruikmaking van de Eigen bibliotheek voor numerieke berekeningen.

Tesseract 3 OCR-proces van papier

Legacy Tesseract 3.x was afhankelijk van het meerfasige proces waarin we stappen kunnen onderscheiden:

  • Woord vinden
  • Lijn vinden
  • Karakterclassificatie

Het vinden van woorden werd gedaan door tekstregels in blobs te ordenen en de lijnen en regio's worden geanalyseerd op vaste toonhoogte of proportionele tekst. Tekstregels worden op verschillende manieren in woorden onderverdeeld, afhankelijk van het soort tekenafstand. Erkenning verloopt dan als een proces van twee passages. In de eerste pass wordt geprobeerd elk woord om de beurt te herkennen. Elk woord dat bevredigend is, wordt als trainingsgegevens doorgegeven aan een adaptieve classificator. De adaptieve classificator krijgt dan de kans om tekst lager op de pagina nauwkeuriger te herkennen.

Modernisering van de Tesseract-tool was een inspanning bij het opschonen van codes en het toevoegen van een nieuw LSTM-model. Het invoerbeeld wordt regel voor regel in dozen (rechthoek) verwerkt in het LSTM-model en geeft uitvoer. In onderstaande afbeelding kunnen we visualiseren hoe het werkt.

Hoe Tesseract het LSTM-model gebruikt presentatie

Na het toevoegen van een nieuwe trainingstool en het trainen van het model met veel gegevens en lettertypen, behaalt Tesseract betere prestaties. Toch niet goed genoeg om te werken aan handgeschreven tekst en rare lettertypen. Het is mogelijk om toplagen te verfijnen of opnieuw te trainen voor experimenten.


Tesseract installeren

Het installeren van tesseract op Windows is eenvoudig met de voorgecompileerde binaire bestanden hier. Vergeet niet de omgevingsvariabele "pad" te bewerken en een tesseract-pad toe te voegen. Voor Linux- of Mac-installatie wordt het geïnstalleerd met weinig opdrachten.

Controleer na de installatie of alles werkt door het commando in de terminal of cmd te typen:

$ tesseract --version

En u zult de uitvoer zien die lijkt op:

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

U kunt hierna de python-wrapper voor tesseract installeren met pip.
$ pip install pytesseract

De Tesseract-bibliotheek wordt geleverd met een handig opdrachtregelprogramma genaamd tesseract. We kunnen deze tool gebruiken om OCR op afbeeldingen uit te voeren en de uitvoer wordt opgeslagen in een tekstbestand. Als we Tesseract in onze C ++ of Python-code willen integreren, gebruiken we de Tesseract-API.


Tesseract uitvoeren met CLI

Roep de Tesseract-engine op de afbeelding op met afbeelding_pad en zet afbeelding om in tekst, regel voor regel geschreven in de opdrachtprompt door het volgende te typen:

$ tesseract image_path stdout

Om de uitvoertekst in een bestand te schrijven:

$ tesseract image_path text_result.txt

Om de naam van het taalmodel op te geven, schrijft u de taalsnelkoppeling erna -l vlag, standaard Engels taal nodig:

$ tesseract image_path text_result.txt -l eng

Standaard verwacht Tesseract een tekstpagina wanneer het een afbeelding segmenteert. Als u alleen een kleine regio wilt OCR, probeer dan een andere segmentatiemodus, met behulp van de –Psm argument. Er zijn 14 modi beschikbaar die te vinden zijn hier. Standaard automatiseert Tesseract de paginasegmentatie volledig, maar voert het geen oriëntatie en scriptdetectie uit. Typ het volgende om de parameter op te geven:

$ tesseract image_path text_result.txt -l eng --psm 6

Er is ook nog een belangrijker argument, de OCR-engine-modus (oem). Tesseract 4 heeft twee OCR-engines - Legacy Tesseract-engine en LSTM-engine. Er zijn vier bedieningsmodi gekozen met de optie –oem.
0 Alleen Legacy-engine.
1 Alleen neurale netten LSTM-motor.
2 Legacy + LSTM-engines.
3 Standaard, gebaseerd op wat beschikbaar is.

Resultaat van de Tesseract OCR-engine

OCR met Pytesseract en OpenCV

Pytesseract of Python-tesseract is een OCR-tool voor python die ook dient als een wrapper voor de Tesseract-OCR Engine. Het kan tekst in afbeeldingen lezen en herkennen en wordt vaak gebruikt in python ocr-beeld-naar-tekst-gebruiksgevallen.

Het is ook handig als een op zichzelf staand aanroepscript om tesseract te gebruiken, omdat het alle afbeeldingstypen kan lezen die worden ondersteund door de Pillow en Leptonica-beeldvormingsbibliotheken, inclusief jpeg, png, gif, bmp, tiff en andere.

Meer info over Python-aanpak lees hier. De code voor deze tutorial vind je hierin bewaarplaats.

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)

Preprocessing voor Tesseract

Om alle manieren te vermijden waarop de nauwkeurigheid van uw uitvoer kan afnemen, moet u ervoor zorgen dat de afbeelding correct is voorbewerkt.

Dit omvat herschaling, binarisatie, ruisverwijdering, rechtzetten, enz.

Om een ​​afbeelding voor OCR voor te bewerken, gebruikt u een van de volgende python-functies of volgt u de OpenCV-documentatie.

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) 

Laten we met een voorbeeld werken om de dingen beter te zien. Zo ziet onze originele afbeelding eruit -

Het Aurebesh-schrijfsysteem

Na voorverwerking met de volgende code

image = cv2.imread('aurebesh.jpg')

gray = get_grayscale(image)
thresh = thresholding(gray)
opening = opening(gray)
canny = canny(gray)

en het plotten van de resulterende afbeeldingen, krijgen we de volgende resultaten.

Het beeld na voorverwerking

De uitvoer voor de originele afbeelding ziet er als volgt uit -

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

Hier is hoe de uitvoer voor verschillende voorverwerkte afbeeldingen eruit ziet -

Canny edge-afbeelding (niet zo goed) -

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

Drempelig beeld -

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

Openingsbeeld -

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

Vakken rond tekst krijgen

Met Pytesseract kunt u de begrenzingsvakinformatie voor uw OCR-resultaten op de volgende manier verkrijgen code.

Het onderstaande script geeft u informatie over het begrenzingsvak voor elk teken dat door Tesseract wordt gedetecteerd tijdens 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)

Als u vakjes rond woorden wilt in plaats van tekens, is de functie image_to_data komt goed van pas. Je kunt de image_to_data functie met output type gespecificeerd met pytesseract Output.


Heeft u een OCR-probleem in gedachten? Facturen, pdf's of kentekenplaten digitaliseren? Ga naar Nanonetten en bouwen gratis online OCR modellen gratis!


We zullen de voorbeeldfactuurafbeelding hierboven gebruiken om onze tesseract-outputs te testen.

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

Dit zou je de volgende output moeten geven -
dict_keys(['level', 'page_num', 'block_num', 'par_num', 'line_num', 'word_num', 'left', 'top', 'width', 'height', 'conf', 'text'])

Met behulp van dit woordenboek kunnen we elk woord laten detecteren, hun begrenzingsvakinformatie, de tekst erin en de vertrouwensscores voor elk woord.

U kunt de dozen plotten met behulp van de onderstaande code -

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)

Dit is hoe dit eruit zou zien voor de afbeelding van een voorbeeldfactuur.


Overeenstemming van tekstsjabloon

Neem het voorbeeld van het proberen te vinden waar een datum in een afbeelding staat. Hier zal onze sjabloon een patroon voor reguliere expressies zijn dat we zullen matchen met onze OCR-resultaten om de juiste begrenzingskaders te vinden. We zullen de gebruiken regex module en de image_to_data functie hiervoor.

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)

Zoals verwacht krijgen we één doos rond de factuurdatum in de afbeelding.


Paginasegmentatiemodi

Er zijn verschillende manieren waarop een tekstpagina kan worden geanalyseerd. De tesseract api biedt verschillende modi voor paginasegmentatie als u OCR op slechts een klein gebied of in verschillende oriëntaties wilt uitvoeren, enz.

Hier is een lijst van de ondersteunde modi voor paginasegmentatie per tesseract -

0 Alleen oriëntatie en scriptdetectie (OSD).
1 Automatische paginasegmentatie met OSD.
2 Automatische paginasegmentatie, maar geen OSD of OCR.
3 Volledig automatische paginasegmentatie, maar geen OSD. (Standaard)
4 Ga uit van een enkele tekstkolom van variabele grootte.
5 Ga uit van één uniform blok verticaal uitgelijnde tekst.
6 Ga uit van één uniform tekstblok.
7 Behandel de afbeelding als een enkele tekstregel.
8 Behandel de afbeelding als één woord.
9 Behandel de afbeelding als een enkel woord in een cirkel.
10 Behandel de afbeelding als één teken.
11 Dunne tekst. Zoek zoveel mogelijk tekst in willekeurige volgorde.
12 Dunne tekst met OSD.
13 Ruwe lijn. Behandel de afbeelding als een enkele tekstregel en omzeil hacks die Tesseract-specifiek zijn.

Wijzig de modus om uw paginasegmentatie te wijzigen --psm argument in uw aangepaste configuratiestring voor een van de bovengenoemde moduscodes.


Detecteer oriëntatie en script

U kunt de oriëntatie van tekst in uw afbeelding detecteren en ook het script waarin het is geschreven. De volgende afbeelding -
beeld
na het doorlopen van de volgende code -

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)

zal de volgende uitvoer afdrukken.

angle: 90
script: Latin

Detecteer alleen cijfers

Neem deze afbeelding bijvoorbeeld -
beeld
De tekst die uit deze afbeelding is gehaald, ziet er als volgt uit.

‘Customer name Hallium Energy services
Project NEHINS-HIB-HSA
lavoice no 43876324
Dated 17%h Nov2018
Pono 76496234

U kunt alleen cijfers herkennen door de configuratie te wijzigen in het volgende

custom_config = r'--oem 3 --psm 6 outputbase digits'
print(pytesseract.image_to_string(img, config=custom_config))

De uitvoer ziet er als volgt uit.

--

. 43876324
172018
0 76496234

Tekens op de witte lijst zetten

Stel dat u alleen bepaalde tekens van de gegeven afbeelding wilt detecteren en de rest wilt negeren. U kunt uw witte lijst met tekens specificeren (hier hebben we alleen de kleine letters van a tot z gebruikt) met behulp van de volgende configuratie.

custom_config = r'-c tessedit_char_whitelist=abcdefghijklmnopqrstuvwxyz --psm 6'
print(pytesseract.image_to_string(img, config=custom_config))

Uitgang -

customername
roject
tnvoleeno
ated

alliumenergyservices
e
thovo

Tekens op de zwarte lijst zetten

Als u zeker weet dat bepaalde tekens of uitdrukkingen zeker niet in uw tekst zullen voorkomen (de OCR retourneert anders de verkeerde tekst in plaats van op de zwarte lijst geplaatste tekens), kunt u die tekens op de zwarte lijst zetten met behulp van de volgende configuratie.

custom_config = r'-c tessedit_char_blacklist=0123456789 --psm 6'
pytesseract.image_to_string(img, config=custom_config)

Uitgang -

Customer name Hallium Energy services
Project NEHINS-HIB-HSA
lavoice no
Dated %h Nov%
Pono

Detecteer in meerdere talen

U kunt de beschikbare talen controleren door dit in de terminal te typen

$ tesseract --list-langs

Om tesseract te downloaden voor een specifiek taalgebruik

$ sudo apt-get install tesseract-ocr-LANG

waarbij LANG de drielettercode is voor de taal die u nodig heeft. U kunt de LANG-waarden achterhalen hier.

U kunt de .traindata bestand voor de taal die je nodig hebt hier en plaats het erin $TESSDATA_PREFIX directory (dit moet hetzelfde zijn als waar de tessdata directory is geïnstalleerd) en deze moet klaar zijn voor gebruik.

Note - Alleen talen met een .traineddata bestandsformaat wordt ondersteund door tesseract.

Gebruik de om de taal te specificeren waarin u uw OCR-uitvoer nodig heeft -l LANG argument in de configuratie waarbij LANG de drielettercode is voor de taal die u wilt gebruiken.

custom_config = r'-l eng --psm 6'
pytesseract.image_to_string(img, config=custom_config)

Neem deze afbeelding bijvoorbeeld -
beeld
U kunt met meerdere talen werken door de LANG-parameter als zodanig te wijzigen -

custom_config = r'-l grc+tha+eng --psm 6'
pytesseract.image_to_string(img, config=custom_config)

en je krijgt de volgende output -

Here’s some Greek:

Οδιο διστα ιμπεδιτ φιμ ει, αδ φελ αβχορρεανθ ελωκυενθιαμ, εξ εσε εξερσι γυ-
βεργρεν ηας. Ατ μει σολετ σριπτορεμ. ἴυς αλια λαβωρε θε. Σιθ κυωτ νυσκυαμ
τρασυνδια αν, ὠμνιυμ ελιγενδι τιν πρι. Παρτεμ φερθερεμ συσιπιαντὺυρ εξ ιυς,ναμ
%0790 แ ร เง ๑ ๕ 80 ๕ 6 ๑ อ 06 ส 0 เง น อ ๓ , πρω πρωπριαε σαεφολα ιδ. Ατ πρι δολορ νυ-
σκυαμ.

6 Thai

Here’s some Thai: ν᾿

ค อ ร ั ป ซั น จ ุ ้ ย โป ร ด ิ ว เซ อ ร ์ ส ถา ป ั ต ย ์ จ ๊ า บ แจ ็ ก พ ็ อ ต ม ้ า ห ิ น อ ่ อ น ซา ก ุ ร ะ ค ั น ถ ธ ุ ร ะ ฟิ ด ส ต า ร ์ ท ง ี ้ บ อ ย
ค อ ต อ ื ่ ม แป ร ั ส ั ง โฆ ค ํ า ส า ป แฟ น ซี ศิ ล ป ว ั ฒ น ธร ร ม ไฟ ล ท ์ จ ิ ๊ ก โก ๋ ก ั บ ด ั ก เจ ล พ ล ็ อ ต ม า ม ่ า ซา ก ุ ร ะ ด ี ล เล อ
ร ์ ซี น ด ั ม พ ์ แฮ ป ป ี ้ เอ ๊ ้ า ะ อ ุ ร ั ง ค ธา ต ุ ซิ ม ฟิ น ิ ก ซ์ เท ร ล เล ่ อ ร ์ อ ว อ ร ์ ด แค น ย อ น ส ม า พ ั น ธ์ ค ร ั ว ซอ ง ฮั ม อ า
ข่ า เอ ็ ก ซ์ เพ ร ส

Note - De taal die als eerste is opgegeven voor de -l parameter is de primaire taal.

Helaas heeft tesseract geen functie om de taal van de tekst in een afbeelding automatisch te detecteren. Een alternatieve oplossing wordt geboden door een andere python-module genaamd langdetect die kan worden geïnstalleerd via pip.

$ pip install langdetect

Deze module detecteert opnieuw niet de taal van tekst met behulp van een afbeelding, maar heeft stringinvoer nodig om de taal te detecteren. De beste manier om dit te doen is door eerst tesseract te gebruiken om OCR-tekst op te halen in de talen die je zou kunnen vinden, met langdetect om te zien welke talen in de OCR-tekst zijn opgenomen en voer vervolgens OCR opnieuw uit met de gevonden talen.

Stel dat we een tekst hebben waarvan we dachten dat die in het Engels en Portugees was.

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)

Dit zou een lijst met talen in de tekst en hun kansen moeten opleveren.

[en:0.714282468983554, es:0.2857145605644145]

De taalcodes die worden gebruikt door langdetect volg ISO 639-1 codes. Controleer om te vergelijken dit en dit. We merken dat de taal die in de tekst wordt gebruikt Engels en Spaans is.

We krijgen de tekst opnieuw door de configuratie te wijzigen in

custom_config = r'-l eng+spa --psm 6'
txt = pytesseract.image_to_string(img, config=custom_config)

Note - Tesseract presteert slecht wanneer, in een afbeelding met meerdere talen, de in de configuratie gespecificeerde talen verkeerd zijn of helemaal niet worden genoemd. Dit kan de langdetect-module ook behoorlijk misleiden.


Tessdata_fast gebruiken

Als snelheid een grote zorg voor u is, kunt u uw tessdata-taalmodellen vervangen door tessdata_fast-modellen, die 8-bits integere versies van de tessdata-modellen zijn.

Volgens de tessdata_fast GitHub -

Deze repository bevat snelle integer-versies van getrainde modellen voor de Tesseract Open Source OCR-engine.

Deze modellen werken alleen met de LSTM OCR-engine van Tesseract 4.

  • Dit is een compromis tussen snelheid en nauwkeurigheid met betrekking tot wat de beste "prijs-kwaliteitverhouding" in snelheid versus nauwkeurigheid bood.
  • Voor sommige talen is dit nog steeds het beste, maar voor de meeste niet.
  • De netwerkconfiguratie met de "beste prijs-kwaliteitverhouding" werd vervolgens geïntegreerd voor verdere snelheid.
  • De meeste gebruikers zullen deze getrainde gegevensbestanden willen gebruiken om OCR te doen en deze zullen worden verzonden als onderdeel van Linux-distributies, bijv. Ubuntu 18.04.
  • Fine tuning / incrementele training zal NIET mogelijk zijn van deze fast modellen, aangezien ze een 8-bits geheel getal zijn.
  • Bij gebruik van de modellen in deze repository wordt alleen de nieuwe op LSTM gebaseerde OCR-engine ondersteund. De nalatenschap tesseract engine wordt niet ondersteund met deze bestanden, dus de OEM-modi '0' en '2' van Tesseract zullen er niet mee werken.

Te gebruiken tessdata_fast modellen in plaats van tessdata, het enige wat u hoeft te doen is uw downloaden tessdata_fast taalgegevensbestand van hier en plaats het in je $TESSDATA_PREFIX directory.


Wilt u documenten, bonnen of facturen digitaliseren, maar te lui om te coderen? Ga naar Nanonetten en bouw gratis OCR-modellen!


Training Tesseract op maat gemaakte data

Tesseract 4.00 bevat een nieuwe neurale netwerkgebaseerde herkenningsengine die een aanzienlijk hogere nauwkeurigheid levert op documentafbeeldingen. Neurale netwerken vereisen aanzienlijk meer trainingsgegevens en trainen veel langzamer dan basis Tesseract. Voor Latijnse talen zijn de bestaande verstrekte modelgegevens getraind op ongeveer 400000 tekstregels die ongeveer 4500 lettertypen beslaan.

Om de Tesseract 4.0 LSTM-trainingstutorial succesvol uit te voeren, moet u een werkende installatie van Tesseract 4 en Tesseract 4 Training Tools hebben en ook de trainingsscripts en vereiste getrainde databestanden in bepaalde mappen hebben. Bezoek github-opslagplaats voor bestanden en tools.

Tesseract 4.00 duurt een paar dagen tot een paar weken om vanaf nul te trainen. Zelfs met al deze nieuwe trainingsgegevens zijn hier daarom enkele opties voor training:

  • Afstellen - Begin met een bestaande getrainde taal en train op uw specifieke aanvullende gegevens. Bijvoorbeeld training op een handgeschreven dataset en enkele extra fonts.
  • Knip de bovenste laag af - van het netwerk en train een nieuwe toplaag met de nieuwe data. Als fine-tuning niet werkt, is dit waarschijnlijk de op één na beste optie. De analogie waarom dit nuttig is, neem bijvoorbeeld modellen die zijn getraind op ImageNet-dataset. Het doel is om een ​​classificatie voor katten of honden te bouwen, lagere lagen in het model zijn goed bij abstractie op laag niveau, zoals hoeken, horizontale en verticale lijnen, maar hogere lagen in het model combineren die kenmerken en detecteren oren, ogen, neus van katten of honden enzovoorts. Door alleen toplagen opnieuw te trainen, gebruikt u kennis uit lagere lagen en combineert u met uw nieuwe verschillende dataset.
  • Vanaf het begin opnieuw trainen - Dit is een erg trage aanpak, tenzij je een zeer representatieve en voldoende grote trainingsset hebt voor je probleem. De beste bron om helemaal opnieuw te trainen is dit te volgen github-opslagplaats.

Een gids over hoe u kunt trainen op uw aangepaste gegevens en deze kunt maken .traineddata bestanden kunnen worden gevonden hier, hier en hier.

In deze blogpost behandelen we de code voor training met Tesseract niet.

Beperkingen van Tesseract

Tesseract werkt het beste als er een zuivere segmentatie van de voorgrondtekst van de achtergrond is. In de praktijk kan het erg uitdagend zijn om dit soort setups te garanderen. Er zijn verschillende redenen waarom u mogelijk geen uitvoer van goede kwaliteit van Tesseract krijgt, zoals wanneer de afbeelding ruis op de achtergrond heeft. Hoe beter de beeldkwaliteit (grootte, contrast, bliksem), hoe beter het herkenningsresultaat. Het vereist een beetje voorbewerking om de OCR-resultaten te verbeteren, afbeeldingen moeten op de juiste manier worden geschaald, hebben zoveel mogelijk beeldcontrast en de tekst moet horizontaal worden uitgelijnd. Tesseract OCR is behoorlijk krachtig, maar heeft de volgende beperkingen.

Tesseract-beperkingen opgesomd in de lijst.

  • De OCR is niet zo nauwkeurig als sommige commerciële oplossingen waarover we beschikken.
  • Doet het niet goed met afbeeldingen die worden beïnvloed door artefacten, waaronder gedeeltelijke occlusie, vervormd perspectief en complexe achtergrond.
  • Het is niet in staat handschrift te herkennen.
  • Het kan wartaal vinden en dit rapporteren als OCR-uitvoer.
  • Als een document andere talen bevat dan die in de -l LANG-argumenten, zijn de resultaten mogelijk slecht.
  • Het is niet altijd goed om de natuurlijke leesvolgorde van documenten te analyseren. Het kan bijvoorbeeld niet worden herkend dat een document twee kolommen bevat en kan proberen tekst over kolommen heen te voegen.
  • Scans van slechte kwaliteit kunnen OCR van slechte kwaliteit opleveren.
  • Het geeft geen informatie over waartoe de tekst van de lettertypefamilie behoort.

Er is natuurlijk een betere, veel eenvoudigere en intuïtievere manier om OCR-taken uit te voeren.


OCR met Nanonets

De Nanonets OCR-API kunt u eenvoudig OCR-modellen bouwen. U hoeft zich geen zorgen te maken over het voorverwerken van uw afbeeldingen of u hoeft zich geen zorgen te maken over het matchen van sjablonen of het bouwen van op regels gebaseerde engines om de nauwkeurigheid van uw OCR-model te vergroten.

U kunt uw gegevens uploaden, annoteren, het model instellen om te trainen en te wachten op het ontvangen van voorspellingen via een browsergebaseerde gebruikersinterface zonder een enkele regel code te schrijven, u zorgen te maken over GPU's of de juiste architecturen te vinden voor uw deep learning-modellen. U kunt ook de JSON-antwoorden van elke voorspelling verkrijgen om deze met uw eigen systemen te integreren en door machine learning aangedreven apps te bouwen die zijn gebouwd op geavanceerde algoritmen en een sterke infrastructuur.

De GUI gebruiken: https://app.nanonets.com/

U kunt ook de Nanonets-OCR-API gebruiken door de onderstaande stappen te volgen: ‌

Stap 1: kloon de opslagplaats, installeer afhankelijkheden

git clone https://github.com/NanoNets/nanonets-ocr-sample-python.git
cd nanonets-ocr-sample-python
sudo pip install requests tqdm

Stap 2: Ontvang uw gratis API-sleutel
Haal uw gratis API-sleutel op https://app.nanonets.com/#/keys

nummerplaat-detectie-gif

Stap 3: Stel de API-sleutel in als omgevingsvariabele

export NANONETS_API_KEY=YOUR_API_KEY_GOES_HERE

Stap 4: maak een nieuw model

python ./code/create-model.py

Opmerking: Dit genereert een MODEL_ID die je nodig hebt voor de volgende stap

Stap 5: Model-ID toevoegen als omgevingsvariabele

export NANONETS_MODEL_ID=YOUR_MODEL_ID

Opmerking: je krijgt YOUR_MODEL_ID van de vorige stap

Stap 6: Upload de trainingsgegevens
De trainingsgegevens zijn te vinden in images (afbeeldingsbestanden) en annotations (annotaties voor de afbeeldingsbestanden)

python ./code/upload-training.py

Stap 7: Train Model
Zodra de afbeeldingen zijn geüpload, begint u met het trainen van het model

python ./code/train-model.py

Stap 8: Verkrijg de modelstatus
Het duurt ongeveer 2 uur om het model te trainen. Je ontvangt een e-mail zodra het model is opgeleid. Ondertussen controleer je de staat van het model

python ./code/model-state.py

Stap 9: Maak een voorspelling
Zodra het model is opgeleid. Met het model kun je voorspellingen doen

python ./code/prediction.py ./images/151.jpg

Nanonets en Humans in the Loop

‌‌Het 'Moderate'-scherm ondersteunt de correctie- en invoerprocessen en vermindert de werklast van de handmatige reviewer met bijna 90% en verlaagt de kosten met 50% voor de organisatie.

Functies omvatten

  1. Volg voorspellingen die correct zijn
  2. Houd bij welke fout zijn
  3. Breng correcties aan op de onnauwkeurige
  4. Verwijder degenen die fout zijn
  5. Vul de ontbrekende voorspellingen in
  6. Filter afbeeldingen met datumbereiken
  7. Krijg tellingen van gemodereerde afbeeldingen tegen degenen die niet worden gemodereerd

Alle velden zijn gestructureerd in een eenvoudig te gebruiken GUI waarmee de gebruiker kan profiteren van de OCR-technologie en kan helpen om deze beter te maken terwijl ze werken, zonder code te hoeven typen of te begrijpen hoe de technologie werkt.


Heeft u een OCR-probleem in gedachten? Wilt u de gegevensinvoerkosten van uw organisatie verlagen? Ga naar Nanonetten en OCR-modellen te bouwen om extraheer tekst uit afbeeldingen or extraheer gegevens uit pdf's!


Conclusie

Net zoals diep leren invloed heeft gehad op bijna elk facet van computervisie, geldt hetzelfde voor tekenherkenning en handschriftherkenning. Op deep learning gebaseerde modellen zijn erin geslaagd een ongekende nauwkeurigheid van tekstherkenning te verkrijgen, veel verder dan traditioneel informatie-extractie en machine learning beeldverwerking benaderingen.

Tesseract presteert goed wanneer documentafbeeldingen de volgende richtlijnen volgen:

  • Maak segmentatie van de voorgrondtekst schoon van de achtergrond
  • Horizontaal uitgelijnd en passend geschaald
  • Hoogwaardig beeld zonder wazigheid en ruis

De nieuwste versie van Tesseract 4.0 ondersteunt op diep leren gebaseerde OCR die aanzienlijk nauwkeuriger is. De OCR-engine zelf is gebouwd op een Long Short-Term Memory (LSTM) -netwerk, een soort Recurrent Neural Network (RNN).

Tesseract is perfect voor het scannen van schone documenten en wordt geleverd met een vrij hoge nauwkeurigheid en variabiliteit in lettertypen omdat de training uitgebreid was. Ik zou zeggen dat Tesseract een hulpmiddel is als het je taak is om boeken, documenten en gedrukte tekst op een schone witte achtergrond te scannen.


Verder lezen

update:
Veel mensen vroegen ons hoe ze datum in de vorm van tekst kunnen krijgen of gebruiken wanneer het datum of andere specifieke gegevens detecteert, zodat ze aan de lijst kunnen worden toegevoegd.
Hier is het antwoord:
In de code om een ​​begrenzingsvak rond het datumvak te tekenen, ziet u een lijn die overeenkomt met het regex-patroon met d['text']. Het tekent alleen een doos als het patroon overeenkomt. U kunt de waarden eenvoudig extraheren uit: d['text'] zodra het patroon overeenkomt en voeg ze toe aan een lijst.

Update 2:
Om vragen over niet-Engelse OCR te beantwoorden, hebben we verdere leeslijsten bijgewerkt.

spot_img

Laatste intelligentie

spot_img

Chat met ons

Hallo daar! Hoe kan ik u helpen?