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

۱. مقدمه

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

۱.۱. نویسه‌خوان 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

نمایش می‌دهیم.
به مجموعه اطلاعات ماتریس تغییر حالت و حالت کنونی یک مدل گفته می‌شود که آن را با \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] که در بخش پیاده سازی بیشتر در مورد آنها بحث خواهد شد.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


۳. آزمایش ها

پس از یافتن یک دیدگاه اولیه از تئوری های استفاده شده برای پیاده سازی حال می‌توانیم آمایش ‌‌هایی بر اساس همین روش ها را پیاده سازی و نتایج آن را بررسی کنیم ( لینک مخزن گیتهاب پروژه ).

۳.۱. آماده سازی سیستم پیاده سازی

به منظور در دست داشتن یک ابزار قابل اعتماد از نظر کیفیت و سرعت در پیاده سازی مدل های مارکوف, از کتابخانه Hidden Markof Toolkit - HTK Speech Recognition System استفاده می‌کنیم. همانطور که در توضیحات قبل اشاره شد سیستم برای یادگیری مراحلی مشابه با تشخیص گفتار را طی می‌کند.
تمام مراحل ذکر شده در قست های بعدی در واقع مراحل یادگیری و آزمایش ذکر شده در کتاب مرجع HTK می‌باشند. با این تفاوت که ما سعی کرده‌ایم که در آن به جای داده های صوتی و بررسی آنها در قالب آوا ها, فایل های تصویری را به عنوان ورودی سیستم در نظر بگیریم و حروف آنرا برسی کنیم [7] .
به منظور تمرکز بر ارایه نتایج از پرداختن توضیحات جزیی در باره دستورات کتابخانه HTK در این پژوهش نامه پرهیز شده‌است و تنها به نام چندی از دستورات پر کاربرد بسنده کردیم. توضیحات کامل در این مورد درکتاب مرجع HTK ذکر شده‌است و مطالعه آنرا بر عهده خواننده می‌گذاریم.

مراحل انجام هریک از آزمایش ها به شرح ذیل است:

  • آماده سازی داده های آزمایش
    برای به دست آوردن حجم بسیار زیادی از داده های متقارن تصویری به همراه متن های صحیح مربوط به هریک از قابلیت های برچسب17 Canvas در HTML5 استفاده می‌کنیم. به این طریق می‌توانیم هر تعداد فایل متنی موجود را به نوشته فارسی در قالب عکس (‌با اندازه و قلم های متفاوت ) تبدیل و ذخیره کنیم. در طی آزمایش های اولیه بیشتر تصاویر تولید شده شامل اسم های فارسی ایجاد شده توسط کتابخانه های Faker یا متن های جمع آوری شده از سرتیتر های سایت های خبری می‌باشد.


  • تبدیل تصاویر به فرمت های مجاز
    در مرحله قبل به منظور سهولت و سرعت در تولید تصاویر آنها را با فرمت PNG ایجاد می‌نماییم. اما برای پردازش ساده تر در مراحل استخراج ویژگی ها باید آنها را به ساختاری انتقال دهیم که به صورت خودکار قابل پردازش باشند. بدین منظور از کتابخانه Netpbm (که یکی از قدیمی ترین ابزار های پردازش تصویر در محیط های یونیکس است) استفاده می‌کنیم. Netpbm ساختاری یکپارچه و انعطاف پذیر (و در عین حال بسیار سبک و کم حجم)‌ برای نمایش و پردازش تصاویر ایجاد می‌کند. به صورت کلی این کتابخانه ۳ فرمت اصلی برای تصویر دارد : Portable Bitmap - Portable Graymap - Portable Pixmap
    ما در طی این‌ازمایش تمام تصاویر را به نوع اول یعنی PBM تبدیل می‌کنیم. این فرمت تنها به نگه داشتن اطلاعات دودویی از تصویر بسنده می‌کند و با توجه به اینکه در مراحل بعدی نیز تنها تصاویر سیاه و سفید را مورد پردازش قرار می‌دهیم استفاده از این فرمت بسیار بهینه تر می‌باشد.

یک نمونه تصویر دودویی استفاده شده در آزمایش ها در فرمت PBM


  • استخراج ویژگی ها
    دستورات زیر برای استخراج ویژگی ها به ترتیب استفاده می‌شوند. همانطور که اشاره شد این مراحل کاملا بر پایه Netpbm صورت می‌گیرد و دلیل اصلی سازگار کردن تصاویر با این کتابخانه سهولت این مرحله بود.

    pnmdepth 255 $f |     # Change to grey Level
    pgmmedian |           # Smooth the image
    pgmslope|             # Perform "Slope" correction
    pgmslant -M M |       # Perform "Slant" correction using Std. Desv.
    pgmnormsize -c 5 |    # Perform size normalization
    pgmtextfea -c $DIM  > /tmp/tmp.fea    # Compute feature extraction     
    pfl2htk /tmp/tmp.fea $DDEST/${d/pbm/fea} # Convert to HTK format
    

در دستورات فوق متغییر $f تعداد پنجره های استفاده شده برای استخراج ویژگی های هر عکس می‌باشد. (در آزمایش های ما این مقدار ۲۰ قرار داده شده)

یک نمونه از ویژگی های استخراج شده از داده های یادگیری


  • ایجاد مدل اولیه 18 حروف
    همانگونه که در توضیحات بخش قبل ذکر شد در ابتدای فرآیند برای هر کاراکتر یک مدل یکسان ایجاد می‌شود که در فاز یادگیری به تدریج مدل ها از یکدیگر تمایز پیدا می‌کنند و هریک نشانگر یک حرف خاص خواهد بود. در این بخش تعریف مدل بر اساس ساختار استاندارد شده در کتابخانه HTK صورت می‌گیرد که در آن به هر حرف یک مدل سمت راستی 19 تخصیص می‌شود که در آن ۸ وضعیت یکسان تعریف شده که احتمال انتقال از هر وضعیت به وضعیت بعدی .۴ و وضعیت اکنون .۶ در نظر گرفته می‌شود. این مدل به صورت یک فایل متنی ذخیره می‌شود.
    علاوه بر آن با پردازش همه جمله های تعریف شده به عنوان داده یادگیری یک فایل از لیست تمام حروف قابل تشخیص سیستم ایجاد می‌شود.
    انجام این مرحله پیاده سازی چالش ۱ توضیح داده شده در بخش مقدمه می‌باشد.


  • ایجاد لیست های یادگیری
    به منظور خودکار کردن رویه یادگیری لیستی از تصاویر پردازش شده در قالب ویژگی ها ایجاد می‌کنیم و عمل یادگیری را روی تمام عناصر این لیست انجام می‌دهیم. در آزمایش های ما این لیست شامل کل داده های ورودی می‌باشد. علاوه بر آن برای آزمایش نتایج ۱۰ لیست ۱۰۰ تایی به صورت تصادفی از میان داده های ورودی انتخاب شده و عمل تشخیص 20 روی آنها صورت می‌گیرد و میانگین نهایی آنها مورد بحث قرار داده می‌شود. این روش به منظور حذف ضریب تصادفی بودن نتیجه در آزمایش و اطمینان از صحیح بودن ضریب خطای نهایی می‌باشد.


  • ایجاد فایل های مرجع برای یادگیری و تشخیص
    فایل مرجع یادگیری ایجاد شده به منظور داشتن یک منبع صحیح از حروف به کار رفته در هر کلمه است. در همه بخش های بعدی این فایل ها به عنوان یک داده صحیح از کلمه نوشته شده در یک عکس ( چه در زمان یادگیری و چه در زمان تشخیص) استفاده می‌کنیم. شایان ذکر است که مانند مرحله تعریف مدل های مارکوف برای کلمه, در این محله نیز ساختار فایل های ایجاد شده مطابق کتابخانه HTK می‌باشد.
    تنها تفاوت اصلی در فایل مرجع آموزش و فایل مرجع تشخیص این است که در فایل استفاده شده در بخش آموزش جمله ها تا مرز حروف تجزیه شده‌اند و در بخش تشخیص جملات تا مرز یک کلمه تجزیه می‌شود.

    sample.mlf # فایل مرجع یادگیری
    \*/train_122.lab 
    پ
    ر
    س
    ت
    و
    @ 
    م
    ط
    ه
    ر
    ی
    .
    SampleRef.mlf # فایل مرجع تشخیص 
    پرستو 
    مطهری 
    .

مطابق قرارداد های HTK حرف . به عنوان نشانه پایان یک جمله و حرف @ به عنوان یک آوای خالی ( سکوت ) شناخته می‌شود که در آزمایش های ما از آن برای نشان دادن یک فاصله 21 استفاده می‌شود.


  • یادگیری

    پارامتر های اصلی یادگیری اولیه

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

  • مدل خام حروف

  • لیست یادگیری

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


  • ایجاد مدل های زبانی
    همانطور که در بلوک دیاگرام سیستم کلی اشاره شد, به منطور ایجاد نتایج بهتر از یک مدل زبانی وسیع به عنوان یکی از ورودی های بخش تشخیص استفاده می‌شود. در برخی آزمایش های انجام شده با توجه به نوع داده ورودی استفاده شده سعی شده که کامل ترین نوع مدل زبانی موجود مورد استفاده قرار گیرد.
    مثلا در آزمایش های صورت گرفته بر روی جمله های خبری هر جمله ای که یک یا چند کلمه از آن به عنوان یک تصویر یادگیری برگزیده می‌شود, به صورت کامل در فایل مدل زبانی ذخیره میگردد.
    نتیجه نهایی این مدل زبانی دو فایل با نام های Network و Dictionary می‌باشد که در آنها یک مدل مرتبه ۲ 22 از کلمه های استفاده شده ذخیره می‌گردد.


  • تشخیص

    مراحل تشخیص یک جمله

    بلوک دیاگرام فوق در کتاب مرجع HTK مجموعه اطلاعات و بخش هایی که در نهایت موجب تشخیص یک ورودی سیستم می‌شوند را نشان می‌دهد. همانطور که مشاهده می‌شود مدل های زبانی ایجاد شده, مدل های حروف به همراه یک فایل مجهول به عنوان ورودی در نظر گرفته می‌شوند و توسط دستور HVite ( که نام آن برگفته شده از الگوریتم Viterbi است ) پردازش شده و توسط دستور HResult آنالیز شده و درصد خطای آن بدست می‌آید.
    انجام این مرحله پیاده سازی چالش ۳ توضیح داده شده در بخش مقدمه می‌باشد.


۳.۲. آزمایش اول : یادگیری اسامی فارسی

در یک آزمایش اولیه نام های فارسی ایجاد شده توسط کتابخانه های Faker را به عنوان ورودی سیستم در نظر می‌گیریم.
نتیج بدست آمده به شرح زیر است:
درصد های اعلام شده در جدول نتیجه میانگین حاصله از ۱۰ مرتبه اجرای عمل تشخیص روی ۱۰۰ داده ورودی به صورت تصادفی می‌باشد.

قلم - اندازه تعداد داده صحت کلمه صحت جمله
میترا ۴۲ ۵۰۰ ۸۰.۷۵٪ ۷۷٪
میترا ۴۲ ۱٬۰۰۰ ۴۹.۱۳٪ ۴۰.۱٪
میترا ۱۰۲ ۱٬۵۰۰ ۴۱.۴۱٪ ۳۴٪
میترا ۱۴۲ ۲۵٬۰۰۰ ۷.۳۹٪ ۱.۲۱٪

۳.۳. آزمایش دوم : یادگیری از آرشیو های خبری

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

قلم - اندازه تعداد داده حداکثر تعداد طول جمله صحت کلمه صحت جمله
میترا ۴۲ ۱٬۵۰۰ ۳ ۵۱.۰۶٪ ۵۲.۰۰٪
میترا ۴۲ ۵٬۰۰۰ ۳ ۱۹.۲۱٪ ۱۸.۲۰٪
میترا ۴۲ ۱۳٬۰۰۰ ۳ ۷.۱۸٪ ۸.۰۰٪
میترا ۴۲ ۲۵٬۰۰۰ نامحدود ۱.۹۶٪ ۱.۱۲٪
میترا ۴۲ * ۳۵٬۰۰۰ ۳ ۶.۹۶٪ ۴.۸۷٪

۳.۴. نتایج اولیه برگرفته شده از آزمون ها

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

  • افت ضریب صحت کلمات با افزایش تعداد داده ها اصلی ترین مشکل سیستم اکنون است که می‌تواند دلایل مختلفی داشته باشد. تعداد داده های آزمایش شده بیشتر شده, اما نه تا حدی که به دقیق تر شدن بیشتر سیستم کمکی بکند. برای مثال در یک آزمایش با ۵۰۰ نام به عنوان ورودی تعداد حالت های موجود بسیار محدود است و میزان یادگیری نیز برای برای آن کفایت می‌کند. اما در یک آزمایش با ۵۰۰۰ داده ورودی تعداد حالات و کلمه های ممکن با ضریب بسیار زیادی رشد پیدا می‌کند (این تفاوت مخصوصاً در داده های خبری که میزان تنوع لغت در آنها بیشتر است مشهود است) در حالی که ۱۰ برابر شدن داده ها با ضریب کمتری باعث بهبود یادگیری مدل ها می‌شوند.

  • استفاده شدن از مدل های زبانی ضعیف نیز می‌توان از دلایل کاهش دقت سیستم با گسترده تر شدن زبان باشد. در آزمایش های فوق برای تولید مدل زبانی از منبع مستقل استفاده نشده و به مجموع کل متن های ورودی سیستم برای تولید Bigram بسنده شده است. مثلا در آزمایشی با ۵۰۰ جمله ۳ حرفی از داده های خبری تنها همین ۵٬۰۰۰ جمله به عنوان مرجع زبان استفاده شده‌اند. تنها در آزمایش آخر پایگاه های خبری که با علامت * مشخص شده است از یک مبع مستقل شامل بیش از ۵۰٬۰۰۰ جمله کامل خبری استفاده شده است که تاثیر مثبت آن نیز قابل مشاهده است. (‌هرچند با وجود آن نیز دقت بسیار پایین است)

  • در تمام آزمایش ها از یک رویه ثابت برای استخراج ویژگی‌ها استفاده شده است. با وجود بهره گیری این رویه از روش های پیشنهاد شده در منابع شاید ایجاد تغییر در آنها بتواند موجب عملکرد سیستم گردد.

  • تنوع قلم ها و اندازه ها به حدی بوده‌است که نشان دهد حداقل در این مرحله از پروژه نمی‌تواند تاثیر بسزایی ( مثلا رساندن یک نمونه آزمایش با دقت زیر ۵۰٪ به یک دقت مطلوب بالای ۷۰٪) در بهبود سیستم داشته باشد.

  • پارامتر های بسیاری زیادی را میتوان در مراحل انجام شده تغییر داد که تمام حالت های آنها ممکن است به نتیجه بهتر منجر شود. (‌انجام این تغییرات بعد مطالعه بیشتر و در فاز بهبود آزمایش میشود )

۳.۵. قدم های بعدی پیش‌رو برای بهبود سیستم

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

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

  • استفاده از یادگیری مجدد مدل زبانی: یک روش دیگر برای بهبود میتواند تکرار عمل یادگیری و به‌روزرسانی پارامتر های مدل حروف و مدل های زبانی باشد. در فاز بهبود تلاش خواهد شد که با اجرای یک رَویه خودکار سیستم تشخیص به صورت مکرر فراخوانی شود و تا زمان رسیدن به نتیجه درست برای هر نمونه مجددا آموزش داده شود و مدل زبانی مربوطه را نیز به‌روزرسانی کند.

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

۵. مراجع

[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
[7]Documentation for HTK

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

  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. Character Modeling

  16. Pattern Matching

  17. Tag

  18. Prototype

  19. Left to Right HMM

  20. Recognition

  21. Space

  22. Bigram Language Model

تایید شده

با تشکر از زحمات فراوان شما در این پروژه که مشهود می باشد ، نکات زیر به نظرم می آید:
1- قسمت « یکپارچه سازی 1 » به عنوان پاورقی باید تعریف شود.
2- عکس های متعددی در پروژه شما قرار گرفته که بعضی از آنها سایز بزرگی دارد و در نوشته شما زیادی نمایان است.پیشنهاد می کنم تا سایز آنها را کوچکتر کنید تا نوشته های قسمت های بعدی بهتر نمایان شوند .
3- از نکات مثبت و بارز پروژه شما، استفاده از لینک های متعدد می باشد که به فهم پروژه شما کمک می کند.
4- قسمت چالش ها مخصوصا چالش های زبان فارسی به خوبی بیان شده است.
5- قسمت مقدمه به صورت کلی به خوبی بسط داده شده است.
6- مدل مارکوف به خوبی قابل فهم میباشد.
7- متاسفانه بعد از توضیح مدل مارکوف نحوه استفاده از مدل در نویسه خوان فارسی توضیح داده نشده است.
8- در توضیح پیاده سازی تنها به نام بردن اسم لایبرری اکتفا شده است.
9- قسمت استخراج ویژگی ها توضیح دقیق ندارد در حالی که مهمترین قسمت بوده و تقریبا بعد از این مرحله نویسه تشخیص داده خواهد شد.


  1. Binarization

تایید شده

سلام،خسته نباشید میگم. موضوع‌تان یک موضوع جالب و کاربردی هست که حتی خود منم تا حالا به چنین نرم‌افزاری نیازمند شدم. چندتا نکته میگم که امیدوارم مفید واقع بشود.

  • چیزی که خیلی تو چشم میزند استفاده از کاراکتر «,» در متن نگارشتون هست، به نظرم بهتره از ، استفاده کنید.

  • طبقه‌بندی مطالبتون خیلی خوبه و خیلی به من واسه فهم پروژه‌تون کمک کرد.

  • اینکه واسه لینک‌های مختلف واسه مطالعه بیشتر گذاشتید یکی از نقاط قوت پروژتون محسوب می‌شود که در پروژه‌های دیگه کمتر دیده میشه.

  • بهتر بود در گیت‌هاب چندتا عکس به عنوان تست و example هم قرار میدادید.

  • جا داشت ویژگی‌ها که به نظر من تأثیرگذارترین بخش روی نتیجه است را بیشتر توضیح میدادید.

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

تایید شده

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

تایید شده

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