PyTesseract: jednoduché Python optické rozpoznávání znaků

Úvod

lidé mohou pochopit obsah obrazu pouhým pohledem. Text na obrázku vnímáme jako text a umíme jej číst.

počítače nefungují stejným způsobem. Potřebují něco konkrétnějšího, organizovaného tak, aby pochopili.

zde začíná optické rozpoznávání znaků (OCR). Ať už je to rozpoznávání automobilových desek z fotoaparátu nebo ručně psaných dokumentů, které by měly být převedeny na digitální kopii, je tato technika velmi užitečná. I když to není vždy perfektní, je to velmi pohodlné a dělá to mnohem jednodušší a rychlejší pro některé lidi dělat svou práci.

v tomto článku se ponoříme do hloubky optického rozpoznávání znaků a jeho aplikačních oblastí. V Pythonu také vytvoříme jednoduchý skript, který nám pomůže detekovat znaky z obrázků a vystavit je prostřednictvím aplikace baňky pro pohodlnější interakční médium.

co je optické rozpoznávání znaků?

optické rozpoznávání znaků zahrnuje detekci textového obsahu na obrázcích a překlad obrázků do kódovaného textu, kterému počítač snadno porozumí. Obrázek obsahující text je naskenován a analyzován, aby se identifikovaly znaky v něm. Po identifikaci je znak převeden na strojově kódovaný text.

Jak je toho skutečně dosaženo? Pro nás je text na obrázku snadno rozpoznatelný a jsme schopni detekovat znaky a číst text, ale pro počítač je to všechno řada teček.

obrázek je nejprve naskenován a textové a grafické prvky jsou převedeny na bitmapu, což je v podstatě matice černobílých teček. Obraz je poté předem zpracován, kde jsou jas a kontrast upraveny tak, aby se zvýšila přesnost procesu.

obrázek je nyní rozdělena do zón, vymezení oblastí zájmu, jako jsou kde obrázky nebo text, a to pomáhá výkop proces extrakce. Oblasti obsahující text lze nyní dále rozdělit na řádky a slova a znaky a nyní je software schopen porovnávat znaky pomocí srovnání a různých detekčních algoritmů. Konečným výsledkem je text na obrázku, který jsme dostali.

proces nemusí být 100% přesný a může vyžadovat zásah člověka, aby opravil některé prvky, které nebyly správně naskenovány. Opravy chyb lze také dosáhnout pomocí slovníku nebo dokonce zpracování přirozeného jazyka (NLP).

výstup lze nyní převést na jiná média, jako jsou dokumenty word, soubory PDF nebo dokonce zvukový obsah prostřednictvím technologií převodu textu na řeč.

použití OCR

dříve bylo digitalizace dokumentů dosaženo ručním zadáním textu do počítače. Prostřednictvím OCR je tento proces usnadněn, protože dokument lze skenovat, zpracovávat a text extrahovat a ukládat v upravitelné podobě, jako je dokument aplikace word.

Pokud máte v telefonu skener dokumentů, například Adobe Scan, pravděpodobně jste se setkali s používanou technologií OCR.

letiště mohou také používat OCR k automatizaci procesu rozpoznávání pasů a získávání informací z nich.

Mezi další použití OCR patří automatizace procesů zadávání dat, Detekce a rozpoznávání poznávacích značek automobilů.

co použijeme

pro tento projekt OCR použijeme knihovnu Python-Tesseract nebo jednoduše PyTesseract, což je obal pro motor Tesseract-OCR společnosti Google.

vybral jsem si to, protože je zcela open-source a je vyvíjen a udržován gigantem, kterým je Google. Při instalaci Tesseractu do počítače postupujte podle těchto pokynů, protože na něm závisí PyTesseract.

použijeme také webový rámec baňky k vytvoření našeho jednoduchého serveru OCR, kde můžeme fotografovat prostřednictvím webové kamery nebo nahrávat fotografie pro účely rozpoznávání znaků.

budeme také používat Pipenv, protože také zpracovává nastavení virtuálního prostředí a správu požadavků.

Kromě toho, budeme také používat Polštář knihovna, která je vidlice Python Imaging Library (PIL) pro otevření a manipulaci s obrázky v mnoha formátech v jazyce Python.

V tomto příspěvku, budeme se soustředit na PyTesseract i když existují i jiné Python knihoven, které vám mohou pomoci extrahovat text z obrázků jako je:

  • Textract: který lze extrahovat data z Pdf, ale je těžký balík.
  • Pyocr: nabízí více možností detekce, jako jsou věty, číslice nebo slova.

nastavení

začněte instalací Pipenv pomocí následujícího příkazu pomocí Pip (v případě, že jej potřebujete nastavit, viz toto).

$ pip install pipenv

vytvořte adresář projektu a spusťte projekt spuštěním následujícího příkazu:

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

nyní můžeme aktivovat náš virtuální prostředí a začít instalaci naší závislosti:

$ pipenv shell$ pipenv install pytesseract Pillow 

V případě, že budete neměly být pomocí Pipenv, můžete vždy použít Pip a Virtuální přístup k životnímu Prostředí. Postupujte podle oficiální dokumentace, které vám pomohou začít s Pip a Virtuální Prostředí:

Poznámka: V případě, že místo pipenv install Pillow, příkaz bude pip install Pillow.

implementace

tento projekt budeme realizovat ve 2 fázích. V prvním vytvoříme skript a v dalším vytvoříme aplikaci baňky, která bude fungovat jako rozhraní.

OCR Script

S nastavení dokončeno, můžeme nyní vytvořit jednoduchou funkci, která vezme obrázek a vrátí text detekovány v obrázku – to bude jádro našeho projektu:

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

funkce je poměrně jednoduché, v prvních 5 řádků dovážíme ImagePillow knihovna a naše PyTesseract knihovna.

pak vytvoříme a ocr_core funkci, která převezme název souboru a vrátí text obsažený v obrázku.

podívejme se, jak skript tarify s jednoduchý obrázek obsahující text:

při spuštění kus kódu, jsme přivítali s tímto:

Náš jednoduchý OCR script funguje! Je zřejmé, že to bylo poněkud snadné, protože se jedná o digitální text, dokonalý a přesný, na rozdíl od rukopisu. Je toho mnohem víc, co můžeme udělat s Knihovnou PyTesseract, ale více o tom později v příspěvku.

začněme tento skript nejprve integrovat do aplikace baňky, abychom usnadnili nahrávání obrázků a provádění operací rozpoznávání znaků.

webové rozhraní baňky

náš skript lze použít pomocí příkazového řádku, ale aplikace baňky by byla uživatelsky přívětivější a všestrannější. Můžeme například nahrávat fotografie prostřednictvím webových stránek a získat extrahovaný text zobrazený na webových stránkách nebo můžeme zachytit fotografie prostřednictvím webové kamery a provádět rozpoznávání znaků na nich.

Pokud nejste obeznámeni s rámcem baňky, je to dobrý návod, jak vás dostat do rychlosti a jít.

začněte tím, že instalací Baňky balení:

$ pipenv install Flask

Nyní, pojďme se definovat základní trasa:

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

Uložte soubor a spustit:

$ python3 app.py

Pokud si otevřete prohlížeč a hlavu na 127.0.0.1:5000 nebo localhost:5000 měli byste vidět „Hello World!“na stránce. To znamená, že naše baňka aplikace je připravena pro další kroky.

nyní vytvoříme složku templates pro hostování našich HTML souborů. Pojďme do toho a vytvořit jednoduchý index.html:

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

Dovolte nám také vyladit naše app.py render naše nové šablony:

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

Všimněte si, máme nyní importovány render_template a použít je k vykreslení HTML souboru. Pokud restartujete aplikaci baňky, měli byste stále vidět “ Hello World!“na domovské stránce.

to stačí na rychlokurzu baňky, nyní integrujme náš OCR skript do webové aplikace.

nejprve přidáme funkce pro nahrávání obrázků do naší aplikace baňky a předáme je funkci ocr_core, kterou jsme napsali výše. Budeme pak vykreslit obraz vedle extrahuje text na náš web app v důsledku:

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

Jak můžeme vidět v našich upload_page() funkce, obdrží obrázek POŠTOU a vykreslení nahrát HTML je-li žádost ZÍSKAT.

zkontrolujeme, zda uživatel skutečně nahrál soubor, a pomocí funkce allowed_file() zkontrolujeme, zda je soubor přijatelného typu.

po ověření, že je obrázek požadovaného typu, jej předáme skriptu rozpoznávání znaků, který jsme vytvořili dříve.

funkce detekuje text v obrázku a vrátí jej. Nakonec jako odpověď na nahrání obrázku vykreslíme detekovaný text vedle obrázku, aby uživatel viděl výsledky.

soubor upload.html se postará o zveřejnění obrazu a vykreslení výsledku pomocí šablonovacího motoru Jinja, který je standardně dodáván s baňkou:

<!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 nám umožňuje zobrazit text v konkrétních scénářích pomocí značek {% if %} {% endif %}. Můžeme také předávat zprávy z naší aplikace baňky, které se zobrazí na webové stránce v rámci značek {{ }}. Formulář používáme k nahrání obrázku do naší aplikace baňky.

výsledek je:

nahrát úvodní stránka

Nyní, pokud budeme pokračovat a nahrát obrázek z dříve:

nahrát stránku, výsledek

Ano! Naše aplikace baňka byla schopna integrovat funkci OCR a zobrazit text v prohlížeči. To usnadňuje zpracování obrázků namísto spouštění příkazů na CLI pokaždé, když máme nový obrázek ke zpracování.

připojme další obrázky, abychom dále prozkoumali limity našeho jednoduchého skriptu OCR, protože nebude fungovat ve všech situacích.

zkusme například extrahovat text z následujícího obrázku a výsledek byl na obrázku zvýrazněn:

nepodařilo skenování covery

To je důkaz, že OCR není vždy 100% přesné a mohou potřebovat lidský zásah, čas od času.

jsem také testoval OCR script proti mému rukopisu, aby viděli, jak to bude provádět, a toto je výsledek:

můj rukopis

Jak můžete vidět, je to docela nelze extrahovat text z mého rukopisu, jako to udělal s jinými obrazy, které jsme viděli předtím. Rozhodl jsem se to zkusit znovu, tentokrát s obrázkem z tohoto zdroje, a to byly výsledky:

stáhnout ručně psané

rozpoznávání znaků na tomto snímku je mnohem lepší než ten, kde jsem použil svůj vlastní rukopis. Jak vidíte, řádky ve staženém obrázku jsou silnější a mezi textem a pozadím je lepší kontrast, což by mohlo být důvodem špatné detekce na mém rukopisu.

Toto je oblast, kterou můžete dále prozkoumat, můžete získat ručně psané poznámky od přátel nebo kolegů a zjistit, jak dobře bude skript schopen detekovat znaky. Můžete dokonce získat plakáty na události a zkusit je skenovat pro text, možností je spousta.

další možnosti PyTesseract

Python-Tesseract má více možností, které můžete prozkoumat. Například, můžete určit jazyk, pomocí lang flag:

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

Toto je výsledek skenování obrazu bez lang vlajka:

A teď lang vlajky:

rámec je také optimalizován pro detekci jazyků lépe, jak je vidět na screenshotech. (Zdroj obrázku).

bez vlajky lang skript vynechal některá francouzská slova, ale po zavedení vlajky byl schopen detekovat veškerý francouzský obsah. Překlad není možný, ale je to stále působivé. Oficiální dokumentace společnosti Tesseract obsahuje Podporované jazyky v této části.

orientace a detekce skriptů patří také mezi schopnosti PyTesseract a to pomáhá při detekci použitých písem a orientaci textu na daném obrázku. Pokud můžeme odkázat na vlastnoruční obrázek, který jsme stáhli dříve:

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

Tam byl žádné číslo stránky informace o obrazu, takže to nebyla zjištěna. Motor Tesseract je schopen extrahovat informace o orientaci textu v obraze a rotaci. Důvěra v orientaci je údaj o jistotě motoru o zjištěné orientaci, která působí jako vodítko a také ukazuje, že není vždy 100% přesná. Sekce skriptu označuje systém zápisu použitý v textu a za ním následuje značka spolehlivosti.

Když jsme byli po rozpoznané znaky a jejich hranice rámečku, PyTesseract dosahuje prostřednictvím pytesseract.image_to_boxes(Image.open('downloaded_handwritten.png')).

to jsou některé z možností PyTesseract mimo jiné, jako je konverze extrahovaného textu do prohledávatelného PDF nebo hOCR výstup.

Co jsme neudělali

Jsme dosáhli hodně v tomto příspěvku, ale tam je ještě více udělat, vylepšit náš projekt a připravit ji na skutečný svět. Za prvé, můžeme přidat styl na naše webové stránky a učinit z něj přitažlivější pro koncového uživatele pomocí CSS. Můžeme také přidat možnost nahrát a skenovat více obrázků najednou a zobrazit veškerý jejich výstup najednou. Nebylo by to pohodlnější skenovat více dokumentů?

prohlížeč nám umožňuje proniknout do kamery stroje a pořizovat snímky, samozřejmě se svolením uživatele. To může být velkou pomocí zejména na mobilních zařízeních. Namísto toho, aby uživatel musel snímek zachytit a uložit a poté jej nahrát na web, pokud přidáme funkci fotoaparátu, můžeme uživateli umožnit provádět operace přímo z webové aplikace baňka. Díky tomu bude proces skenování rychlejší.

Předpokládejme, že aplikace baňky není to, co jste zamýšleli vystavit skener OCR, můžete také vytvořit nástroj CLI. Tento nástroj vám umožní spustit příkaz včetně umístění obrázku a poté vytisknout výstup skeneru do terminálu nebo jej odeslat do databáze nebo API. Pokud jste zvolili tuto cestu, Docopt je fantastický nástroj pro vytváření nástrojů příkazového řádku pomocí Pythonu.

závěr

prostřednictvím knihovny Tesseract a Python-Tesseract jsme byli schopni skenovat obrázky a extrahovat z nich text. Jedná se o optické rozpoznávání znaků a může být velmi užitečné v mnoha situacích.

Jsme vybudovali skener, který vezme obrázek a vrátí text obsažený v obrazu a integrované do Baňky aplikace jako rozhraní. To nám umožňuje odhalit funkčnost ve známějším médiu a způsobem, který může sloužit více lidem současně.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *