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

۱. مقدمه

در این بخش برای توصیف پروژه و ایجاد درک صحیح از آن برای خواننده به پاسخ دادن به چند سوال میپردازیم

۱.۱. نویسه خوان 1 چیست ؟‌

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

۱.۲. چگونه به یک ماشین خواندن متن را بیاموزیم , ارتباط نویسه خوانی و هوش مصنوعی ؟

معقوله فراگیری نویسه خوانی در ماشین آغاز گر طرز فکر بسیار جالبی در باره دنیای کامپیوتر میباشد ( یا حداقل برای شخص من بوده :) ) .
اگر یک تصویر از حرف فارسی " گ " را - فارغ از خوش خط یا بد خط بودن نویسنده - درمقابل ما بگیرند و از ما بخواهد که تشخیص دهیم که این حرف کدامیک از حروف مجموعه الفبای فارسی است , پاسخ به آن برای ما - انسان ها - بسیار آسان خواهد بود ُ اما ُ
اگر عبارت ۲۳۷۴ × ۷۴۵ را در مقابل ما قرار دهند و پاسخ آن را از ما بخواهند - با فرض اینکه یک نابغه ذاتی نیستیم - برای محاسبه آن احتمالا به زمان قابل توجهی و یک قلم و کاعذ نیاز خواهید داشت .
فرض کنیم یک ماشین در مقابل همین ۲ پرسش قرار گیرد . محاسبه ۲۳۷۴ × ۷۴۵ برای یک ماشین یک سوال بسیار آسان است در حالی که برای یک انسان بسیار زمان بر است . و در عین حال فهمیدن و تشخیص حرف " گ " برای یک ماشین ( موجودیتی که تنها صفر و یک میفهمد ! ) و تنها میتواند یک درک داده ای سطح پایین از یک تصویر بر اساس رنگ های پیکسل هایش داشته باشد یک کار بسیار بسیار دشوار است !
تفاوت اصلی در نوع حل مساله در انسان ها و ماشین ها است . ماشین ها توانایی بسیار زیادی در محاسبه دارند اما انسان ها توانایی بسیار بالایی در یادگیری .
نکته دیگری که از این مقایسه قابل برداشت است این است که یک انسان در نهایت میتواند حاصل ۲۳۷۴ × ۷۴۵ را محاسبه کند اما آیا یک مایشن هم تنها با تکیه بر قابلیت های محاسبه ای خود میتواند یک نوشته را بخواند ؟ جواب این سوال بله است , اما نه آن دست بله هایی که بتوانیم به تحقق آن امیدوار باشیم !
واقعیت این است نوشتن یک الگوریتم برای انجام عمل خواندن متن و تشخیص صحیح تک تک کاراکتر های آن , حداقل تا به امروز برای ما به عنوان برنامه ریز های ماشین ها امکان پذیر نبوده .
علاوه بر این موضوع , باید توجه داشت که توانایی یاد گرفتن عامل اصلی برتری انسان بر ماشین - حداقل تا زمان معاصر - میباشد و همین موضوع , یعنی قابلیت یادگیری انسان موجب شده که بتواند یک ضرب بسیار سخت را - شاید در زمان بیشتر - انجام دهد ُ‌ اما یک کامپیوتر در یک زمان معقول نتواند به تنهایی یک حرف را تشخیص دهد .
و در نهایت بحث بهبود نتیجه نیز ارزش تفکر کردن را دارد ! انسان میتواند با تمرین و یادگیری زمان محاسبه ضرب را کاهش دهد و دقت خود را بالا ببرد اما یک ماشین ُ مانند ساختار صفر و یکی اش , نهایتا یا میتواند یک حرف را در یک زمان عملی 2 تشخیص دهد یا نمیتواند !
نتیجه کلی مقایسه بالا این کلیّت را در بر دارد که برای حل برخی دسته ای از مسایل پیچیده از کامپیوتر باید به دنبال دسته ای کلی از الگوریتم ها باشیم که به کامپیوتر توانایی یادگیری آن مساله را ببخشد , نه توانایی صرفا حل آنرا , دقیقا مشابه مغز انسان .
این دسته از الگوریتم ها به الگوریتم های هوش مصنویی معروف هستند .

۱.۳. کاربرد های نویسه خوان چیست ؟

نویسه خوان میتواند کاربرد های بسیاری داشته باشد ,
تصور کنید متن جالبی را در یک روزنامه مشاهده میکنید و میخواهید آنرا برای دوستتان بفرستید , معمولا همه ما با عکس برداری از آن صفحه این کار را انجام میدهیم , اما آیا بهتر نبود اگر میتوانستیم با تلفن هوشمند خود از آن عکس بگیریم و نرم افزاری متن آنرا تشخیص میداد و برای ما تولید میکرد ؟ قطعا در این صورت دست ما باز تر میبود :)‌
یا فرض کنید مقدار زیادی کار تحقیقاتی و محاسبه در کاغذ انجام داده اید و میخواهید آنرا تبدیل به یک سند معتبر کنید , قطعا ناچار هستید زمان زیادی را برای تایپ دوباره آن صرف کنید !
علاوه بر آن در زمینه های مهم تری نیز نویسه خوان کاربر دارد , خواندن شماره پلاک خودرو ها در دوربین های کنترل سرعت , امکان پردازش چک بانکی در دستگاه های خودپرداز , یا تولید نسخه بک آپ از اسناد مهم کتابخانه ها و ادارات به صورت دیجیتال , همه میتوانند کاربرد های بسیار مهم یک نویسه خوان دقیق باشند .
امروزه در بسیاری از ادارات و سازمان های دولتی , افراد زیادی ساعت های زیادی را به وارد کردن اطلاعات فرم هایی که با دست پر شده اند به کامپیوتر صرف میکنند و با در اختیار داشتن یک نرم افزار نویسه خوان میتوانن در زمان و نیروی انسانی بسیاری صرفه جویی نمود .

۱.۴. مقایسه نویسه خوان در زبان فارسی با دیگر زبان ها

این واقعیت بسیار سخت وجود دارد که فرآیند ایجاد یک سیستم هوشمند برای تشخیص زبان فارسی بسیار دشوار تر از زبانی مثل انگلیسی میباشد ( باید با این موضوع کنار بیاییم ! )‌ . این سختی فقط مختص زبان فارسی نیست , تمام زبان های سرهم نوشته شده 3 درجه سختی بسیار بیشتری نسبت به زبان هایی که خطوط آنها گسسته و جدا از هم است دارد .
دلیل این سختی مضاعف در قسمت های بعدی به طور کامل تر شرح خواهد داده شد , اما با یک نگاه ساده هم میتوان تصور کرد یک ماشین برای فهم حرف ' ه ' فارسی نیاز به یادگیری چندین شکل مختلف ان ( ابتدا , میانه و انتها )‌ دارد , علاوه بر آن با مشاهده یک کلمه انگلیسی , فرآیند قطعه قطعه سازی 4 که دلیل بسیاری از اشتباهات در سیستم های نویسه خوان است , در آن آسان تر صورت میگیرد آما در یک کلمه فارسی جایگاه هر حرف و تشخیص آن خود یک مساله بسیار پیچیده است.

۱.۵. ابزار های موجود متن باز

  1. موتور Tesseract
    موتور نویسه خوان Tessearct اولین نویسه خوان موجود در دنیای متن باز بوده . هم اکنون هم تمام سورس کد آن در گیتهاب قابل مشاهده است . توسعه آن از دهه ۸۰ میلادی آغاز شده و تا امروز نیز ادامه داشته است . این موتور قابلیت یادگیری بیش از ۴۰ زبان دنیا از جمله عربی را دارد و علاوه بر آن هسته اصلی بسیاری از ابزار های وابسته نیز مباشد.

    1. موتور OCRopy

  2. این موتور جدید تر از Tesseract میباشد و محوه پیاده سازی آن نیز کمتر از Tesseract وابسته به زبان است . علاوه بر آن ساختار آن نیز تنها وابسته به تصویر یک نوشته نیست و در پیاده سازی آن از علاوه بر تحلیل شکل کلمه , به بررسی لغوی آن نیز پرداخته میشود.

    OCRopus is an OCR system that combines pluggable layout analysis, pluggable character recognition, and pluggable language modeling. It aims primarily for high-volume document conversion, namely for Google Book Search, but also for desktop and office use or for vision impaired people.

    با رجوع به صفحات ویکی این پروژه در مخزن گیتهاب در میبابیم که بخش تشخصی حرف ها 5 در این موتور بر پایه موتور Tesseract نوشته شده است و مدل زبان و تحلیلگر قالب دو بعد جدید پردازش در این موتور میباشند که موجب بهبود نتایج آن برای داده های نا منظم تر و زبان های سر هم شده است.
    توضیحات بیشتر در باره بازخورد ها و بازدهی این موتور های چند زبانه برای زبان فارسی در بخش های بعدی گفته خواهد شد.

۱.۶. ابزار های فارسی

با جستوجوی صفحات وب , میتوان بلافاصله دریافت که نویسه خوانی به زبان فارسی از نظر پیشرفت , فاصله زیادی با معادل های خود در زبان های دیگر دارد .
واضح است که این فرآیند برای تنها تشخیص اعداد و حروف یکه فارسی در سامانه دوربین های کنترل ترافیک با موفقیت پیاده سازی شده است اما فقدان یک ابزار متن باز برای گسترش استفاده های نویسه خوان در ابعاد مختلف احساس میشود.
همچنین ابزار های فارسی نویسه خوان با استفاده محدود و به صورت تجاری در حال حاضر وجود دارند اما علاوه بر گرانی بسیار با رجوع به صفحات وب و نوشته های درج شده در توصیف نتایح کاربران این محصولات نمیتوان از صحت و جامعیت کاربرد های این محصولات اطمینان کامل داشت. برای مثال میتوان به مقاله سایت یک پزشک در باره نویسه خوان فارسی آراکس شاره کرد .

یکی از ابزار های فارسی نویسه خوانی که نمیتوان از اشاره کردن به آن چشم پوشی نمود نیز رابط فارسی یادگیری موتور Tesseract میباشد که به عنوان یک پروژه متن باز در گیتهاب موجود میباشد و در بازه زمانی کوتاه در آن تلاش شد که با ایجاد یک محیط مخصوص زبان فارسی , موتور Tesseract آموزش داده شود . با وحود گذشتن مدت زیاد از پایان توسعه این پروژه کماکان میتوان از آن به عنوان جدی ترین تلاش ایجاد نویسه خوان فارسی متن باز نام برد.


۲. کارهای مرتبط

میخواهیم به بررسی روش های مختلف ایجاد یک نویسه خوان بپردازیم و نتایج ثبت شده در مقالات را مقایسه کنیم . در این قسمت در تمامی مراجع ارجاعی اولویت با مقالاتیست که برای نویسه خوان های مستقل از زبان نگارش شده اند .

۲.۱. نویسه خوانی بر پایه تشخیص مسیر 6

موتور Tesseract یک نمونه از موتور هایی میباشد که بر این اساس ایجاد شده . در این رویه تاکید اصلی سیستم بر قطعه قطعه سازی نوشته و تشخیص کاراکتر ها بر اساس شکل آنها میباشد . این روش نیازمند آن است که رویه قطعه قطعه سازی برای هر زبان جدید صورت گیرد . علاوه بر این همانطور که در بخش مقدمه گفته شد غلبه بر چالش هاش زبان های سر هم نیز مانع بزرگی به شمار می آیند . ( با ذکر این نکته که این مشکل تنها در زبان های فارسی , عربی یا هندی که ساختار به هم پیوسته دارند رخ نمی دهد , در بسیاری از زبان ها مانند انگلیسی هم بسیاری از افراد کلمات خاصی را به صورا به هم پیوسته مینویسند . یا در بسیاری از اسناد چاپی به مرور زمان به دلیل پخش شدن جوهر در کاغذ کلمات به هم متصل میشوند و قطعه قطعه سازی آنها سخت تر میشود )
در یک نگاه اولیه میتوان به این موضوع فکر کرد که شاید بتوان با قدرت بخشیدن به الگوریتم های قطعه قطعه سازی میتوان بر این مشکل غلبه کرد اما به دلیل محدود بودن توان ما در این زمینه ( این واقعیت که عملا نمیتوان این فرایند را به صورت ایده آل انجام داد ) زمان یادگیری سیستم بسیار بالا میرود و در حالت بدتر شاید سیستم هرگز به درستی آموزش دیده نشود . در نتیجه طبیعتا به این فکر میکنیم اگر راهکاری متفاوت با وابستگی کمتر به قطعه قطعه سازی نوشته و زبان در دسترس است , آنرا نیز بررسی کنیم . این کار در بخش بعدی صورت میگیرد .

نمونه ای از نحوه یادگیری کلمات به وسیله Tessearct پس از قطعه قطعه سازی

۲.۲. یک روش بهتر : شبیه سازی نویسه خوان مشابه سیستم تشخیص گفتار 7

ایده اولیه این رویه از سیستم های تشخیص گفتار ناشی میشود . در یک سیستم تشخیص گفتار , برنامه باید بتواند صدای گوینده را دریافت کند و متنی که وی گفته را تولید کند . با وجود ظاهر متفاوت , میتوان نشان داد که این دو مساله در ظاهر بسیار شبیه به هم هستند [1] .
در یک سیستم تشخیص صدا , یک سیگنال صوتی وابسته به زمان ( نمودار آن شامل دو بردارد شدت صوت و زمان است ) ورودی سیستم است [5] . موضوع اصلی و مورد علاقه ما رابطه وابستگی زمانی بین سیگنال های ورودی سیستم میباشد ( به طور دقیق تر وابستگی هر ورودی به ورودی قبل ) . با فرض اینکه مدل کامل فرکانس های آوا ها را در اختیار داریم ( از نقطه نظر نویسه خوان به آن مدل کلمه گفته میشود - در بخش توضیخات مدل مارکوف توضیخات بیشتری در این زمینه ذکر شده است ) برای دریافت کلمه " سلام " ابتدای آوای " س " را پردازش میکنیم و سپس همین آوا به تدریح به " سَ " تبدیل میشود , سپس " ل " در ادامه آن تشخیص داده میشود و ... و علاوه بر ترتیب , برآیند نهایی این آوا ها در کنار هم سیستم را به سمت جواب میبرد !
دقت به این روند باعث میشود دریبایم که در تشخیص صدا , روند پردازش کاملا متفاوت از روش قبلی توضیح داده شده میباشد و ورودی ها در قالب یک دنباله در سیستم مورد پردازش قرار میگیرند , و این دقیقا اتفاقیست که اگر بتوانیم آنرا در نویسه خوان مدل کنیم , مشکل قطعه قطعه سازی دیگر بر سر راه ما نخواهد بود !
میتوان سیستمی را در نظر گرفت که در آن ورودی به جای یک سیگنال صوتی یک بردارد از خصوصیت های مستقل از زبان وابسته به یک قاب از یک خط از نوشته باشد . در مورد این بردار از خصوصیت های مستقل از زبان در بخش های بعد توضیحاتی ارایه خواهد شد .

مقایسه یک سیگنال صوتی و یک قاب از یک خط دست نوشته در زمان پردازش

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

۲.۳. مدل پنهان مارکوف

حال که فهمیدیم یک راه حل مناسب برای رهایی از مشکلات عدیده نویسه خوان های بر پایه مسیر , شبیه سازی آن با مدل های پیوسته ای است که در سیستم های تشخیص گفتار به کار میروند , باید توضیحات بیشتری در مورد نحوه کار آنها به دست آوریم .
مدل های مارکوف برای شبیه سازی اتفاقات تصادفی به کار میروند , با این شرط که سیستم داری نوعی خاصیت بی حافظگی میباشد و در هر لحظه وضعیت سیستم تنها به وضعیت اکنون سیستم بستگی دارد و نه وضعیت های قبلی . میتوان در قالب نظریه احتمال این مساله را اینگونه بیان کرد که احتمال هر رخداد در زمان t+1 تنها به احتمال رخداد آن در زمان t وابسطه است و از احتمال های زمان 0 تا t-1 مستقل است .
به این ساده سازی فرض مارکوف 9 نیز گفته میشود .
زمانی که در یک سیستم احتمال رخداد یک پدیده در آینده را تنها به زمان حال ( یک واحد زمانی قبل ) وابسطه بدانیم به آن مدل مارکوف مرتبه یک گفته میشود , اگر پدیده ای را به n حالت قبل وابسته در نظر بگیریم به آن مدل مارکوف مرتبه n گفته میشود .

مدل مارکوف در قالب نظریه احتمال

با در نظر گرفتن این ساده سازی میتوان هر دنباله از پدیده ها را به صورت یک گراف از احتمال های تغییر حالت بین وضعیت های سیستم نمایش داد که به آن نمایش گرافی یک مدل مارکوف میگویند .

یک مدل مارکوف با ۵ وضعیت

توضیحات بسیاری در باره مدل های مارکوف میتوان بیان کرد , در این بخش ما تنها در آن حدی از آن که مربوط به این پروژه میشود را توضیح میدهیم . لازم به ذکر است که کتابخانه هایی برای پیاده سازی این مدل موجود میباشند و در ظاهر به نظر آید که توضیح سطح پایین و ریاضی این مدل فایده چندانی نداشته باشد , اما تجربه شخصی من این بوده همیشه فهم یک سوال و یا سیستم از پایه , به مراتب بهتر است و نتایج دقیق تری را به همراه خواهد داشت .

۲.۴. جزییات و مثالی از مدل پنهان مارکوف

برای فهم مدل های مارکوف به صورت کامل , این موضوع را با مثال مطرح میکنیم :
فرض کنید که در شهری خاص قرار داریم و در میانه هر روز وضعیت آب و هوا را مشاهده میکنیم و برا اساس آن یه وضعیت 10 را به این روز نسبت میدهیم .
فرض میکنیم که وضعیت های آب و هوایی به صورت زیر مشخص میشوند :

S_1 = Rainy , S_2 = Cloudy , S_3 = Sunny

همچنین فرض کنید ماتریسی در اختیار داریم که در آن احتمال رفتن از یک حالت به حالت های دیگر مشخص شده است :
یک نمونه از ماتریس تغییر حالت در مدل مارکوف

این ماتریس از مولفه های اصلی این مدل میباشد که به آن ماتریس تغییر حالت 11 گفته میشود . توجه شود که این یک ماتریس توضیع احتمال است و جمع هر سطر و ستون آن باید ۱ باشد .
همچین وضعیت سیستم در زمان t را نیز با

State at Time t = q_t

نمایش میدهیم .
با این فرض که به مجموعه اطلاعات ماتریس تغییر حالت و حالت کنونی یک مدل گفته میشود کi آن را با \lambda نمایش میدهیم , برای تشریح بهتر کارکرد این مدل میخواهیم به پاسخ پرسش زیر بپردازیم :‌

  • چه احتمالی وجود دارد که با دانستن یک مدل

    \lambda = { A , q_0 }

    وضعیت های آینده به شرح زیر باشند :
    O = { S_1 , S_1 , S_1 , S_2 , S_3 , S_2 , S_1 }

    به دنباله نشان داده شده با O دنباله مشاهدات 12 گفته میشود .
    این مساله را در قالب ریاضی زیر میتوان شرح داد :
    P( O | \lambda ) = \pi_{1} + a_{11} + a_{11} + a_{12} + a_{23} + a_{32} + a_{21}

    نماد \pi به معنی وضعیت آغازین سیستم است و آنرا به صورا زیر تعریف میکنیم :‌
    \pi_{i} = P(q_1 = S_i)

    به طور مشابه میتوان به پرسش های جالب دیگری هم با استفاده از همین مدل پاسخ داد :‌

  • چه احتمالی وجود دارد که برای d روز پیاپی در یک وضعیت باقی بمانیم؟

  • چه احتمالی وجود دارد پس پس از یک روز آفتابی , ۳ روز پیاپی باران ببارد؟‌

  • چه احتمالی وجود دارد پس برای یک هفته بارش برف نداشته باشیم؟

ذکر این نکته مهم است که در انتخاب تعداد حالات این مدل مارکوف , حداقل حالات یا ساده ترین شکل ممکن در نظر گرفته شده است . برای مثال در صورتی که این دانش را داشته باشیم که احتمال بارش باران پس از یک روز بارانی دیگر متفاوت از دیگر احتمال بارش باران پس از یک روز آفتابی است ( توجه کنید که در مدل های مارکوف مرتبه n وابستگی به n وضعیت قبلی مجاز است و در نظر گرفته میشود ) واضح است که تعداد حالت های مدل و ابعاد ماتریس تغییر حالت بیشتر خواهد شد .

برای تشریح کامل مدل پنهان مارکوف لازم است که اجزای 13 آنرا بشناسیم .

  1. تعداد حالت ها که با N نمایش داده میشود .

  2. تعداد حالت های مشاهدات در هر وضعیت که دریافت میشود ( در مثال قبل ۳ حالت مشاهده در هر وضعیت داشتیم - برفی , بارانی و آفتابی ) . تعداد این مشاهدات با M و دنباله آن با V = { v_1 , v_2 , ... , V_M } نمایش داده میشود . توجه شود که این دنباله لزوما با تعداد حالات برابر نیست و در این مثال به دلیل توضیح داده شده در بخش قبلی ( یک حالت به ازای هر وضعیت آب و هوایی ) تعداد ها یکسان میباشد .

  3. ماتریس احتمال تغییر حالت که با نماد A , a_{i} نمایش داده میشود . هر عضو در سطر i و ستون j به معنی احتمال رفتن از وضعیت i به وضعیت j میباشد.

  4. احتمال مشاهدات متفاوت در هر ورودی . احتمال اینکه در وضعیت i مشاهده k ام جزو مشاهدات دریافتی باشد با نماد زیر نمایش داده میشود :

    B = b_i(k) = P( v_k | q_t = s_i )

  5. وضعیت اولیه سیستم که در طی مثال نیز توضیح داده شد . احتمال اینکه سیستم با وضعیت i آغاز گردد به صورت زیر نمایش داده میشود :

    \pi_{i} = P(q_1 = S_i)

با داشتن این اطلاعات اولیه به بررسی سه چالش اصلی در یک مدل مارکوف میپردازیم :

  • به در اختیار داشتن یک مدل \lambda = ( A , B , \pi ) ُ‌ با مشاهده یک ورودی خاص O = { o_1 , o_2 , .. , 0_m} چگونه به صورت بهینه احتمال رخداد این ورودی با فرض این مدل را محاسبه کنیم ؟

    P ( O | \lambda ) = ?

  • با فرض یک دنباله ورودی O = { o_1 , o_2 , .. , 0_m} و یک مدل \lambda چگونه یک دنبال از وضعیت ها را ( Q = { q_1 , 1_2 , .. } ) انتخاب بکنیم که به بهترین نحو ورودی سیستم رو توجیه کنند .

  • چگونه یک مدل با پارامتر های فوق را تشکیل دهیم .

قبل از فکر کردن و درگیر کردن ذهن با روش های حل هریک از چالش فوق ُ لازم است که برای واضح شدن اهمیت آنها , ربط هریک از مراحل با رویه تشخیص یک نوشته در این پروژه را توضیح دهیم [6] :‌
به مثال اصلی که مارا به مدل های پنهان مارکوف سوق داد بازمیگردیم ! یک سیستم تشخیص گفتار :
فرض کنید که به ازای هر کلمه w در الفبای سیستم W یک مدل با N وضعیت تشکیل میدهیم . سیگنال های ورودی سیستم به صورت بردار های فرکانسی برچسب گذاری شده بر اساس زمان نشان داده میشوند .
اولین قدم ایجاد مدل کلمات ُ‌ و پیش بینی اولیه پارامتر های آن است . این کار دقیقا برابر با چالش ۳ میباشد .
در مرحله بعد لازم است که به وسیله یک مجموعه اطلاعات صحیح اولیه برای آموزش سیستم , وضعیت های مدل را تغییر دهیم و پرامتر های آن را بهبود ببخشیم . این بخش باعث میشود که در میان وضعیت های یک مدل ( که خود نشان دهنده یک کلمه است ) دنباله صحیح وضعیت را پیدا کنیم . شاید لازم باشد یک بار دیگر تکرار بکنیم که تا این مرحله به چه چیزی رسیده ایم :
ما برای هریک از کلمات ورودی سیستم یک مدل با تعداد حالات مشابه در نظر گرفتیم . هر یک از این مدل ها ( که در واقع قبل از آموزش دیدن و اجرای این مرحله کاملا مشابه هم هستند ) در یک وضعیت آغازین قرار دارند و با مشاهده دنباله ای از بردار های ورودی به وضعیت های متقاوت میروند . پس لازم است که هر مدل برای شناسایی یک کلمه آموزش دیده شود یا به عبارت دیگر , با مشاهده دنباله حالت هایی که مدل به آن به ازای یک ورودی خاص میرود , پارامتر هایش را به گونه ای تغییر میدهد که برای حالت های نزدیک به این ورودی نیز بتواند آنرا تشخیص دهد . این کار با تکرار مکرر چالش ۲ انجام میگیرد . سیستم با مشاهده یک ورودی آموزشی دنباله وضعیت هایی را که با این ورودی بیشترین همخوانی را دارند (‌ این ورودی را توجیه میکنند )‌ تشخیص داده و خود را با توجه به آن اصلاح میکند . این مرحله شامل رویه استخراج ویژگی ها 14 که یکی از همه ترین بخش های این پروژه می باشد نیز هست که در فاز پیاده سازی با جزییات بیشتر در مورد آن توضیحاتی داده خواهد شد .
و بالاخره ! هدف نهایی ما : اینکه پس از آموزش دیدن یک مدل توسط ورودی های اولیه , با مشاهده یک ورودی بتوانیم احتمال وجود این ورودی در یک مدل را بدست آوریم و نهایتا تشخیص دهیم که کدامیک از مدل ها بیشترین شانس را برای توجیه این ورودی دارد . این کار در چالش ۱ انجام میگیرد .

بدست آورد روشی بهنیه برای رفع هریک از این چالش ها روش های مخصوصی دارد [6] که در بخش پیاده سازی بیشتر در مورد آنها بحث خواهد شد .

۲.۵. ساختار یک نویسه خوان بر اساس مدل پنهان مارکوف

حال که بسیاری از فواید مدل های مارکوف , استفاده از آنها در سیستم های تشخیص گفتار و ربط آن با سیستم نویسه خوان را بررسی کردیم , میتوانیم به بررسی ساختار یک نویسه خوان بر پایه نظریات مطرح شده برسیم !
در این بخش چکیده ای از معماری یک نویسه خوان با الگو از سیستم تشخیص گفتار بیان میگردد . قبل از آغاز کار لازم به ذکر است که با توجه به گستردگی چالش های رَویه تشخیص یک نوشته در عکس , این پروژه تنها به بُعد تشخیص می پردازد و توضیخات این بخش و پیاده سازی نیز مربوط به همین بُعد خواهند بود .
برای درک بهتر این موضوع خط لوله اصلی رویه تبدیل یک نوشته به متن را میتوان در شکل زیر مشاهده کرد .

مراحل تبدیل عکس به نوشته

  • یکپارچه سازی 15 : شامل تبدیل عکس رنگی به یک تصویر کاملا سیاه و سفید به منظور افزایش درک سیستم از هر پیکسل در عکس .

  • قطعه قطعه سازی :‌مطالب بسیاری در باره حذف این بخش در سیستم نویسه خوانی که آنرا در این مقاله شرح دادیم مطرح شد , اما نهایتا نباید فراموش کنیم که بخش تشخیص یک خط در متن کماکان یک چالش - قابل حل - در مسیر ما میباشد .

  • تشخیص : بخش اصلی سیستم که بر اساس آن بتواند متن نهایی را تولید کند .

۲.۵.۱. دیاگرام نویسه خوان نهایی

بدون مقدمه بیشتر , ابتدا سیستم نهایی رو مشاهده میکنیم و سپس اجزای آنرا بررسی میکنیم :

دیاگرام بلوکی یک نویسه خوان

به طور خلاصه میتوان در شکل مشاهده کرد که سیستم به دو بخش اصلی آموزش و تشخیص تفکیک شده است . هسته اصلی سیستم آموزش ( مدل سازی کاراکتر ها16 ) ابتدا توسط داده های آموزشی , پس از استخراج ویژگی ها , به بهبود پارامتر ها میپردازد . ( در مثال بخش قبل برای فهم بهتر و سادگی از یک کلمه به عنوان پایه مدل ها نام برده شد , در حالی که واضح است در این صورت میبایست بیشمار مدل برای کلمات ممکن داشت! )
همانطور که در بخش قبل به شباهت مدل ها قبل از آموزش دیدن اشاره شد , در این بخش هم این نکته قابل بیان شدن است که تجربه نشان داده متفاوت گرفتن تعداد حالات برای مدل های کاراکتر های مخالف ( مثلا کارکتر هایی که به نظر پیچیدگی بیشتری دارند تعداد حالات بیشتری داشته باشند ) عملا کارایی چندانی در بهبود عملکرد نهایی سیستم نخواهد داشت [4] .
علاوه بر مدل هایی که از ویژگی های ظاهری حروف استخراج میگردند , میتوان در یک سطح بالاتر ( سطح کلمات ) از مدل های زبانی نیز برای بهبود و تایید نتایج استفاده کرد ( البته میتوان از مدل های زبانی در سطح حروف نیز استفاده کرد اما انباشتگی بسیار زیاد اطلاعات آن عملا باعث ناکارامدی آن میشود ) . ساختار این مدل های زبانی بسیار مشابه کاری که نویسه خوان در سطح حروف اتجام میدهد است , تنها با این تفاوت که در سطح کلمات و ترتیب قرار گیری آنها در پی یکدیگر , احتمال صحت یک دنباله بررسی میشود . ( از بررسی جزییات کارکرد این بخش به دلیل عدم ارتباط با پروژه اصلی پرهیز میشود )

تا این مرحله از موضیحات چندین بار از واژه استخراج ویژگی نام برده شد و حال که به بُعد پیاده سازی بسیار نزدیک هستیم بهترین فرصت میباشد که کمی بیشتر در مورد آنها توضیح دهیم .
در بخش قبل به چالشی اشاره کردیم که در طی آن باید راهی برای بهبود پارمتر های مدل خود پیدا میکردیم . مشخصاً این کار امکان پذیر نیست مگر آنکه راهی برای تبدیل یک مشاهد سیستم به یک مجموعه از پارامتر های قابل فهم برای سیستم , داشته باشیم . این پارامتر های قابل فهم همان ویژگی های یک قاب از ورودی ( که معادل یک مشاهده - V_i - میباشد ) است . برای مثال میتوان در هر قاب ویژگی های زیر را استخراج کرد :

  1. میزان غلظت پیکسل های سیاه و سفید

  2. مشتق طولی از بردار غلظت

  3. مشتق عرضی از بردار غلظت

پس هر بردارد از ویژگی ها نهایتا بیانگر یک مشاهده خواهد بود و حال میتوان متوجه شد که به چه دلیل هم در بخش آموزش و هم در بخش تشخیص سیستم نتیجه بخش استخراج ویژگی ها به پردازشگر اصلی منتقل میکند .
بحث در مورد اینکه کدام ویژگی ها برای دریافت بهترین نتایج مناسب تر هستند میتواند یکی از کار های اصلی بخش پیاده سازی باشد ( ویژگی های فوق در مراجع [1] به عوان یک سری از ویژگی های لازم و حداقل مطرح شده اند)‌

برای جمع بندی نهایی معماری کلی نویسه خوان , یک بار دیگر مراحل اصلی عکس فوق را با مقدمات ریاضی مطرح شده در بخش قبل از مدل های مارکوف تطابق میدهیم :
سیستم ابتدا بر اساس پردازش تصویری از قاب های پیاپی از ورودی و استخراج ویژگی های آنها یک دنباله از ورودی های آموزشی V_i را مهیا کرده . بخش ایجاد کننده مدل های کاراکتر ها ( چالش ۳ ) برای هر کاراکتر یک مدل خام ایجاد کرده و با مشاهده ورودی های مخالف با طرز نوشتن های متفاوت و .. شروع به بهبود پارامتر مدل برای تشخیص بهتر این کاراکتر میکند .
و در نهایت سیستم در زمان تشخیص و آزمایش نهایی بار دیگر دنباله مشاهدات ورودی را با همان روشی که بر طبق آن آموزش دیده است تبدیل به یک بردار ویژگی میکند و با مقایسه میزان شباهت آن با مدل های مختلف متن نهایی را تولید میکند .

۲.۵.۲. آیا نتیجه بهتری میگیریم ؟

پس از بیان تمام این مقدمات بیایید با هم یکبار دیگر چند پرسش بسیار ساده تر را پاسخ دهیم :
چرا نویسه خوان خود را بر اساس مقدمات فوق پیاده سازی کنیم ؟ آیا روش بهتری وجود ندارد ؟ یا اصلا چرا از صفر اینکار را انجام میدهیم ؟ ایا شانسی برای یادگیری ابزار های موجود متن باز حال حاضر برای زبان فارسی وجود ندارد ؟‌
با جستجویی در وب میتوانیم بسیاری از روش های دیگر برای پیاده سازی نویسه خوان را پیدا کنیم :

  • پیاده سازی بر اساس الگوریتم های تطابق مسیر ( روشی که ترکیب آن با شبکه عصبی پایه Tesseract است ) 17

  • پیاده سازی با ابزارهای متلب

  • پیاده سازی بر اساس شبکه های عصبی (‌ روشی که Ocropy بر پایه آن نوشته شده - لینک )

همان طور که در بخش های اولیه توضیح داده شد , هریک از روش های زیر به دلایل متفاوت (‌که اصلی ترین آنها وابستگی زیاد به تشخیص حروف در زبان هایی با نوشتار گسسته است ) راه حل مناسب و امید بخشی به حساب نمی آیند , در حالی که روش ارایه شده بر پایه تشخیص گفتار - حداقل در ظاهر و بر پایه مقالات نگارش شده در این زمینه - بسیار امیدوار کننده تر میباشد و در در مقالاتی که نتایج برخی آزمایش هایشان را منتشر کرده اند ,مشاهده میکنیم که برای زبان عربی (‌که در یک مرتبه مشابه سختی با زبان فارسی قرار دارد ) به ضریب خطای کمتر از ۱٪ هم بدست آمده است [1] .

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

۳. کارهای آینده

  • تشریح بیشتر روش های حل ۳ چالش اساسی مدل های مارکوف

  • پیاده سازی این مدل و تحقیق و آزمایش در مورد بهینه ترین بردار ویژگی ها

  • ایجاد ابزار های تولید کننده دادهگان آموزشی برای سیستم

۴. مراجع

[1] A Robust, Language-Independent OCR System . Zhidong Lu, Issam Bazzi, Andras Kornai, John Makhoul,
Premkumar Natarajan, and Richard SchwartBBN Technologies, GTE Internetworking, Cambridge, MA 02138
[2] Post Processing of Optically Recognized Text via Second Order Hidden Markov Model . Srijana Poudel , University of Nevada, Las Vegas
[3] Optical Character Recognition - A Combined ANN/HMM Approach , Sheikh Faisal Rashid Thesis
[4] The Optical Character Recognition for Cursive Script Using HMM: A Review . Saeeda Naz, Arif I. Umar, Syed H. Shirazi
[5] The 1994 BBN/BYBLOS Speech Recognition System, Nguyen, T. Anastasakos, F. Kubala, C. LaPre, J. Makhoul, R. Schwartz, N. Yuan, G. Zavaliagkos, and Y. Zhao
[6] A tutorial on hidden Markov models and selected applications in speech recognition

۵. لینک های مفید

  1. کتابخانه یادگیری ماشین به همراه آموزش برای زبان پایتون

  2. کتابخانه پیادی سازی مدل پنهان مارکوف در زبان پایتون


  1. Optical Character recognition

  2. Feasable

  3. Curved script language

  4. Segmentation

  5. Charachter Recognition

  6. Path Recognition

  7. Speech recognition

  8. Hidden Markov Model

  9. Markov Assumption

  10. State

  11. State Transition Metrice

  12. Observation

  13. Element

  14. Featur Extraction

  15. Binarization

  16. Character Modeling

  17. Pattern Matching

تایید شده

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