Hur man OCR med Tesseract, OpenCV och Python PlatoBlockchain Data Intelligence. Vertikal sökning. Ai.

Hur man OCR med Tesseract, OpenCV och Python

Hur man OCR med Tesseract, OpenCV och Python

I det här blogginlägget kommer vi att försöka förklara tekniken bakom den mest använda Tesseract Engine, som uppgraderades med den senaste kunskapen som forskats inom optisk karaktärsigenkänning. Denna artikel kommer också att fungera som en guide / handledning om hur man implementerar OCR i python med Tesseract-motorn. Vi går igenom följande moduler:

  • Tesseract OCR-funktioner
  • Förbehandling för OCR med OpenCV
  • Kör Tesseract med CLI och Python
  • Begränsningar av Tesseract-motorn

Innehållsförteckning

Beskrivning

OCR = Optical Character Recognition. Med andra ord omvandlar OCR-system en tvådimensionell bild av text, som kan innehålla maskinskriven eller handskriven text från dess bildrepresentation till maskinläsbar text. OCR som process består i allmänhet av flera delprocesser för att utföra så exakt som möjligt. Delprocesserna är:

  • Förbehandling av bilden
  • Textlokalisering
  • Karaktärsegmentering
  • Teckenigenkänning
  • Post Processing

Delprocesserna i listan ovan kan naturligtvis skilja sig åt, men det här är ungefär steg som behövs för att närma sig automatisk teckenigenkänning. I OCR-programvara är huvudsyftet att identifiera och fånga alla unika ord med olika språk från skrivna texttecken.

I nästan två decennier har optiska teckenigenkänningssystem använts i stor utsträckning för att tillhandahålla automatisk textinmatning i datoriserade system. Men under all denna tid, konventionella OCR-system (som zonal OCR) har aldrig övervunnit sin oförmåga att läsa mer än en handfull typsnitt och sidformat. Proportionellt fördelade typsnitt (som inkluderar praktiskt taget alla typsnitt), laserskrivarteckensnitt och till och med många icke-proportionella skrivmaskinsteckensnitt, har förblivit utom räckhåll för dessa system. Och som ett resultat har konventionell OCR aldrig uppnått mer än en marginell inverkan på det totala antalet dokument som behöver konverteras till digital form.

Hur man OCR med Tesseract, OpenCV och Python
Process för erkännande av optiska karaktärer (Courtesy)

Nästa generations OCR-motorer hanterar ovan nämnda problem riktigt bra genom att använda den senaste forskningen inom området djupinlärning. Genom att utnyttja kombinationen av djupa modeller och stora datamängder som är allmänt tillgängliga, uppnår modeller toppmoderna noggrannheter för givna uppgifter. Numera är det också möjligt att generera syntetiska data med olika teckensnitt som använder generativa kontroversiella nätverk och få andra generativa tillvägagångssätt.

Optisk karaktärsigenkänning förblir en utmanande problem när text förekommer i obegränsade miljöer, t.ex. naturliga scener, på grund av geometriska snedvridningar, komplexa bakgrunder och olika teckensnitt. Tekniken har fortfarande en enorm potential på grund av olika användningsfall av djupinlärningsbaserad OCR-liknande


Har du ett OCR-problem i åtanke? Vill du minska din organisations kostnader för datainmatning? Gå över till Nanonetter och bygga OCR-modeller till extrahera text från bilder or extrahera data från PDF-filer med AI-baserad PDF OCR!


OCR-verktyg med öppen källkod

Det finns en hel del optisk teckenigenkänning tillgänglig programvara. Jag hittade ingen kvalitetsjämförelse mellan dem, men jag kommer att skriva om några av dem som verkar vara de mest utvecklarvänliga.

tesseract - en OCR-motor med öppen källkod som har blivit populär bland OCR-utvecklare. Även om det ibland kan vara smärtsamt att implementera och modifiera fanns det inte för många gratis och kraftfulla OCR-alternativ på marknaden under den längsta tiden. Tesseract började som doktorsexamen. forskningsprojekt i HP Labs, Bristol. Det blev populär och utvecklades av HP mellan 1984 och 1994. 2005 släppte HP Tesseract som en programvara med öppen källkod. Sedan 2006 har den utvecklats av Google.

Hur man OCR med Tesseract, OpenCV och Python
google-trender jämförelse för olika OCR-verktyg med öppen källkod

OCRopus - OCRopus är ett OCR-system med öppen källkod som gör det enkelt att utvärdera och återanvända OCR-komponenterna av både forskare och företag. En samling dokumentanalysprogram, inte ett nyckelfärdigt OCR-system. För att tillämpa den på dina dokument kan du behöva göra en bildförbehandling och eventuellt också träna nya modeller. Förutom själva igenkänningsskripten finns det flera skript för redigering och korrigering av markens sanning, mätning av felhastigheter, bestämning av förvirringsmatriser som är lätta att använda och redigera.


Okulär - Ocular fungerar bäst på dokument som skrivs ut med en handpress, inklusive de som är skrivna på flera språk. Den fungerar med kommandoraden. Det är ett toppmodernt historiskt OCR-system. Dess främsta funktioner är:

  • Oövervakad inlärning av okända teckensnitt: kräver endast dokumentbilder och en textkorpus.
  • Förmåga att hantera bullriga dokument: inkonsekvent färg, avstånd, vertikal inriktning
  • Stöd för flerspråkiga dokument, inklusive de som har betydande kodväxling på ordnivå.
  • Oövervakad inlärning av ortografiska variationer inklusive arkaiska stavningar och skrivare.
  • Samtidig, gemensam transkription till både diplomatiska (bokstavliga) och normaliserade former.


SwiftOCR - Jag kommer också att nämna OCR-motorn skriven i Swift eftersom det görs enorm utveckling för att främja användningen av Swift som utvecklingsprogrammeringsspråk som används för djupt lärande. Kolla upp blogg för att ta reda på mer varför. SwiftOCR är ett snabbt och enkelt OCR-bibliotek som använder neurala nätverk för bildigenkänning. SwiftOCR hävdar att deras motor överträffar välkända Tessaract-bibliotek.

I detta blogginlägg kommer vi att lägga fokusera på Tesseract OCR och ta reda på mer om hur det fungerar och hur det används.


Tesseract OCR

Tesseract är en textigenkänningsmotor med öppen källkod (OCR), tillgänglig under Apache 2.0-licensen. Den kan användas direkt, eller (för programmerare) med hjälp av ett API för att extrahera tryckt text från bilder. Den stöder en mängd olika språk. Tesseract har inget inbyggt gränssnitt, men det finns flera tillgängliga från 3rdParty sida. Tesseract är kompatibel med många programmeringsspråk och ramar genom omslag som finns här.. Den kan användas med den befintliga layoutanalysen för att känna igen text i ett stort dokument, eller den kan användas tillsammans med en extern textdetektor för att känna igen text från en bild av en enda textrad.

Hur man OCR med Tesseract, OpenCV och Python
OCR Process Flow för att bygga API med Tesseract från en blogginlägg

Tesseract 4.00 inkluderar ett nytt delsystem för neurala nätverk konfigurerat som en textradigenkännare. Det har sitt ursprung i OCRopus Python-baserade LSTM implementering men har redesignats för Tesseract i C ++. Det neurala nätverkssystemet i Tesseract går före TensorFlow men är kompatibelt med det, eftersom det finns ett nätverksbeskrivningsspråk som heter Variable Graph Specification Language (VGSL), som också är tillgängligt för TensorFlow.

För att känna igen en bild som innehåller en enda karaktär använder vi vanligtvis ett Convolutional Neural Network (CNN). Text med godtycklig längd är en sekvens av tecken, och sådana problem löses med hjälp av RNN och LSTM är en populär form av RNN. Läs det här inlägget för att lära dig mer om LSTM.


Teknik - Hur det fungerar

LSTM är bra för att lära sig sekvenser men saktar ner mycket när antalet stater är för stort. Det finns empiriska resultat som tyder på att det är bättre att be en LSTM att lära sig en lång sekvens än en kort sekvens med många klasser. Tesseract utvecklades från OCRopus-modellen i Python som var en gaffel av en LSMT i C ++, kallad CLSTM. CLSTM är en implementering av den återkommande neurala nätverksmodellen LSTM i C ++, med Eigen-biblioteket för numeriska beräkningar.

Hur man OCR med Tesseract, OpenCV och Python
Tesseract 3 OCR-process från papper

Legacy Tesseract 3.x var beroende av flerstegsprocessen där vi kan skilja steg:

  • Ord att hitta
  • Linjesökning
  • Karaktärsklassificering

Ordsökning gjordes genom att organisera textrader i blobs, och raderna och regionerna analyseras för fast tonhöjd eller proportionell text. Textrader är uppdelade i ord på olika sätt beroende på typ av teckenavstånd. Erkännande fortsätter sedan som en tvåpassprocess. I det första passet görs ett försök att känna igen varje ord i tur och ordning. Varje ord som är tillfredsställande skickas till en adaptiv klassificering som träningsdata. Den adaptiva klassificeraren får sedan en chans att mer exakt känna igen text nere på sidan.

Modernisering av Tesseract-verktyget var ett försök med kodrengöring och tillägg av en ny LSTM-modell. Inmatningsbilden bearbetas i rutor (rektangel) rad för rad som matas in i LSTM-modellen och ger utdata. I bilden nedan kan vi visualisera hur det fungerar.

Hur man OCR med Tesseract, OpenCV och Python
Hur Tesseract använder LSTM-modellen presentation

Efter att ha lagt till ett nytt träningsverktyg och tränat modellen med mycket data och typsnitt uppnår Tesseract bättre prestanda. Fortfarande inte tillräckligt bra för att arbeta med handskriven text och konstiga teckensnitt. Det är möjligt att finjustera eller omskola toppskikt för experiment.


Installera Tesseract

Det är enkelt att installera tesseract på Windows med de förkompilerade binärfiler som hittats här.. Glöm inte att redigera "path" miljövariabel och lägg till tesseract sökväg. För installation av Linux eller Mac installeras den med få kommandon.

Kontrollera efter installationen att allt fungerar genom att skriva kommando i terminalen eller cmd:

$ tesseract --version

Och du ser utdata som liknar:

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 installera pythonomslaget för tesseract efter detta med pip.
$ pip install pytesseract

Tesseract-biblioteket levereras med ett praktiskt kommandoradsverktyg som heter tesseract. Vi kan använda detta verktyg för att utföra OCR på bilder och utdata lagras i en textfil. Om vi ​​vill integrera Tesseract i vår C ++ - eller Python-kod kommer vi att använda Tesseracts API.


Kör Tesseract med CLI

Ring Tesseract-motorn på bilden med bildsökväg och konvertera bild till text, skriven rad för rad i kommandotolken genom att skriva följande:

$ tesseract image_path stdout

Så här skriver du utmatningstexten i en fil:

$ tesseract image_path text_result.txt

För att ange språkmodellnamnet, skriv språkgenväg efter -l flagga, som standard tar det engelska språket:

$ tesseract image_path text_result.txt -l eng

Som standard förväntar sig Tesseract en sida med text när den segmenterar en bild. Om du bara vill OCR en liten region, prova ett annat segmenteringsläge med hjälp av –Psm argument. Det finns 14 lägen tillgängliga som kan hittas här.. Som standard automatiserar Tesseract sidesegmenteringen helt, men utför inte orientering och skriptdetektering. För att ange parametern, skriv följande:

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

Det finns också ett viktigt argument, OCR-motorläge (oem). Tesseract 4 har två OCR-motorer - Legacy Tesseract-motor och LSTM-motor. Det finns fyra driftsätt som valts med alternativet –oem.
0 Endast äldre motor.
1 Neurala nät LSTM-motor endast.
2 Legacy + LSTM-motorer.
3 Standard, baserat på vad som är tillgängligt.

Hur man OCR med Tesseract, OpenCV och Python
Resultat av Tesseract OCR-motorn

OCR med Pytesseract och OpenCV

Pytesseract är ett omslag för Tesseract-OCR Engine. Det är också användbart som ett fristående anropsskript för att tesseract, eftersom det kan läsa alla bildtyper som stöds av bildbiblioteken Pillow och Leptonica, inklusive jpeg, png, gif, bmp, tiff och andra. Mer information om Python-tillvägagångssätt läs här.. Koden för denna handledning finns i den här 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)

Förbehandling för Tesseract

För att undvika alla sätt som din tesserakt-utgångsnoggrannhet kan sjunka måste du se till att bilden är korrekt förbehandlad.

Detta inkluderar omskalning, binärisering, brusborttagning, avstängning etc.

För att förbehandla avbildningen för OCR, använd någon av följande pythonfunktioner eller följ 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) 

Låt oss arbeta med ett exempel för att se saker bättre. Så här ser vår originalbild ut –

Hur man OCR med Tesseract, OpenCV och Python
Aurebesh-skrivsystemet

Efter förbehandling med följande kod

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

och plottning av de resulterande bilderna får vi följande resultat.

Hur man OCR med Tesseract, OpenCV och Python
Bilden efter förbehandling

Utgången för originalbilden ser ut så här -

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

Så här ser utdata för olika förbearbetade bilder ut –

Canny edge image (inte 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

Tröskelvärd bild -

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

Öppningsbild -

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å rutor runt text

Med Pytesseract kan du få information om begränsningsrutan för dina OCR-resultat med hjälp av följande koda.

Skriptet nedan ger dig information om avgränsningsrutan för varje tecken som detekteras 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)

Om du vill ha rutor runt ord istället för tecken, funktionen image_to_data kommer att vara till nytta. Du kan använda image_to_data funktion med utgångstyp specificerad med pytesseract Output.

Hur man OCR med Tesseract, OpenCV och Python

Har du ett OCR-problem i åtanke? Vill du digitalisera fakturor, PDF-filer eller nummerskyltar? Gå över till Nanonetter och bygg OCR-modeller gratis!


Vi kommer att använda exemplet på fakturabilden ovan för att testa våra tesserakt-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())

Detta ska ge dig följande resultat -
dict_keys(['level', 'page_num', 'block_num', 'par_num', 'line_num', 'word_num', 'left', 'top', 'width', 'height', 'conf', 'text'])

Med hjälp av denna ordlista kan vi få varje ord upptäckt, information om deras avgränsningsruta, texten i dem och konfidenspoängen för varje.

Du kan plotta rutorna med koden nedan -

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å här skulle det se ut för bilden av en provfaktura.

Hur man OCR med Tesseract, OpenCV och Python


Textmallmatchning

Ta exemplet med att försöka hitta var ett datum finns i en bild. Här kommer vår mall att vara ett reguljärt uttrycksmönster som vi matchar med våra OCR-resultat för att hitta lämpliga avgränsningsrutor. Vi kommer att använda regex modul och image_to_data funktion för detta.

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 förväntat får vi en ruta runt fakturadatumet i bilden.

Hur man OCR med Tesseract, OpenCV och Python

Sidsegmenteringslägen

Det finns flera sätt att analysera en sida med text. Tesseract api har flera sidasegmenteringslägen om du bara vill köra OCR på en liten region eller i olika riktningar etc.

Här är en lista över de sidsegmenteringslägen som stöds av tesseract –

0 Endast orientering och skriptdetektering (OSD).
1 Automatisk siddelning med OSD
2 Automatisk sidsegmentering men ingen OSD eller OCR.
3 Helautomatisk sidsegmentering men inget OSD. (Standard)
4 Antag en enda kolumn med text i olika storlekar.
5 Anta ett enda enhetligt block med vertikalt inriktad text.
6 Anta ett enda enhetligt textblock.
7 Behandla bilden som en enda textrad.
8 Behandla bilden som ett enda ord.
9 Behandla bilden som ett enda ord i en cirkel.
10 Behandla bilden som en enda karaktär.
11 Sparse text. Hitta så mycket text som möjligt i ingen särskild ordning.
12 Sparse text med OSD.
13 Rå linje. Behandla bilden som en enda textrad, förbi hack som är Tesseract-specifika.

För att ändra sidsegmenteringsläge, ändra --psm argument i din anpassade konfigurationssträng till någon av ovan nämnda lägskoder.


Upptäck orientering och skript

Du kan upptäcka textens orientering i din bild och även skriptet där den är skriven. Följande bild -
Hur man OCR med Tesseract, OpenCV och Python
efter att ha kört igenom följande kod -

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öljande utdata.

angle: 90
script: Latin

Upptäck endast siffror

Ta den här bilden till exempel -
Hur man OCR med Tesseract, OpenCV och Python
Texten som extraheras från den här bilden ser ut så här.

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

Du kan bara känna igen siffror genom att ändra konfigurationen till följande

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

Resultatet ser ut så här.

-- . 43876324
172018
0 76496234

Vitlista tecken

Anta att du bara vill upptäcka vissa tecken från den givna bilden och ignorera resten. Du kan ange din vitlista över tecken (här har vi endast använt alla små bokstäver från a till z) med hjälp av följande konfiguration.

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

Utgång -

customername
roject
tnvoleeno
ated alliumenergyservices
e
thovo

Svartlistningstecken

Om du är säker på att vissa tecken eller uttryck definitivt inte kommer att dyka upp i din text (OCR returnerar fel text istället för svartlistade tecken annars), kan du svartlista dessa tecken med hjälp av följande konfiguration.

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

Utgång -

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

Upptäck på flera språk

Du kan kontrollera tillgängliga språk genom att skriva detta i terminalen

$ tesseract --list-langs

För att ladda ner tesseract för ett specifikt språkbruk

$ sudo apt-get install tesseract-ocr-LANG

där LANG är koden på tre bokstäver för det språk du behöver. Du kan ta reda på LANG-värdena här..

Du kan ladda ner .traindata fil för det språk du behöver från här. och placera den i $TESSDATA_PREFIX katalog (detta bör vara detsamma som där tessdata katalogen är installerad) och den ska vara redo att användas.

Anmärkningar - Endast språk som har en .traineddata filformat stöds av tesseract.

För att ange språket du behöver din OCR-utdata på, använd -l LANG argument i konfigurationen där LANG är koden på 3 bokstäver för vilket språk du vill använda.

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

Ta den här bilden till exempel -
Hur man OCR med Tesseract, OpenCV och Python
Du kan arbeta med flera språk genom att ändra LANG-parametern som sådan -

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

och du får följande resultat -

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

Anmärkningar - Språket som anges först till -l parameter är det primära språket.

Tyvärr har tesseract inte en funktion för att automatiskt upptäcka språket i texten i en bild. En alternativ lösning tillhandahålls av en annan pythonmodul som kallas langdetect som kan installeras via pip.

$ pip install langdetect

Den här modulen upptäcker inte språket för text med en bild men behöver stränginmatning för att upptäcka språket från. Det bästa sättet att göra detta är att först använda tesseract för att få OCR-text på vilket språk du känner finns där, med langdetect för att hitta vilka språk som ingår i OCR-texten och kör sedan OCR igen med de språk som finns.

Säg att vi har en text som vi trodde var på engelska och portugisiska.

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)

Detta bör ge en lista med språk i texten och deras sannolikheter.

[en:0.714282468983554, es:0.2857145605644145]

De språkkoder som används av langdetect följ ISO 639-1-koder. För att jämföra, kontrollera detta och detta. Vi finner att språket som används i texten är engelska och spanska istället.

Vi får texten igen genom att ändra konfigurationen till

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

Anmärkningar – Tesseract presterar dåligt när, i en bild med flera språk, språken som anges i konfigurationen är fel eller inte nämns alls. Detta kan också vilseleda langdetect-modulen en hel del.


Använda tessdata_fast

Om hastighet är ett stort problem för dig kan du ersätta dina tessdata-språkmodeller med tessdata_fast-modeller som är 8-bitars heltalversioner av tessdata-modellerna.

Enligt tessdata_fast github -

Detta arkiv innehåller snabba heltalversioner av utbildade modeller för Tesseract OCR-motor med öppen källkod.

Dessa modeller fungerar bara med LSTM OCR-motorn i Tesseract 4.

  • Dessa är en hastighet/noggrannhet kompromiss om vad som erbjöd det bästa "värdet för pengarna" i hastighet kontra noggrannhet.
  • För vissa språk är det fortfarande bäst, men för de flesta inte.
  • Nätverkskonfigurationen "bästa valuta för pengarna" integrerades sedan för ytterligare hastighet.
  • De flesta användare vill använda dessa utbildade datafiler för att göra OCR och dessa kommer att skickas som en del av Linux-distributioner, t.ex. Ubuntu 18.04.
  • Finjustering / inkrementell träning kommer INTE vara möjligt från dessa fast modeller, eftersom de är 8-bitars heltal.
  • När du använder modellerna i detta arkiv stöds endast den nya LSTM-baserade OCR-motorn. Arvet tesseract motorn stöds inte med dessa filer, så Tesseracts oem-lägen '0' och '2' kommer inte att fungera med dem.

Att använda tessdata_fast modeller istället för tessdata, allt du behöver göra är att ladda ner din tessdata_fast språkdatafil från här. och placera den i din $TESSDATA_PREFIX katalog.


Behöver du digitalisera dokument, kvitton eller fakturor men för lat för att koda? Gå över till Nanonetter och bygg OCR-modeller gratis!


Utbildning Tesseract om anpassade data

Tesseract 4.00 innehåller en ny neural nätverksbaserad igenkänningsmotor som ger betydligt högre noggrannhet på dokumentbilder. Neurala nätverk kräver betydligt mer träningsdata och tränar mycket långsammare än bas Tesseract. För latinbaserade språk har befintlig modellinformation tillhandahållits utbildats på cirka 400000 textrader som spänner över cirka 4500 teckensnitt.

För att framgångsrikt kunna köra Tesseract 4.0 LSTM-träningshandledningen måste du ha en fungerande installation av Tesseract 4 och Tesseract 4 Training Tools och även ha träningsskript och nödvändiga utbildade datafiler i vissa kataloger. Besök github repo för filer och verktyg.

Tesseract 4.00 tar några dagar till ett par veckor för träning från grunden. Även med alla dessa nya träningsdata finns det därför några alternativ för träning:

  • Finjustera - Börja med ett befintligt utbildat språk, träna på dina specifika tilläggsdata. Till exempel träning i en handskriven dataset och några ytterligare teckensnitt.
  • Klipp av det översta lagret – från nätverket och träna om ett nytt toppskikt med hjälp av den nya datan. Om finjustering inte fungerar är detta troligen det näst bästa alternativet. Analogin varför detta är användbart, ta till exempel modeller tränade på ImageNet-datauppsättning. Målet är att bygga en katt- eller hundklassificerare, lägre lager i modellen är bra på abstraktion på låg nivå som hörn, horisontella och vertikala linjer, men högre lager i modellen kombinerar dessa egenskaper och upptäcker katt- eller hundöron, ögon, näsa och så vidare. Genom att omskola enbart toppskikten använder du kunskap från lägre skikt och kombinerar med ditt nya annorlunda dataset.
  • Omskola från grunden - Det här är ett mycket långsamt tillvägagångssätt om du inte har en mycket representativ och tillräckligt stor träningssats för ditt problem. Den bästa resursen för träning från grunden är att följa detta github repo.

En guide om hur du tränar på dina egna data och skapar .traineddata filer kan hittas här., här. och här..

Vi kommer inte att täcka koden för träning med Tesseract i det här blogginlägget.

Hur man OCR med Tesseract, OpenCV och Python

Begränsningar av Tesseract

Tesseract fungerar bäst när det finns en ren segmentering av förgrundstexten från bakgrunden. I praktiken kan det vara extremt utmanande att garantera dessa typer av inställningar. Det finns olika orsaker till att du kanske inte får bra kvalitet från Tesseract, som om bilden har brus i bakgrunden. Ju bättre bildkvalitet (storlek, kontrast, blixt) desto bättre igenkänningsresultat. Det kräver lite förbehandling för att förbättra OCR-resultaten, bilderna måste skalas på lämpligt sätt, ha så mycket bildkontrast som möjligt och texten måste justeras horisontellt. Tesseract OCR är ganska kraftfull men har följande begränsningar.

Begränsningar av Tesseract sammanfattas i listan.

  • OCR är inte lika exakt som vissa kommersiella lösningar tillgängliga för oss.
  • Klarar sig inte bra med bilder som påverkas av artefakter inklusive partiell ocklusion, förvrängt perspektiv och komplex bakgrund.
  • Det kan inte känna igen handskrift.
  • Det kan hitta gibberish och rapportera detta som OCR-utdata.
  • Om ett dokument innehåller språk utanför de som anges i -l LANG-argumenten kan resultaten vara dåliga.
  • Det är inte alltid bra att analysera dokumentens naturliga läsordning. Det kan till exempel misslyckas med att känna igen att ett dokument innehåller två kolumner och kan försöka sammanfoga text över kolumner.
  • Genomsökningar av dålig kvalitet kan ge OCR av dålig kvalitet.
  • Det avslöjar inte information om vad typsnittfamiljstext tillhör.


Det finns naturligtvis ett bättre, mycket enklare och mer intuitivt sätt att utföra OCR-uppgifter.


OCR med Nanonets

Hur man OCR med Tesseract, OpenCV och Python

Smakämnen Nanonets OCR API gör att du enkelt kan bygga OCR-modeller. Du behöver inte oroa dig för förbehandlingen av dina bilder eller oroa dig för att matcha mallar eller bygga regelbaserade motorer för att öka noggrannheten för din OCR-modell.

Du kan ladda upp dina data, kommentera dem, ställa in modellen för att träna och vänta på att få förutsägelser via ett webbläsarbaserat användargränssnitt utan att skriva en enda kodrad, oroa dig för GPU eller hitta rätt arkitekturer för dina djupa inlärningsmodeller. Du kan också förvärva JSON-svar från varje förutsägelse för att integrera det med dina egna system och bygga maskininlärningsdrivna appar som är byggda på toppmoderns algoritmer och en stark infrastruktur.

Använda GUI: https://app.nanonets.com/

Du kan också använda Nanonets-OCR API genom att följa stegen nedan: ‌

Steg 1: Klona repo, installera beroenden

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

Steg 2: Få din gratis API-nyckel
Hämta din gratis API-nyckel från http://app.nanonets.com/#/keys

Hur man OCR med Tesseract, OpenCV och Python

Steg 3: Ställ in API-nyckeln som en miljövariabel

export NANONETS_API_KEY=YOUR_API_KEY_GOES_HERE

Steg 4: Skapa en ny modell

python ./code/create-model.py

Notera: Detta genererar en MODEL_ID som du behöver för nästa steg

Steg 5: Lägg till modell-id som miljövariabel

export NANONETS_MODEL_ID=YOUR_MODEL_ID

Notera: får du YOUR_MODEL_ID från föregående steg

Steg 6: Ladda upp träningsdata
Träningsdata finns i images (bildfiler) och annotations (kommentarer för bildfilerna)

python ./code/upload-training.py

Steg 7: Tågmodell
När bilderna har laddats upp börjar du utbilda modellen

python ./code/train-model.py

Steg 8: Hämta modelltillstånd
Modellen tar ~ 2 timmar att träna. Du får ett e-postmeddelande när modellen tränas. Under tiden kontrollerar du modellens status

python ./code/model-state.py

Steg 9: Gör förutsägelse
När modellen tränas. Du kan göra förutsägelser med hjälp av modellen

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


Nanonets och människor i slingan

‌‌Skärmen "Moderat" hjälper korrigerings- och inmatningsprocesserna och minskar den manuella granskarens arbetsbelastning med nästan 90 % och minskar kostnaderna med 50 % för organisationen.

Hur man OCR med Tesseract, OpenCV och Python

funktioner inkluderar

  1. Spåra förutsägelser som är korrekta
  2. Spåra vilka som är fel
  3. Gör korrigeringar av de felaktiga
  4. Radera de som är fel
  5. Fyll i de saknade förutsägelserna
  6. Filtrera bilder med datumintervall
  7. Få räkningar av modererade bilder mot de som inte modereras

Alla fält är strukturerade till ett användarvänligt GUI som gör det möjligt för användaren att dra nytta av OCR-tekniken och hjälpa till att göra det bättre som de går, utan att behöva skriva någon kod eller förstå hur tekniken fungerar.


Har du ett OCR-problem i åtanke? Vill du minska din organisations kostnader för datainmatning? Gå över till Nanonetter och bygga OCR-modeller till extrahera text från bilder or extrahera data från PDF-filer!


Slutsats

Precis som djupinlärning har påverkat nästan alla aspekter av datorseende, gäller samma sak för teckenigenkänning och handskriftsigenkänning. Deep learning-baserade modellerna har lyckats få oöverträffad textigenkänningsnoggrannhet, långt utöver traditionella information utvinning och maskininlärning bildbehandling metoder.

Tesseract fungerar bra när dokumentbilder följer följande riktlinjer:

  • Ren segmentering av förgrundstexten från bakgrunden
  • Horisontellt inriktad och skalas på lämpligt sätt
  • Högkvalitativ bild utan suddighet och buller

Den senaste versionen av Tesseract 4.0 stöder djupinlärningsbaserad OCR som är betydligt mer exakt. Själva OCR-motorn är byggd på ett LSTM-nätverk (Long Short-Term Memory), ett slags återkommande neuralt nätverk (RNN).

Tesseract är perfekt för att skanna rena dokument och har ganska hög noggrannhet och typsnittsvariation eftersom dess utbildning var omfattande. Jag skulle säga att Tesseract är ett bra verktyg om din uppgift är att skanna böcker, dokument och tryckt text på en ren vit bakgrund.


Ytterligare läsning

Uppdatering:
Många människor frågade oss hur de kan få datum i form av text eller använda när det upptäcker datum eller någon annan specifik data så att de kan lägga till i listan.
Här är svaret:
I koden för att rita en begränsningsram runt datumrutan kommer du att märka en linje som matchar regexmönstret med d['text']. Den ritar bara en ruta om mönstret matchar. Du kan helt enkelt extrahera värdena från d['text'] när mönstret matchar och lägg till dem i en lista.

Uppdatering 2:
För att ta itu med frågor kring icke-engelsk OCR har vi uppdaterat ytterligare läslistor.

Tidsstämpel:

Mer från AI och maskininlärning