Pytesseract: Enkel Python Optisk Tegngjenkjenning

Introduksjon

Mennesker kan forstå innholdet i et bilde bare ved å se. Vi oppfatter teksten på bildet som tekst og kan lese den.

Datamaskiner fungerer ikke på samme måte. De trenger noe mer konkret, organisert på en måte de kan forstå.

Dette er Hvor Optisk Tegngjenkjenning (OCR) sparker inn. Enten det er anerkjennelse av bilplater fra et kamera, eller håndskrevne dokumenter som skal konverteres til en digital kopi, er denne teknikken veldig nyttig. Selv om det ikke alltid er perfekt, er det veldig praktisk og gjør det mye enklere og raskere for noen mennesker å gjøre jobben sin.

i denne artikkelen vil vi dykke inn i dybden Av Optisk Tegngjenkjenning og dens anvendelsesområder. Vi vil også bygge et enkelt skript I Python som vil hjelpe oss med å oppdage tegn fra bilder og avsløre dette gjennom En Kolbe-applikasjon for et mer praktisk interaksjonsmedium.

Hva Er Optisk Tegngjenkjenning?

Optisk Tegngjenkjenning innebærer gjenkjenning av tekstinnhold på bilder og oversettelse av bildene til kodet tekst som datamaskinen lett kan forstå. Et bilde som inneholder tekst, skannes og analyseres for å identifisere tegnene i den. Ved identifikasjon konverteres tegnet til maskinkodet tekst.

Hvordan er det egentlig oppnådd? For oss er tekst på et bilde lett å se, og vi er i stand til å oppdage tegn og lese teksten, men til en datamaskin er det hele en serie prikker.

bildet blir først skannet og tekst-og grafikkelementene konverteres til en bitmap, som egentlig er en matrise av svarte og hvite prikker. Bildet blir deretter forhåndsbehandlet der lysstyrken og kontrasten justeres for å forbedre nøyaktigheten av prosessen.

bildet er nå delt inn i soner som identifiserer interesseområder som hvor bildene eller teksten er, og dette hjelper kickoff utvinningsprosessen. Områdene som inneholder tekst kan nå brytes ned videre i linjer og ord og tegn, og nå er programvaren i stand til å matche tegnene gjennom sammenligning og ulike deteksjonsalgoritmer. Det endelige resultatet er teksten i bildet som vi er gitt.

prosessen er kanskje ikke 100% nøyaktig og kan trenge menneskelig inngripen for å korrigere noen elementer som ikke ble skannet riktig. Feilkorreksjon kan også oppnås ved hjelp av en ordbok eller Til Og Med Naturlig Språkbehandling (NLP).

utdataene kan nå konverteres til andre medier som word-dokumenter, Pdf-Filer eller til og med lydinnhold gjennom tekst-til-tale-teknologier.

Bruk AV OCR

tidligere ble digitalisering av dokumenter oppnådd ved å skrive teksten manuelt på datamaskinen. GJENNOM OCR, er denne prosessen gjort enklere som dokumentet kan skannes, behandles og teksten hentet og lagret i en redigerbar form som et word-dokument.

hvis du har en dokumentskanner på telefonen, For Eksempel Adobe Scan, har DU sannsynligvis møtt OCR-teknologi i bruk.

Flyplasser kan også bruke OCR til å automatisere prosessen med passgjenkjenning og utvinning av informasjon fra dem.Andre bruksområder FOR OCR inkluderer automatisering av dataregistreringsprosesser, gjenkjenning og gjenkjenning av bilskilt.

Hva Vi Skal Bruke

for DETTE OCR-prosjektet bruker Vi Python-Tesseract, eller Bare pytesseract, biblioteket som er En wrapper For Googles Tesseract-OCR-Motor.jeg valgte dette fordi det er helt åpen kildekode og blir utviklet Og vedlikeholdt Av giganten Som Er Google. Følg disse instruksjonene for å installere Tesseract på maskinen din, Siden PyTesseract avhenger av det.

Vi vil også bruke Flask web framework for å lage vår enkle OCR server der vi kan ta bilder via webcam eller laste opp bilder for tegngjenkjenning formål.

Vi kommer også til å bruke Pipenv siden det også håndterer virtuelle miljø oppsett og krav ledelse.I Tillegg til Disse, vil vi også bruke Pillow library som er en gaffel Av Python Imaging Library (PIL) for å håndtere åpning og manipulering av bilder i Mange formater I Python.i dette innlegget vil vi konsentrere Oss Om PyTesseract, selv om det finnes Andre Python-biblioteker som kan hjelpe deg med å trekke ut tekst fra bilder som: Textract: som kan trekke ut data fra Pdf-Filer, men er en tung pakke.

  • Pyocr: tilbyr flere gjenkjenningsalternativer som setninger, sifre eller ord.
  • Oppsett

    Start med å installere Pipenv ved hjelp av følgende kommando Via Pip (hvis du må sette opp det, se dette).

    $ pip install pipenv

    Opprett prosjektkatalogen og start prosjektet ved å kjøre følgende kommando:

    $ mkdir ocr_server && cd ocr_server && pipenv install --three

    Vi kan nå aktivere vårt virtuelle miljø og begynne å installere våre avhengigheter:

    $ pipenv shell$ pipenv install pytesseract Pillow 

    i tilfelle Du ikke skal bruke Pipenv, kan Du alltid bruke Pip Og Virtuelt Miljø tilnærming. Følg den offisielle dokumentasjonen for å hjelpe deg med Å komme i gang Med Pip og Virtuelt Miljø:

    Merk: i så fall, i stedet for pipenv install Pillow, vil kommandoen være pip install Pillow.

    Implementering

    vi skal gjennomføre dette prosjektet i 2 faser. I det første skal vi lage skriptet, og i det neste skal vi bygge Et Kolbe-program for å fungere som et grensesnitt.

    OCR Script

    med oppsettet fullført, kan vi nå lage en enkel funksjon som tar et bilde og returnerer teksten oppdaget i bildet – dette vil være kjernen i prosjektet vårt:

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

    funksjonen er ganske grei, i de første 5 linjene importerer vi Image fra Pillow bibliotek og vår PyTesseract bibliotek.

    vi lager og ocr_core funksjon som tar inn et filnavn og returnerer teksten i bildet.

    La Oss se hvordan skriptet fares med et enkelt bilde som inneholder litt tekst:

    Og ved å kjøre koden, blir vi møtt med dette:

    VÅRT enkle OCR-skript fungerer! Åpenbart var dette noe enkelt siden dette er digital tekst, perfekt og presis, i motsetning til håndskrift. Det er mye mer vi kan gjøre Med pytesseract-biblioteket, men mer om dette senere i innlegget.La oss integrere dette skriptet i Et Kolbe-program først, for å gjøre det enklere å laste opp bilder og utføre tegngjenkjenningsoperasjoner.

    Flask Web Interface

    vårt skript kan brukes via kommandolinjen, men En Flask søknad ville gjøre det mer brukervennlig og allsidig. For eksempel kan vi laste opp bilder via nettsiden og få den ekstraherte teksten som vises på nettsiden, eller vi kan ta bilder via webkameraet og utføre tegngjenkjenning på dem.

    hvis Du ikke er kjent Med Flask rammeverk, er dette en god tutorial for å få deg opp til fart og går.

    la oss starte med å installere Kolben pakken:

    $ pipenv install Flask

    nå, la oss definere en grunnleggende rute:

    from flask import Flaskapp = Flask(__name__)@app.route('/')def home_page(): return "Hello World!"if __name__ == '__main__': app.run()

    Lagre filen Og kjør:

    $ python3 app.py

    hvis du åpner Din til 127.0.0.1:5000 eller localhost:5000 du bør se «hei verden!»på siden. Dette betyr At Vår Flask app er klar for de neste trinnene.

    vi lager nå entemplates mappe for å være vert FOR VÅRE HTML-filer. La oss gå videre og lage en enkel index.html:

    <!DOCTYPE html><html> <head> <title>Index</title> </head> <body> Hello World. </body></html>

    la oss også justere vår app.py for å gjengi vår nye mal:

    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 nå importert render_template og brukte den til å gjengi html-filen. Hvis Du starter Flask app, bør du fortsatt se » Hello World!»på hjemmesiden.

    det er nok På Kolbe crash course, la oss nå integrere VÅRT OCR-skript på webapplikasjonen.Først vil vi legge til funksjonalitet for å laste opp bilder til Vår Kolbe app og sende dem til ocr_core funksjon som vi skrev ovenfor. Vi vil da gjengi bildet ved siden av den ekstraherte teksten på vår webapp 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 vårupload_page() funksjon, vil vi motta bildet VIA POST og gjengi opplastings HTML hvis forespørselen ER GET.

    vi sjekker om brukeren virkelig har lastet opp en fil og bruker funksjonen allowed_file() for å sjekke om filen er av en akseptabel type.

    ved å verifisere at bildet er av ønsket type, sender vi det til tegngjenkjenningsskriptet vi opprettet tidligere.

    funksjonen registrerer teksten i bildet og returnerer den. Til slutt, som et svar på bildeopplastingen, gjengir vi den oppdagede teksten sammen med bildet for brukeren å se resultatene.

    upload.html filen vil håndtere postering av bildet og gjengivelse av resultatet Ved Hjelp Av 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 tillater oss å vise tekst i bestemte scenarier gjennom{% if %} {% endif %} tags. Vi kan også sende meldinger fra Vår Flask app som skal vises på nettsiden i{{ }} tags. Vi bruker et skjema for å laste opp bildet til Vår Kolbe app.

    resultatet er:

    last opp sidens første

    Nå, hvis vi går videre og laster opp bildet vårt fra tidligere:

    last opp sidens resultat

    Ja! Vår Flask søknad har vært i stand til å integrere OCR funksjonalitet og vise teksten i nettleseren. Dette gjør det enklere å behandle bilder i stedet for å kjøre kommandoer på CLI hver gang vi har et nytt bilde å behandle.

    La oss legge ved noen flere bilder for å utforske grensene for VÅRT enkle OCR-skript, siden det ikke vil fungere i alle situasjoner.

    la Oss for eksempel prøve å trekke ut tekst fra følgende bilde, og resultatet er uthevet på bildet:

    mislykkede scan cover songs

    DETTE er bevis på AT OCR ikke alltid er 100% nøyaktig og kan trenge menneskelig inngripen fra tid til annen.

    jeg testet OGSÅ OCR-skriptet mot min håndskrift for å se hvordan det ville utføre, og dette er resultatet:

    min håndskrift

    som du kan se, kan det ikke helt trekke ut tekst fra min håndskrift som det gjorde med andre bilder vi har sett før. Jeg bestemte meg for å gi det et forsøk, denne gangen med et bilde fra denne kilden, og disse var resultatene:

    nedlastet håndskrevet

    tegngjenkjenningen på dette bildet er mye bedre enn den der jeg brukte min egen håndskrift. Som du kan se linjene i det nedlastede bildet er tykkere og det er bedre kontrast mellom teksten og bakgrunnen, og dette kan være årsaken til dårlig deteksjon på håndskriften min.

    Dette er et område å utforske videre, du kan få håndskrevne notater fra venner eller kolleger og se hvor godt skriptet vil kunne oppdage tegn. Du kan også få plakater til hendelser og prøve å skanne dem for tekst, mulighetene er mange.

    Andre Pytesseract Alternativer

    Python-Tesseract har flere alternativer du kan utforske. Du kan for eksempel angi språket ved å bruke et lang flagg:

    pytesseract.image_to_string(Image.open(filename), lang='fra')

    dette er resultatet av å skanne et bilde uten lang flagg:

    og nå med lang flagget:

    rammen er også optimalisert for å oppdage språk bedre som sett i skjermbilder. (Bildekilde).

    uten flaggetlang savnet skriptet noen franske ord, men etter å ha introdusert flagget var det i stand til å oppdage alt fransk innhold. Oversettelse er ikke mulig, men dette er fortsatt imponerende. Tesseracts offisielle dokumentasjon inneholder de støttede språkene i denne delen.

    Orientering og script deteksjon er også blant egenskapene Til PyTesseract og dette hjelpemidler i påvisning av skriftene som brukes og orientering av teksten på det gitte bildet. Hvis vi kan referere til det håndskrevne bildet vi lastet ned tidligere:

    print(pytesseract.image_to_osd(Image.open('downloaded_handwritten.png')))

    det var ingen sidetallinformasjon på bildet, så dette ble ikke oppdaget. Tesseract-motoren er i stand til å trekke ut informasjon om orienteringen av teksten i bildet og rotasjonen. Orienteringen tillit er en figur av kausjonist av motoren om orienteringen oppdaget å fungere som en guide, og også vise at det er ikke alltid 100% nøyaktig. Skriptdelen angir skrivesystemet som brukes i teksten, og dette følges også av konfidensmarkøren.

    hvis Vi var etter de anerkjente tegnene og deres boksgrenser, oppnår PyTesseract dette gjennompytesseract.image_to_boxes(Image.open('downloaded_handwritten.png')).

    dette er noen av egenskapene Til PyTesseract blant andre som konvertering av den ekstraherte teksten til en søkbar PDF eller HOCR-utgang.

    Hva vi ikke har Gjort

    Vi har oppnådd mye i dette innlegget, Men det er fortsatt mer å gjøre for å forfine prosjektet vårt og forberede det på den virkelige verden. For det første kan vi legge til stil på nettstedet vårt og gjøre det mer attraktivt for sluttbrukeren ved Å bruke CSS. Vi kan også legge til muligheten til å laste opp og skanne flere bilder samtidig og vise alle sine utdata på en gang. Ville ikke dette gjøre det enklere å skanne flere dokumenter?

    nettleseren lar oss tappe inn i maskinens kamera og ta bilder, med tillatelse fra brukeren, selvfølgelig. Dette kan være til stor hjelp, spesielt på mobile enheter. I stedet for at brukeren må fange og lagre bildet og laste det opp på nettstedet, hvis vi legger til kameraets funksjonalitet, kan vi tillate brukeren å utføre operasjonene direkte fra Flask webapplikasjonen. Dette vil gjøre skanneprosessen raskere.Anta at Et Kolbe-program Ikke er det du har tenkt å utsette OCR-skanneren din, du kan også lage ET cli-verktøy. Verktøyet vil tillate deg å kjøre en kommando, inkludert plasseringen av bildet og deretter skrive ut resultatet av skanneren til terminalen din eller sende den til en database eller API. Hvis Du velger Denne banen Docopt Er et fantastisk verktøy for å bygge kommandolinjeverktøy ved Hjelp Av Python.

    Konklusjon

    Gjennom Tesseract og Python-tesseract-biblioteket har vi kunnet skanne bilder og trekke ut tekst fra dem. Dette Er Optisk Tegngjenkjenning, og det kan være til stor nytte i mange situasjoner.

    Vi har bygget en skanner som tar et bilde og returnerer teksten i bildet og integrert den i En Kolbe program som grensesnitt. Dette gjør at vi kan eksponere funksjonaliteten i et mer kjent medium og på en måte som kan betjene flere personer samtidig.

    Legg igjen en kommentar

    Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *