introduktion
mennesker kan forstå indholdet af et billede ved blot at kigge. Vi opfatter teksten på billedet som tekst og kan læse den.
computere fungerer ikke på samme måde. De har brug for noget mere konkret, organiseret på en måde, de kan forstå.
det er her Optical Character Recognition (OCR) sparker ind. Uanset om det er genkendelse af bilplader fra et kamera eller håndskrevne dokumenter, der skal konverteres til en digital kopi, er denne teknik meget nyttig. Selvom det ikke altid er perfekt, er det meget praktisk og gør det meget lettere og hurtigere for nogle mennesker at udføre deres job.
i denne artikel vil vi dykke ned i dybden af optisk tegngenkendelse og dens anvendelsesområder. Vi vil også opbygge et simpelt script i Python, der hjælper os med at registrere tegn fra billeder og udsætte dette gennem en kolbe-applikation til et mere praktisk interaktionsmedium.
Hvad er optisk tegngenkendelse?
optisk tegngenkendelse involverer detektering af tekstindhold på billeder og oversættelse af billederne til kodet tekst, som computeren let kan forstå. Et billede, der indeholder tekst, scannes og analyseres for at identificere tegnene i det. Ved identifikation konverteres tegnet til maskinkodet tekst.
hvordan er det virkelig opnået? For os er tekst på et billede Let at se, og vi er i stand til at registrere tegn og læse teksten, men for en computer er det hele en række prikker.
billedet scannes først, og tekst-og grafikelementerne konverteres til en bitmap, som i det væsentlige er en matrice af sorte og hvide prikker. Billedet forbehandles derefter, hvor lysstyrken og kontrasten justeres for at forbedre nøjagtigheden af processen.
billedet er nu opdelt i områder, der identificerer de interesseområder, som hvor billederne eller teksten er, og dette hjælper med at kickoff ekstraktionsprocessen. De områder, der indeholder tekst, kan nu opdeles yderligere i linjer og ord og tegn, og nu er programmet i stand til at matche tegnene gennem sammenligning og forskellige detektionsalgoritmer. Det endelige resultat er teksten i det billede, vi får.
processen er muligvis ikke 100% nøjagtig og har muligvis brug for menneskelig indgriben for at rette nogle elementer, der ikke blev scannet korrekt. Fejlkorrektion kan også opnås ved hjælp af en ordbog eller endda Natural Language Processing (NLP).
outputtet kan nu konverteres til andre medier såsom orddokumenter, PDF-filer eller endda lydindhold gennem tekst-til-tale-teknologier.
anvendelse af OCR
tidligere blev digitalisering af dokumenter opnået ved manuelt at skrive teksten på computeren. Gennem OCR gøres denne proces lettere, da dokumentet kan scannes, behandles og teksten ekstraheres og gemmes i en redigerbar form, såsom et orddokument.
Hvis du har en Dokumentscanner på din telefon, såsom Adobe Scan, Har du sandsynligvis stødt på OCR-teknologi i brug.
lufthavne kan også bruge OCR til at automatisere processen med pas anerkendelse og udvinding af oplysninger fra dem.
andre anvendelser af OCR inkluderer automatisering af dataindtastningsprocesser, detektion og genkendelse af bilnummerplader.
hvad vi bruger
til dette OCR-projekt bruger vi Python-Tesseract, eller simpelthen pytesseract, bibliotek, som er en indpakning til Googles Tesseract-OCR-motor.
Jeg valgte dette, fordi det er helt open source og udvikles og vedligeholdes af giganten, der er Google. Følg disse instruktioner for at installere Tesseract på din maskine, da PyTesseract afhænger af det.
Vi bruger også Flask-rammen til at oprette vores enkle OCR-server, hvor vi kan tage billeder via kameraet eller uploade fotos til karaktergenkendelsesformål.
Vi vil også bruge Pipenv, da det også håndterer opsætning af virtuelt miljø og kravstyring.
udover dem bruger vi også Pudebiblioteket, som er en gaffel af Python Imaging Library (PIL) til at håndtere åbning og manipulation af billeder i mange formater i Python.
i dette indlæg koncentrerer vi os om PyTesseract, selvom der er andre Python-biblioteker, der kan hjælpe dig med at udtrække tekst fra billeder som:
- Tekstract: som kan udtrække data fra PDF-filer, men er en tung pakke.
- Pyocr: tilbyder flere detektionsindstillinger såsom sætninger, cifre eller ord.
opsætning
Start med at installere Pipenv ved hjælp af følgende kommando via Pip (hvis du har brug for at konfigurere den, se dette).
$ pip install pipenv
Opret projektmappen og start projektet ved at køre følgende kommando:
$ mkdir ocr_server && cd ocr_server && pipenv install --three
Vi kan nu aktivere vores virtuelle miljø og begynde at installere vores afhængigheder:
$ pipenv shell$ pipenv install pytesseract Pillow
Hvis du ikke bruger Pipenv, kan du altid bruge PIP og virtuelt miljø tilgang. Følg den officielle dokumentation for at hjælpe dig med at komme i gang med Pip og virtuelt miljø:
Bemærk: i så fald i stedet for pipenv install Pillow
, vil kommandoen være pip install Pillow
.
implementering
Vi skal gennemføre dette projekt i 2 faser. I det første opretter vi scriptet, og i det næste bygger vi en kolbe-applikation til at fungere som en grænseflade.
OCR Script
når opsætningen er afsluttet, kan vi nu oprette en simpel funktion, der tager et billede og returnerer teksten, der er registreret i billedet – dette vil være kernen i vores projekt:
try: from PIL import Imageexcept ImportError: import Imageimport pytesseractdef ocr_core(filename): """ This function will handle the core OCR processing of images. """ text = pytesseract.image_to_string(Image.open(filename)) # We'll use Pillow's Image class to open the image and pytesseract to detect the string in the image return textprint(ocr_core('images/ocr_example_1.png'))
funktionen er ret ligetil, i de første 5 linjer importerer vi Image
fra Pillow
bibliotek og vores PyTesseract
bibliotek.
Vi opretter derefter ogocr_core
funktion, der tager et filnavn og returnerer teksten i billedet.
lad os se, hvordan scriptet går med et simpelt billede, der indeholder noget tekst:
og når vi kører kodestykket, bliver vi mødt med dette:
vores enkle OCR-script fungerer! Det var klart, at dette var noget let, da dette er digital tekst, perfekt og præcis, i modsætning til håndskrift. Der er meget mere, vi kan gøre med pytesseract-biblioteket, men mere om dette senere i posten.
lad os først integrere dette script i en kolbe-applikation for at gøre det lettere at uploade billeder og udføre tegngenkendelsesoperationer.
kolbe-grænseflade
vores script kan bruges via kommandolinjen, men en kolbe-applikation ville gøre det mere brugervenligt og alsidigt. For eksempel kan vi uploade billeder via hjemmesiden og få den udpakkede tekst vist på hjemmesiden, eller vi kan tage billeder via internetkameraet og udføre tegngenkendelse på dem.
Hvis du ikke er bekendt med Kolberammen, er dette en god tutorial til at få dig op i fart og gå.
lad os starte med at installere kolbe-pakken:
$ pipenv install Flask
lad os nu definere en grundlæggende rute:
from flask import Flaskapp = Flask(__name__)@app.route('/')def home_page(): return "Hello World!"if __name__ == '__main__': app.run()
Gem filen og kør:
$ python3 app.py
Hvis du åbner din pakke, skal du gå videre til 127.0.0.1:5000
eller localhost:5000
du skal se “hej verden!”på siden. Dette betyder, at vores kolbe-app er klar til de næste trin.
Vi opretter nu entemplates
mappe til at være vært for vores HTML-filer. Lad os gå videre og oprette en simpel index.html
:
<!DOCTYPE html><html> <head> <title>Index</title> </head> <body> Hello World. </body></html>
lad os også justere vores app.py
for at gengive vores nye skabelon:
from flask import Flask, render_templateapp = Flask(__name__)@app.route('/')def home_page(): return render_template('index.html')if __name__ == '__main__': app.run()
varsel vi har nu importeret render_template
og brugt den til at gengive HTML-filen. Hvis du genstarter din Flask-app, skal du stadig se “Hej Verden!”på hjemmesiden.
det er nok på kolben crash kursus, lad os nu integrere vores OCR script på internettet Ansøgning.
først tilføjer vi funktionalitet til at uploade billeder til vores Flask-app og sende dem til ocr_core
– funktionen, som vi skrev ovenfor. Vi gengiver derefter billedet ved siden af den udpakkede tekst på vores NetApp som et resultat:
import osfrom flask import Flask, render_template, request# import our OCR functionfrom ocr_core import ocr_core# define a folder to store and later serve the imagesUPLOAD_FOLDER = '/static/uploads/'# allow files of a specific typeALLOWED_EXTENSIONS = set()app = Flask(__name__)# function to check the file extensiondef allowed_file(filename): return '.' in filename and \ filename.rsplit('.', 1).lower() in ALLOWED_EXTENSIONS# route and function to handle the home [email protected]('/')def home_page(): return render_template('index.html')# route and function to handle the upload [email protected]('/upload', methods=)def upload_page(): if request.method == 'POST': # check if there is a file in the request if 'file' not in request.files: return render_template('upload.html', msg='No file selected') file = request.files # if no file is selected if file.filename == '': return render_template('upload.html', msg='No file selected') if file and allowed_file(file.filename): # call the OCR function on it extracted_text = ocr_core(file) # extract the text and display it return render_template('upload.html', msg='Successfully processed', extracted_text=extracted_text, img_src=UPLOAD_FOLDER + file.filename) elif request.method == 'GET': return render_template('upload.html')if __name__ == '__main__': app.run()
Som vi kan se i vores upload_page()
funktion, modtager vi billedet via POST og gengiver upload HTML, hvis anmodningen er GET.
Vi kontrollerer, om brugeren virkelig har uploadet en fil og bruger funktionenallowed_file()
for at kontrollere, om filen er af en acceptabel type.
Når vi har verificeret, at billedet er af den krævede type, sender vi det derefter til det tegngenkendelsesscript, vi oprettede tidligere.
funktionen registrerer teksten i billedet og returnerer den. Endelig, som et svar på billedoverførslen, gengiver vi den registrerede tekst sammen med billedet, så brugeren kan se resultaterne.
upload.html
filen håndterer udstationering af billedet og gengivelse af resultatet ved hjælp af Jinja templating engine, som leveres med Kolbe som standard:
<!DOCTYPE html><html> <head> <title>Upload Image</title> </head> <body> {% if msg %} <h1>{{ msg }}</h1> {% endif %} <h1>Upload new File</h1> <form method=post enctype=multipart/form-data> <p><input type=file name=file> <input type=submit value=Upload> </form> <h1>Result:</h1> {% if img_src %} <img src="{{ img_src }}"> {% endif %} {% if extracted_text %} <p> The extracted text from the image above is: <b> {{ extracted_text }} </b></p> {% else %} The extracted text will be displayed here {% endif %} </body></html>
Jinja templating giver os mulighed for at vise tekst i specifikke scenarier gennem{% if %} {% endif %}
tags. Vi kan også sende beskeder fra vores Flask app, der skal vises på hjemmesiden inden for {{ }}
tags. Vi bruger en formular til at uploade billedet til vores Flask-app.
resultatet er:
nu, hvis vi går videre og uploader vores billede fra tidligere:
Ja! Vores kolbe ansøgning har været i stand til at integrere OCR funktionalitet og vise teksten på bro.ser. Dette gør det lettere at behandle billeder i stedet for at køre kommandoer på CLI hver gang vi har et nyt billede at behandle.
lad os vedhæfte nogle flere billeder for yderligere at udforske grænserne for vores enkle OCR-script, da det ikke fungerer i alle situationer.
lad os for eksempel prøve at udtrække tekst fra følgende billede, og resultatet er blevet fremhævet på billedet:
Dette er bevis for, at OCR ikke altid er 100% nøjagtig og muligvis har brug for menneskelig indgriben fra tid til anden.
Jeg testede også OCR-scriptet mod min håndskrift for at se, hvordan det ville fungere, og dette er resultatet:
som du kan se, kan det ikke helt udtrække tekst fra min håndskrift, som det gjorde med andre billeder, vi har set før. Jeg besluttede at prøve det igen, denne gang med et billede fra denne kilde, og det var resultaterne:
tegngenkendelsen på dette billede er meget bedre end den, hvor jeg brugte min egen håndskrift. Som du kan se, er linjerne i det hentede billede tykkere, og der er bedre kontrast mellem teksten og baggrunden, og det kan være årsagen til den dårlige detektion på min håndskrift.
dette er et område at udforske yderligere, Du kan få håndskrevne noter fra venner eller kolleger og se, hvor godt scriptet kan registrere tegn. Du kan endda få plakater til begivenheder og prøve at scanne dem efter tekst, mulighederne er masser.
andre Pytesseract muligheder
Python-Tesseract har flere muligheder, du kan udforske. For eksempel kan du angive sproget ved hjælp af et lang
flag:
pytesseract.image_to_string(Image.open(filename), lang='fra')
Dette er resultatet af scanning af et billede uden lang
flag:
og nu med lang
flag:
rammen er også optimeret til at registrere sprog bedre som det ses i skærmbillederne. (Billedkilde).
udenlang
flag gik scriptet glip af nogle franske ord, men efter at have introduceret flaget var det i stand til at registrere alt det franske indhold. Oversættelse er ikke mulig, men det er stadig imponerende. Tesseracts officielle dokumentation indeholder de understøttede sprog i dette afsnit.
orientering og scriptdetektion er også blandt funktionerne i PyTesseract, og dette hjælper med at detektere de anvendte skrifttyper og orienteringen af teksten på det givne billede. Hvis vi kan henvise til det håndskrevne billede, vi hentede tidligere:
print(pytesseract.image_to_osd(Image.open('downloaded_handwritten.png')))
Der var ingen sidenummeroplysninger på billedet, så dette blev ikke registreret. Tesseract-motoren er i stand til at udtrække oplysninger om retningen af teksten i billedet og rotationen. Orienteringstilliden er en figur af motorens kaution om den orientering, der opdages for at fungere som en guide og også vise, at den ikke altid er 100% nøjagtig. Scriptafsnittet angiver det skrivesystem, der bruges i teksten, og dette efterfølges også af tillidsmarkøren.
Hvis vi var efter de anerkendte tegn og deres boksgrænser, opnår PyTesseract dette gennempytesseract.image_to_boxes(Image.open('downloaded_handwritten.png'))
.
dette er nogle af funktionerne i PyTesseract blandt andre, såsom konvertering af den udpakkede tekst til en søgbar PDF-eller HOCR-output.
hvad vi ikke har gjort
Vi har opnået meget i dette indlæg, men der er stadig mere at gøre for at forfine vores projekt og forberede det til den virkelige verden. For det første kan vi tilføje stil til vores hjemmeside og gøre det mere tiltalende for slutbrugeren ved hjælp af CSS. Vi kan også tilføje muligheden for at uploade og scanne flere billeder på en gang og vise al deres output på en gang. Ville det ikke gøre det mere bekvemt at scanne flere dokumenter?det giver os mulighed for at tappe ind i en maskine kamera og tage billeder, med tilladelse fra brugeren, selvfølgelig. Dette kan være til stor hjælp, især på mobile enheder. I stedet for at brugeren skal fange og gemme billedet og derefter uploade det på hjemmesiden, hvis vi tilføjer kamerafunktionaliteten, kan vi give brugeren mulighed for at udføre operationerne direkte fra kolbe-applikationen. Dette vil gøre scanningen hurtigere.
Antag, at en kolbe-applikation ikke er det, du havde til hensigt at udsætte din OCR-scanner, du kan også oprette et CLI-værktøj. Værktøjet giver dig mulighed for at køre en kommando inklusive placeringen af billedet og derefter udskrive scannerens output til din terminal eller sende den til en database eller API. Hvis du vælger denne sti, er Docopt et fantastisk værktøj til at opbygge kommandolinjeværktøjer ved hjælp af Python.
konklusion
gennem Tesseract og Python-Tesseract-biblioteket har vi været i stand til at scanne billeder og udtrække tekst fra dem. Dette er optisk tegngenkendelse, og det kan være til stor nytte i mange situationer.
Vi har bygget en scanner, der tager et billede og returnerer teksten indeholdt i billedet og integreret det i en kolbe-applikation som interface. Dette giver os mulighed for at udsætte funktionaliteten på et mere velkendt medium og på en måde, der kan tjene flere mennesker samtidigt.