Introducere
oamenii pot înțelege conținutul unei imagini pur și simplu prin căutarea. Percepem textul de pe imagine ca text și îl putem citi.
calculatoarele nu funcționează la fel. Au nevoie de ceva mai concret, organizat într-un mod în care să poată înțelege.
aici intervine recunoașterea optică a caracterelor (OCR). Fie că este vorba de recunoașterea plăcilor auto de la o cameră foto, fie de documente scrise de mână care ar trebui convertite într-o copie digitală, această tehnică este foarte utilă. Deși nu este întotdeauna perfect, este foarte convenabil și face mult mai ușor și mai rapid pentru unii oameni să-și facă treaba.
în acest articol, vom aprofunda profunzimea recunoașterii optice a caracterelor și a domeniilor sale de aplicare. De asemenea, vom construi un script simplu în Python care ne va ajuta să detectăm personaje din imagini și să expunem acest lucru printr-o aplicație Flask pentru un mediu de interacțiune mai convenabil.
ce este recunoașterea optică a caracterelor?
recunoașterea optică a caracterelor implică detectarea conținutului textului pe imagini și traducerea imaginilor în text codificat pe care computerul îl poate înțelege cu ușurință. O imagine care conține text este scanată și analizată pentru a identifica caracterele din ea. La identificare, caracterul este convertit în text codificat de mașină.
cum se realizează cu adevărat? Pentru noi, textul dintr-o imagine este ușor de discernut și suntem capabili să detectăm caractere și să citim textul, dar la un computer, totul este o serie de puncte.
Imaginea este scanată mai întâi, iar textul și elementele grafice sunt convertite într-un bitmap, care este în esență o matrice de puncte alb-negru. Imaginea este apoi pre-procesată în cazul în care luminozitatea și contrastul sunt ajustate pentru a spori precizia procesului.
Imaginea este acum împărțită în zone de identificare a zonelor de interes, cum ar fi în cazul în care imaginile sau textul sunt și acest lucru ajută kickoff procesul de extracție. Zonele care conțin text pot fi acum defalcate în continuare în linii și cuvinte și caractere, iar acum software-ul este capabil să se potrivească cu caracterele prin comparație și diverși algoritmi de detectare. Rezultatul final este textul din imaginea pe care ni-l dați.este posibil ca procesul să nu fie 100% precis și să necesite intervenția umană pentru a corecta unele elemente care nu au fost scanate corect. Corectarea erorilor poate fi realizată și folosind un dicționar sau chiar procesarea limbajului Natural (NLP).
ieșirea poate fi acum convertită în alte medii, cum ar fi documente word, PDF-uri sau chiar conținut audio prin tehnologii text-To-speech.
utilizări ale OCR
anterior, digitalizarea documentelor a fost realizată prin tastarea manuală a textului pe computer. Prin OCR, acest proces este facilitat, deoarece documentul poate fi scanat, procesat și textul extras și stocat într-o formă editabilă, cum ar fi un document word.
Dacă aveți un scaner de documente pe telefon, cum ar fi Adobe Scan, probabil că ați întâlnit tehnologia OCR în uz.
aeroporturile pot utiliza, de asemenea, OCR pentru a automatiza procesul de recunoaștere a pașapoartelor și extragerea informațiilor de la acestea.alte utilizări ale OCR includ automatizarea proceselor de introducere a datelor, detectarea și recunoașterea plăcuțelor de înmatriculare ale mașinii.
ce vom folosi
pentru acest proiect OCR, vom folosi Python-Tesseract, sau pur și simplu PyTesseract, biblioteca care este un înveliș pentru motorul Google Tesseract-OCR.
am ales acest lucru pentru că este complet open-source și este dezvoltat și întreținut de gigantul care este Google. Urmați aceste instrucțiuni pentru a instala Tesseract pe mașina dvs., deoarece PyTesseract depinde de acesta.
de asemenea, vom folosi Flask web framework pentru a crea serverul nostru OCR simplu, unde putem face fotografii prin intermediul camerei web sau încărca fotografii în scopuri de recunoaștere a caracterelor.
de asemenea, vom folosi Pipenv, deoarece se ocupă și de configurarea mediului virtual și de gestionarea cerințelor.
pe lângă acestea, vom folosi și Biblioteca de perne, care este o furculiță a Bibliotecii de imagini Python (Pil) pentru a gestiona deschiderea și manipularea imaginilor în mai multe formate în Python.
în acest post, ne vom concentra pe PyTesseract deși există alte biblioteci Python care vă pot ajuta să extrageți text din imagini, cum ar fi:
- Textract: care poate extrage date din PDF-uri, dar este un pachet greu.
- Pyocr: oferă mai multe opțiuni de detectare, cum ar fi propoziții, cifre sau cuvinte.
Setup
începeți prin instalarea Pipenv folosind următoarea comandă prin Pip (în cazul în care trebuie să o configurați, consultați acest lucru).
$ pip install pipenv
creați directorul de proiect și inițiați proiectul executând următoarea comandă:
$ mkdir ocr_server && cd ocr_server && pipenv install --three
acum putem activa mediul virtual și putem începe instalarea dependențelor noastre:
$ pipenv shell$ pipenv install pytesseract Pillow
În cazul în care nu veți utiliza Pipenv, puteți utiliza întotdeauna abordarea PIP și Virtual Environment. Urmați documentația oficială pentru a vă ajuta să începeți cu Pip și mediul Virtual:
Notă: În acest caz, în loc depipenv install Pillow
, comanda va fipip install Pillow
.
implementare
vom implementa acest proiect în 2 etape. În primul, vom crea scriptul, iar în următorul vom construi o aplicație Flask pentru a acționa ca o interfață.
Script OCR
cu configurarea completă, putem crea acum o funcție simplă care ia o imagine și returnează textul detectat în imagine – acesta va fi nucleul proiectului nostru:
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'))
funcția este destul de simplă, în primele 5 linii importămImage
dinPillow
și biblioteca noastrăPyTesseract
.
apoi creăm șiocr_core
funcție care preia un nume de fișier și returnează textul conținut în imagine.
Să vedem cum se descurcă scriptul cu o imagine simplă care conține un text:
și la rularea piesei de cod, suntem întâmpinați cu acest lucru:
scriptul nostru OCR simplu funcționează! Evident, acest lucru a fost oarecum ușor, deoarece acesta este un text digital, perfect și precis, spre deosebire de scrierea de mână. Există mult mai multe lucruri pe care le putem face cu Biblioteca PyTesseract, dar mai multe despre acest lucru mai târziu în post.
să integrăm mai întâi acest script într-o aplicație Flask, pentru a facilita încărcarea imaginilor și efectuarea operațiunilor de recunoaștere a caracterelor.
Flask Web Interface
scriptul nostru poate fi folosit prin linia de comandă, dar o aplicație Flask ar face mai ușor de utilizat și versatil. De exemplu, putem încărca fotografii prin intermediul site-ului web și putem obține textul extras afișat pe site sau putem captura fotografii prin intermediul camerei web și putem efectua recunoașterea caracterelor pe ele.
dacă nu sunteți familiarizați cu cadrul Flask, acesta este un tutorial bun pentru a vă pune la curent și a merge.
să începem prin instalarea pachetului Flask:
$ pipenv install Flask
acum, să definim un traseu de bază:
from flask import Flaskapp = Flask(__name__)@app.route('/')def home_page(): return "Hello World!"if __name__ == '__main__': app.run()
salvați fișierul și rulați:
$ python3 app.py
dacă deschideți browserul și mergeți la 127.0.0.1:5000
sau localhost:5000
ar trebui să vedeți „hello world!”pe pagină. Aceasta înseamnă că aplicația noastră Flask este pregătită pentru pașii următori.
vom crea acum untemplates
folder pentru a găzdui fișierele noastre HTML. Să mergem mai departe și de a crea un simplu index.html
:
<!DOCTYPE html><html> <head> <title>Index</title> </head> <body> Hello World. </body></html>
să ne tweak, de asemenea, app.py
pentru a face noul nostru șablon:
from flask import Flask, render_templateapp = Flask(__name__)@app.route('/')def home_page(): return render_template('index.html')if __name__ == '__main__': app.run()
importat render_template
și l-a folosit pentru a reda fișierul HTML. Dacă reporniți aplicația Flask, ar trebui să vedeți în continuare „Hello World!”pe pagina principală.
asta e de ajuns pe Flask crash course, să ne integreze acum script-ul nostru OCR pe aplicația web.
În primul rând, vom adăuga funcționalitate pentru a încărca imagini în aplicația noastră Flask și le vom transmite funcțieiocr_core
pe care am scris-o mai sus. Vom face apoi imaginea de lângă textul extras pe aplicația noastră web ca rezultat:
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()
după cum putem vedea înupload_page()
funcția, vom primi imaginea prin poștă și face HTML upload în cazul în care cererea este GET.
verificăm dacă utilizatorul a încărcat într-adevăr un fișier și folosim funcțiaallowed_file()
pentru a verifica dacă fișierul este de un tip acceptabil.
la verificarea faptului că imaginea este de tipul necesar, o transmitem apoi scriptului de recunoaștere a caracterelor pe care l-am creat mai devreme.
funcția detectează textul din imagine și îl returnează. În cele din urmă, ca răspuns la încărcarea imaginii, redăm textul detectat alături de imagine pentru ca utilizatorul să vadă rezultatele.
fișierulupload.html
se va ocupa de postarea Imaginii și de redarea rezultatului cu ajutorul motorului Jinja templating, care este livrat implicit cu Flask:
<!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 ne permite să afișăm text în scenarii specifice prin etichetele{% if %} {% endif %}
. De asemenea, putem transmite mesaje din aplicația noastră Flask pentru a fi afișate pe pagina web în cadrul etichetelor {{ }}
. Folosim un formular pentru a încărca imaginea în aplicația noastră Flask.
rezultatul este:
acum, dacă mergem mai departe și încărcați imaginea noastră de mai devreme:
Da! Aplicația noastră Flask a reușit să integreze funcționalitatea OCR și să afișeze textul în browser. Acest lucru facilitează procesarea imaginilor în loc să ruleze comenzi pe CLI de fiecare dată când avem o nouă imagine de procesat.
să atașăm câteva imagini pentru a explora în continuare limitele scriptului nostru OCR simplu, deoarece nu va funcționa în toate situațiile.
de exemplu, să încercăm să extragem text din următoarea imagine și rezultatul a fost evidențiat pe imagine:
aceasta este o dovadă că OCR nu este întotdeauna 100% corectă și poate avea nevoie de intervenție umană din când în când.
am testat și scriptul OCR cu scrisul meu de mână pentru a vedea cum va funcționa, iar acesta este rezultatul:
după cum puteți vedea, nu poate extrage destul de mult text din scrisul meu de mână, așa cum a făcut-o cu alte imagini pe care le-am văzut înainte. Am decis să mai încerc, de data aceasta cu o imagine din această sursă, iar acestea au fost rezultatele:
recunoașterea caracterelor de pe această imagine este mult mai bună decât cea în care mi-am folosit propria scriere de mână. După cum puteți vedea liniile din imaginea descărcată sunt mai groase și există un contrast mai bun între text și fundal și acesta ar putea fi motivul pentru detectarea slabă a scrierii mele de mână.
aceasta este o zonă pentru a explora în continuare, puteți obține note scrise de mână de la prieteni sau colegi și a vedea cât de bine script-ul va fi capabil de a detecta caractere. Puteți obține chiar și postere la evenimente și încercați să le scanați pentru text, posibilitățile sunt multe.
alte opțiuni PyTesseract
Python-Tesseract are mai multe opțiuni pe care le puteți explora. De exemplu, puteți specifica limba utilizând un lang
steag:
pytesseract.image_to_string(Image.open(filename), lang='fra')
acesta este rezultatul scanării unei imagini fără lang
steag:
și acum cu lang
Pavilion:
cadrul este, de asemenea, optimizat pentru a detecta limbi mai bine așa cum se vede în capturi de ecran. (Sursa imaginii).
fără steagullang
, scriptul a ratat câteva cuvinte franceze, dar după introducerea steagului a reușit să detecteze tot conținutul francez. Traducerea nu este posibilă, dar acest lucru este încă impresionant. Documentația oficială a Tesseract include limbile acceptate în această secțiune.
orientarea și detectarea scriptului sunt, de asemenea, printre capacitățile PyTesseract și acest lucru ajută la detectarea fonturilor utilizate și orientarea textului pe imaginea dată. Dacă ne putem referi la imaginea scrisă de mână pe care am descărcat-o mai devreme:
print(pytesseract.image_to_osd(Image.open('downloaded_handwritten.png')))
nu existau informații despre numărul paginii pe imagine, astfel încât aceasta nu a fost detectată. Motorul Tesseract este capabil să extragă informații despre orientarea textului în imagine și rotație. Încrederea în orientare este o figură a garanției motorului cu privire la orientarea detectată pentru a acționa ca un ghid și pentru a arăta, de asemenea, că nu este întotdeauna 100% precisă. Secțiunea script denotă sistemul de scriere utilizat în text și acesta este urmat și de markerul de încredere.
dacă am fi urmărit caracterele recunoscute și limitele cutiei lor, PyTesseract realizează acest lucru prinpytesseract.image_to_boxes(Image.open('downloaded_handwritten.png'))
.
acestea sunt câteva dintre capacitățile PyTesseract, printre altele, cum ar fi conversia textului extras într-un PDF sau o ieșire HOCR căutabilă.
ceea ce nu am făcut
am realizat multe în această postare, dar mai sunt încă multe de făcut pentru a ne rafina proiectul și a-l pregăti pentru lumea reală. În primul rând, putem adăuga stil site-ului nostru web și îl putem face mai atrăgător pentru utilizatorul final folosind CSS. De asemenea, putem adăuga opțiunea de a încărca și scana mai multe imagini simultan și de a afișa toate ieșirile lor simultan. Nu ar face acest lucru mai convenabil să scanați mai multe documente?
browserul ne permite să accesăm camera unei mașini și să capturăm imagini, cu permisiunea utilizatorului, desigur. Acest lucru poate fi de mare ajutor, în special pe dispozitivele mobile. În loc ca utilizatorul să fie nevoit să capteze și să salveze imaginea, apoi să o încarce pe site, dacă adăugăm funcționalitatea camerei, putem permite utilizatorului să efectueze operațiunile direct din aplicația Web Flask. Acest lucru va face procesul de scanare mai rapid.
Să presupunem că o aplicație Flask nu este ceea ce intenționați să expuneți scanerul OCR, puteți crea și un instrument CLI. Instrumentul vă va permite să rulați o comandă care să includă locația imaginii și apoi să imprimați ieșirea scanerului pe terminalul dvs. sau să o trimiteți la o bază de date sau API. Dacă ați ales această cale Docopt este un instrument fantastic pentru construirea de instrumente de linie de comandă folosind Python.
concluzie
prin Tesseract și biblioteca Python-Tesseract, am reușit să scanăm imagini și să extragem text din ele. Aceasta este recunoașterea optică a caracterelor și poate fi de mare folos în multe situații.
am construit un scaner care ia o imagine și returnează textul conținut în imagine și integrat într-o aplicație Flask ca interfață. Acest lucru ne permite să expunem funcționalitatea într-un mediu mai familiar și într-un mod care poate servi mai multor persoane simultan.