از طریق منوی جستجو مطلب مورد نظر خود در وبلاگ را به سرعت پیدا کنید
PyTesseract: تشخیص ساده کاراکترهای نوری پایتون
سرفصلهای مطلب
معرفی
انسان ها می توانند محتویات یک تصویر را به سادگی با نگاه کردن درک کنند. ما متن را درک می کنیم روی تصویر به عنوان متن است و می تواند آن را بخواند.
کامپیوترها یکسان کار نمی کنند. آنها به چیزی ملموس تر، سازماندهی شده به گونه ای که بتوانند درک کنند نیاز دارند.
اینجاست که تشخیص کاراکتر نوری (OCR) شروع میشود. چه تشخیص پلاکهای خودرو از دوربین باشد، چه اسناد دستنویسی که باید به یک کپی دیجیتال تبدیل شوند، این تکنیک بسیار مفید است. اگرچه همیشه کامل نیست، اما بسیار راحت است و انجام کارهای خود را برای برخی افراد بسیار آسانتر و سریعتر میکند.
در این مقاله، به عمق تشخیص کاراکتر نوری و حوزه های کاربردی آن خواهیم پرداخت. ما همچنین یک اسکریپت ساده در پایتون میسازیم که به ما کمک میکند کاراکترهای تصاویر را شناسایی کرده و آن را از طریق یک برنامه Flask برای یک رسانه تعاملی راحتتر در معرض دید قرار دهیم.
تشخیص کاراکتر نوری چیست؟
تشخیص نوری کاراکتر شامل تشخیص محتوای متنی است روی تصاویر و ترجمه تصاویر به متن کدگذاری شده که کامپیوتر به راحتی می تواند آن را درک کند. یک تصویر حاوی متن به منظور شناسایی شخصیت های موجود در آن اسکن و تجزیه و تحلیل می شود. پس از شناسایی، کاراکتر به متن کدگذاری شده توسط ماشین تبدیل می شود.
واقعا چگونه به دست می آید؟ برای ما پیامک کنید روی یک تصویر به راحتی قابل تشخیص است و ما می توانیم کاراکترها را تشخیص دهیم و متن را بخوانیم، اما برای کامپیوتر، همه اینها یک سری نقطه است.
ابتدا تصویر اسکن می شود و متن و عناصر گرافیکی به یک بیت مپ تبدیل می شوند که در اصل ماتریسی از نقاط سیاه و سفید است. سپس تصویر از قبل پردازش می شود که در آن روشنایی و کنتراست برای افزایش دقت تنظیم می شود process.
اکنون تصویر به مناطقی تقسیم می شود که مناطق مورد علاقه را شناسایی می کند، مانند جایی که تصاویر یا متن در آن قرار دارند و این به شروع استخراج کمک می کند. process. اکنون می توان نواحی حاوی متن را به خطوط و کلمات و کاراکترها تقسیم کرد و اکنون نرم افزار قادر است کاراکترها را از طریق مقایسه و الگوریتم های تشخیص مختلف مطابقت دهد. نتیجه نهایی متن موجود در تصویری است که به ما داده شده است.
را process ممکن است 100٪ دقیق نباشد و ممکن است برای اصلاح برخی از عناصری که به درستی اسکن نشده اند به مداخله انسانی نیاز داشته باشد. تصحیح خطا را می توان با استفاده از فرهنگ لغت یا حتی به دست آورد پردازش زبان طبیعی (NLP).
اکنون می توان خروجی را از طریق فناوری های تبدیل متن به گفتار به رسانه های دیگر مانند اسناد word، PDF یا حتی محتوای صوتی تبدیل کرد.
موارد استفاده از OCR
پیش از این، دیجیتالی کردن اسناد با تایپ دستی متن انجام می شد روی کامپیوتر رایانه. از طریق OCR، این process آسان تر می شود زیرا سند را می توان اسکن، پردازش کرد و متن را به شکلی قابل ویرایش مانند سند word استخراج و ذخیره کرد.
اگر اسکنر اسناد دارید روی گوشی شما، مانند Adobe Scan، احتمالاً با فناوری OCR در حال استفاده مواجه شده اید.
فرودگاه ها همچنین می توانند از OCR برای خودکارسازی استفاده کنند process شناسایی گذرنامه و استخراج اطلاعات از آنها.
از دیگر کاربردهای OCR میتوان به اتوماسیون فرآیندهای ورود اطلاعات، شناسایی و شناسایی پلاک خودروها اشاره کرد.
آنچه ما استفاده خواهیم کرد
برای این پروژه OCR، ما از Python-Tesseract، یا به سادگی PyTesseract، کتابخانه ای که لفافی برای موتور Tesseract-OCR گوگل.
من این را انتخاب کردم زیرا کاملاً منبع باز است و توسط غول گوگل توسعه یافته و نگهداری می شود. اینها را دنبال کنید دستورالعمل ها برای نصب Tesseract روی ماشین شما، از آنجایی که PyTesseract وابسته است روی آی تی.
ما نیز استفاده خواهیم کرد چارچوب وب فلاسک برای ایجاد سرور OCR ساده خود که می توانیم از طریق وب کم عکس بگیریم یا برای اهداف تشخیص کاراکتر عکس آپلود کنیم.
ما هم قرار است استفاده کنیم پیپنف از آنجایی که تنظیم محیط مجازی و مدیریت نیازمندی ها را نیز مدیریت می کند.
علاوه بر آنها، ما همچنین از آن استفاده خواهیم کرد بالش کتابخانه که انشعابی از کتابخانه تصویربرداری پایتون (PIL) برای مدیریت باز کردن و دستکاری تصاویر در بسیاری از فرمت ها در پایتون.
در این پست، ما تمرکز می کنیم روی PyTesseract اگرچه کتابخانه های پایتون دیگری وجود دارد که می تواند به شما در استخراج متن از تصاویر کمک کند، مانند:
- متن: که می تواند داده ها را از PDF استخراج کند اما بسته سنگینی است.
- Pyocr: گزینه های تشخیص بیشتری مانند جملات، ارقام یا کلمات را ارائه می دهد.
برپایی
با نصب شروع کنید پیپنف با استفاده از دستور زیر از طریق Pip (در صورت نیاز به تنظیم، مراجعه کنید این).
$ pip install pipenv
دایرکتوری پروژه را ایجاد کرده و با اجرای دستور زیر پروژه را شروع کنید:
$ mkdir ocr_server && cd ocr_server && pipenv install --three
اکنون می توانیم محیط مجازی خود را فعال کرده و شروع به نصب وابستگی های خود کنیم:
$ pipenv shell
$ pipenv install pytesseract Pillow
در صورتی که از Pipenv استفاده نمی کنید، همیشه می توانید از رویکرد Pip و Virtual Environment استفاده کنید. اسناد رسمی را دنبال کنید تا به شما در شروع کار کمک کند پیپ و محیط مجازی:
توجه داشته باشید: در آن صورت به جای pipenv install Pillow
، دستور خواهد بود pip install Pillow
.
پیاده سازی
قرار است این پروژه را در 2 فاز اجرا کنیم. در اول، ما اسکریپت را ایجاد می کنیم، و در مرحله بعد، یک برنامه Flask می سازیم تا به عنوان یک رابط عمل کند.
اسکریپت OCR
با تکمیل تنظیمات، اکنون میتوانیم یک تابع ساده ایجاد کنیم که یک تصویر میگیرد و متن شناسایی شده در تصویر را برمیگرداند – این هسته پروژه ما خواهد بود:
try:
from PIL import Image
except ImportError:
import Image
import pytesseract
def ocr_core(filename):
"""
This function will handle the core OCR processing of images.
"""
text = pytesseract.image_to_string(Image.open(filename))
return text
print(ocr_core('images/ocr_example_1.png'))
عملکرد کاملاً ساده است، در 5 خط اول ما import Image
از Pillow
کتابخانه و ما PyTesseract
کتابخانه
سپس ایجاد می کنیم و ocr_core
تابعی که نام فایل را می گیرد و متن موجود در تصویر را برمی گرداند.
بیایید ببینیم که اسکریپت با یک تصویر ساده حاوی متنی چگونه عمل می کند:
و با اجرای قطعه کد، با این خوشامد میگوییم:
اسکریپت OCR ساده ما کار می کند! بدیهی است که این کار تا حدودی آسان بود زیرا این متن دیجیتالی است، بر خلاف دست خط، کامل و دقیق. کارهای بسیار بیشتری می توانیم با کتابخانه PyTesseract انجام دهیم، اما بیشتر روی این بعد در پست
بیایید ابتدا این اسکریپت را در یک برنامه Flask ادغام کنیم تا آپلود تصاویر و انجام عملیات تشخیص کاراکتر آسانتر شود.
رابط وب فلاسک
اسکریپت ما را می توان از طریق خط فرمان استفاده کرد، اما یک برنامه Flask آن را کاربر پسندتر و همه کاره تر می کند. به عنوان مثال، ما می توانیم عکس ها را از طریق وب سایت آپلود کنیم و متن استخراج شده را نمایش دهیم روی وب سایت یا ما می توانیم از طریق دوربین وب عکس بگیریم و تشخیص کاراکتر را انجام دهیم روی آنها را
اگر با چارچوب Flask آشنا نیستید، این یک است آموزش خوب تا شما را به سرعت و حرکت برسانند.
بیایید با نصب بسته Flask شروع کنیم:
$ pipenv install Flask
حالا بیایید یک مسیر اصلی را تعریف کنیم:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def home_page():
return "Hello World!"
if __name__ == '__main__':
app.run()
فایل را ذخیره کرده و اجرا کنید:
$ python3 app.py
اگر مرورگر خود را باز کنید و سر بزنید روی به 127.0.0.1:5000
یا localhost:5000
شما باید “Hello World!” روی را page. این بدان معناست که برنامه Flask ما برای مراحل بعدی آماده است.
ما اکنون یک را ایجاد می کنیم templates
پوشه به host فایل های HTML ما بیایید جلو برویم و یک ساده ایجاد کنیم index.html
:
<!DOCTYPE html>
<html>
<head>
<title>Index</title>
</head>
<body>
Hello World.
</body>
</html>
اجازه دهید ما نیز نیشگون گرفتن و کشیدن خود را app.py
برای ارائه الگوی جدید ما:
from flask import Flask, render_template
app = Flask(__name__)
@app.route('/')
def home_page():
return render_template('index.html')
if __name__ == '__main__':
app.run()
توجه داشته باشید که ما اکنون وارد کرده ایم render_template
و از آن برای رندر فایل HTML استفاده کرد. اگر برنامه Flask خود را مجددا راه اندازی کنید، همچنان باید “Hello World!” روی خانه page.
بس است روی دوره خرابی Flask، اجازه دهید اکنون اسکریپت OCR خود را یکپارچه کنیم روی برنامه وب
ابتدا، ما قابلیتی برای آپلود تصاویر در برنامه Flask خود و ارسال آنها به برنامه اضافه می کنیم ocr_core
تابعی که در بالا نوشتیم. سپس تصویر را در کنار متن استخراج شده رندر می کنیم روی برنامه وب ما در نتیجه:
import os
from flask import Flask, render_template, request
from ocr_core import ocr_core
UPLOAD_FOLDER = '/static/uploads/'
ALLOWED_EXTENSIONS = set(('png', 'jpg', 'jpeg'))
app = Flask(__name__)
def allowed_file(filename):
return '.' in filename and \
filename.rsplit('.', 1)(1).lower() in ALLOWED_EXTENSIONS
@app.route('/')
def home_page():
return render_template('index.html')
@app.route('/upload', methods=('GET', 'POST'))
def upload_page():
if request.method == 'POST':
if 'file' not in request.files:
return render_template('upload.html', msg='No file selected')
file = request.files('file')
if file.filename == '':
return render_template('upload.html', msg='No file selected')
if file and allowed_file(file.filename):
extracted_text = ocr_core(file)
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()
همانطور که در ما می بینیم upload_page()
تابع، تصویر را از طریق دریافت خواهیم کرد پست و در صورت درخواست آپلود HTML را ارائه دهید گرفتن.
بررسی می کنیم که آیا کاربر واقعاً فایلی را آپلود کرده است یا خیر و از تابع استفاده می کند allowed_file()
برای بررسی اینکه آیا فایل از نوع قابل قبولی است یا خیر.
پس از تأیید اینکه تصویر از نوع مورد نیاز است، آن را به اسکریپت تشخیص کاراکتر که قبلا ایجاد کردیم ارسال می کنیم.
تابع متن را در تصویر تشخیص داده و آن را برمی گرداند. در نهایت، به عنوان پاسخ به آپلود تصویر، متن شناسایی شده را در کنار تصویر برای کاربر نمایش می دهیم تا نتایج را ببیند.
را upload.html
فایل ارسال تصویر و رندر نتیجه را با کمک موتور قالب جینجا، که به طور پیش فرض با 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 به ما اجازه می دهد تا متن را در سناریوهای خاص از طریق نمایشگر نمایش دهیم {% if %} {% endif %}
برچسب ها همچنین میتوانیم پیامهایی را از برنامه Flask خود ارسال کنیم تا نمایش داده شوند روی صفحه وب در داخل {{ }}
برچسب ها ما از یک فرم برای آپلود تصویر در برنامه Flask خود استفاده می کنیم.
نتیجه این است:
حالا، اگر جلو برویم و تصویر قبلی خود را آپلود کنیم:
آره! برنامه Flask ما قادر به ادغام عملکرد OCR و نمایش متن است روی مرورگر این کار را آسان تر می کند process تصاویر به جای اجرای دستورات روی CLI هر بار که یک تصویر جدید داریم process.
بیایید چند تصویر دیگر را ضمیمه کنیم تا محدودیت های اسکریپت OCR ساده خود را بیشتر بررسی کنیم زیرا در همه شرایط کار نمی کند.
به عنوان مثال، بیایید متن را از تصویر زیر استخراج کنیم و نتیجه برجسته شده است روی تصویر:
این شواهدی است که OCR همیشه 100٪ دقیق نیست و ممکن است هر از گاهی نیاز به مداخله انسانی داشته باشد.
من همچنین اسکریپت OCR را با دستخط خود آزمایش کردم تا ببینم عملکرد آن چگونه است، و نتیجه این است:
همانطور که می بینید، نمی تواند مانند سایر تصاویری که قبلاً دیده ایم، متن را از دست خط من استخراج کند. تصمیم گرفتم دوباره امتحانش کنم، این بار با تصویری از این منبع، و این نتایج بود:
تشخیص شخصیت روی این تصویر خیلی بهتر از تصویری است که من از دستخط خودم استفاده کردم. همانطور که می بینید خطوط در تصویر دانلود شده ضخیم تر هستند و کنتراست بهتری بین متن و پس زمینه وجود دارد و این می تواند دلیل تشخیص ضعیف باشد. روی دست خط من
این منطقه ای برای کاوش بیشتر است، می توانید یادداشت های دست نویس از دوستان یا همکاران دریافت کنید و ببینید که اسکریپت تا چه حد قادر به تشخیص شخصیت ها خواهد بود. شما حتی می توانید پوسترهایی را برای رویدادها دریافت کنید و سعی کنید آنها را برای متن اسکن کنید، امکانات بسیار زیاد است.
سایر گزینه های PyTesseract
Python-Tesseract گزینه های بیشتری دارد که می توانید کاوش کنید. به عنوان مثال، می توانید زبان را با استفاده از a مشخص کنید lang
پرچم:
pytesseract.image_to_string(Image.open(filename), lang='fra')
این نتیجه اسکن یک تصویر بدون آن است lang
پرچم:
و در حال حاضر با lang
پرچم:
این چارچوب همچنین برای تشخیص بهتر زبان ها همانطور که در تصاویر دیده می شود بهینه شده است. (منبع تصویر).
بدون lang
flag، اسکریپت برخی از کلمات فرانسوی را از قلم انداخته بود، اما پس از معرفی پرچم توانست تمام محتوای فرانسوی را شناسایی کند. ترجمه امکان پذیر نیست، اما این هنوز هم چشمگیر است. اسناد رسمی Tesseract شامل زبان های پشتیبانی شده در این بخش است.
جهت یابی و تشخیص اسکریپت نیز از جمله قابلیت های PyTesseract است که به تشخیص فونت های استفاده شده و جهت گیری متن کمک می کند. روی تصویر داده شده اگر ممکن است به تصویر دست نویسی که قبلا دانلود کرده بودیم مراجعه کنیم:
print(pytesseract.image_to_osd(Image.open('downloaded_handwritten.png')))
وجود نداشت page اطلاعات شماره روی این تصویر شناسایی نشد. موتور Tesseract قادر به استخراج اطلاعات در مورد جهت متن در تصویر و چرخش است. اطمینان جهت گیری رقمی است از اطمینان موتور در مورد جهت تشخیص داده شده به عنوان راهنما و همچنین نشان می دهد که همیشه 100٪ دقیق نیست. بخش اسکریپت سیستم نوشتاری مورد استفاده در متن را نشان می دهد و نشانگر اطمینان نیز به دنبال آن است.
اگر دنبال کاراکترهای شناسایی شده و مرزهای جعبه آنها بودیم، PyTesseract از طریق آن به این امر دست می یابد pytesseract.image_to_boxes(Image.open('downloaded_handwritten.png'))
.
اینها برخی از قابلیت های PyTesseract از جمله تبدیل متن استخراج شده به خروجی PDF یا HOCR قابل جستجو هستند.
کاری که ما انجام نداده ایم
ما در این پست کارهای زیادی انجام داده ایم، اما هنوز کارهای بیشتری برای اصلاح پروژه و آماده سازی آن برای دنیای واقعی وجود دارد. ابتدا، میتوانیم به وبسایت خود سبک اضافه کنیم و با استفاده از CSS آن را برای کاربر نهایی جذابتر کنیم. همچنین میتوانیم گزینه آپلود و اسکن چند تصویر را بهطور همزمان و نمایش تمام خروجیهای آنها در یک زمان اضافه کنیم. آیا این کار اسکن چندین سند را راحت تر نمی کند؟
مرورگر به ما اجازه می دهد تا به دوربین دستگاه ضربه بزنیم و تصاویر را البته با اجازه کاربر ثبت کنیم. این به خصوص می تواند کمک بزرگی باشد روی دستگاه های تلفن همراه به جای اینکه کاربر مجبور شود تصویر را گرفته و ذخیره کند و سپس آن را آپلود کند روی وب سایت، اگر عملکرد دوربین را اضافه کنیم، می توانیم به کاربر اجازه دهیم تا عملیات را مستقیماً از برنامه وب Flask انجام دهد. این اسکن را انجام می دهد process سریعتر
فرض کنید یک برنامه Flask آن چیزی نیست که قصد دارید اسکنر OCR خود را نشان دهید، همچنین می توانید یک ابزار CLI ایجاد کنید. این ابزار به شما این امکان را می دهد که دستوری از جمله مکان تصویر را اجرا کنید و سپس خروجی اسکنر را در دستگاه خود چاپ کنید. terminal یا ارسال آن به پایگاه داده یا API. اگر این راه را انتخاب کردید Docopt ابزاری فوق العاده برای ساخت ابزارهای خط فرمان با استفاده از پایتون است.
نتیجه
از طریق Tesseract و کتابخانه Python-Tesseract، ما قادر به اسکن تصاویر و استخراج متن از آنها بوده ایم. این تشخیص کاراکتر نوری است و می تواند در بسیاری از موقعیت ها از آن استفاده زیادی کند.
ما یک اسکنر ساختهایم که تصویری را میگیرد و متن موجود در تصویر را برمیگرداند و آن را در یک برنامه Flask به عنوان رابط ادغام میکند. این به ما امکان میدهد عملکرد را در رسانهای آشناتر و به گونهای که بتواند به طور همزمان به چندین نفر خدمت کند، نشان دهیم.
کد منبع این پروژه موجود است اینجا روی Github.
(برچسبها به ترجمه)# python
منتشر شده در 1403-01-24 22:52:14