آموزش الکترونیکآموزش پردازش تصویر

پردازش تصویر حروف انگلیسی OCR با رزبری پای و OpenCV

توانایی ماشین ها در استفاده از دوربین برای دیدن دنیای واقعی و تفسیر داده های حاصل از آن ، تأثیر بیشتری بر کاربرد آن ها می گذارد. چه ربات های تحویل غذا چه ماشین های پیشرفته تسلا همه با توجه به شرایط محیط و اطلاعات بدست آمده توسط دوربین ها عملیات های مختلف انجام میدهند. در این آموزش می آموزیم چگونه حروف و کلمات انگلیسی را در تصاویر مشخص کنیم. به این کار تشخیص نوری کاراکتری یا همان OCR گفته میشود.

در بسیاری از پروژه ها، ممکن است بخواهید اطلاعات دوربین را پردازش کنید مثلا مششخصات کارت ویزیت را بخوانید یا تابلو های روی جاده را تشخیص دهید و … برخی از شما ممکن است این ویژگی را با لنز های گوگل تجربه کرده باشید. بنابراین امروز ما با استفاده از ابزار تشخیص نوری کاراکتری (OCR) از Google Tesseract-OCR Engine به همراه پایتون و OpenCV، با استفاده از رزبری پای چیزی مشابه را میسازیم.

رزبری پای به عنوان یک وسیله کم مصرف و قابل حمل، در بسیاری از پروژه های پردازش تصویر مانند تشخیص چهره، سیستم امنیتی خانه، ردیابی اشیا و… مورد استفاده قرار میگیرد.

پیش نیازها

همانطور که قبلاً گفته شد ، ما از کتابخانه OpenCV برای شناسایی حرف ها استفاده خواهیم کرد. بنابراین حتما قبل از ادامه این آموزش ، آموزش نصب OpenCV روی رزبری پای را بخوانید. همچنین Pi خود را با آداپتور 2A تغذیه کرده و برای رفع اشکال راحت تر آن را به یک مانیتور صفحه نمایش وصل کنید.

در صورتی که علاقمند به یادگیری پردازش تصویر هستید ، در نحوه عملکرد OpenCV دقیقاً توضیح داده نمی شود ، بنابراین پیشنهاد میشود مطالب قسمت آموزش پردازش تصویر را نیز بخوانید.

نصب Tesseract در رزبری پای

برای انجام تشخیص نوری کاراکتر در Raspberry Pi ، باید موتور OCR Tesseract را روی رزبری پای نصب کنیم. برای این کار ابتدا باید بسته بندی Debian (dpkg) را تنظیم کنیم که به ما در نصب Tesseract OCR کمک می کند. برای پیکربندی Debian Package از دستور زیر در پنجره ترمینال استفاده کنید.

sudo dpkg - -configure –a

سپس می توانیم با استفاده از دستور زیر Tesseract OC را نصب کنیم.

sudo apt-get install tesseract-ocr

پنجره ترمینال شما چیزی شبیه به زیر خواهد بود ، 5-10 دقیقه طول می کشد تا نصب کامل شود.

نصب Tesseract در رزبری پای

اکنون که Tesseract OCR را نصب کرده ایم ، باید بسته PyTesseract را با استفاده از بسته نصب pip نصب کنیم. Pytesseract نوعی بسته بندی پایتون در موتور OCR tesseract است که به ما کمک می کند تا از پایتون  استفاده کنیم. برای نصب pytesseract روی python ، دستور زیر را دنبال کنید.

Pip install pytesseract

قبل از شروع این مرحله مطمئن شوید که pillow از قبل نصب شده است. افرادی که آموزش شناسایی چهره با رزبری پای را خوانده اند ، قبلا آنرا نصب کرده اند. سایرین می توانند از آن آموزش استفاده کرده و هم اکنون آن را نصب کنند. پس از اتمام نصب pytesseract ، پنجره چیزی شبیه به این می شود.

آموزش نصب pytesseract

Tesseract 4.0 در ویندوز / اوبونتو

پروژه تشخیص کاراکتر نوری Tesseract ابتدا در سال 1980 توسط هیولت پاکارد آغاز شد و سپس توسط گوگل تصویب شد که این پروژه را تا به امروز حفظ می کند. در طول سالها Tesseract تکامل یافته است و در محیط های کنترل شده خوب کار می کند.

آخرین نسخه tesseract ، یعنی Tesseract 4.0 از یک مدل Deep Learning برای تشخیص کاراکتر ها و حتی دست نوشته ها استفاده می کند. Tesseract 4.0 برای بهبود دقت موتور OCR خود از حافظه کوتاه مدت بلند (LSTM) و شبکه عصبی مکرر (RNN) استفاده می کند. در این زمان آموزش Tesseract 4.0 فقط برای ویندوز و اوبونتو در دسترس است ، و برای Raspberry Pi هنوز در مرحله بتا است. بنابراین تصمیم گرفتیم Tesseract 4.0 را در ویندوز و Tesseract 3.04 در Raspberry Pi استفاده کنیم.

حتما ببینید :  تست برد آردوینو (آموزش تعمیر خرابی سوختن آردوینو)

پروژه تشخیص کلمات ساده با رزبری پای

از آنجا که ما قبلاً بسته های Tesseract OCR و Pytesseract را در رزبری پای خود نصب کرده ایم. ما می توانیم به سرعت یک برنامه کوچک بنویسیم تا بررسی کنیم که چگونه شناسایی کاراکتر یک تصویر کار می کند. تصویر آزمایشی که من استفاده کردم ، برنامه و نتیجه را می توانید در زیر مشاهده کنید.

اگر در مورد این مطلب سوالی داشتید در انتهای صفحه در قسمت نظرات بپرسید.

پروژه تشخیص کلمات ساده با رزبری پای

همانطور که می بینید این برنامه بسیار ساده است و ما حتی از هیچ بسته OpenCV استفاده نکردیم. برنامه فوق در زیر آورده شده است :

from PIL import Image
img =Image.open (‘1.png’)
text = pytesseract.image_to_string(img, config=’’)
print (text)

در برنامه فوق سعی داریم متن را از تصویری با نام 1.png که در همان دایرکتوری برنامه قرار دارد ، بخوانیم. از بسته Pillow برای باز کردن این تصویر و ذخیره آن در زیر نام متغیر img استفاده می شود. سپس از روش image_to_sting از بسته pytesseract برای تشخیص متن از تصویر استفاده می کنیم و آن را به عنوان رشته در متن متغیر ذخیره می کنیم. سرانجام برای بررسی نتایج مقدار متن را چاپ می کنیم.

همانطور که می بینید تصویر اصلی در واقع حاوی متن Explain that Stuff! 01234567890است که یک عکس تست کامل است زیرا حروف الفبا ، نماد ها و اعداد را در تصویر داریم. اما خروجی ما از pi این است: “Explain that stuff! Sdfiosiefoewufv” این بدان معنی است که در شناسایی شماره های تصویر موفق نیست. برای رفع این مشکل ، افراد معمولاً از OpenCV برای حذف نویز از برنامه استفاده می کنند و سپس موتور Tesseract OCR را بر اساس تصویر پیکربندی می کنند تا نتایج بهتری کسب کنند. اما به یاد داشته باشید که از Tesseract OCR Python هم نمی توان انتظار خروجی 100٪ مطمئن داشت.

پیکربندی Tesseract OCR برای نتایج بهتر پردازش تصویر

Pytesseract به ما امکان پیکربندی موتور Tesseract OCR را می دهد که نحوه جستجوی تصویر را برای کاراکترها تغییر می دهد. سه پرچم اصلی که در پیکربندی OCR Tesseract مورد استفاده قرار می گیرد زبان (-l) ، حالت موتور OCR (--oem) و حالت صفحه بندی بخش بندی (- -psm) است.

در کنار زبان پیش فرض انگلیسی ، Tesseract از بسیاری از زبان های دیگر از جمله هندی ، ترکی ، فرانسوی و … پشتیبانی می کند. ما فقط در اینجا از انگلیسی استفاده خواهیم کرد ، اما می توانید داده های دیگر را از صفحه رسمی github بارگیری کنید و آن را به بسته خود اضافه کنید تا سایر زبان ها را پردازش کنید. همچنین می توان دو یا چند زبان مختلف را از یک تصویر تشخیص داد. زبان با پرچم –l تنظیم شده است ، مثلا برای تنظیم زبان انگلیسی، پرچم –l eng خواند بود.

پرچم بعدی حالت OCR Engine Mode است که دارای چهار حالت مختلف است. هر حالت از الگوریتم متفاوتی برای شناسایی حرف های تصویر استفاده می کند. و به طور پیش فرض از الگوریتمی که با بسته نصب شده استفاده می کند. اما ما می توانیم آن را تغییر دهیم تا از شبکه های LSTM یا Neural استفاده کنیم. چهار حالت مختلف موتور در زیر نشان داده شده است. مثلا برای استفاده از پرچم 1 ، به راحتی از -- oem 1 استفاده کنید.

تنظیم OCR Engine Mode

پرچم نهایی و مهم ترین پرچم حالت تقسیم بندی صفحه است. این موارد زمانی بسیار مفید هستند که تصویر شما جزئیات پس زمینه زیادی به همراه کاراکترها داشته باشد یا کاراکترها با جهت و اندازه متفاوت نوشته شوند. 14 حالت تقسیم صفحه مختلف وجود دارد ، همه آنها در زیر ذکر شده اند. مثلا برای تنظیم پرچم در حالت 11، باید –psm 11را وارد کنیم.

آموزش تشخیص حروف در رزبری پای

استفاده از oem و psm در Tesseract برای نتیجه بهتر

بگذارید بررسی کنیم که این حالت های پیکربندی تا چه اندازه موثر هستند. در تصویر زیر سعی میکنیم کاراکترها را در یک تابلو محدودیت سرعت که می گوید “SPEED LIMIT 35” بشناسید. همانطور که مشاهده میکنید عدد 35 نسبت به حروف بزرگتر است بنابراین در اینجا فقط SPEED LIMIT تشخیص داده شده است.

حتما ببینید :  کاربرد آردوینو در صنعت (ساخت PLC با برد صنعتی آردوینو)

استفاده از oem و psm در Tesseract برای نتیجه بهتر

برای رفع این مشکل ، می توانیم پرچم های پیکربندی را تنظیم کنیم. در برنامه فوق پرچم پیکربندی خالی است (config=’’) ، اکنون اجازه دهید ما آن را با استفاده از جزئیات ذکر شده در بالا تنظیم کنیم. تمام متن های موجود در تصویر به زبان انگلیسی است بنابراین پرچم زبان –l eng است ، موتور OCR به صورت پیشفرص در حالت 3 است و این را تغییر نمیدهیم. حالا در حالت psm ، باید کاراکتر های بیشتری از تصویر پیدا کنیم بنابراین ما از حالت 11 در اینجا استفاده می کنیم. خط پیکربندی نهایی میشود :

test = pytesseract.image_to_string(gray, config='-l eng --oem 3 --psm 12')

و نتیجه را می توان در تصویر زیر مشاهده کرد. همانطور که می بینید اکنون Tesseract قادر به یافتن تمامی کاراکتر های تصویر از جمله اعداد است.

تشخیص کاراکتر های انگلیسی در تصاویر با OpenCV

بهبود دقت و اطمینان در پردازش تصویر

یکی دیگر از ویژگیهای جالب که در Tesseract موجود است روش image_to_data است. این روش می تواند جزئیاتی از قبیل موقعیت کاراکتر در تصویر ، سطح اطمینان از تشخیص ، خط و شماره صفحه را به ما بدهد. بیایید سعی کنیم از این نمونه در تصویر نمونه استفاده کنیم.

بهبود دقت و اطمینان در پردازش تصویر

در این مثال خاص ، اطلاعات نویز زیادی را به همراه اطلاعات اصلی دریافت می کنیم. تصویر نام بیمارستان “Fortis Hospital” را نشان میدهد. اما در کنار نام ، تصویر دارای جزئیات پس زمینه دیگری مانند ساختمان آرم و … نیز می باشد. بنابراین Tesseract سعی می کند همه چیز را به متن تبدیل کند و موارد بیهورده ای مانند “$ C” “|” “S _______ S == +” و … تشخیص داده میشود.

اکنون در این موارد روش image_to_data مفید است. همانطور که در اینجا مشاهده می کنید ، الگوریتم تشخیص کاراکتر نوری فوق ، سطح اطمینان هر شخصیتی را که به رسمیت شناخته است برمی گرداند و سطح اطمینان Fortis 64 است و برای HOSPITAL 24 است. برای سایر اطلاعات بیهوده مقدار اطمینان 10 یا پایین تر است. بنابراین میتوانیم تشخیص هایی با سطح اطمینان زیر 10 را حذف کنیم.

تشخیص حروف با OCR در رزبری پای

اگرچه نتایج حاصل از رزبری پای در هنگام استفاده از Tesseract چندان رضایت بخش نیستند، اما می توانیم از OpenCV استفاده کنیم تا تصویر نویز کمی داشته باشد و همچنین از روش های دیگر پیکربندی استفاده کنیم تا نتیجه قابل قبول و قابل اطمینان داشته باشیم.

ما در حال حاضر 7 تصویر مختلف را با استفاده از tesseract روی رزبری پای امتحان کردیم و سعی کردیم با استفاده از حالت های مناسب نتایج نزدیک را بدست آوریم. حالا بیایید یک تابلو ساده را با استفاده از این روش پردازش کنیم.

import pytesseract
from PIL import Image
import cv2

img = cv2.imread('4.png',cv2.IMREAD_COLOR) #باز کردن تصویر
#img = cv2.resize(img, (620,480) ) #تغییر اندازه تصویر

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) #تبدیل تصویر به سیاه و سفید
gray = cv2.bilateralFilter(gray, 11, 17, 17) #تار کردن برای جلوگیری از نویز

original = pytesseract.image_to_string(gray, config='')
#test = (pytesseract.image_to_data(gray, lang=None, config='', nice=0) ) #تنظیم سطح اطمینان
#print(pytesseract.image_to_boxes(gray))

print (original)

این برنامه فایلی را باز می کند که از آن باید کاراکتر ها را بشناسیم و سپس آن را به مقیاس خاکستری تبدیل کنیم. این باعث می شود جزئیات بیهوده تصویر کاهش یابد و تشخیص Tesseract برای حروف آسان تر شود. برای کاهش نویز پس زمینه ، تصویر را با استفاده از یک فیلتر دو طرفه که یک روش از OpenCV است ، تار می کنیم. در آخر ما کاراکترهای موجود در تصویر را شناسایی می کنیم و آن ها را روی صفحه چاپ می کنیم. نتیجه نهایی چیزی شبیه به این خواهد بود.

تشخیص حروف با OCR در رزبری پای

امیدوارم که شما آموزش را درک کرده باشید و از یادگیری لذت ببرید. OCR در بسیاری از مکان ها مانند اتومبیل های دارای رانندگی خودکار ، تشخیص پلاک اتومبیل ، تشخیص ناوبری در خیابان و … مورد استفاده قرار می گیرد و استفاده از آن در رزبری پای باعث می شود تا امکانات بیشتری برای شما فراهم شود زیرا این دستگاه قابل حمل و جمع و جور است.

نظرتان را در مورد این مطلب با ستاره دادن اعلام کنید امیدوارم این مطلب برای شما مفید بوده باشد. نظرات ، مشکلات و پیشنهادات خود را در پایین صفحه اعلام کنید

محمد رحیمی

محمد رحیمی هستم. سعی میکنم در آیرنکس مطالب مفید را قرار دهم. (در خصوص سوال در مورد این مطلب از قسمت نظرات همین مطلب اقدام کنید)

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا