Pytesseract: egyszerű Python optikai karakterfelismerés

Bevezetés

az emberek egyszerűen megnézhetik a kép tartalmát. A képen látható szöveget szövegként érzékeljük, és el is tudjuk olvasni.

a számítógépek nem működnek ugyanúgy. Szükségük van valami konkrétabb, szervezett módon tudják megérteni.

itt kezdődik az optikai karakterfelismerés (OCR). Függetlenül attól, hogy az autólemezek felismerése egy fényképezőgépről, vagy kézzel írott dokumentumok, amelyeket digitális másolattá kell alakítani, ez a technika nagyon hasznos. Bár nem mindig tökéletes, nagyon kényelmes, és sokkal könnyebbé és gyorsabbá teszi néhány ember számára a munkáját.

ebben a cikkben belemerülünk az optikai karakterfelismerés mélységébe és alkalmazási területeibe. Mi is épít egy egyszerű script Python, amely segít felismerni karakterek képeket, majd tegye ki ezt egy lombik alkalmazás egy kényelmesebb interakció közeg.

mi az optikai karakterfelismerés?

Az optikai karakterfelismerés magában foglalja a képek szöveges tartalmának felismerését, valamint a képek kódolt szövegre történő fordítását, amelyet a számítógép könnyen megérthet. Egy szöveget tartalmazó képet beolvasunk, majd elemezzük annak érdekében, hogy azonosítsuk a benne szereplő karaktereket. Azonosításkor a karakter átalakul géppel kódolt szöveggé.

hogyan érhető el valójában? Számunkra a képen látható szöveg könnyen felismerhető, képesek vagyunk felismerni a karaktereket és olvasni a szöveget, de egy számítógép számára ez mind pontok sorozata.

a kép első beolvasása után a szöveg és a grafikus elemek bittérképekké alakulnak, ami lényegében fekete-fehér pontok mátrixa. A kép ezután előfeldolgozásra kerül, ahol a fényerő és a kontraszt beállítása a folyamat pontosságának növelése érdekében történik.

a kép most zónákra oszlik, amelyek azonosítják az érdeklődési területeket, például ahol a képek vagy a szöveg található, ez segít a kivonási folyamat elindításában. A szövegeket tartalmazó területek most már sorokra, szavakra és karakterekre bonthatók, a szoftver pedig összehasonlítási és különböző detektálási algoritmusok segítségével képes a karaktereknek megfelelni. A végeredmény a képen látható szöveg.

előfordulhat, hogy a folyamat nem 100% – ban pontos, és emberi beavatkozásra lehet szükség a nem megfelelően beolvasott elemek kijavításához. A hibajavítás szótár vagy akár természetes nyelvfeldolgozás (NLP) segítségével is megvalósítható.

a kimenet mostantól konvertálható más médiumokra, például word dokumentumokra, PDF-fájlokra vagy akár audio tartalomra Szöveg-beszéd technológiákon keresztül.

az OCR

korábban a dokumentumok digitalizálását a számítógép szövegének kézi beírásával sikerült elérni. Az OCR-en keresztül ez a folyamat könnyebbé válik, mivel a dokumentum beolvasható,feldolgozható, a szöveg pedig szerkeszthető formában, például word-dokumentumban tárolható.

Ha a telefonján dokumentum-szkenner található,például az Adobe Scan, akkor valószínűleg OCR technológiával találkozott.

a repülőterek az OCR segítségével automatizálhatják az útlevelek felismerésének és az ezekből származó információk kinyerésének folyamatát is.

az OCR egyéb felhasználási területei közé tartozik az adatbeviteli folyamatok automatizálása, az autólemezek felismerése és felismerése.

mi fogjuk használni

erre OCR projekt, fogjuk használni a Python-Tesseract, vagy egyszerűen PyTesseract, könyvtár, amely egy wrapper a Google Tesseract-OCR motor.

ezt azért választottam, mert teljesen nyílt forráskódú, és az óriás, a Google fejlesztette és tartja fenn. Kövesse ezeket az utasításokat a Tesseract telepítéséhez a gépére, mivel a PyTesseract attól függ.

a lombik webes keretrendszerét is felhasználjuk egyszerű OCR szerverünk létrehozásához, ahol webkamerán keresztül képeket készíthetünk, vagy képeket tölthetünk fel karakterfelismerés céljából.

mi is használni fogjuk a Pipenv-t, mivel ez kezeli a virtuális környezet beállítását és a követelmények kezelését is.

Ezen kívül a Python Imaging Library (PIL) villáját is használjuk, hogy a képek megnyitását és manipulálását számos formátumban kezeljük Python-ban.

ezen A poszton, majd koncentrálni PyTesseract bár vannak más Python könyvtárak, amely segít kivonat szöveg a kép, például:

  • Textract: ami az adatok kinyerése a Pdf-fájlok, de a nehéz csomagot.
  • Pyocr: több észlelési lehetőséget kínál, például mondatokat, számjegyeket vagy szavakat.

Setup

Kezdje a Pipenv telepítésével a következő paranccsal a Pip segítségével (ha be kell állítania, olvassa el ezt).

$ pip install pipenv

hozza létre a projekt könyvtárat, majd indítsa el a projektet a következő parancs futtatásával:

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

most aktiválása a virtuális környezet beszerelné a függőségek:

$ pipenv shell$ pipenv install pytesseract Pillow 

abban Az esetben, ha nem használjuk Pipenv, még mindig használhatja a Pip a Virtuális Környezet megközelítés. Kövesse a hivatalos dokumentációt a PIP és a virtuális környezet használatához:

megjegyzés: ebben az esetben apipenv install Pillow helyett a parancspip install Pillowlesz.

implementáció

ezt a projektet 2 fázisban fogjuk megvalósítani. Az elsőben elkészítjük a szkriptet, a következőben pedig egy lombik alkalmazást építünk, amely felületként működik.

OCR Script

a beállítás kész, már csak létre kell hozni egy egyszerű függvényt, hogy vesz egy képet, majd visszatér a szöveg észlelt a kép – ez a lényege a 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'))

A funkció nagyon egyszerű, az első 5 sor mi import Image a Pillow könyvtárat, majd a PyTesseract könyvtár.

ezután létrehozunk egy ocr_core függvényt, amely egy fájlnevet vesz fel, és visszaadja a képen található szöveget.

nézzük meg, hogy a script viteldíjak egy egyszerű képet tartalmazó szöveget:

S fut a darab kódot, mi köszöntötte ezt:

Az egyszerű OCR script működik! Nyilvánvaló, hogy ez kissé egyszerű volt, mivel ez digitális szöveg, tökéletes és pontos, ellentétben a kézírással. Sokkal többet tehetünk a PyTesseract könyvtárral, de erről később a bejegyzésben.

először integráljuk ezt a szkriptet egy Lombikalkalmazásba, hogy megkönnyítsük a képek feltöltését és a karakterfelismerési műveletek végrehajtását.

szkriptünk a parancssoron keresztül használható, de egy lombik alkalmazás felhasználóbarátabbá és sokoldalúbbá tenné. Például a weboldalon keresztül tölthetünk fel fotókat, a kibontott szöveget pedig megjeleníthetjük a weboldalon, vagy fényképeket rögzíthetünk a webkamerán keresztül, illetve karakterfelismerést végezhetünk rajtuk.

ha nem ismeri a lombik keretrendszer, ez egy jó bemutató, hogy neked fel a sebességet, majd megy.

kezdjük a Lombikcsomag telepítésével:

$ pipenv install Flask

most definiáljunk egy alapvető útvonalat:

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

mentse el a fájlt és futtassa:

$ python3 app.py

Ha megnyitja böngészőjét irány a 127.0.0.1:5000 vagy “az oldalon. Ez azt jelenti, hogy a lombik alkalmazás készen áll a következő lépésekre.

most létrehozunk egy templates mappát a HTML fájlok fogadásához. Hozzunk létre egy egyszerű index.html:

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

let us also tweak our app.py to render 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 most importáltuk a render_template fájlt, és a HTML fájl megjelenítésére használtuk. Ha újraindítja a lombik alkalmazást, még mindig látnia kell a “Hello World!”a honlapon.

Ez elég a lombik összeomlási tanfolyamon, most integráljuk OCR szkriptünket a webes alkalmazásba.

először funkcionalitást adunk hozzá a képek feltöltéséhez a Lombikalkalmazásunkba, majd átadjuk azokat a ocr_core függvénynek, amelyet fent írtunk. Ezután a képet a kibontott szöveg mellé tesszük webalkalmazásunkban, ennek eredményeként:

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

amint azt a upload_page() funkciónkban láthatjuk, postán keresztül megkapjuk a képet, és feltesszük a feltöltési HTML-t, ha a kérés megérkezik.

ellenőrizzük, hogy a felhasználó valóban feltöltött-e egy fájlt, és a allowed_file() függvényt használjuk annak ellenőrzésére, hogy a fájl elfogadható típusú-e.

miután ellenőriztük, hogy a kép a kívánt típusú-e, átadjuk azt a korábban létrehozott karakterfelismerő szkriptnek.

a funkció felismeri a képen látható szöveget, majd visszaadja azt. Végül a kép feltöltésére adott válaszként az észlelt szöveget a kép mellé tesszük, hogy a felhasználó láthassa az eredményeket.

a upload.html fájl kezeli a kép feladását és az eredmény megjelenítését a Jinja templating motor segítségével, amely alapértelmezés szerint lombikot szállít:

<!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 lehetővé teszi számunkra, hogy megjelenjen a szöveg konkrét forgatókönyveket a{% if %} {% endif %} címkék. Azt is át üzeneteket a lombik app jelenik meg a weboldalon belül {{ }} címkék. Egy űrlapot használunk a kép feltöltéséhez a lombik alkalmazásunkba.

az eredmény:

feltöltés oldal kezdeti

most, ha megyünk előre, és feltölteni a képet a korábbi:

feltöltés oldal eredmény

Igen! A lombik alkalmazás képes volt integrálni az OCR funkciót, valamint megjeleníteni a szöveget a böngészőben. Ez megkönnyíti a képek feldolgozását, ahelyett, hogy parancsokat futtatna a CLI-n minden alkalommal, amikor új képet kell feldolgoznunk.

csatoljunk még néhány képet az egyszerű OCR szkriptünk korlátainak további feltárásához, mivel ez nem fog működni minden helyzetben.

például próbáljunk ki szöveget a következő képből, majd az eredmény kiemelve lett a képen:

failed scan cover songs

Ez a bizonyíték arra, hogy az OCR nem mindig 100% – ban pontos, és időről időre szükség lehet emberi beavatkozásra.

azt is tesztelték az OCR-script ellen a kézírást látni, hogyan fog teljesíteni, ez pedig az eredmény:

a kézírás

Mint látható, ez nem elég kivonat szövegét a kézírás, mint a többi képet már láttunk. Úgy döntöttem, hogy még egy próbát adok neki, ezúttal egy ilyen forrásból származó képpel, ezek voltak az eredmények:

letöltött kézzel írt

a karakterfelismerés ezen a képen sokkal jobb, mint az, ahol a saját kézírásomat használtam. Mint látható, a letöltött kép sorai vastagabbak, jobb a kontraszt a szöveg és a háttér között, és ez lehet az oka annak, hogy a kézírásomat rosszul érzékeltem.

Ez egy olyan terület, amelyet tovább kell vizsgálni, kézírásos jegyzeteket kaphat barátaitól vagy kollégáitól, és megnézheti, hogy a szkript mennyire képes felismerni a karaktereket. Még plakátokat is kaphat az eseményekre, és megpróbálhatja beolvasni őket szövegért, a lehetőségek bőven vannak.

Egyéb PyTesseract opciók

Python-Tesseract több lehetőséget lehet felfedezni. Például megadhatja a nyelvet a lang zászló:

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

Ez egy kép beolvasásának eredménye a lang zászló nélkül:

/div>

és most a lang zászlóval:

a keretrendszer optimalizálva van a nyelvek jobb észlelésére is, amint az a képernyőképeken látható. (Kép forrása).

alang zászló nélkül a szkript hiányzott néhány francia szót, de a zászló bevezetése után képes volt felismerni az összes francia tartalmat. A fordítás nem lehetséges, de ez még mindig lenyűgöző. A Tesseract hivatalos dokumentációja tartalmazza a támogatott nyelveket ebben a szakaszban.

A Pytesseract képességei közé tartozik az orientáció és a szkriptfelismerés is, ami segíti a használt betűtípusok felismerését és a szöveg orientációját az adott képen. Ha hivatkozhatunk a korábban letöltött kézzel írt képre:

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

nem volt oldalszám információ a képen, így ezt nem észlelték. A Tesseract motor képes információt kinyerni a kép tájolásáról és forgásáról. Az Orientációs bizalom a motor biztosítékának egy alakja a vezetőként észlelt tájolásról, valamint azt is mutatja, hogy nem mindig 100% – ban pontos. A szkript rész a szövegben használt írási rendszert jelöli, ezt követi a megbízhatósági jelölő is.

Ha a felismert karaktereket és azok dobozhatárait követjük, a PyTesseract ezt a pytesseract.image_to_boxes(Image.open('downloaded_handwritten.png'))segítségével éri el.

ezek többek között a PyTesseract néhány képessége, például a kibontott szöveg kereshető PDF vagy HOCR kimenetre történő átalakítása.

amit még nem tettünk meg

sokat értünk el ebben a bejegyzésben, de még van mit tenni a projekt finomítása és a Való Világ előkészítése érdekében. Először is, mi is hozzá stílus honlapunkon, hogy vonzóbbá tegye a végfelhasználó segítségével CSS. Azt is hozzá a lehetőséget, hogy feltölteni, szkennelni több képet egyszerre, megjelenítve az összes kimenetet egyszerre. Ez nem tenné kényelmesebbé több dokumentum beolvasását?

a böngésző lehetővé teszi számunkra, hogy bekapcsoljuk a gép kameráját, és természetesen a felhasználó engedélyével képeket készítsünk. Ez nagy segítség lehet, különösen a mobil eszközökön. Ahelyett, hogy a felhasználónak el kell rögzítenie és el kell mentenie a képet, majd fel kell töltenie azt a weboldalra, Ha hozzáadjuk a kamera funkciót, lehetővé tehetjük a felhasználó számára, hogy a műveleteket közvetlenül a lombik webes alkalmazásból végezze el. Ez gyorsabbá teszi a szkennelési folyamatot.

tegyük fel, hogy egy lombik alkalmazás nem az, amit az OCR szkenner felfedésére szántak, akkor létrehozhat egy CLI eszközt is. Az eszköz lehetővé tenné, hogy futtasson egy parancsot, beleértve a kép helyét, majd nyomtassa ki a szkenner kimenetét a terminálra, vagy küldje el egy adatbázisba vagy API-ba. Ha ezt az utat választotta, a Docopt fantasztikus eszköz a parancssori eszközök Python használatával történő felépítéséhez.

következtetés

a Tesseract és a Python-Tesseract könyvtár segítségével képesek voltunk képeket beolvasni és szöveget kivonni belőlük. Ez optikai karakterfelismerés, és sok esetben jól használható.

készítettünk egy szkennert, amely képet készít, visszaadja a képen szereplő szöveget, majd interfészként egy Lombikalkalmazásba integráljuk. Ez lehetővé teszi számunkra, hogy a funkcionalitást egy ismerős közegben tárjuk fel oly módon, hogy egyszerre több embert is kiszolgálhassunk.

Vélemény, hozzászólás?

Az e-mail-címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük