Pytesserakti: yksinkertainen Python optinen hahmontunnistus

Johdanto

ihmiset voivat ymmärtää kuvan sisällön yksinkertaisesti katsomalla. Havaitsemme kuvan tekstin tekstinä ja voimme lukea sitä.

tietokoneet eivät toimi samalla tavalla. He tarvitsevat jotain konkreettisempaa, järjestäytynyttä tavalla, jonka he ymmärtävät.

tässä potkaisee Optical Character Recognition (OCR). Olipa kyse auton rekisterikilpien tunnistamisesta kamerasta tai käsin kirjoitetuista asiakirjoista, jotka pitäisi muuntaa digitaaliseksi kopioksi, tämä tekniikka on erittäin hyödyllinen. Vaikka se ei ole aina täydellinen, se on erittäin kätevä ja tekee siitä paljon helpompaa ja nopeampaa joillekin ihmisille tehdä työnsä.

tässä artikkelissa pureudutaan optisen hahmontunnistuksen syvyyteen ja sen sovellusalueisiin. Rakennamme myös yksinkertaisen komentosarjan Pythoniin, joka auttaa meitä tunnistamaan merkkejä kuvista ja paljastamaan tämän Flask-sovelluksen kautta kätevämmän vuorovaikutusvälineen.

mikä on optinen merkintunnistus?

optinen merkintunnistus tarkoittaa kuvien tekstisisällön havaitsemista ja kuvien kääntämistä koodatuksi tekstiksi, jonka tietokone ymmärtää helposti. Tekstiä sisältävä kuva skannataan ja analysoidaan sen merkkien tunnistamiseksi. Tunnistamisen jälkeen merkki muutetaan koneellisesti koodatuksi tekstiksi.

miten se todella saavutetaan? Meille kuvan teksti on helposti erotettavissa ja pystymme havaitsemaan merkit ja lukemaan tekstin, mutta tietokoneelle se kaikki on pistesarjaa.

kuva skannataan ensin ja teksti-ja grafiikkaelementit muunnetaan bittikarttaan, joka on käytännössä mustien ja valkoisten pisteiden matriisi. Tämän jälkeen kuva esikäsitellään, jossa kirkkautta ja kontrastia säädetään prosessin tarkkuuden parantamiseksi.

kuva on nyt jaettu vyöhykkeisiin, jotka yksilöivät kiinnostavat alueet, kuten missä kuvat tai teksti ovat, ja tämä auttaa purkamaan louhintaprosessin. Tekstiä sisältävät alueet voidaan nyt jaotella edelleen riveihin ja sanoihin ja merkkeihin, ja nyt ohjelmisto pystyy vastaamaan merkkeihin vertailun ja erilaisten tunnistusalgoritmien avulla. Lopputulos on kuvan teksti, joka meille annetaan.

prosessi ei välttämättä ole 100-prosenttisen tarkka, ja se saattaa vaatia ihmisen toimenpiteitä korjatakseen joitain osia, joita ei ole skannattu oikein. Virhekorjaus voidaan tehdä myös sanakirjan tai jopa luonnollisen kielen käsittelyn (NLP) avulla.

tuotos voidaan nyt muuntaa tekstistä puheeksi-tekniikan avulla muihin medioihin, kuten word-dokumentteihin, PDF-tiedostoihin tai jopa äänisisältöön.

OCR: n käyttö

aiemmin dokumenttien digitointi tapahtui kirjoittamalla teksti käsin tietokoneeseen. OCR: n avulla tämä prosessi helpottuu, kun dokumentti voidaan skannata, käsitellä ja teksti purkaa ja tallentaa muokattavaan muotoon, kuten word-asiakirjaan.

jos puhelimessasi on dokumenttiskanneri, kuten Adobe Scan, olet todennäköisesti törmännyt käytössä olevaan OCR-tekniikkaan.

lentoasemat voivat myös käyttää OCR-järjestelmää automatisoidakseen passien tunnistamisen ja tietojen poimimisen niiltä.

muita OCR: n käyttökohteita ovat muun muassa tiedonsyöttöprosessien automatisointi, autojen rekisterikilpien havaitseminen ja tunnistaminen.

mitä käytämme

tässä OCR-projektissa, käytämme Python-Tesseract-kirjastoa tai yksinkertaisesti PyTesseract-kirjastoa, joka on Googlen Tesseract-OCR-Moottorin kääre.

valitsin tämän, koska se on täysin avoimen lähdekoodin ja sitä kehittää ja ylläpitää jättiläinen, joka on Google. Noudata näitä ohjeita asentaaksesi Tesseractin koneeseesi, sillä PyTesseract riippuu siitä.

Käytämme myös Flask web Frameworkia luodaksemme yksinkertaisen OCR-palvelimemme, jossa voimme ottaa kuvia webbikameran kautta tai ladata kuvia hahmojen tunnistamista varten.

aiomme käyttää myös Pipenviä, sillä se hoitaa myös virtuaaliympäristön asennuksen ja vaatimusten hallinnan.

niiden lisäksi käytämme myös Pillow Librarya, joka on Python Imaging Libraryn (PIL) haarukka, joka käsittelee kuvien avaamista ja manipulointia monissa muodoissa Pythonissa.

tässä viestissä keskitymme Pytesseractiin, vaikka on muitakin Python-kirjastoja, joiden avulla voit poimia tekstiä kuvista, kuten:

  • Textract: joka voi poimia tietoja PDF-tiedostoista, mutta on raskas paketti.
  • Pyocr: tarjoaa enemmän tunnistusvaihtoehtoja, kuten lauseita, numeroita tai sanoja.

Setup

Aloita asentamalla Pipenv seuraavalla komennolla Pip: n kautta (jos haluat määrittää sen, Katso tästä).

$ pip install pipenv

luo projektihakemisto ja aloita projekti suorittamalla seuraava komento:

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

voimme nyt aktivoida virtuaaliympäristömme ja aloittaa riippuvuuksiemme asentamisen:

$ pipenv shell$ pipenv install pytesseract Pillow 

Jos et käytä Pipenviä, voit aina käyttää Pip-ja virtuaaliympäristön lähestymistapaa. Seuraa virallista dokumentaatiota, jotta pääset alkuun Pip: n ja virtuaaliympäristön kanssa:

huomaa: tällöin pipenv install Pillow sijasta komento on pip install Pillow.

toteutus

toteutamme tämän projektin kahdessa vaiheessa. Ensimmäisessä luomme käsikirjoituksen, ja seuraavassa rakennamme Flask-sovelluksen toimimaan rajapintana.

OCR – skripti

asennuksen päätyttyä voimme nyt luoda yksinkertaisen funktion, joka ottaa kuvan ja palauttaa kuvassa havaitun tekstin-Tämä on projektimme ydin:

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

funktio on melko suoraviivainen, ensimmäisillä 5 rivillä tuomme ImagePillow kirjasto ja meidän PyTesseract kirjasto.

tämän jälkeen luodaan ja ocr_core funktio, joka ottaa tiedostonimen ja palauttaa kuvan sisältämän tekstin.

katsotaan, miten skripti pärjää yksinkertaisella, tekstiä sisältävällä kuvalla:

ja kun koodinpätkä ajetaan, meitä tervehtii tämä:

yksinkertainen OCR-skriptimme toimii! Ilmeisesti tämä oli hieman helppoa, koska tämä on digitaalista tekstiä, täydellistä ja tarkkaa, toisin kuin käsiala. PyTesseract-kirjastolla voi tehdä paljon muutakin, mutta lisää tästä myöhemmin postissa.

integroidaan tämä skripti ensin Flask-sovellukseen, jotta kuvien lataaminen ja hahmontunnistusoperaatioiden suorittaminen helpottuu.

Flask Web-käyttöliittymää

komentorivin kautta voidaan käyttää komentosarjaa, mutta Flask-sovellus tekisi siitä käyttäjäystävällisemmän ja monipuolisemman. Esimerkiksi, voimme ladata kuvia sivuston kautta ja saada uutettu teksti näkyy verkkosivuilla tai voimme kaapata kuvia web-kameran kautta ja suorittaa merkin tunnistus niitä.

Jos et tunne Taskumatin kehystä, tämä on hyvä opetusohjelma, jolla pääset vauhtiin ja vauhtiin.

aloitetaan asentamalla Taskumattipaketti:

$ pipenv install Flask

nyt määritellään perusreitti:

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

Tallenna tiedosto ja aja:

$ python3 app.py

Jos avaat selaimen ja kohti 127.0.0.1:5000 tai localhost:5000 sinun pitäisi nähdä ”Hello world!”sivulla. Tämä tarkoittaa, että meidän Flask app on valmis seuraaviin vaiheisiin.

luomme nyt templates kansion HTML-tiedostojemme isännöimiseksi. Let ’ s go ahead and create a simple index.html:

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

myös tweak our app.py to renderöid our new template:

from flask import Flask, render_templateapp = Flask(__name__)@app.route('/')def home_page(): return render_template('index.html')if __name__ == '__main__': app.run()

Notice we have nyt tuotu render_template ja käytti sitä HTML-tiedoston renderöintiin. Jos käynnistät Flask-sovelluksen uudelleen, sinun pitäisi silti nähdä ”Hello World!”kotisivulla.

se riittää Flask crash Coursella, integroikaamme nyt OCR-skriptimme verkkosovellukseen.

ensin lisäämme toiminnallisuuden kuvien lataamiseen Flask-sovellukseemme ja välitämme ne ocr_core funktiolle, jonka kirjoitimme edellä. Tämän jälkeen renderoimme kuvan uutetun tekstin viereen web-sovellukseemme tuloksena:

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

kuten näemme upload_page() funktio, saamme kuvan postitse ja renderoimme upload HTML: n, jos pyyntö on saada.

Tarkistamme, onko käyttäjä todella ladannut tiedoston ja käytämme toimintoa allowed_file() tarkistaaksemme, onko tiedosto hyväksyttyä tyyppiä.

varmistettuamme, että kuva on vaadittua tyyppiä, siirrämme sen aiemmin luomaamme hahmontunnistusohjelmistoon.

funktio tunnistaa kuvan tekstin ja palauttaa sen. Lopuksi, vastauksena kuvan lataamiseen, renderoimme havaitun tekstin kuvan rinnalle, jotta käyttäjä voi nähdä tulokset.

upload.html tiedosto hoitaa kuvan lähettämisen ja tuloksen renderöinnin Jinja-templointimoottorin avulla, joka lähettää oletusarvoisesti pullon kanssa:

<!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 mahdollistaa tekstin näyttämisen tietyissä skenaarioissa {% if %} {% endif %} tagien kautta. Voimme myös välittää viestejä Flask-sovelluksestamme näytettäväksi verkkosivulla {{ }} tagit. Lataamme Kuvan lomakkeella Flask-sovellukseemme.

tulos on:

upload page initial

nyt, jos mennään eteenpäin ja ladataan kuva aiemmasta:

upload page result

Yes! Flask-sovelluksemme on pystynyt integroimaan OCR-toiminnallisuuden ja näyttämään tekstin selaimessa. Tämä helpottaa kuvien käsittelyä sen sijaan, että ajaisimme komentoja CLI: ssä aina, kun meillä on uusi kuva käsiteltävänä.

liittäkäämme mukaan lisää kuvia, jotta voimme tutkia tarkemmin yksinkertaisen OCR-komentosarjamme rajoja, sillä se ei toimi kaikissa tilanteissa.

kokeillaan esimerkiksi tekstin poimimista seuraavasta kuvasta ja tulos on korostettu kuvassa:

epäonnistuneet cover-kappaleet

Tämä on osoitus siitä, että OCR ei ole aina 100% tarkka ja saattaa vaatia ihmisen väliintuloa ajoittain.

testasin myös OCR-kirjoitusta käsialaani vastaan nähdäkseni, miten se toimisi, ja tämä on tulos:

käsialani

kuten näkyy, se ei aivan pysty irrottamaan tekstiä käsialastani kuten muiden aiemmin näkemiemme kuvien kanssa. Päätin antaa sille toisen yrittää, tällä kertaa kuvan tästä lähteestä, ja nämä olivat tulokset:

ladatut käsin kirjoitetut

tämän kuvan hahmontunnistus on paljon parempi kuin se, jossa käytin omaa käsialaani. Kuten näette linjat ladatun kuvan ovat paksumpia ja siellä on parempi kontrasti tekstin ja taustan ja tämä voisi olla syy huono havaitseminen minun käsiala.

Tämä on alue, jota voi tutkia tarkemmin, voit saada käsin kirjoitettuja muistiinpanoja ystäviltä tai kollegoilta ja nähdä, kuinka hyvin skripti pystyy havaitsemaan merkkejä. Voit jopa saada julisteita tapahtumiin ja yrittää skannata niistä tekstiä, mahdollisuuksia on paljon.

muut Pytesseraktivaihtoehdot

Python-Tesseractissa on enemmän vaihtoehtoja, joita voit tutkia. Kielen voi määrittää esimerkiksi käyttämällä lang flag:

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

Tämä on tulos kuvan skannaamisesta ilman lang flag:

ja nyt langlippu:

kehys on myös optimoitu havaitsemaan kieliä paremmin, kuten kuvakaappauksissa näkyy. (Kuvalähde).

ilman lang – lippua kirjoituksesta puuttui joitakin ranskankielisiä sanoja, mutta lipun käyttöönoton jälkeen se pystyi havaitsemaan kaiken ranskankielisen sisällön. Kääntäminen ei ole mahdollista, mutta tämä on silti vaikuttava. Tesseractin virallinen dokumentaatio sisältää tuetut kielet tässä osiossa.

orientaatio-ja komentosarjatunnistus on myös Pytesseractin ominaisuuksia, ja tämä auttaa tunnistamaan käytetyt kirjasimet ja suuntaamaan tekstin annettuun kuvaan. Jos voimme viitata aiemmin lataamaamme käsinkirjoitettuun kuvaan:

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

Kuvassa ei ollut sivunumerotietoa, joten tätä ei havaittu. Tesseract-moottori pystyy poimimaan tietoa kuvan tekstin suunnasta ja pyörimisestä. Orientaatioluottamus on luku Moottorin vakuudesta noin suunta havaittu toimimaan ohjeena ja myös osoittaa, että se ei ole aina 100% tarkka. Käsikirjoitusosio ilmaisee tekstissä käytettävää kirjoitusjärjestelmää ja tätä seuraa myös luottamusmerkki.

Jos oltiin tunnistettujen merkkien ja niiden laatikkorajojen perässä, PyTesseract saavuttaa tämän pytesseract.image_to_boxes(Image.open('downloaded_handwritten.png')).

nämä ovat joitakin Pytesseractin ominaisuuksia muun muassa, kuten uutetun tekstin muuntaminen haettavaksi PDF-tai HOCR-tulosteeksi.

se, mitä emme ole tehneet

olemme saaneet paljon aikaan tässä viestissä, mutta vielä on tehtävää projektimme hiomisessa ja sen valmistamisessa reaalimaailmaan. Ensimmäinen, voimme lisätä tyyli sivuillamme ja tehdä siitä houkuttelevampi loppukäyttäjälle käyttämällä CSS. Voimme myös lisätä mahdollisuuden ladata ja skannata useita kuvia kerralla ja näyttää kaikki niiden tuotos kerralla. Eikö tämä tekisi helpommaksi skannata useita asiakirjoja?

selaimella voi näpäyttää koneen kameraa ja ottaa kuvia, käyttäjän luvalla tietenkin. Tästä voi olla suurta apua erityisesti mobiililaitteissa. Sen sijaan, että käyttäjän täytyy kaapata ja tallentaa kuva ja ladata se verkkosivustolle, jos lisäämme kameran toiminnot, voimme sallia käyttäjän suorittaa toiminnot suoraan Flask web-sovelluksesta. Tämä tekee skannauksen nopeammin.

Jos et aikonut paljastaa OCR-skanneriasi Pullosovelluksella, voit myös luoda CLI-työkalun. Työkalun avulla voit suorittaa komennon, joka sisältää kuvan sijainnin ja tulostaa skannerin tulosteen päätelaitteeseesi tai lähettää sen tietokantaan tai API: iin. Jos valitsit tämän polun, Docopt on loistava työkalu komentorivityökalujen rakentamiseen Pythonin avulla.

johtopäätös

Tesseractin ja Python-Tesseract-kirjaston kautta on pystytty skannaamaan kuvia ja poimimaan niistä tekstiä. Tämä on optinen hahmontunnistus ja siitä voi olla paljon hyötyä monissa tilanteissa.

olemme rakentaneet skannerin, joka ottaa kuvan ja palauttaa kuvan sisältämän tekstin ja integroi sen rajapinnaksi Pullosovellukseen. Näin voimme paljastaa toiminnallisuuden tutummalla välineellä ja tavalla, joka voi palvella useita ihmisiä samanaikaisesti.

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *