I dette blogginnlegget vil vi prøve å forklare teknologien bak den mest brukte Tesseract Engine, som ble oppgradert med den nyeste kunnskapen som er undersøkt innen optisk tegngjenkjenning. Denne artikkelen vil også tjene som en veiledning / veiledning om hvordan du implementerer OCR i python ved hjelp av Tesseract-motoren. Vi vil gå gjennom følgende moduler:
- Tesseract OCR-funksjoner
- Forbehandling av OCR ved bruk av OpenCV
- Kjører Tesseract med CLI og Python
- Begrensninger for Tesseract-motoren
Innholdsfortegnelse
- Introduksjon
- Åpen kildekode OCR-verktøy
- Tesseract OCR
- OCR med Pytesseract og OpenCV
- Trening Tesseract om tilpassede data
- Begrensninger av Tesseract
- OCR med Nanonets
- konklusjonen
Introduksjon
OCR = Optical Character Recognition. Med andre ord, OCR-systemer transformerer et todimensjonalt bilde av tekst, som kan inneholde maskinutskrevet eller håndskrevet tekst fra bilderepresentasjonen til maskinlesbar tekst. OCR som prosess består generelt av flere delprosesser for å utføre så nøyaktig som mulig. Delprosessene er:
- Forbehandling av bildet
- Tekstlokalisering
- Karakter segmentering
- Karaktergjenkjenning
- Postbehandling
Delprosessene i listen over kan selvfølgelig variere, men dette er omtrent nødvendige trinn for å nærme seg automatisk tegngjenkjenning. I OCR-programvare er hovedmålet å identifisere og fange opp alle unike ord ved hjelp av forskjellige språk fra skriftlige teksttegn.
I nesten to tiår har optiske tegngjenkjenningssystemer blitt mye brukt for å gi automatisert tekstinntasting i datastyrte systemer. Men i all denne tiden, konvensjonelle OCR-systemer (som sone OCR) har aldri overvunnet deres manglende evne til å lese mer enn en håndfull skrifttyper og sideformater. Typer med proporsjonal avstand (som inkluderer praktisk talt alle typesett-kopier), laserskriverfonter, og til og med mange ikke-proporsjonale skrivemaskinfonter, har holdt seg utenfor rekkevidden til disse systemene. Og som et resultat har konvensjonell OCR aldri oppnådd mer enn en marginal innvirkning på det totale antallet dokumenter som trenger konvertering til digital form.
Neste generasjons OCR-motorer takler disse problemene nevnt ovenfor veldig bra ved å bruke den nyeste forskningen innen dyp læring. Ved å utnytte kombinasjonen av dype modeller og store datasett som er offentlig tilgjengelige, oppnår modellene toppmoderne nøyaktigheter på gitte oppgaver. Nå for tiden er det også mulig å generere syntetiske data med forskjellige skrifttyper ved hjelp av generative motstandernettverk og få andre generative tilnærminger.
Optisk karaktergjenkjenning forblir en utfordrende problem når tekst forekommer i ubegrensede miljøer, som f.eks naturlige scenerpå grunn av geometriske forvrengninger, komplekse bakgrunner og forskjellige skrifttyper. Teknologien har fremdeles et enormt potensial på grunn av de forskjellige brukssakene til dyplæringsbasert OCR som
Har du et OCR-problem i tankene? Vil du redusere organisasjonens kostnader for dataregistrering? Gå over til Nanonetter og bygge OCR-modeller til trekke ut tekst fra bilder or trekke ut data fra PDF-filer med AI basert PDF OCR!
Åpen kildekode OCR-verktøy
Det finnes en rekke Optisk karaktergjenkjennelse programvare tilgjengelig. Jeg fant ingen kvalitetssammenligning mellom dem, men jeg vil skrive om noen av dem som ser ut til å være de mest utviklervennlige.
Tesseract - en OCR-motor med åpen kildekode som har fått popularitet blant OCR-utviklere. Selv om det noen ganger kan være smertefullt å implementere og modifisere, var det ikke for mange gratis og kraftige OCR-alternativer på markedet i lengste tid. Tesseract begynte som doktorgrad. forskningsprosjekt i HP Labs, Bristol. Den ble populær og ble utviklet av HP mellom 1984 og 1994. I 2005 ga HP ut Tesseract som en programvare med åpen kildekode. Siden 2006 er den utviklet av Google.
OCRopus - OCRopus er et OCR-system med åpen kildekode som gjør det enkelt å evaluere og gjenbruke OCR-komponentene av både forskere og selskaper. En samling dokumentanalyseprogrammer, ikke et nøkkelferdig OCR-system. For å bruke den på dokumentene dine, kan det hende du trenger å gjøre noe bildebehandling, og muligens også trene nye modeller. I tillegg til gjenkjenningsskriptene i seg selv, er det flere skript for redigering og korrigering av bakkesannhet, måling av feilrater, bestemmelse av forvirringsmatriser som er enkle å bruke og redigere.
ocular - Ocular fungerer best på dokumenter som skrives ut med håndtrykk, inkludert de som er skrevet på flere språk. Den fungerer ved hjelp av kommandolinjen. Det er et moderne OCR-system. Dens viktigste funksjoner er:
- Uovervåket læring av ukjente skrifttyper: krever kun dokumentbilder og et tekstkorpus.
- Evne til å håndtere støyende dokumenter: inkonsekvent blekk, avstand, vertikal justering
- Støtte for flerspråklige dokumenter, inkludert de som har betydelig kodebytte på ordnivå.
- Uovervåket læring av ortografiske variasjonsmønstre, inkludert arkaiske stavemåter og skriverforkortelse.
- Samtidig, felles transkripsjon til både diplomatiske (bokstavelige) og normaliserte former.
SwiftOCR - Jeg vil også nevne OCR-motoren skrevet i Swift, siden det er en enorm utvikling i å fremme bruken av Swift som utviklingsprogrammeringsspråk som brukes til dyp læring. Sjekk ut blog for å finne ut mer hvorfor. SwiftOCR er et raskt og enkelt OCR-bibliotek som bruker nevrale nettverk for bildegjenkjenning. SwiftOCR hevder at motoren deres overgår det velkjente Tessaract-biblioteket.
I dette blogginnlegget vil vi sette fokus på Tesseract OCR og finn ut mer om hvordan det fungerer og hvordan det brukes.
Tesseract OCR
Tesseract er en åpen kildekode-tekstgjenkjenningsmotor (OCR), tilgjengelig under Apache 2.0-lisensen. Den kan brukes direkte, eller (for programmerere) ved å bruke en API for å trekke ut trykt tekst fra bilder. Den støtter et bredt utvalg av språk. Tesseract har ikke en innebygd GUI, men det er flere tilgjengelige fra 3rdParty side. Tesseract er kompatibel med mange programmeringsspråk og rammer gjennom innpakninger som finnes her.. Den kan brukes med eksisterende layoutanalyse for å gjenkjenne tekst i et stort dokument, eller den kan brukes sammen med en ekstern tekstdetektor for å gjenkjenne tekst fra et bilde av en enkelt tekstlinje.
Tesseract 4.00 inkluderer et nytt delsystem for nevrale nettverk konfigurert som en tekstlinjegjenkjenning. Den har sin opprinnelse i OCRopus sin Python-baserte LSTM implementering, men er redesignet for Tesseract i C ++. Nevrale nettverkssystem i Tesseract forhåndsdaterer TensorFlow, men er kompatibelt med det, da det er et nettverksbeskrivelsesspråk kalt Variable Graph Specification Language (VGSL), som også er tilgjengelig for TensorFlow.
For å gjenkjenne et bilde som inneholder et enkelt tegn, bruker vi vanligvis et Convolutional Neural Network (CNN). Tekst med vilkårlig lengde er en sekvens av tegn, og slike problemer løses ved bruk av RNN-er, og LSTM er en populær form for RNN. Les dette innlegget for å lære mer om LSTM.
Teknologi - Hvordan det fungerer
LSTM er gode til å lære sekvenser, men reduserer mye når antall stater er for stort. Det er empiriske resultater som antyder at det er bedre å be en LSTM om å lære en lang sekvens enn en kort sekvens av mange klasser. Tesseract utviklet fra OCRopus-modellen i Python som var en gaffel av en LSMT i C ++, kalt CLSTM. CLSTM er en implementering av LSTM tilbakevendende nevrale nettverksmodell i C ++ ved bruk av Eigen-biblioteket for numeriske beregninger.
Legacy Tesseract 3.x var avhengig av flertrinnsprosessen der vi kan skille trinn:
- Ordfunn
- Linjefunn
- Karakterklassifisering
Ordfunn ble gjort ved å organisere tekstlinjer i klatter, og linjene og regionene analyseres for fast tonehøyde eller proporsjonal tekst. Tekstlinjer er delt inn i ord forskjellig i henhold til typen tegnavstand. Anerkjennelse fortsetter deretter som en to-pass prosess. I første omgang blir det forsøkt å gjenkjenne hvert ord etter tur. Hvert ord som er tilfredsstillende overføres til en adaptiv klassifikator som treningsdata. Den adaptive klassifisereren får da sjansen til å gjenkjenne tekst mer nøyaktig nede på siden.
Modernisering av Tesseract-verktøyet var et forsøk på å rense kode og legge til en ny LSTM-modell. Inngangsbildet behandles i bokser (rektangel) linje for linje som mates inn i LSTM-modellen og gir utdata. På bildet nedenfor kan vi visualisere hvordan det fungerer.
Etter å ha lagt til et nytt treningsverktøy og trent modellen med mye data og skrifter, oppnår Tesseract bedre ytelse. Fremdeles ikke bra nok til å jobbe med håndskrevet tekst og rare skrifter. Det er mulig å finjustere eller omskole topplag for eksperimentering.
Installere Tesseract
Det er enkelt å installere tesseract på Windows med de forhåndskompilerte binærfunnene som er funnet her.. Ikke glem å redigere "sti" miljøvariabelen og legge til tesserakt bane. For Linux eller Mac installasjon er den installert med få kommandoer.
Etter installasjonen, bekreft at alt fungerer ved å skrive kommando i terminalen eller cmd:
$ tesseract --version
Og du vil se utdataene som ligner på:
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-innpakningen for tesseract etter dette ved hjelp av pip.
$ pip install pytesseract
Tesseract-biblioteket leveres med et praktisk kommandolinjeverktøy som heter tesseract. Vi kan bruke dette verktøyet til å utføre OCR på bilder, og utdataene lagres i en tekstfil. Hvis vi ønsker å integrere Tesseract i C ++ - eller Python-koden, vil vi bruke Tesseracts API.
Kjører Tesseract med CLI
Ring Tesseract-motoren på bildet med image_path og konverter bilde til tekst, skrevet linje for linje i ledeteksten ved å skrive følgende:
$ tesseract image_path stdout
Slik skriver du utdatateksten i en fil:
$ tesseract image_path text_result.txt
For å spesifisere navnet på språkmodellen, skriv språkgenvei etter -l flagg, som standard tar det engelsk språk:
$ tesseract image_path text_result.txt -l eng
Som standard forventer Tesseract en side med tekst når den segmenterer et bilde. Hvis du bare ønsker å OCR en liten region, prøv en annen segmenteringsmodus ved å bruke –Psm argument. Det er 14 moduser tilgjengelig som kan bli funnet her.. Som standard automatiserer Tesseract sidesegmenteringen fullt ut, men utfører ikke orientering og skriptdeteksjon. For å spesifisere parameteren, skriv inn følgende:
$ tesseract image_path text_result.txt -l eng --psm 6
Det er også et viktig argument, OCR-motormodus (oem). Tesseract 4 har to OCR-motorer - Legacy Tesseract-motor og LSTM-motor. Det er fire driftsmåter valgt med alternativet –oem.
0 Kun eldre motor.
1 Bare nevnte LSTM-motor.
2 Legacy + LSTM-motorer.
3 Standard, basert på hva som er tilgjengelig.
OCR med Pytesseract og OpenCV
Pytesseract er en innpakning for Tesseract-OCR Engine. Det er også nyttig som et frittstående innkallingsskript til tesseract, da det kan lese alle bildetyper som støttes av Pillow og Leptonica bildebehandlingsbibliotek, inkludert jpeg, png, gif, bmp, tiff og andre. Les mer om Python-tilnærming her.. Koden for denne veiledningen finner du 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 av Tesseract
For å unngå alle måtene din tesserakt-utgangsnøyaktighet kan synke, må du sørge for at bildet er riktig forhåndsbehandlet.
Dette inkluderer omskalering, binærisering, støyfjerning, vridning osv.
For å forhåndsbehandle bilde for OCR, bruk en av følgende pythonfunksjoner eller følg OpenCV-dokumentasjon.
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)
La oss jobbe med et eksempel for å se ting bedre. Slik ser originalbildet vårt ut –
Etter forhåndsbehandling med følgende kode
image = cv2.imread('aurebesh.jpg') gray = get_grayscale(image)
thresh = thresholding(gray)
opening = opening(gray)
canny = canny(gray)
og plotte de resulterende bildene, får vi følgende resultater.
Utgangen for det originale bildet ser slik ut -
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
Slik ser utdataene for forskjellige forhåndsbehandlede bilder ut –
Canny edge image (ikke så bra) -
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
Terskelbilde -
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
Åpningsbilde -
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å bokser rundt tekst
Ved hjelp av Pytesseract kan du få informasjon om begrensningsboksen for OCR-resultatene dine ved hjelp av følgende kode.
Skriptet nedenfor vil gi deg informasjon om avgrensningsruten for hvert tegn oppdaget av 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 ha bokser rundt ord i stedet for tegn, funksjonen image_to_data
vil komme godt med. Du kan bruke image_to_data
funksjon med utgangstype spesifisert med pytesseract Output
.
Har du et OCR-problem i tankene? Vil du digitalisere fakturaer, PDF-filer eller nummerplater? Gå over til Nanonetter og bygg OCR-modeller gratis!
Vi vil bruke eksemplet på fakturabildet ovenfor for å teste ut våre tesseract-utdata.
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 skal gi deg følgende utgang -
dict_keys(['level', 'page_num', 'block_num', 'par_num', 'line_num', 'word_num', 'left', 'top', 'width', 'height', 'conf', 'text'])
Ved hjelp av denne ordboken kan vi oppdage hvert ord, informasjon om avgrensningsruten, teksten i dem og tillitspoengene for hvert.
Du kan plotte boksene ved å bruke 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)
Slik ser dette ut for bildet av en eksempelfaktura.
Tekstmal matching
Ta eksemplet med å prøve å finne hvor en dato er i et bilde. Her vil malen vår være et vanlig uttrykksmønster som vi vil matche med våre OCR-resultater for å finne de riktige avgrensningsfeltene. Vi vil bruke regex
modulen og image_to_data
funksjon for 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 en rute rundt fakturadatoen i bildet.
Sidesegmenteringsmodus
Det er flere måter en side med tekst kan analyseres på. Tesseract api tilbyr flere sidesegmenteringsmodus hvis du bare vil kjøre OCR på en liten region eller i forskjellige retninger osv.
Her er en liste over støttede sidesegmenteringsmoduser etter tesseract –
0 Kun orientering og skriptdeteksjon (OSD).
1 Automatisk sidesegmentering med OSD.
2 Automatisk sidesegmentering, men ingen OSD eller OCR.
3 Helautomatisk sidesegmentering, men ingen OSD. (Misligholde)
4 Anta en enkelt kolonne med tekst i variable størrelser.
5 Anta en enkelt uniform blokk med vertikalt justert tekst.
6 Anta en enkelt uniform tekstblokk.
7 Behandle bildet som en enkelt tekstlinje.
8 Behandle bildet som et enkelt ord.
9 Behandle bildet som et enkelt ord i en sirkel.
10 Behandle bildet som et enkelt tegn.
11 Sparsom tekst. Finn så mye tekst som mulig uten spesiell rekkefølge.
12 Sparsom tekst med OSD.
13 Rå linje. Behandle bildet som en enkelt tekstlinje, og omgå hacks som er Tesseract-spesifikke.
Hvis du vil endre sidesegmenteringsmodus, endrer du --psm
argument i din tilpassede konfigurasjonsstreng til noen av de ovennevnte moduskodene.
Oppdag orientering og skript
Du kan oppdage retningen til teksten i bildet ditt og også skriptet der den er skrevet. Følgende bilde -
etter å ha kjørt gjennom 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)
skriver ut følgende utdata.
angle: 90
script: Latin
Oppdag bare sifre
Ta dette bildet for eksempel -
Teksten hentet fra dette bildet ser slik ut.
‘Customer name Hallium Energy services
Project NEHINS-HIB-HSA
lavoice no 43876324
Dated 17%h Nov2018
Pono 76496234
Du kan bare gjenkjenne sifre ved å endre konfigurasjonen til følgende
custom_config = r'--oem 3 --psm 6 outputbase digits'
print(pytesseract.image_to_string(img, config=custom_config))
Utgangen vil se slik ut.
-- . 43876324
172018
0 76496234
Hvitliste tegn
Si at du bare vil oppdage bestemte tegn fra det gitte bildet og ignorere resten. Du kan spesifisere hvitlisten over tegn (her har vi bare brukt alle små bokstaver fra a til z) ved å bruke følgende konfigurasjon.
custom_config = r'-c tessedit_char_whitelist=abcdefghijklmnopqrstuvwxyz --psm 6'
print(pytesseract.image_to_string(img, config=custom_config))
Utgang -
customername
roject
tnvoleeno
ated alliumenergyservices
e
thovo
Blacklisting-tegn
Hvis du er sikker på at noen tegn eller uttrykk definitivt ikke vil dukke opp i teksten din (OCR vil returnere feil tekst i stedet for svarteliste tegn ellers), kan du svarteliste disse tegnene ved å bruke følgende konfigurasjon.
custom_config = r'-c tessedit_char_blacklist=0123456789 --psm 6'
pytesseract.image_to_string(img, config=custom_config)
Utgang -
Customer name Hallium Energy services
Project NEHINS-HIB-HSA
lavoice no
Dated %h Nov%
Pono
Oppdag på flere språk
Du kan sjekke språkene som er tilgjengelige ved å skrive dette i terminalen
$ tesseract --list-langs
For å laste ned tesseract for et spesifikt språkbruk
$ sudo apt-get install tesseract-ocr-LANG
der LANG er koden på tre bokstaver for språket du trenger. Du kan finne ut LANG-verdiene her..
Du kan laste ned .traindata
filen for språket du trenger fra her. og plasser den i $TESSDATA_PREFIX
katalog (dette skal være det samme som der tessdata
katalogen er installert) og den skal være klar til bruk.
Merknader - Bare språk som har en .traineddata
filformat støttes av tesseract.
For å spesifisere språket du trenger OCR-utgangen på, bruk -l LANG
argument i konfigurasjonen der LANG er koden på 3 bokstaver for hvilket språk du vil bruke.
custom_config = r'-l eng --psm 6'
pytesseract.image_to_string(img, config=custom_config)
Ta dette bildet for eksempel -
Du kan jobbe med flere språk ved å endre 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 utdata -
Here’s some Greek: Οδιο διστα ιμπεδιτ φιμ ει, αδ φελ αβχορρεανθ ελωκυενθιαμ, εξ εσε εξερσι γυ-
βεργρεν ηας. Ατ μει σολετ σριπτορεμ. ἴυς αλια λαβωρε θε. Σιθ κυωτ νυσκυαμ
τρασυνδια αν, ὠμνιυμ ελιγενδι τιν πρι. Παρτεμ φερθερεμ συσιπιαντὺυρ εξ ιυς,ναμ
%0790 แ ร เง ๑ ๕ 80 ๕ 6 ๑ อ 06 ส 0 เง น อ ๓ , πρω πρωπριαε σαεφολα ιδ. Ατ πρι δολορ νυ-
σκυαμ. 6 Thai Here’s some Thai: ν᾿ ค อ ร ั ป ซั น จ ุ ้ ย โป ร ด ิ ว เซ อ ร ์ ส ถา ป ั ต ย ์ จ ๊ า บ แจ ็ ก พ ็ อ ต ม ้ า ห ิ น อ ่ อ น ซา ก ุ ร ะ ค ั น ถ ธ ุ ร ะ ฟิ ด ส ต า ร ์ ท ง ี ้ บ อ ย
ค อ ต อ ื ่ ม แป ร ั ส ั ง โฆ ค ํ า ส า ป แฟ น ซี ศิ ล ป ว ั ฒ น ธร ร ม ไฟ ล ท ์ จ ิ ๊ ก โก ๋ ก ั บ ด ั ก เจ ล พ ล ็ อ ต ม า ม ่ า ซา ก ุ ร ะ ด ี ล เล อ
ร ์ ซี น ด ั ม พ ์ แฮ ป ป ี ้ เอ ๊ ้ า ะ อ ุ ร ั ง ค ธา ต ุ ซิ ม ฟิ น ิ ก ซ์ เท ร ล เล ่ อ ร ์ อ ว อ ร ์ ด แค น ย อ น ส ม า พ ั น ธ์ ค ร ั ว ซอ ง ฮั ม อ า
ข่ า เอ ็ ก ซ์ เพ ร ส
Merknader - Språket som ble spesifisert først til -l
parameteren er hovedspråket.
Dessverre har tesseract ikke en funksjon for å oppdage språket i teksten i et bilde automatisk. En alternativ løsning er gitt av en annen python-modul kalt langdetect
som kan installeres via pip.
$ pip install langdetect
Denne modulen oppdager ikke språket i tekst som bruker et bilde, men trenger strenginngang for å oppdage språket fra. Den beste måten å gjøre dette på er å først bruke tesseract for å få OCR-tekst på hvilke språk du måtte føle er der inne, ved å bruke langdetect
for å finne hvilke språk som er inkludert i OCR-teksten, og kjør deretter OCR igjen med språkene som er funnet.
Si at vi har en tekst vi trodde 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 skal gi en liste over språk i teksten og sannsynlighetene deres.
[en:0.714282468983554, es:0.2857145605644145]
Språkkodene som brukes av langdetect
følg ISO 639-1-koder. For å sammenligne, vennligst sjekk denne og denne. Vi finner at språket som brukes i teksten er engelsk og spansk i stedet.
Vi får teksten igjen ved å endre konfigurasjonen til
custom_config = r'-l eng+spa --psm 6'
txt = pytesseract.image_to_string(img, config=custom_config)
Merknader – Tesseract presterer dårlig når, i et bilde med flere språk, språkene spesifisert i konfigurasjonen er feil eller ikke er nevnt i det hele tatt. Dette kan også villede langdetect-modulen ganske mye.
Bruke tessdata_fast
Hvis hastighet er viktig for deg, kan du erstatte tessdata-språkmodellene dine med tessdata_fast-modeller som er 8-biters heltallversjoner av tessdata-modellene.
I følge tessdata_fast GitHub -
Dette depotet inneholder raske heltallversjoner av trente modeller for Tesseract OCR-motor med åpen kildekode.
Disse modellene fungerer bare med LSTM OCR-motoren fra Tesseract 4.
- Dette er et hastighet/nøyaktighet-kompromiss med hensyn til hva som ga best "verdi for pengene" i hastighet vs. nøyaktighet.
- For noen språk er dette fremdeles best, men for de fleste ikke.
- Nettverkskonfigurasjonen "best verdi for pengene" ble deretter integrert for ytterligere hastighet.
- De fleste brukere vil ønske å bruke disse trente datafilene til å gjøre OCR, og disse vil bli sendt som en del av Linux-distribusjoner, f.eks. Ubuntu 18.04.
- Finjustering / inkrementell trening vil IKKE være mulig fra disse
fast
modeller, ettersom de er 8-biters heltall. - Når du bruker modellene i dette depotet, støttes bare den nye LSTM-baserte OCR-motoren. Arven
tesseract
motoren støttes ikke med disse filene, så Tesseracts oem-modus '0' og '2' vil ikke fungere med dem.
Å bruke tessdata_fast
modeller i stedet for tessdata
, alt du trenger å gjøre er å laste ned din tessdata_fast
språk datafil fra her. og plasser den i din $TESSDATA_PREFIX
katalogen.
Trenger du å digitalisere dokumenter, kvitteringer eller fakturaer, men for lat til å kode? Gå over til Nanonetter og bygg OCR-modeller gratis!
Trening Tesseract om tilpassede data
Tesseract 4.00 inkluderer en ny nevral nettverksbasert gjenkjenningsmotor som gir betydelig høyere nøyaktighet på dokumentbilder. Nevrale nettverk krever betydelig mer treningsdata og trener mye tregere enn basen Tesseract. For latinbaserte språk er eksisterende modelldata gitt opplært på rundt 400000 tekstlinjer som strekker seg over 4500 skrifter.
For å kunne kjøre Tesseract 4.0 LSTM-opplæringsopplæringen, må du ha en fungerende installasjon av Tesseract 4 og Tesseract 4 Training Tools og også ha treningsskriptene og nødvendige trente datafiler i visse kataloger. Besøk github repo for filer og verktøy.
Tesseract 4.00 tar noen dager til et par uker for trening fra bunnen av. Selv med alle disse nye treningsdataene, er det derfor få muligheter for trening:
- Fin tone - Begynn med et eksisterende opplært språk, tren på dine spesifikke tilleggsdata. For eksempel trening på et håndskrevet datasett og noen ekstra skrifter.
- Klipp av topplaget – fra nettverket og trene opp et nytt topplag ved å bruke de nye dataene. Hvis finjustering ikke fungerer, er dette mest sannsynlig det nest beste alternativet. Analogien hvorfor dette er nyttig, ta for eksempel modeller som er trent på ImageNet-datasettet. Målet er å bygge en katte- eller hundeklassifiserer, lavere lag i modellen er gode på abstraksjon på lavt nivå som hjørner, horisontale og vertikale linjer, men høyere lag i modellen kombinerer disse funksjonene og oppdager kattens eller hundens ører, øyne, nese og så videre. Ved å omskolere kun de øverste lagene bruker du kunnskap fra de lavere lagene og kombinerer med ditt nye forskjellige datasett.
- Omskole fra bunnen av - Dette er en veldig langsom tilnærming, med mindre du har et veldig representativt og tilstrekkelig stort treningssett for problemet ditt. Den beste ressursen for opplæring fra bunnen av er å følge dette github repo.
En guide om hvordan du kan trene på dine tilpassede data og lage .traineddata
filer kan bli funnet her., her. og her..
Vi vil ikke dekke koden for opplæring ved bruk av Tesseract i dette blogginnlegget.
Begrensninger av Tesseract
Tesseract fungerer best når det er en ren segmentering av forgrunnen fra bakgrunnen. I praksis kan det være ekstremt utfordrende å garantere disse typer oppsett. Det er mange grunner til at du kanskje ikke får god kvalitet fra Tesseract, som om bildet har støy i bakgrunnen. Jo bedre bildekvalitet (størrelse, kontrast, lyn), jo bedre blir gjenkjennelsesresultatet. Det krever litt forbehandling for å forbedre OCR-resultatene, bildene må skaleres riktig, ha så mye bildekontrast som mulig, og teksten må være horisontalt justert. Tesseract OCR er ganske kraftig, men har følgende begrensninger.
Tesseract begrensninger oppsummert i listen.
- OCR er ikke så nøyaktig som noen kommersielle løsninger som er tilgjengelige for oss.
- Gjør det ikke bra med bilder påvirket av artefakter, inkludert delvis okklusjon, forvrengt perspektiv og kompleks bakgrunn.
- Det er ikke i stand til å gjenkjenne håndskrift.
- Det kan finne gibberish og rapportere dette som OCR-utgang.
- Hvis et dokument inneholder språk utenfor de som er gitt i -l LANG-argumentene, kan resultatene være dårlige.
- Det er ikke alltid bra å analysere den naturlige leserekkefølgen på dokumenter. Det kan for eksempel mislykkes i å gjenkjenne at et dokument inneholder to kolonner, og kan prøve å koble sammen tekst på tvers av kolonnene.
- Skanninger av dårlig kvalitet kan gi OCR av dårlig kvalitet.
- Den avslører ikke informasjon om hva fontfamilieteksten tilhører.
Det er selvfølgelig en bedre, mye enklere og mer intuitiv måte å utføre OCR-oppgaver på.
OCR med Nanonets
De Nanonets OCR API lar deg enkelt bygge OCR-modeller. Du trenger ikke å bekymre deg for å forhåndsbehandle bildene dine eller bekymre deg for å matche maler eller bygge regelbaserte motorer for å øke nøyaktigheten til OCR-modellen.
Du kan laste opp dataene dine, kommentere dem, stille inn modellen til å trene og vente på å få spådommer gjennom et nettleserbasert brukergrensesnitt uten å skrive en eneste kodelinje, bekymre deg for GPU-er eller finne de riktige arkitekturene for dine dype læringsmodeller. Du kan også anskaffe JSON-svarene fra hver prediksjon for å integrere den med dine egne systemer og bygge maskinlæringsapper som er bygd på topp moderne algoritmer og en sterk infrastruktur.
Bruke GUI: https://app.nanonets.com/
Du kan også bruke Nanonets-OCR API ved å følge trinnene nedenfor:
Trinn 1: Klone repoen, installer avhengigheter
git clone https://github.com/NanoNets/nanonets-ocr-sample-python.git
cd nanonets-ocr-sample-python
sudo pip install requests tqdm
Trinn 2: Få din gratis API-nøkkel
Få din gratis API-nøkkel fra http://app.nanonets.com/#/keys
Trinn 3: Sett API-nøkkelen som en miljøvariabel
export NANONETS_API_KEY=YOUR_API_KEY_GOES_HERE
Trinn 4: Lag en ny modell
python ./code/create-model.py
OBS: Dette genererer en MODEL_ID som du trenger for neste trinn
Trinn 5: Legg til modell-id som miljøvariabel
export NANONETS_MODEL_ID=YOUR_MODEL_ID
OBS: får du YOUR_MODEL_ID fra forrige trinn
Trinn 6: Last opp treningsdataene
Treningsdataene finnes i images
(bildefiler) og annotations
(merknader for bildefilene)
python ./code/upload-training.py
Trinn 7: Togmodell
Når bildene er lastet opp, begynn å trene modellen
python ./code/train-model.py
Trinn 8: Få modelltilstand
Modellen tar ~ 2 timer å trene. Du vil få en e-post når modellen er opplært. I mellomtiden sjekker du modellens tilstand
python ./code/model-state.py
Trinn 9: Gjør prediksjon
Når modellen er trent. Du kan lage spådommer ved å bruke modellen
python ./code/prediction.py ./images/151.jpg
Nanonetter og mennesker i sløyfen
Moderate-skjermen hjelper korrigerings- og inntastingsprosessene og reduserer den manuelle kontrollørens arbeidsmengde med nesten 90 % og reduserer kostnadene med 50 % for organisasjonen.
Funksjonene inkluderer
- Spor spådommer som er riktige
- Spor hvilke som er gale
- Gjør rettelser til de unøyaktige
- Slett de som er gale
- Fyll ut de manglende spådommene
- Filtrer bilder med datoperioder
- Få tellinger av modererte bilder mot de som ikke modereres
Alle feltene er strukturert i en brukervennlig GUI som lar brukeren dra nytte av OCR-teknologien og hjelpe til med å gjøre det bedre mens de går, uten å måtte skrive inn noen kode eller forstå hvordan teknologien fungerer.
Har du et OCR-problem i tankene? Vil du redusere organisasjonens kostnader for dataregistrering? Gå over til Nanonetter og bygge OCR-modeller til trekke ut tekst fra bilder or trekke ut data fra PDF-filer!
konklusjonen
Akkurat som dyp læring har påvirket nesten alle fasett av datasyn, gjelder det samme for karaktergjenkjenning og håndskriftgjenkjenning. Dyplæringsbaserte modeller har klart å oppnå enestående tekstgjenkjenningsnøyaktighet, langt utover tradisjonell informasjonsutvinning og maskinlæring bildebehandling tilnærminger.
Tesseract fungerer godt når dokumentbilder følger de neste retningslinjene:
- Ren segmentering av forgrunnen fra bakgrunnen
- Horisontalt justert og skalert riktig
- Høykvalitetsbilde uten uskarphet og støy
Den siste utgivelsen av Tesseract 4.0 støtter dyp læringsbasert OCR som er betydelig mer nøyaktig. Selve OCR-motoren er bygget på et Long Short-Term Memory (LSTM) nettverk, et slags Recurrent Neural Network (RNN).
Tesseract er perfekt for skanning av rene dokumenter og har ganske høy nøyaktighet og skriftvariabilitet siden opplæringen var omfattende. Jeg vil si at Tesseract er et godt verktøy hvis oppgaven din er å skanne bøker, dokumenter og trykt tekst på en ren hvit bakgrunn.
Videre Reading
- Best trente modell for LSTM Tesseract 4.0
- Dropbox-tilnærming til OCR 4.2017
- Oversikt over Tesseract OCR Engine Legacy
- Forum for Tesseract-utviklere
- Forum for Tesseract-brukere
- Sammenligning av OCR-nøyaktighet på tidlig trykte bøker ved hjelp av
Open Source Engines Calamari og OCRopus - Effektiv, leksikonfri OCR ved hjelp av Deep Learning
- Egnetheten til OCR-motorer i informasjonsekstraksjonssystemer – en sammenlignende evaluering
- DeepText Benchmark
- OCR-prosjektliste
- Tesseract Github siste utgivelse
- CVPR 2019 – Character Region Awareness for Text Detection (CRAFT)
- Kredittkort OCR med OpenCV og Python
- Bildeforbehandling
- Bildeforbehandling i OpenCV
- OCR ved å bruke Tesseract på Raspberry Pi
- Tesseract OCR for ikke-engelske språk
- Hvordan gjøre OCR fra Linux-kommandolinjen ved å bruke Tesseract
- En oversikt over Tesseract OCR-motoren
Oppdatering:
Mange mennesker spurte oss hvordan de kan få dato i form av tekst eller bruke når den oppdager dato eller andre spesifikke data slik at de kan legge til listen.
Her er svaret:
I koden for å tegne en avgrensningsramme rundt datoboksen, vil du legge merke til en linje som samsvarer med regex-mønsteret medd['text']
. Den tegner bare en boks hvis mønsteret stemmer. Du kan ganske enkelt trekke ut verdiene frad['text']
når mønsteret samsvarer og legg dem til en liste.
Oppdatering 2:
For å svare på spørsmål rundt ikke-engelsk OCR, har vi oppdatert ytterligere leselister.
- 100
- 2019
- 7
- 9
- Om oss
- Ifølge
- nøyaktig
- oppnådd
- erverve
- tvers
- Ytterligere
- adresse
- Fordel
- AI
- hjelpemidler
- algoritmer
- Alle
- tillate
- blant
- analyse
- En annen
- api
- tilnærming
- apps
- AREA
- argumenter
- rundt
- Kunst
- Artikkel
- Automatisert
- tilgjengelig
- bevissthet
- være
- BEST
- Bit
- Blogg
- bøker
- grensen
- Eske
- nett~~POS=TRUNC leseren~~POS=HEADCOMP
- bygge
- innebygd
- Kan få
- CD
- endring
- Circle
- krav
- Rengjøring
- CNN
- kode
- samling
- Kolonne
- kombinasjon
- kommersiell
- Selskaper
- komplekse
- selvtillit
- Konfigurasjon
- forvirring
- inneholder
- Konvertering
- Korreksjoner
- Kostnader
- kunne
- Par
- dato
- avtale
- oppdaget
- Gjenkjenning
- bestemme
- utviklet
- utviklere
- Utvikling
- gJORDE
- avvike
- forskjellig
- digitalt
- Digitize
- sifre
- dokumenter
- ned
- Drop
- dropbox
- Tidlig
- Edge
- emalje
- Endpoint
- energi
- Engelsk
- Miljø
- alt
- eksempel
- forventet
- forventer
- familie
- FAST
- Trekk
- Egenskaper
- Felt
- Først
- flyten
- følge
- etter
- gaffel
- skjema
- format
- skjemaer
- funnet
- Gratis
- funksjon
- få
- gå
- GitHub
- Giving
- mål
- god
- grå
- Gråtoner
- flott
- veilede
- retningslinjer
- hacks
- å ha
- hode
- her.
- Høy
- holder
- Hvordan
- Hvordan
- HTTPS
- stort
- Mennesker
- identifisere
- bilde
- Påvirkning
- iverksette
- viktig
- forbedre
- I andre
- inkludert
- Inkludert
- Øke
- info
- informasjon
- Infrastruktur
- integrere
- intuitiv
- IT
- bli medlem
- nøkkel
- nøkler
- kunnskap
- kjent
- Labs
- Språk
- språk
- stor
- siste
- LÆRE
- læring
- Bibliotek
- Tillatelse
- Lyn
- linje
- linux
- Liste
- lister
- Lang
- mac
- maskin
- maskinlæring
- større
- Making
- håndbok
- marked
- Match
- Minne
- tankene
- modell
- modeller
- mest
- nettverk
- nettverksbasert
- nettverk
- Bråk
- åpen
- åpen kildekode
- åpning
- Alternativ
- alternativer
- rekkefølge
- organisering
- Annen
- ellers
- Mønster
- Ansatte
- ytelse
- perspektiv
- dårlig
- Populær
- mulig
- kraftig
- prediksjon
- Spådommer
- trykk
- pen
- primære
- Problem
- prosess
- Prosesser
- produsere
- programmerere
- Programmering
- programmerings språk
- programmer
- prosjekt
- gi
- gir
- kvalitet
- priser
- Raw
- RE
- Lesning
- grunner
- redusere
- regelmessig
- forble
- rapporterer
- Repository
- krever
- påkrevd
- forskning
- ressurs
- REST
- Resultater
- Kjør
- rennende
- skanning
- Skjerm
- segmentering
- Tjenester
- sett
- Kort
- lignende
- Enkelt
- Størrelse
- liten
- So
- Software
- Solutions
- Spansk
- spesifikasjon
- fart
- Tilstand
- Stater
- sterk
- vellykket
- Støttes
- Støtter
- SWIFT
- system
- Systemer
- oppgaver
- Teknologi
- terminal
- test
- Gjennom
- tid
- verktøy
- topp
- tradisjonelle
- Kurs
- Transform
- behandle
- Trender
- Ubuntu
- ui
- forstå
- unik
- us
- bruke
- bruk-tilfeller
- Brukere
- verdi
- syn
- W
- vente
- walking
- Hva
- Hva er
- hviteliste
- Wikipedia
- vinduer
- innenfor
- uten
- ord
- Arbeid
- arbeid
- virker
- skriving
- X