Sådan OCR med Tesseract, OpenCV og Python PlatoBlockchain Data Intelligence. Lodret søgning. Ai.

Sådan OCR med Tesseract, OpenCV og Python

Sådan OCR med Tesseract, OpenCV og Python

I dette blogindlæg vil vi forsøge at forklare teknologien bag den mest brugte Tesseract Engine, som blev opgraderet med den nyeste viden, der er forsket i optisk tegngenkendelse. Denne artikel vil også tjene som en vejledning / tutorial om, hvordan man implementerer OCR i python ved hjælp af Tesseract-motoren. Vi vil gennemgå følgende moduler:

  • Tesseract OCR-funktioner
  • Forbehandling til OCR ved hjælp af OpenCV
  • Kører Tesseract med CLI og Python
  • Begrænsninger af Tesseract-motor

Indholdsfortegnelse

Introduktion

OCR = Optical Character Recognition. Med andre ord omdanner OCR-systemer et todimensionelt billede af tekst, der kunne indeholde maskintrykt eller håndskrevet tekst fra dets billedrepræsentation til maskinlæsbar tekst. OCR som proces består generelt af flere delprocesser for at udføre så nøjagtigt som muligt. Underprocesserne er:

  • Forbehandling af billedet
  • Tekstlokalisering
  • Karaktersegmentering
  • Karaktergenkendelse
  • Efterbehandling

Underprocesserne i listen ovenfor kan selvfølgelig være forskellige, men disse er groft sagt nødvendige trin for at nærme sig automatisk tegngenkendelse. I OCR-software er det hovedformålet at identificere og fange alle de unikke ord ved hjælp af forskellige sprog fra skrevne teksttegn.

I næsten to årtier har optiske tegngenkendelsessystemer været meget brugt til at give automatisk tekstindtastning i computeriserede systemer. Alligevel i al denne tid har konventionelle OCR-systemer (som zone OCR) har aldrig overvundet deres manglende evne til at læse mere end en håndfuld skrifttyper og sideformater. Proportionalt adskilte skrifttyper (som omfatter stort set alle skrifttyper), laserprinterskrifttyper og endda mange ikke-proportionale skrivemaskineskrifttyper er forblevet uden for disse systemers rækkevidde. Og som et resultat har konventionel OCR aldrig opnået mere end en marginal indvirkning på det samlede antal dokumenter, der skal konverteres til digital form.

Sådan OCR med Tesseract, OpenCV og Python
Optisk tegngenkendelsesproces (høflighed)

Næste generations OCR-motorer håndterer disse problemer nævnt ovenfor rigtig godt ved at bruge den nyeste forskning inden for dyb læring. Ved at udnytte kombinationen af ​​dybe modeller og enorme datasæt, der er offentligt tilgængelige, opnår modellerne avanceret nøjagtighed på givne opgaver. I dag er det også muligt generere syntetiske data med forskellige skrifttyper ved hjælp af generative kontradiktoriske netværk og få andre generative tilgange.

Optisk tegngenkendelse forbliver en udfordrende problem når tekst forekommer i ubegrænsede miljøer, som f.eks naturlige scener, på grund af geometriske forvrængninger, komplekse baggrunde og forskellige skrifttyper. Teknologien rummer stadig et enormt potentiale på grund af de forskellige use-cases af deep learning baseret OCR som


Har du et OCR-problem i tankerne? Vil du reducere din organisations omkostninger til dataindtastning? Gå over til Nanonetter og bygge OCR-modeller til udtræk tekst fra billeder or udtrække data fra PDF-filer med AI baseret PDF OCR!


Open Source OCR-værktøjer

Der er en masse optisk tegngenkendelse software tilgængelig. Jeg fandt ingen kvalitetssammenligning mellem dem, men jeg vil skrive om nogle af dem, der ser ud til at være de mest udviklervenlige.

Tesseract – en open source OCR-motor, der har vundet popularitet blandt OCR-udviklere. Selvom det nogle gange kan være smertefuldt at implementere og ændre, var der ikke for mange gratis og kraftfulde OCR-alternativer på markedet i længst tid. Tesseract begyndte som ph.d. forskningsprojekt i HP Labs, Bristol. Det vandt popularitet og blev udviklet af HP mellem 1984 og 1994. I 2005 udgav HP Tesseract som en open source-software. Siden 2006 er det udviklet af Google.

Sådan OCR med Tesseract, OpenCV og Python
google-tendenssammenligning for forskellige open source OCR-værktøjer

OCRopus – OCRopus er et open source OCR-system, der tillader nem evaluering og genbrug af OCR-komponenterne af både forskere og virksomheder. En samling af dokumentanalyseprogrammer, ikke et nøglefærdigt OCR-system. For at anvende det på dine dokumenter, skal du muligvis lave noget billedforbehandling og muligvis også træne nye modeller. Ud over selve genkendelsesscripts er der adskillige scripts til jordsandhedsredigering og -korrektion, måling af fejlrater, bestemmelse af forvirringsmatricer, der er nemme at bruge og redigere.


Okulær – Ocular fungerer bedst på dokumenter, der er udskrevet med en håndpresse, inklusive dem, der er skrevet på flere sprog. Det fungerer ved hjælp af kommandolinjen. Det er et state-of-the-art historisk OCR-system. Dens primære funktioner er:

  • Uovervåget indlæring af ukendte skrifttyper: kræver kun dokumentbilleder og et korpus af tekst.
  • Evne til at håndtere støjende dokumenter: uensartet farvelægning, mellemrum, lodret justering
  • Understøttelse af flersprogede dokumenter, inklusive dem, der har betydelig kodeskift på ordniveau.
  • Uovervåget indlæring af ortografiske variationsmønstre inklusive arkaiske stavemåder og printerstenografi.
  • Samtidig, fælles transskription til både diplomatiske (bogstavelige) og normaliserede former.


SwiftOCR – Jeg vil også nævne OCR-motoren skrevet i Swift, da der er en enorm udvikling i gang med at fremme brugen af ​​Swift som udviklingsprogrammeringssprog, der bruges til dyb læring. Tjek ud blog for at finde ud af mere hvorfor. SwiftOCR er et hurtigt og enkelt OCR-bibliotek, der bruger neurale netværk til billedgenkendelse. SwiftOCR hævder, at deres motor overgår det velkendte Tessaract-bibliotek.

I dette blogindlæg vil vi sætte fokus på Tesseract OCR og find ud af mere om, hvordan det virker, og hvordan det bruges.


Tesseract OCR

Tesseract er en open source tekstgenkendelsesmotor (OCR) tilgængelig under Apache 2.0-licensen. Det kan bruges direkte eller (for programmører) ved hjælp af en API til at udtrække trykt tekst fra billeder. Det understøtter en lang række sprog. Tesseract har ikke en indbygget GUI, men der er flere tilgængelige fra 3rdParty side. Tesseract er kompatibel med mange programmeringssprog og rammer gennem wrappers, der kan findes link.. Den kan bruges sammen med den eksisterende layoutanalyse til at genkende tekst i et stort dokument, eller den kan bruges sammen med en ekstern tekstdetektor til at genkende tekst fra et billede af en enkelt tekstlinje.

Sådan OCR med Tesseract, OpenCV og Python
OCR Process Flow til at bygge API med Tesseract fra en blogindlæg

Tesseract 4.00 inkluderer et nyt neuralt netværksundersystem konfigureret som en tekstlinjegenkendelse. Det har sin oprindelse i OCRopus' Python-baserede LSTM implementering, men er blevet redesignet til Tesseract i C++. Det neurale netværkssystem i Tesseract går forud for TensorFlow, men er kompatibelt med det, da der er et netværksbeskrivelsessprog kaldet Variable Graph Specification Language (VGSL), som også er tilgængeligt for TensorFlow.

For at genkende et billede, der indeholder et enkelt tegn, bruger vi typisk et Convolutional Neural Network (CNN). Tekst af vilkårlig længde er en sekvens af tegn, og sådanne problemer løses ved hjælp af RNN'er, og LSTM er en populær form for RNN. Læs dette indlæg for at lære mere om LSTM.


Teknologi – Sådan fungerer det

LSTM'er er gode til at lære sekvenser, men bremser meget, når antallet af tilstande er for stort. Der er empiriske resultater, der tyder på, at det er bedre at bede en LSTM om at lære en lang sekvens end en kort sekvens af mange klasser. Tesseract udviklet fra OCRopus model i Python, som var en gaffel af en LSMT i C++, kaldet CLSTM. CLSTM er en implementering af LSTM-modellen for tilbagevendende neurale netværk i C++, ved hjælp af Eigen-biblioteket til numeriske beregninger.

Sådan OCR med Tesseract, OpenCV og Python
Tesseract 3 OCR-proces fra papir

Legacy Tesseract 3.x var afhængig af flertrinsprocessen, hvor vi kan differentiere trin:

  • Ordfinding
  • Linjefinding
  • Karakterklassificering

Ordsøgning blev gjort ved at organisere tekstlinjer i klatter, og linjerne og regionerne analyseres for fast pitch eller proportional tekst. Tekstlinjer er opdelt i ord forskelligt afhængigt af typen af ​​tegnafstand. Anerkendelsen fortsætter derefter som en to-pass proces. I det første gennemløb forsøger man at genkende hvert ord efter tur. Hvert ord, der er tilfredsstillende, videregives til en adaptiv klassifikator som træningsdata. Den adaptive klassifikator får så en chance for mere præcist at genkende tekst længere nede på siden.

Modernisering af Tesseract-værktøjet var et forsøg på koderensning og tilføjelse af en ny LSTM-model. Inputbilledet behandles i kasser (rektangel) linje for linje ind i LSTM-modellen og giver output. På billedet nedenfor kan vi visualisere, hvordan det fungerer.

Sådan OCR med Tesseract, OpenCV og Python
Hvordan Tesseract bruger LSTM-modellen præsentation

Efter at have tilføjet et nyt træningsværktøj og trænet modellen med en masse data og skrifttyper, opnår Tesseract en bedre ydeevne. Alligevel ikke god nok til at arbejde med håndskrevet tekst og mærkelige skrifttyper. Det er muligt at finjustere eller genoptræne de øverste lag til eksperimentering.


Installation af Tesseract

Det er nemt at installere tesseract på Windows med de forudkompilerede binære filer link.. Glem ikke at redigere "sti" miljøvariabel og tilføje tesseract-sti. Til Linux eller Mac installation er den installeret med få kommandoer.

Efter installationen skal du kontrollere, at alt fungerer ved at skrive kommando i terminalen eller cmd:

$ tesseract --version

Og du vil se output, der ligner:

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

Du kan installere python-indpakningen til tesseract efter dette ved hjælp af pip.
$ pip install pytesseract

Tesseract-biblioteket leveres med et praktisk kommandolinjeværktøj kaldet tesseract. Vi kan bruge dette værktøj til at udføre OCR på billeder, og outputtet gemmes i en tekstfil. Hvis vi ønsker at integrere Tesseract i vores C++ eller Python kode, vil vi bruge Tesseracts API.


Kører Tesseract med CLI

Kald Tesseract-motoren på billedet med image_path og konverter billede til tekst, skrevet linje for linje i kommandoprompten ved at skrive følgende:

$ tesseract image_path stdout

Sådan skriver du outputteksten i en fil:

$ tesseract image_path text_result.txt

For at angive sprogmodellens navn skal du skrive sproggenvej efter -l flag, som standard tager det engelsk sprog:

$ tesseract image_path text_result.txt -l eng

Som standard forventer Tesseract en side med tekst, når den segmenterer et billede. Hvis du bare søger at OCR en lille region, prøv en anden segmenteringstilstand ved at bruge -psm argument. Der er 14 tilgængelige tilstande, som kan findes link.. Som standard automatiserer Tesseract sidesegmenteringen fuldt ud, men udfører ikke orientering og scriptdetektion. For at angive parameteren skal du skrive følgende:

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

Der er også et mere vigtigt argument, OCR-motortilstand (oem). Tesseract 4 har to OCR-motorer - Legacy Tesseract-motor og LSTM-motor. Der er fire driftstilstande valgt ved hjælp af –oem-indstillingen.
0 Kun ældre motor.
1 Neurale net kun LSTM-motor.
2 Legacy + LSTM motorer.
3 Standard, baseret på hvad der er tilgængeligt.

Sådan OCR med Tesseract, OpenCV og Python
Resultat af Tesseract OCR-motoren

OCR med Pytesseract og OpenCV

Pytesseract er en indpakning til Tesseract-OCR Engine. Det er også nyttigt som et selvstændigt invokationsscript til tesseract, da det kan læse alle billedtyper, der understøttes af billedbibliotekerne Pillow og Leptonica, inklusive jpeg, png, gif, bmp, tiff og andre. Læs mere om Python-tilgangen link.. Koden til denne tutorial kan findes i denne Repository.

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)

Forbehandling til Tesseract

For at undgå alle de måder, hvorpå din tesseract-outputnøjagtighed kan falde, skal du sørge for, at billedet er korrekt forbehandlet.

Dette inkluderer omskalering, binarisering, fjernelse af støj, skråstilling osv.

For at forbehandle billede til OCR skal du bruge en af ​​følgende python-funktioner eller følge OpenCV dokumentation.

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) 

Lad os arbejde med et eksempel for at se tingene bedre. Sådan ser vores originale billede ud –

Sådan OCR med Tesseract, OpenCV og Python
Aurebesh-skriftsystemet

Efter forbehandling med følgende kode

image = cv2.imread('aurebesh.jpg') gray = get_grayscale(image)
thresh = thresholding(gray)
opening = opening(gray)
canny = canny(gray)

og plotter de resulterende billeder, får vi følgende resultater.

Sådan OCR med Tesseract, OpenCV og Python
Billedet efter forbehandling

Outputtet for det originale billede ser sådan ud -

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

Her er, hvordan outputtet for forskellige forbehandlede billeder ser ud –

Canny kant billede (ikke så godt)-

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

Tærskelbillede –

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

Åbningsbillede -

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


Få kasser omkring tekst

Ved at bruge Pytesseract kan du få oplysninger om afgrænsningsrammen for dine OCR-resultater ved at bruge følgende kode.

Scriptet nedenfor vil give dig information om afgrænsningsrammen for hvert tegn, der registreres af tesseract under 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)

Hvis du vil have bokse omkring ord i stedet for tegn, kan funktionen image_to_data vil komme til nytte. Du kan bruge image_to_data funktion med outputtype angivet med pytesseract Output.

Sådan OCR med Tesseract, OpenCV og Python

Har du et OCR-problem i tankerne? Vil du digitalisere fakturaer, PDF'er eller nummerplader? Gå over til Nanonetter og byg OCR-modeller gratis!


Vi vil bruge eksemplet på fakturabilledet ovenfor til at teste vores tesseract-output.

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

Dette skulle give dig følgende output -
dict_keys(['level', 'page_num', 'block_num', 'par_num', 'line_num', 'word_num', 'left', 'top', 'width', 'height', 'conf', 'text'])

Ved at bruge denne ordbog kan vi få registreret hvert ord, deres afgrænsningsrammeoplysninger, teksten i dem og konfidensresultaterne for hvert.

Du kan plotte boksene ved at bruge koden nedenfor –

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)

Sådan ser det ud for billedet af en eksempelfaktura.

Sådan OCR med Tesseract, OpenCV og Python


Matchende tekstskabelon

Tag eksemplet med at prøve at finde ud af, hvor en dato er på et billede. Her vil vores skabelon være et regulært udtryksmønster, som vi matcher med vores OCR-resultater for at finde de passende afgrænsningsfelter. Vi vil bruge regex modul og image_to_data funktion til dette.

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)

Som forventet får vi én boks omkring fakturadatoen på billedet.

Sådan OCR med Tesseract, OpenCV og Python

Sidesegmenteringstilstande

Der er flere måder en side med tekst kan analyseres på. Tesseract API'et giver flere sidesegmenteringstilstande, hvis du kun vil køre OCR på et lille område eller i forskellige orienteringer osv.

Her er en liste over de understøttede sidesegmenteringstilstande efter tesseract –

0 Kun Orientering og scriptdetektion (OSD).
1 Automatisk sidesegmentering med OSD.
2 Automatisk sidesegmentering, men ingen OSD eller OCR.
3 Fuldautomatisk sidesegmentering, men ingen OSD. (Standard)
4 Antag en enkelt kolonne med tekst af variable størrelser.
5 Antag en enkelt ensartet blok af lodret justeret tekst.
6 Antag en enkelt ensartet tekstblok.
7 Behandl billedet som en enkelt tekstlinje.
8 Behandl billedet som et enkelt ord.
9 Behandl billedet som et enkelt ord i en cirkel.
10 Behandl billedet som et enkelt tegn.
11 Sparsom tekst. Find så meget tekst som muligt uden bestemt rækkefølge.
12 Sparsom tekst med OSD.
13 Rå linje. Behandl billedet som en enkelt tekstlinje, og omgå hacks, der er Tesseract-specifikke.

For at ændre din sidesegmenteringstilstand skal du ændre --psm argument i din tilpassede konfigurationsstreng til en af ​​de ovennævnte tilstandskoder.


Registrer orientering og script

Du kan registrere retningen af ​​tekst i dit billede og også scriptet, hvori det er skrevet. Følgende billede -
Sådan OCR med Tesseract, OpenCV og Python
efter at have kørt gennem følgende kode -

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)

vil udskrive følgende output.

angle: 90
script: Latin

Registrer kun cifre

Tag dette billede for eksempel -
Sådan OCR med Tesseract, OpenCV og Python
Teksten udtrukket fra dette billede ser sådan ud.

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

Du kan kun genkende cifre ved at ændre konfigurationen til følgende

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

Outputtet vil se sådan ud.

-- . 43876324
172018
0 76496234

Hvidliste karakterer

Sig, at du kun vil opdage bestemte tegn fra det givne billede og ignorere resten. Du kan angive din hvidliste over tegn (her har vi kun brugt alle små bogstaver fra a til z) ved at bruge følgende konfiguration.

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

Output -

customername
roject
tnvoleeno
ated alliumenergyservices
e
thovo

Sortliste tegn

Hvis du er sikker på, at nogle tegn eller udtryk helt sikkert ikke vil dukke op i din tekst (OCR returnerer ellers forkert tekst i stedet for sortlistede tegn), kan du sortliste disse tegn ved at bruge følgende konfiguration.

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

Output -

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

Find på flere sprog

Du kan tjekke de tilgængelige sprog ved at skrive dette i terminalen

$ tesseract --list-langs

For at downloade tesseract til en bestemt sprogbrug

$ sudo apt-get install tesseract-ocr-LANG

hvor LANG er koden på tre bogstaver for det sprog, du skal bruge. Du kan finde ud af LANG-værdierne link..

Du kan hente den .traindata fil til det sprog, du skal bruge fra link. og læg den ind $TESSDATA_PREFIX mappe (dette skal være det samme som hvor tessdata mappen er installeret), og den skulle være klar til brug.

Bemærk – Kun sprog, der har en .traineddata filformater understøttes af tesseract.

For at angive det sprog, du skal bruge dit OCR-output på, skal du bruge -l LANG argument i konfigurationen hvor LANG er koden på 3 bogstaver for hvilket sprog du vil bruge.

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

Tag dette billede for eksempel -
Sådan OCR med Tesseract, OpenCV og Python
Du kan arbejde med flere sprog ved at ændre LANG-parameteren som sådan –

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

og du vil få følgende output -

Here’s some Greek: Οδιο διστα ιμπεδιτ φιμ ει, αδ φελ αβχορρεανθ ελωκυενθιαμ, εξ εσε εξερσι γυ-
βεργρεν ηας. Ατ μει σολετ σριπτορεμ. ἴυς αλια λαβωρε θε. Σιθ κυωτ νυσκυαμ
τρασυνδια αν, ὠμνιυμ ελιγενδι τιν πρι. Παρτεμ φερθερεμ συσιπιαντὺυρ εξ ιυς,ναμ
%0790 แ ร เง ๑ ๕ 80 ๕ 6 ๑ อ 06 ส 0 เง น อ ๓ , πρω πρωπριαε σαεφολα ιδ. Ατ πρι δολορ νυ-
σκυαμ. 6 Thai Here’s some Thai: ν᾿ ค อ ร ั ป ซั น จ ุ ้ ย โป ร ด ิ ว เซ อ ร ์ ส ถา ป ั ต ย ์ จ ๊ า บ แจ ็ ก พ ็ อ ต ม ้ า ห ิ น อ ่ อ น ซา ก ุ ร ะ ค ั น ถ ธ ุ ร ะ ฟิ ด ส ต า ร ์ ท ง ี ้ บ อ ย
ค อ ต อ ื ่ ม แป ร ั ส ั ง โฆ ค ํ า ส า ป แฟ น ซี ศิ ล ป ว ั ฒ น ธร ร ม ไฟ ล ท ์ จ ิ ๊ ก โก ๋ ก ั บ ด ั ก เจ ล พ ล ็ อ ต ม า ม ่ า ซา ก ุ ร ะ ด ี ล เล อ
ร ์ ซี น ด ั ม พ ์ แฮ ป ป ี ้ เอ ๊ ้ า ะ อ ุ ร ั ง ค ธา ต ุ ซิ ม ฟิ น ิ ก ซ์ เท ร ล เล ่ อ ร ์ อ ว อ ร ์ ด แค น ย อ น ส ม า พ ั น ธ์ ค ร ั ว ซอ ง ฮั ม อ า
ข่ า เอ ็ ก ซ์ เพ ร ส

Bemærk – Det sprog, der først er angivet til -l parameter er det primære sprog.

Desværre har tesseract ikke en funktion til automatisk at registrere sproget i teksten i et billede. En alternativ løsning leveres af et andet python-modul kaldet langdetect som kan monteres via pip.

$ pip install langdetect

Dette modul igen, registrerer ikke sproget i teksten ved hjælp af et billede, men har brug for strenginput for at detektere sproget fra. Den bedste måde at gøre dette på er ved først at bruge tesseract til at få OCR-tekst på de sprog, du måtte føle er der, ved at bruge langdetect for at finde hvilke sprog der er inkluderet i OCR-teksten og kør derefter OCR igen med de fundne sprog.

Lad os sige, at vi har en tekst, vi troede var på engelsk og portugisisk.

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)

Dette bør udsende en liste over sprog i teksten og deres sandsynligheder.

[en:0.714282468983554, es:0.2857145605644145]

De sprogkoder, der bruges af langdetect følg ISO 639-1-koder. Tjek venligst for at sammenligne denne , denne. Vi oplever, at sproget i teksten i stedet er engelsk og spansk.

Vi får teksten igen ved at ændre konfigurationen til

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

Bemærk – Tesseract klarer sig dårligt, når de sprog, der er angivet i konfigurationen i et billede med flere sprog, er forkerte eller slet ikke er nævnt. Dette kan også vildlede langdetect-modulet en del.


Bruger tessdata_fast

Hvis hastighed er en stor bekymring for dig, kan du erstatte dine tessdata-sprogmodeller med tessdata_fast-modeller, som er 8-bit heltalsversioner af tessdata-modellerne.

Ifølge tessdata_fast github -

Dette lager indeholder hurtige heltalsversioner af trænede modeller til Tesseract Open Source OCR-motor.

Disse modeller fungerer kun med LSTM OCR-motoren fra Tesseract 4.

  • Disse er et hastighed/nøjagtighed kompromis med hensyn til, hvad der gav den bedste "værdi for pengene" i hastighed vs. nøjagtighed.
  • For nogle sprog er dette stadig bedst, men for de fleste ikke.
  • Den "bedste værdi for pengene" netværkskonfigurationen blev derefter integreret for yderligere hastighed.
  • De fleste brugere vil gerne bruge disse trænede datafiler til at lave OCR, og disse vil blive sendt som en del af Linux-distributioner, f.eks. Ubuntu 18.04.
  • Finjustering/trinvis træning vil IKKE være muligt ud fra disse fast modeller, da de er 8-bit heltal.
  • Når du bruger modellerne i dette lager, understøttes kun den nye LSTM-baserede OCR-motor. Arven tesseract motor er ikke understøttet med disse filer, så Tesseracts oem-tilstande '0' og '2' vil ikke fungere med dem.

At bruge tessdata_fast modeller i stedet for tessdata, alt hvad du skal gøre er at downloade din tessdata_fast sprogdatafil fra link. og placer den inde i din $TESSDATA_PREFIX mappe.


Har du brug for at digitalisere dokumenter, kvitteringer eller fakturaer, men for doven til at kode? Gå over til Nanonetter og byg OCR-modeller gratis!


Træning af Tesseract på brugerdefinerede data

Tesseract 4.00 inkluderer en ny neural netværksbaseret genkendelsesmotor, der leverer væsentlig højere nøjagtighed på dokumentbilleder. Neurale netværk kræver betydeligt flere træningsdata og træner meget langsommere end base Tesseract. For latinbaserede sprog er de eksisterende modeldata blevet trænet på omkring 400000 tekstlinjer, der spænder over omkring 4500 skrifttyper.

For at kunne køre Tesseract 4.0 LSTM træningsvejledningen skal du have en fungerende installation af Tesseract 4 og Tesseract 4 træningsværktøjer og også have træningsscripts og nødvendige trænede datafiler i visse mapper. Besøg github repo til filer og værktøjer.

Tesseract 4.00 tager et par dage til et par uger til træning fra bunden. Selv med alle disse nye træningsdata er der derfor nogle få muligheder for træning:

  • Finjuster – Start med et eksisterende trænet sprog, og træn på dine specifikke yderligere data. For eksempel træning i et håndskrevet datasæt og nogle ekstra skrifttyper.
  • Skær det øverste lag af – fra netværket og genoptræne et nyt toplag ved hjælp af de nye data. Hvis finjustering ikke virker, er dette højst sandsynligt den næstbedste mulighed. Analogien, hvorfor dette er nyttigt, tag for eksempel modeller trænet på ImageNet-datasæt. Målet er at bygge en kat- eller hundeklassifikator, lavere lag i modellen er gode til abstraktion på lavt niveau som hjørner, vandrette og lodrette linjer, men højere lag i modellen kombinerer disse funktioner og registrerer katte- eller hundes ører, øjne, næse og så videre. Ved kun at omskole de øverste lag bruger du viden fra lavere lag og kombinerer med dit nye anderledes datasæt.
  • Genoplær fra bunden – Dette er en meget langsom tilgang, medmindre du har et meget repræsentativt og tilstrækkeligt stort træningssæt til dit problem. Den bedste ressource til at træne fra bunden er at følge dette github repo.

En guide til, hvordan du træner på dine tilpassede data og opretter .traineddata filer kan findes link., link. , link..

Vi vil ikke dække koden til træning med Tesseract i dette blogindlæg.

Sådan OCR med Tesseract, OpenCV og Python

Begrænsninger af Tesseract

Tesseract fungerer bedst, når der er en ren segmentering af forgrundsteksten fra baggrunden. I praksis kan det være ekstremt udfordrende at garantere disse typer opsætning. Der er en række årsager til, at du måske ikke får output i god kvalitet fra Tesseract, som hvis billedet har støj i baggrunden. Jo bedre billedkvalitet (størrelse, kontrast, lyn), jo bedre er genkendelsesresultatet. Det kræver lidt forbehandling at forbedre OCR-resultaterne, billeder skal skaleres passende, have så meget billedkontrast som muligt, og teksten skal justeres vandret. Tesseract OCR er ret kraftfuld, men har følgende begrænsninger.

Tesseract-begrænsninger opsummeret i listen.

  • OCR er ikke så nøjagtig som nogle kommercielle løsninger, der er tilgængelige for os.
  • Klarer sig ikke godt med billeder påvirket af artefakter, herunder delvis okklusion, forvrænget perspektiv og kompleks baggrund.
  • Den er ikke i stand til at genkende håndskrift.
  • Det kan finde volapyk og rapportere dette som OCR-output.
  • Hvis et dokument indeholder sprog uden for dem, der er angivet i -l LANG-argumenterne, kan resultaterne være dårlige.
  • Den er ikke altid god til at analysere dokumenters naturlige læserækkefølge. For eksempel kan den ikke genkende, at et dokument indeholder to kolonner, og kan forsøge at sammenføje tekst på tværs af kolonner.
  • Scanninger af dårlig kvalitet kan give OCR af dårlig kvalitet.
  • Den afslører ikke oplysninger om, hvilken skrifttypefamilietekst tilhører.


Der er selvfølgelig en bedre, meget enklere og mere intuitiv måde at udføre OCR-opgaver på.


OCR med nanonetter

Sådan OCR med Tesseract, OpenCV og Python

Nanonets OCR API giver dig mulighed for nemt at bygge OCR-modeller. Du behøver ikke bekymre dig om at forbehandle dine billeder eller bekymre dig om matchende skabeloner eller bygge regelbaserede motorer for at øge nøjagtigheden af ​​din OCR-model.

Du kan uploade dine data, annotere dem, indstille modellen til at træne og vente på at få forudsigelser gennem en browserbaseret brugergrænseflade uden at skrive en enkelt linje kode, bekymre dig om GPU'er eller finde de rigtige arkitekturer til dine deep learning-modeller. Du kan også tilegne dig JSON-svarene for hver forudsigelse for at integrere den med dine egne systemer og bygge maskinlæringsdrevne apps, der er bygget på avancerede algoritmer og en stærk infrastruktur.

Brug af GUI: https://app.nanonets.com/

Du kan også bruge Nanonets-OCR API ved at følge nedenstående trin:‌

Trin 1: Klon Repo, Installer afhængigheder

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

Trin 2: Få din gratis API-nøgle
Få din gratis API-nøgle fra http://app.nanonets.com/#/keys

Sådan OCR med Tesseract, OpenCV og Python

Trin 3: Indstil API-nøglen som en miljøvariabel

export NANONETS_API_KEY=YOUR_API_KEY_GOES_HERE

Trin 4: Opret en ny model

python ./code/create-model.py

Bemærk: Dette genererer et MODEL_ID, som du skal bruge til det næste trin

Trin 5: Tilføj model-id som miljøvariabel

export NANONETS_MODEL_ID=YOUR_MODEL_ID

Bemærk: du får YOUR_MODEL_ID fra det forrige trin

Trin 6: Upload træningsdataene
Træningsdata findes i images (billedfiler) og annotations (kommentarer til billedfilerne)

python ./code/upload-training.py

Trin 7: Togmodel
Når billederne er blevet uploadet, skal du begynde at træne modellen

python ./code/train-model.py

Trin 8: Få modeltilstand
Modellen tager ~2 timer at træne. Du får en e-mail, når modellen er uddannet. I mellemtiden tjekker du modellens tilstand

python ./code/model-state.py

Trin 9: Lav forudsigelse
Når modellen er trænet. Du kan lave forudsigelser ved hjælp af modellen

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


Nanonetter og mennesker i løkken

‌‌Skærmbilledet 'Moderat' hjælper med rettelses- og indtastningsprocesserne og reducerer den manuelle anmelders arbejdsbyrde med næsten 90 % og reducerer omkostningerne med 50 % for organisationen.

Sådan OCR med Tesseract, OpenCV og Python

Funktionerne omfatter

  1. Spor forudsigelser, der er korrekte
  2. Spor hvilke der er forkerte
  3. Foretag rettelser til de unøjagtige
  4. Slet dem, der er forkerte
  5. Udfyld de manglende forudsigelser
  6. Filtrer billeder med datointervaller
  7. Få tællinger af modererede billeder i forhold til dem, der ikke er modereret

Alle felterne er struktureret i en brugervenlig GUI, som giver brugeren mulighed for at drage fordel af OCR-teknologien og hjælpe med at gøre den bedre, mens de går, uden at skulle indtaste nogen kode eller forstå, hvordan teknologien fungerer.


Har du et OCR-problem i tankerne? Vil du reducere din organisations omkostninger til dataindtastning? Gå over til Nanonetter og bygge OCR-modeller til udtræk tekst fra billeder or udtrække data fra PDF-filer!


Konklusion

Ligesom dyb læring har påvirket næsten alle facetter af computersyn, gælder det samme for karaktergenkendelse og håndskriftsgenkendelse. Deep learning baserede modeller har formået at opnå en hidtil uset tekstgenkendelsesnøjagtighed, langt ud over den traditionelle informationsudtræk , maskinlæring billedbehandling tilgange.

Tesseract klarer sig godt, når dokumentbilleder følger de næste retningslinjer:

  • Ren segmentering af forgrundsteksten fra baggrunden
  • Vandret justeret og skaleret korrekt
  • Billed af høj kvalitet uden sløring og støj

Den seneste udgivelse af Tesseract 4.0 understøtter deep learning baseret OCR, der er betydeligt mere nøjagtig. Selve OCR-motoren er bygget på et Long Short-Term Memory (LSTM) netværk, en slags Recurrent Neural Network (RNN).

Tesseract er perfekt til scanning af rene dokumenter og kommer med ret høj nøjagtighed og skrifttypevariabilitet, da træningen var omfattende. Jeg vil sige, at Tesseract er et go-to-værktøj, hvis din opgave er scanning af bøger, dokumenter og trykt tekst på en ren hvid baggrund.


Yderligere læsning

Update:
Mange mennesker spurgte os, hvordan de kan få dato i form af tekst eller ved at bruge, når den registrerer dato eller andre specifikke data, så de kunne tilføje til listen.
Her er svaret:
I koden til at tegne en afgrænsningsramme rundt om datofeltet, vil du bemærke en linje, som matcher regex-mønsteret med d['text']. Den tegner kun en boks, hvis mønsteret passer. Du kan simpelthen udtrække værdierne fra d['text'] når mønsteret matcher, og føj dem til en liste.

Opdatering 2:
For at besvare spørgsmål omkring ikke-engelsk OCR, har vi opdateret yderligere læselister.

Tidsstempel:

Mere fra AI og maskinindlæring