طبقه‌بندی ارقام دست‌نویس

تغییرات پروژه از تاریخ 1393/10/13 تا تاریخ 1393/11/14
هدف این پروژه طبقه‌بندی ارقام دستنویس به منظور تشخیص رقم مربوطه است. برای این منظور می‌توان از هریک از روش‌های طبقه‌بندی استفاده کرد. در این پروژه انتظار می‌رود چند روش برای طبقه‌بندی ارقام که به نظر مناسب‌تر هستند بررسی و مقایسه شوند. برای این منظور می‌توان از مجموعه دادگان فارسی و یا انگلیسی استفاده کنید.

# مقدمه
تعاملات انسانها از قدیم با روشهای مختلفی از جمله گفتار، نوشتار می باشد و با پیدایش فناوریهای جدید صفحه کلیدها و موبایل ها نیز باعث افزایش تعاملات شده اند و اما در سال های اخیر با پیشرفت فناوری، این ارتباطات به شیوه های نوین از جمله نوشتن بر روی صفحات لمسی رسیده است. تشخیص کاراکترها یا OCR یکی از نرم افزارهای موفق در حوزه شناسای خودکار الگوها است و تشخیص اعداد دست نوشته یکی از زیر بخش های جالب توجه و مهمی از تشخیص کاراکترهای می باشد که کاربردهای زیادی نیز همچون، دسته بندی نامه های پستی، خواندن خودکار مبالغ چک های بانکی، شناسایی خودکار اطلاعات ثبت شده در فرم ها، خواندن نوشته ها از روی صفحه های لمسی و خواندن اعداد از روی تصاویر دست نوشته می باشد. برای انجام تشخیص اعداد فارسی روش های متفاوتی وجود دارد از جمله استفاده از روش های آماری shadow coding، مدل مخفی مارکوف [1]، [2]SVM، نزدیک ترین همسایگی یا K-NN و یا روش های شبکه های عصبی، ژنتیک [3] و فازی را می توان نام برد که همه آنها در مسئله دقت و سرعت انجام کار از اهمیت ویژه ای برخوردار هستند در این راستا از روش هایی مانند PCA برای کاهش حجم داده مورد استفاده قرار می گیرد. از جمله نکات قابل تحقیق این است که از کجا معلوم اعداد موجود در یک عکس، دستنوشته و یا پرینت شده هستند [4]، در این راستا محقیق سعی به تفکیک این دو حالت دارند.همچنین، طرز نوشتن افرادی که در شهرهای مختلف هستند چقدر با هم متفاوت است؟ و نوشتار اعداد فارسی با زبان های دیگر مانند عربی و هندی چقدر با هم متفاوت هستند و چه تاثیری بر روی شناسایی الگو دارد [5]. حوزه دیگری که می تواند مورد اهمیت قرار بگیرد تشخیص درشت نویسی و یا مورب نویسی اعداد است که در زبان فارسی تقریباً کاری در این حوزه انجام نشده است.
![ شکل 1 نمایش اعداد فارسی](https://dl.dropboxusercontent.com/u/106369898/Pr-Pro_L/I1.jpg)
 شکل 1 نمایش اعداد فارسی
در زبان فارسی 13 نوع نمایش اعداد دستنویس وجود دارد. در شکل 1 نمونه ای از آنها نشان داده شده است. در این زبان اعداد صفر، چهار و شش هستند که به دو صورت نوشته می شوند [2]. پس باید برای آن 13 دسته ایجاد کرد و کار تشخیص را برای هر دسته انجام داد.
برای انجام تشخیص اعداد فارسی نیاز به پایگاه داده ای می باشد که مشتمل بر یک سری اعداد دست نوشته فارسی باشد. پایگاه های داده زیادی برای انجام این کار وجود دارد. که در جدول 1 یک مجموعه ای از پایگاه داده های معروف نشان داده شده است.
برای این منظور، در طی انجام تشخیص اعداد، ابتدا نویز های عکس ها را برطرف می کنند و بعد آن ها را نرمال سازی می کنند. یعنی، اندازه همه آنها را به یک اندازه خاص به عنوان مثال 64×64 تبدیل می کنند. بعد از آن با استفاده از یکی و یا ترکیبی از روش های مطرح، سعی به آموزش دادن و یا جمع آوری اطلاعات و تولید ویژگی برای حل مسئله می کنند. در نهایت، مدل آموزش دیده را با داده های آزمونی، مورد آزمون قرار می دهند تا بتوانند میزان دقت کار را بسنجند.

|نام پایگاه داده|dpi|نمونه های آزمایشی| نمونه های آزمونی| مجموعه نمونه ها|
|:-------:|:-------:|:-------:|:-------:|:-------:|
|CENPARMI|166|4000|2000|60000|
|CEDAR|300|18468|2711|21179|
|MNIST|Normalized into 20*20|7291|2007|9298|
جدول 1- مجموعه ای از پایگاه های داده های مهم

در ادامه این مقاله، با یک سری از روش های مطرح و طرز کار آنها تحت عنوان کارهای مرتبط توضیحاتی داده خواهد شد. آزمایشات و نتیجه آنها و مقایسه روش ها نیز به عنوان موضوع بعدی ارائه خواهد شد. در نهایت نیز نتیجه گیری از کار را خواهیم داشت. 
 
# کارهای مرتبط
همان طور که می دانید روش SVM یکی از روش های مطرح در حوزه شناسایی الگو می باشد. لذا، از این روش در شناسایی اعداد فارسی نیز استفاده شده است. چیزی که در اینجا مهم است ایده ای است که برای بدست آوردن ویژگی ها استفاده می شود. هدف اصلی این ویژگی ها این است که بتوان یک شی یا نمونه را به وسیله این ویژگی ها اندازه گیری کرد تا آنهایی که اندازه شان به هم نزدیک تر است بتواند در یک دسته قرار بگیرند. مقالات مختلف ایده های مختلفی را برای بدست آوردن ویژگی ها استفاده می کنند. برای نمونه روش مطرح شده در [2]، برای هر عددی که در عکس وجود دارد 4 دیدگاه مختلف تعریف می شود و از روی هر دیدگاه 16 ویژگی استخراج کرده است. بنابراین در کل برای هر عکس 64 ویژگی خواهد داشت. با این ویژگی ها یک SVM چندگانه آموزش داده می شود تا بتواند اعداد را با دقت 94.14% تشخیص دهد. 
این روش ابتدا عکس ها را بعد از برطرف کردن نویزها با استفاده از روش دورنیابی نزدیک ترین همسایگی به عکس های 64×64 تبدیل می کند تا عکس ها نرمال شوند. در مرحله بعد، دیدگاه های بالا، پائین، چپ و راست ایجاد می شود. می دانید که عکس مورد نظر یک عکس 64×64 است. ماتریس عکس نیز یک ماتریس 64×64 خواهد بود که ارزش رنگ در آن نوشته شده است. از این ماتریس 1/4 آن انتخاب می شود. یک ماتریس 16×16 را ایجاد می کند. از روی این ماتریس، از هر طرف، بالا، پائین، چپ و راست، تعداد خانه های سفید تا به مرز خانه سیاه برسد، شمارش می شود. پس نموداری مانند شکل 2 را تولید خواهد کرد که از اتصال تعداد نقاط سفید در هر جهت از عکس منحنی ایجاد کرده اند. اگر از روی این منحنی مشتق بگیرید شکل 3 را برای دیدگاه های بالا، پائین، چپ و راست ایجاد می کند. مقدارهای مشتق ویژگی های این مسئله می شود. حال 64 ویژگی استخراج شده را با 13 تا SVM برای هر عدد ایجاد می شود و نتیجه نهایی برای تشخیص عدد نیز بیشترین مقدار بین این 13 تا SVM خواهد بود. و نوشتار صورت گرفته است و با پیدایش فناوریهای جدید، همچون صفحه کلیدها و موبایل ها، میزان این تعاملات افزایش نیز یافته است. اما در سال های اخیر با پیشرفت فناوری، این ارتباطات به شیوه های نوینی همچون استفاده از صفحات لمسی نیز صورت می پذیرد. تشخیص کاراکترها یا OCR یکی از شیوه های موفق در حوزه شناسایی خودکار الگوها است. تشخیص اعداد دست نوشته یکی از زیر بخش های جالب توجه و مهم از تشخیص کاراکترها می باشد که کاربردهای زیادی همچون، دسته بندی نامه های پستی، خواندن خودکار مبالغ چک های بانکی، شناسایی خودکار اطلاعات ثبت شده در فرم ها، خواندن نوشته ها از روی صفحه های لمسی و خواندن اعداد از روی تصاویر دست نوشته دارد. برای تشخیص اعداد فارسی روش های متفاوتی وجود دارد که می توان به مواردی همچون استفاده از روش های آماری shadow coding، مدل مخفی مارکوف [1]، [2]SVM، نزدیک ترین همسایگی یا K-NN و یا روش های شبکه های عصبی، ژنتیک [3] و فازی اشاره نمود. دقت و سرعت انجام کار در تمامی این موارد از اهمیت ویژه ای برخوردار است که در این راستا از روش هایی مانند PCA برای کاهش حجم داده ها استفاده می شود. یکی از سوالات مهم در این زمینه، تشخیص دست نویس بودن و یا چاپی بودن اعداد است که در این زمینه پژوهشهای بسیاری برای تفکیک این دو حالت از یکدیگر انجام شده است [4]. نکته دیگر آنکه، طرز نوشتن (دستخط) افراد در شهرهای مختلف و همچنین نوشتار اعداد فارسی با زبان های دیگر مانند عربی و هندی با هم متفاوت است که در این زمینه نیز پژوهشهای بسیاری صورت گرفته است [5]. از زمینه های پژوهشی دیگر، می توان به تشخیص درشت نویسی و یا مورب نویسی اعداد فارسی نیز اشاره نمود که در زبان فارسی تقریباً کاری در این حوزه انجام نشده است.
![ شکل 1 نمایش اعداد فارسی](https://dl.dropboxusercontent.com/u/106369898/Pr-Pro_L/I1.jpg)
 شکل 1 نمایش اعداد فارسی [2]
در زبان فارسی 13 نوع نمایش اعداد دستنویس وجود دارد که شکل 1 نمونه ای از آنها را به تصویر کشیده است. از آنجا که اعداد صفر، چهار و شش در این زبان به دو صورت نوشته می شوند [2]. پس باید برای آن 13 دسته ایجاد کرد و کار تشخیص را برای هر دسته انجام داد.
برای تشخیص اعداد فارسی نیاز به پایگاه داده ای می باشد که مشتمل بر یک سری اعداد دست نوشته فارسی باشد. پایگاه های داده زیادی برای انجام این کار وجود دارد که جدول 1 مجموعه ای از موارد معروف در این زمینه را در بر گرفته است.
روند انجام کار بدین صورت است که برای تشخیص اعداد، ابتدا نویز های عکس ها را برطرف نموده و بعد آن ها را نرمال سازی می کنند. یعنی همه آنها را به یک اندازه خاص به عنوان مثال 64×64 تبدیل نموده و بعد با استفاده از یک و یا ترکیبی از روش های مطرح، سعی به آموزش دادن و یا جمع آوری اطلاعات و تولید ویژگی برای حل مسئله می کنند. در نهایت، مدل آموزش دیده را با داده های آزمونی، مورد سنجش قرار می دهند تا بتوانند میزان دقت کار را بدست آورند.

|نام پایگاه داده|dpi|نمونه های آزمایشی| نمونه های آزمونی| مجموعه نمونه ها|
|:-------:|:-------:|:-------:|:-------:|:-------:|
|CENPARMI|166|4000|2000|60000|
|CEDAR|300|18468|2711|21179|
|MNIST|Normalized into 20*20|7291|2007|9298|
جدول 1- مجموعه ای از پایگاه های داده های مهم  [6]

در ادامه این مقاله، ابتدا از یک سری از روش های مطرح و طرز کار آنها در قالب کارهای مرتبط توضیحاتی داده خواهد شد. آزمایشات انجام شده و نتایج بدست آمده، و همچنین مقایسه روش ها نیز در بخش های بعدی ارائه خواهند شد. در پایان نیز نتیجه گیری نهایی از کارهای انجام شده را ارائه خواهیم نمود. 
 
# کارهای مرتبط
همان طور که می دانید روش SVM یکی از روش های مطرح در حوزه شناسایی الگو می باشد که از این روش در شناسایی اعداد فارسی نیز استفاده شده است. نکته مهم در این روش، ایده ای است که برای بدست آوردن ویژگی ها استفاده می شود. هدف اصلی این ویژگی ها این است که بتوان یک شی یا نمونه را به وسیله آنها اندازه گیری کرد تا آنهایی که اندازه شان به هم نزدیک تر است بتوانند در یک دسته قرار بگیرند. مقالات مختلف، ایده های متفاوتی را برای بدست آوردن ویژگی ها به کار گرفته اند. برای نمونه روش مطرح شده در [2]، برای هر عددی که در عکس وجود دارد، 4 دیدگاه مختلف تعریف می نماید و از روی هر دیدگاه 16 ویژگی استخراج می کند که از این رو در کل برای هر عکس 64 ویژگی پدید خواهد آمد. با این ویژگی ها یک SVM چندگانه آموزش داده می شود تا بتواند اعداد را با دقت 94.14% تشخیص دهد. 
این روش ابتدا عکس ها را بعد از برطرف کردن نویزها با استفاده از روش **دورنیابی**  به نزدیک ترین همسایگی به عکس های 64×64 تبدیل می کند تا عکس ها نرمال شوند. در مرحله بعد، دیدگاه های بالا، پائین، چپ و راست ایجاد می شوند. از آنجا که عکس مورد نظر در ابعاد 64×64 است، ماتریس عکس نیز یک ماتریس 64×64 خواهد بود که ارزش رنگ در آن نوشته شده است. از این ماتریس، به میزان 1/4  که برابر با یک ماتریس 16×16 است، انتخاب می شود. از روی این ماتریس، از هر سو (بالا، پائین، چپ و راست) تعداد خانه های سفید تا رسیدن به مرز خانه سیاه، شمارش می شود. نتیجه تولید نموداری مانند شکل 2 است که  از اتصال تعداد نقاط سفید در هر جهت از عکس، منحنی ایجاد کرده اند. اگر از روی این منحنی مشتق گرفته شود، شکل 3 را برای دیدگاه های بالا، پائین، چپ و راست ایجاد می کند. در حقیقت مقادیر مشتق، ویژگی های این مسئله خواهند بود. **حال 64 ویژگی استخراج شده را برای آموزش به 13 تا SVM که 13 نوع اعداد را مشخص می کنند استفاده می شود و نتیجه نهایی برای تشخیص یک نمونه جدید نیز بیشترین مقدار بین این 13 تا SVM خواهد بود.** 

![ شکل 2 a: عکس اصلی، b: عکس نرمال شده، c-f: دیدگاه مختلف از بالا و پائین، چپ و راست](https://dl.dropboxusercontent.com/u/106369898/Pr-Pro_L/I2.jpg)
شکل 2 a: عکس اصلی، b: عکس نرمال شده، c-f: دیدگاه مختلف از بالا و پائین، چپ و راست [2]

![ شکل 3 نمودار های مشتق گرفته شده از منحنی های دیدگاه های مختلف شکل 2](https://dl.dropboxusercontent.com/u/106369898/Pr-Pro_L/I3.jpg)
شکل 3 نمودار های مشتق گرفته شده از منحنی های دیدگاه های مختلف شکل 2

حوزه دیگری که بسیار قابل رقابت با روش SVM است روش دیاگراف تکرار [^Frequency Diagram] می باشد. این روش نشان می دهد که چگالی رنگ مشکی در عکس به چه میزان است. این روش در [6] مورد بررسی قرار گرفته است. این مرجع، ابتدا عکس ها را به اندازه های 40×40 نرمال سازی می کند. بعد، ماتریس عکس های که برای مثال عدد 5 را مشخص می کنند را با هم رنگهای مشکی با هم جمع، همچنین رنگهای سفید را با هم جمع و رنگ سیاه را از سفید و یا سفید را از سیاه تفریق می کنند. در نهایت یک ساختاری که نشان دهنده ساختار عدد 5 باشد را ایجاد می کند. شکل 4 نشان دهنده این حالت می باشد که از مجموعه ای از عکس ها که برای عدد 5 هستند ایجاد شده است. همچنین، این کار را بر روی اعداد دیگر نیز اعمال می کنند و برای تشخیص از روش شباهت [^similarity] استفاده می کنند تا بتوانند یک عدد را تشخیص دهند. اگر بخواهید روش بدست آوردن دیاگرام تکرار را فرموله کنید می توانید از فرمول$D_i(x,y)=\frac{1}{N_i} \sum\limits_{n=0}^N_i (f_n(x,y)*2-1)*100$ که در آن $x,y = 0,…,39$ می باشد، استفاده کنید. همچنین فرمول تشابه نیز می تواند به صورت زیر باشد.
$$S_i=\sum\limits_{y=0}^{39}\sum\limits_{x=0}^{39} sgn[(F(x,y)*2-1)*D_i(x,y)]*|D_i(x,y)|$$
![ شکل 4 دیاگرام تکرار برای 300 نمونه از عدد 5، حالت سیاه و سفید آن نیز در سمت بالا سمت راست نشان داده شده است.](https://dl.dropboxusercontent.com/u/106369898/Pr-Pro_L/I4.jpg)
شکل 4 دیاگرام تکرار برای 300 نمونه از عدد 5، حالت سیاه و سفید آن نیز در سمت بالا سمت راست نشان داده شده است

همان طور که مشخص است، این روش ها نیاز دارند تا در لحظه انجام تشخیص، این الگو ها را تولید کنند و این می تواند یکی از معایب این روش باشد. لذا، همه این عملیات با حجم بسیار زیادی از داده های آموزشی باید در سیستم معمولی مانند یک موبایل و یا تبلت ها اجرا شود. این کار هزینه انجام کار را بالا خواهد برد. لذا سعی می شود تا با استفاده از روش های کاهش سایز آموزشی زمان انجام کار را بالا ببرند. 
برای کاهش سایز در پایگاه داده باید دو کار انجام شود. اول باید بٌعد را کاهش دهند و دوم باید سایز را کاهش دهند [7]. در کاهش بٌعد سعی می شود تا در ابتدا ویژگی هایی که اهمیت کمی دارند را شناسایی و از مجموعه ویژگی ها حذف کنند. برای انجام این کار از روش های مختلفی مانند PCA، EMG، random projection و ... استفاده می شود. همچنین، می توان برای این کار  با استفاده از روش های ترکیبی نتیجه بهتری گرفت. 
در کاهش سایز سعی می شود تا نمونه های آموزشی را کاهش دهند. اکثر نمونه ها دو گروه از نمونه های آموزشی را از مجموعه خود حذف می کنند. 1) نمونه هایی که خیلی از کلاس خود دور هستند. 2) نمونه هایی که خیلی به مرکز کلاس خود نزدیک هستند. برای انجام این کار از روش هایی مانند K-means و یا روش های مختلف داده کاوی استفاده می کنند تا نمونه ها را به چندین کلاس تقسیم کنند. در نهایت، در [7] با استفاده از روش کاهش سایز PCA توانسته برای روش دیاگرام تکرارها به دقت 97% برسد و اگر انجام نمی داد در زمانی دو برابر به دقت 97.7% می رسید. 
یکی از پر طرفدار ترین روش های تشخیص الگو و آموزش دادن به سیستم ها روش شبکه های عصبی است. برای نمونه [8] بعد از حذف نویز و نرمال سازی، عکس نرمال شده را به عکسی به ضخامت یک پیکسل تبدیل می کند و سعی می کند تا عکس نازک سازی شود و اسکلت تصویر مشخص شود، دوباره عکس مورد نظر را به سایز دو برابر تبدیل می کند. این عمل باعث می شود تا میزان کلفتی و نازکی پهنای دست نوشته تاثیری بر روی روش نداشته باشد. حال کل ماتریس عکس را به 16 خانه n*n تقسیم می کنند و از مقدار داخل آنها میانگین گرفته می شود. حاصل 16 عدد است که نشان دهنده ویژگی ها خواهد بود. با استفاده از روش شبکه های عصبی با وزن دهی به نرون ها و بایاس کردن مقدار اولیه و استفاده از تابع سیگموئید دو قطبی مانند تانژانت سیگموئید سعی به شناسایی اگو می کند و تا 97.2% دقت در شناسایی اعداد دارد. لازم به توضیح است که اگر از روش projection استفاده می شد به درصد دقت 99% می رسید [9]. البته اگر ویژگی ها با استفاده از روش ژنتیک استخراج می شد و با استفاده از روش های شبکه عصبی پرسپترون انجام می شد به دقت 98.1% می رسید [10]. 
یکی دیگر از ویژگی هایی که می توان در شناسایی اعداد از آن تاثیر گرفت، جهت حرکت قلم و یا جهت شکستگی ها می باشد. از این ویژگی بیشتر در حوزه های SVM، شبکه های عصبی [8] و مدل مخفی مارکوف [1] مورد استفاده قرار می گیر [2]

حوزه دیگری که بسیار قابل رقابت با روش SVM است روش دیاگرام تکرار [^Frequency Diagram] است. این روش نشان می دهد که چگالی رنگ مشکی در عکس به چه میزان است که در [6] مورد بررسی قرار گرفته است. این مرجع، ابتدا عکس ها را به اندازه های 40×40 نرمال سازی می کند. سپس، ماتریس عکس هایی را که عدد 5 را مشخص می کنند با هم رنگهای مشکی جمع، و همچنین رنگهای سفید را نیز با هم جمع می نماید و در ادامه رنگ سیاه را از سفید و یا سفید را از سیاه تفریق می کند. در نهایت ساختاری که نشان دهنده عدد 5 باشد را ایجاد می کند. شکل 4 نشان دهنده این حالت است که از مجموعه ای از عکس ها که متعلق به عدد 5 هستند ایجاد شده است. همچنین، این کار را بر روی اعداد دیگر نیز اعمال می کند و برای تشخیص از روش شباهت [^similarity] استفاده می شود تا بتوانند یک عدد را تشخیص دهند. اگر بخواهید روش بدست آوردن دیاگرام تکرار را فرموله کنید می توانید از فرمول $D_i(x,y)=\frac{1}{N_i} \sum_{n=0}^{N_i} (f_n(x,y)*2-1)*100$  که در آن $x,y = 0,…,39$ می باشد، استفاده کنید. همچنین فرمول تشابه نیز می تواند به صورت زیر باشد.
$$S_i=\sum\limits_{y=0}^{39}\sum\limits_{x=0}^{39} sgn[(F(x,y)*2-1)*D_i(x,y)]*|D_i(x,y)|$$
![ شکل 4 دیاگرام تکرار برای 300 نمونه از عدد 5، حالت سیاه و سفید آن نیز در سمت بالا سمت راست نشان داده شده است.](https://dl.dropboxusercontent.com/u/106369898/Pr-Pro_L/I4.jpg)
شکل 4 دیاگرام تکرار برای 300 نمونه از عدد 5، حالت سیاه و سفید آن نیز در سمت بالا سمت راست نشان داده شده است  [6]

همان طور که مشخص است، این روش ها نیاز دارند تا در زمان تشخیص، این الگو ها را تولید کنند و این می تواند یکی از معایب آنها باشد. لذا، همه این عملیات با حجم بسیار زیادی از داده های آموزشی باید در سیستم معمولی مانند یک موبایل و یا تبلت اجرا شود. این کار هزینه انجام کار را بالا خواهد برد که از این رو سعی می شود تا با استفاده از روش های کاهش سایز آموزشی، زمان انجام کار را پایین و سرعت انجام آن را بالا ببرند.
برای کاهش سایز در پایگاه داده باید دو کار انجام شود. اول باید بٌعد را کاهش دهند و دوم باید سایز را کاهش دهند [7]. در کاهش بٌعد سعی می شود تا در ابتدا ویژگی هایی که اهمیت کمی دارند را شناسایی و از مجموعه ویژگی ها حذف کنند. برای انجام این کار از روش های مختلفی مانند PCA، EMG، random projection و ... استفاده می شود. همچنین، انجام این کار  با استفاده از روش های ترکیبی نتیجه بهتری را در پی خواهد داشت. 
در کاهش سایز سعی می شود تا نمونه های آموزشی را کاهش دهند. اکثر روشها دو گروه از نمونه های آموزشی را از مجموعه خود حذف می کنند. 1) نمونه هایی که خیلی از کلاس خود دور هستند. 2) نمونه هایی که خیلی به مرکز کلاس خود نزدیک هستند. برای انجام این کار از روش هایی مانند K-means و یا روش های مختلف داده کاوی استفاده می کنند تا نمونه ها را به چندین کلاس تقسیم کنند. به عنوان یک مثال، در [7] و با استفاده از روش کاهش سایز PCA برای روش دیاگرام تکرارها به دقت 97% دست یافته شده است که در صورت عدم استفاده از کاهش سایز،این روش در زمانی دو برابر به دقت 97.7% می رسید. 
یکی از پر طرفدار ترین روش های تشخیص الگو و آموزش دادن به سیستم ها روش شبکه های عصبی است. برای نمونه [8] بعد از حذف نویز و نرمال سازی، عکس نرمال شده را به عکسی به ضخامت یک پیکسل تبدیل می کند و سعی می کند تا عکس نازک سازی شود و اسکلت تصویر مشخص شود، دوباره عکس مورد نظر را به سایز دو برابر تبدیل می کند. این عمل باعث می شود تا میزان کلفتی و نازکی پهنای دست نوشته تاثیری بر روی روش نداشته باشد. حال کل ماتریس عکس را به 16 خانه n*n تقسیم می کنند و از مقدار داخل آنها میانگین گرفته می شود. حاصل 16 عدد است که نشان دهنده ویژگی ها خواهند بود. با استفاده از روش شبکه های عصبی با وزن دهی به نرون ها و بایاس کردن مقدار اولیه و استفاده از تابع سیگموئید دو قطبی مانند تانژانت سیگموئید سعی به شناسایی الگو می کند که نتیجه، دقت 97.2% در شناسایی اعداد است. لازم به توضیح است که اگر از روش projection استفاده می شد به درصد دقت 99% می رسید [9]. البته اگر ویژگی ها با استفاده از روش ژنتیک استخراج می شدند و روش های شبکه عصبی پرسپترون بر آنها اعمال می شد،دقت 98.1% حاصل می گشت [10]. 
یکی دیگر از ویژگی هایی که می توان در شناسایی اعداد از آن تاثیر گرفت، جهت حرکت قلم و یا جهت شکستگی ها می باشد. از این ویژگی بیشتر در حوزه های SVM، شبکه های عصبی [8] و مدل مخفی مارکوف [1] استفاده  می شود. برای مشخص کردن جهت حرکت قلم ابتدا اسکلت عکس را استخراج می کنند. جهت قلم می تواند 4 سمت شمال، جنوب، شرق و غرب باشد. همچنین 4 جهت نیز با چرخش 45 درجه این جهت ها وجود خواهد داشت. اگر این جهت ها را در جهت چرخش عقربه ساعت شماره گذاری کنید در نتیجه، 8 سمت خواهید داشت. در شکل 5 دنباله مشاهدات برای عدد 1 نشان داده شده است. در روش  مطرح در [1] از مدل مخفی مارکوف، روش جهت حرکت قلم استفاده گردیده تا تشخیص اعداد را انجام دهد. با توجه به اینکه براساس جهت حرکت قلم طراحی شده، برای هر رقم به ازای هر روش نوشتن از لحاظ جهت حرکت قلم یک مدل مخفی ایجاد شده است. هر مدل حداکثر 8 حالت انتقال و هر کدام آنها 8 مشاهده دارند که همان جهت حرکت قلم است. احتمالات انتقال بین حالتها و مشاهدات با توجه به شکلهای استاندارد و غیراستاندارد هر رقم تعیین می شود. در این مدلها ویژگی هدایت شوندگی دیده می شود، به این معنی که در مسیر حرکت بین حالتها امکان بازگشت به حالت قبلی وجود ندارد و مدل را مجبور به طی کردن یک مسیر مشخص می کند، که این ویژگی به تشخیص دقیق تر مدل کمک بسیاری کرده است. و در نهایت این روش دارای دقت  96.76% در تشخیص اعداد می باشد.

![ شکل 5 چند نمونه دنباله مشاهدات برای رقم 1.](https://dl.dropboxusercontent.com/u/106369898/Pr-Pro_L/I5.jpg)
شکل 5 چند نمونه دنباله مشاهدات برای رقم 1  [11]

البته اگر روش شناسایی جهت حرکت قلم را با روش قطعه بندی انجام بدهید به میزان دقت 94.4% می رسید [11]. در روش قطعه بندی سعی می شود تا بعد از بدست آوردن اسکلت اعداد، بخش های مختلف اسکلت را از هم جدا کنند و هر بخش را جداگانه مورد بررسی  قرار بدهند که این کار می تواند در شناسایی اعداد فارسی موثر واقع گردد.
روش مطرح دیگری که در این حوزه باقی می ماند روش های آماری مانند بیز است. در [12] از مدل مخروطی گوسی برای تشخیص اعداد لاتین استفاده کرده است و به دقت 94% دست یافته است. در این روش از مدل مخروطی گوسی در دو مرحله استفاده شده است. ابتدا برای تعیین زیر کلاسهای مربوط به هر عدد و سپس برای تخمین وفقی تابع چگالی احتمال هر زیر کلاس در قالب یک دسته بندی کننده بیز. اگر این روش را با ترکیب روش های HMM و SVM استفاده کنید، در این صورت به میزان دقت 98% خواهید رسید [13].
روش های یادگیری نیمه نظارتی نیز از جمله روش هایی هستند که مورد توجه قرار می گیرند. روشهای نیمه‌نظارتی دسته‌ای از روش‌های یادگیری ماشین است که در آن از داده‌های بدون برچسب و داده‌های برچسب‌دار به صورت هم‌زمان برای بهبود دقت یادگیری استفاده می‌شود. در این نوع آموزش تعداد کمی از داده ها برچسب دارند و مابقی بدون برجسب مورد استفاده قرار خواهد گرفت. این روش ها اکثراً بر روی شبکه های عصبی اعمال می شوند. این در حالی است که خود شبکه های عصبی عضو روش های نظارتی هستند. این روش دو بخش عمده دارد. در بخش اول پیش آموزش بدون نظارت مطرح می شود. در این بخش وزن های لایه ها با استفاده از آموزش بدون نظارت لایه ها مقدار دهی اولیه می شود. در بخش دوم، fine-tuning نام دارد که وزنهای عمومی که با برچسب ها آموزش دیده اند بر روی روش های نظارتی به صورت انتشار عقبگرد اعمال می شود. همه روش هایی که به این صورت عمل می کنند را روش نیمه نظارتی می گویند. داده های بدون برچسب نیز داده هایی هستند که بیشترین احتمال را برای یک کلاس داشته باشند و کلاس آنها نیز درست پیش بینی شده باشد. این روش می تواند همه مدل های شبکه های عصبی را با روش های آموزش به خوبی ترکیب کند. این روش در [14]، به صورت کامل مطرح شده و از نمونه های MNIST استفاده کرده تا شناسایی اعداد را داشته باشد. این کار را با چندی روش مقایسه کرده است و همه آنها را با تعداد نقاط آموزشی 100 تا، 600، 1000 و 3000 انجام داده است و برای تست نیز از 1000 نمونه استفاده کرده است که در جدول 2 میزان خطای کلاس بندی نشان داده شده است که در [14] روش های dropNN، +PL و روش +PL+DAE مطرح شده است. عمومآً برای جلوگیری از overfitting از روش drop کردن استفاده می شود که آموزش نظارتی مورد استفاده قرار میگیرد. در +PL به شبکه های عصبی آموزش بدون برچسب نیز اضافه کرده است و در +PL+DAE به آموزش بدون برچسب بدون نظارت DAE اضافه می شود. DAE را در بخش اول یعنی در پیش آموزش بدون نظارت استفاده می کنند. 

|روش	|100|	600|1000|3000|
|:-------:|:-------:|:-------:|:-------:|:-------:|
|NN	|25.81	|11.44	|10.7|	6.04|
|SVM	|23.44	|8.85	|7.77	|4.21|
|CNN	|22.98	|7.68	|6.45	|3.35|
|TSVM	|16.81	|6.16	|5.38|	3.45|
|DBN-rNCA|	-	|8.7|	-	|3.3|
|EmbedNN	|16.86	|5.97	|5.73	|3.59|
|CAE	|13.47	|6.3	|4.77	|3.2|
|MTC	|12.03	|5.13	|3.64	|**2.57**|
|dropNN	|21.89	|8.57	|6.59	|3.72|
|+PL	|16.15	|5.03	|4.30	|2.80|
|+PL+DAE	|**10.49**	|**4.01**	|**3.46**	|2.69|

جدول 2 میزان خطای روش های مختلف که برای تشخیص اعداد است و با 100، 600، 1000 و 30000 نقطه آموزشی [14]

همان طور که در جدول 2 مشاهده می شود، روش های نیمه نظارتی شبکه های عصبی +PL+DAE دارای خطای کمتری است. ولی با این تفاوت که در تعداد نمونه های زیاد میزان خطای روش MTC از همه کمتر است.
هرچند نمی توان همه این روش ها را به دلیل برابر نبودن وضعیت داده های آموزشی و تعداد آنها و همچنین نوع زبان، با هم مقایسه کرد ولی با توجه به درصدهایی که ارائه شده اند می توان بیان نمود که روش هایی شبکه های عصبی و همچنین شبکه های عصبی نیمه متمرکز بسیار خوب پاسخگو هستند. در ادامه نیز برای انجام آزمایشات با استفاده از روش نمونه برداری ارائه شده در مرجع [2] و روش آموزشی SVM و داده های آموزشی استفاده شده در مرجع [6] سعی می شود تا یک روش آموزشی تست شود و همچنین بتوان آن را مورد ارزیابی قرار داد. 

# آزمایش‌ها
برای انجام آزمایش در ابتدا باید پایگاه داده اعداد دستنویس فارسی را در نظر گرفت که ما در این آزمایش از اعداد فارسی موجود در مرجع [6] استفاده خواهیم کرد. در این پایگاه داده 60000 داده آموزشی وجود دارد که برای هر یک از اعداد صفر تا نه 6000 نمونه وجود دارد. همچنین، 20000 نمونه برای تست وجود دارد که برای هر کدام از اعداد صفر تا نه، 2000 نمونه وجود دارد. 
روش کار مدنظر، متناسب با روش ارائه شده در [2] می باشد. همان طور که در روش مربوطه نیز ذکر شد، در ابتدا داده ها باید نرمال سازی شوند. در ابتدا همه عکس ها را به عکس های 64*64 تبدیل می کنیم. برای انجام این کار در مطلب از دستور {[Data{i} = imresize(Data{i}, [64 64استفاده می کنیم که {Data{i نمونه های یا عکس ها می باشد. در شکل 6 نمونه ای از نمونه های آموزشی، قبل (بالایی) و بعد (پائینی) از نرمال سازی نشان داده شده است.
![ شکل 6 نمونه ای از نمونه های مجموعه داده های آزمایشی که عدد 6 را نشان نمی دهد.](https://dl.dropboxusercontent.com/u/106369898/Pr-Pro_L/l6.jpg)
شکل 6 نمونه ای از نمونه های مجموعه داده های آزمایشی که عدد 6 را نشان نمی دهد.

## بدست آوردن ویژگی ها

اگر به عکس ها توجه کنید، هر عکس، به دلیل خاکستری بودن رنگ، برای هر رنگ یک عدد بین 0 تا 255 در نظر گرفته می شود. در هر عکس 64 ستون و 64 سطر وجود دارد. می توان هر عکس را از چهار دیدگاه بالا، پایین، چپ و راست نگاه کرد و نقاط سفید را برای هر چهار دیدگاه شمرد تا به اولین عنصر غیر رنگ سفید برسیم. به دلیل اینکه رنگ عکس ها را معکوس کرده ایم نوشته ها سفید و ضمینه سیاه خواهد شد. این کار را برای دیدگاه های چپ و راست بر روی 64 سطری که وجود دارد، بر روی سطرهای ضرایب 8 انجام داده می شود. همچنین، برای دیدگاه های بالا و پائین بر روی 64 تا ستونی که وجود دارد، ستون های ضرایب 8 این کار بر روی آنها انجام می شود. اگر به شکل 6 توجه کنید، مشاهده می کنیم که، در سطر اول از چپ به راست 11 خانه صفر وجود دارد و همچنین 43 خانه صفر نیز از راست به چپ داریم. به علاوه در ستون اول از دیدگاه های بالا و پایین نیز به ترتیب 13 و 35 خانه صفر وجود دارد. 
![ شکل 7 دیدگاه های بالا و پائین و چپ و راست از نمونه مورد بررسی در شکل 6.](https://dl.dropboxusercontent.com/u/106369898/Pr-Pro_L/l7.jpg)
شکل 7 دیدگاه های بالا و پائین و چپ و راست از نمونه مورد بررسی در شکل 6.

در شکل 7 نمونه های برداشت شده از شکل 6 نشان داده می شود. بعد از بدست آوردن همه این اطلاعات، از هر یک از نمونه ها، در هر دیدگاهش، شیب بین نقطه هایش را باید بدست آورد. 
پس برای هر دیدگاه 15 ویژگی خواهیم داشت، بنابراین در کل برای هر نمونه 60 ویژگی تعریف خواهد شد. در شکل ها 8 یک نمونه از حاصله ویژگی ها، از دیدگاه های به ترتیب از چپ به راست شکل، بالا، پاویین، راست و چپ برای اعداد 0 تا 9 نشان داده می شود.برای انجام اینکار از نرم افزار متلب استفاده شده است. در قطعه کد زیر می توان دیدگاه ها را از نمونه ها بدست آورد.

    for Fleft = 1:16
    CFCount = 1;
    while (CFCount<65 && 0 == IMaGeF((Fleft)*4,CFCount))
    Left(i,Fleft) = Left(i,Fleft)+1;
    CFCount = CFCount+1;
    end
    if Fleft>2
    MLeft(i,Fleft-1) = Left(i,Fleft) - Left(i,Fleft-1);
    end
    end
    % Right cal
    for Fleft = 1:16
    CFCount = 1;
    while (CFCount<65 && 0 == IMaGeF((Fleft)*4,65-CFCount))
    Right(i,Fleft) = Right(i,Fleft)+1;
    CFCount = CFCount+1;
    end
    if Fleft>2
    MRight(i,Fleft-1) = Right(i,Fleft) - Right(i,Fleft-1);
    end
    end
    % TOP cal
    for Fleft = 1:16
    CFCount = 1;
    while ( CFCount<65 && 0 == IMaGeF(CFCount,(Fleft)*4))
    TOP(i,Fleft) = TOP(i,Fleft)+1;
    CFCount = CFCount+1;
    end
    if Fleft>2
    MTOP(i,Fleft-1) = TOP(i,Fleft) - TOP(i,Fleft-1);
    end
    end
    % Down cal
    for Fleft = 1:16
    CFCount = 1;
    while (CFCount<65 &&0 == IMaGeF(65-CFCount,(Fleft)*4))
    DOWN(i,Fleft) = DOWN(i,Fleft)+1;
    CFCount = CFCount+1;
    end
    if Fleft>2
    MDOWN(i,Fleft-1) = DOWN(i,Fleft) - DOWN(i,Fleft-1);
    end
    end
    %end hadi
که در این کد متغیر IMaGeF نمونه های ما می باشد. 

![ شکل 8 دیدگاه های بالا و پائین و چپ و راست یک نمونه از هر یک از مجموعه نمونه های اعداد صفر تا یک.](https://dl.dropboxusercontent.com/u/106369898/Pr-Pro_L/l8.jpg)
شکل 8 دیدگاه های بالا و پائین و چپ و راست یک نمونه از هر یک از مجموعه نمونه های اعداد صفر تا یک.

ویژگی های هر نمونه را با استفاده کد ذیل در متغیر MALLDATA قرار می دهیم.

    MALLDATA = zeros(TotalRec,60);
    MALLDATA(1:end,1:15) = MTOP(1:end,1:end);
    MALLDATA(1:end,16:30) = MDOWN(1:end,1:end);
    MALLDATA(1:end,31:45) = MRight(1:end,1:end);MALLDATA(1:end,46:60) = MLeft(1:end,1:end);
و با استفاده از کد زیر با استفاده از روش SVM سعی می کنیم تا نمونه ها را یاد بگیریم. 

    for i=0:9
    Group = MakesGroups_SVM(i,labels);
    svmStruct(i+1) = svmtrain(MALLDATA,Group, 'kernel_function', 'polynomial');
    end;
برای انجام عمل آموزش با توابع خطی و چند جمله ای و گوسی استفاده شد که در گوسی و خطی آموزش روند آموزش دچار مشکل می شد و به جواب نمی رسید. ولی در تابع چند جمله درجه 3 به جواب با دقت 90.87% دست پیدا کردیم. برای انجام عمل تست نیز از تابع ذیل استفاده شده است که از بین 20000 نمونه 1867 نمونه را درست تشخیص نداده است. در این مجموعه، از هر کلاس 2000 نمونه وجود دارد.

    DT_lables = zeros(10,TotalRec); 
    for i =1:10
    DT_lables(i,1:end) = svmclassify(svmStruct(i),MALLDATA);
    end;
در کلاس های 0 تا 9 به ترتیب 205، 145، 216، 279، 338، 238، 186، 55، 53، 152 مورد نادرست تشخیص داده شده است. همان طور که ملاحظه می شود در این کلاس ها، کلاس 8 از همه کلاس ها کمترین خطا را دارد. اگر بخواهیم این خطاها را بهتر تحلیل کنیم، باید به جدول 3 بیشتر توجه کنیم.

| | **0**   | **1**  | **2**  | **3**  | **4**  | **5**  | **6**  | **7**  | **8**  | **9**   | **NON** | **sum** |
| ------- | ------ | ------ | ------ | ------ | ------ | ------ | ------ | ------ | ------- | ------- | ------- | ---- |
| **0**   | 0      | 27     | 8      | 4      | 8      | 69     | 12     | 17     | 5       | 10      | 45      | 205  |
| **1**   | 73     | 0      | 1      | 0      | 1      | 18     | 1      | 0      | 0       | 3       | 48      | 145  |
| **2**   | 13     | 26     | 0      | 32     | 11     | 12     | 3      | 3      | 0       | 6       | 110     | 216  |
| **3**   | 11     | 7      | 124    | 0      | 36     | 9      | 3      | 1      | 1       | 2       | 85      | 279  |
| **4**   | 14     | 21     | 16     | 57     | 0      | 68     | 16     | 7      | 2       | 25      | 112     | 338  |
| **5**   | 83     | 27     | 4      | 1      | 1      | 0      | 17     | 28     | 20      | 17      | 40      | 238  |
| **6**   | 14     | 22     | 7      | 0      | 3      | 4      | 0      | 5      | 3       | 62      | 66      | 186  |
| **7**   | 5      | 4      | 8      | 0      | 0      | 3      | 4      | 0      | 0       | 4       | 27      | 55   |
| **8**   | 2      | 2      | 0      | 1      | 0      | 6      | 0      | 0      | 0       | 30      | 12      | 53   |
| **9**   | 10     | 21     | 6      | 2      | 1      | 4      | 33     | 0      | 10      | 0       | 65      | 152  |
| **sum** | 225    | 157    | 174    | 97     | 61     | 193    | 89     | 61     | 41      | 159     | 610     | 1867 |

جدول3 جدول خطا ها

در جدول 3 میزان هر خطا و نوع اشتباه در تشخیص را نشان می دهد. در این جدول ستون ها کلاس های بدست آمده اند و سطر ها کلاس های واقعی نمونه ها هستند. به عنوان نمونه در ستون 0 با سطر 1 نشان می دهد که در کلاس 0 ای که تشخیص داده شده 73 مورد را صفر را، یک تشخیص داده است. همچنین، در ستون 1 و سطر صفر، 27 مورد 1 را به اشتباه صفر تشخیص داده است. همان طور که ملاحظه می شود، 83نمونه صفر، عدد 5 تشخیص داده می شوند و بعد از آن عدد 1 می باشد. همچنین، عدد 2 با عدد 3، 3 با 4، 4 با 3، 5 با 1 و صفر، 6 با 9، 7 و 8 با 5 و 9 با 6 هستند که بیشترین اشتباه ها را دارند. در این دسته از کلاس ها به غیر از کلاس های 0 تا 9 یک دسته با NON نیز وجود دارد که این کلاس نشان می دهد که این دسته را نمی تواند تشخیص دهد که از چه نوعی است. 

همچنین شما می توانید کد ها و نمونه ها را از [اینجا ](https://dl.dropboxusercontent.com/u/106369898/Pr-Pro_L/mycodes.zip)دریافت کنید.


#بهبود نتایج آزمایشات
همان طور که در مرحله قبلی گفته شد، توانستیم تا با روش SVM به دقت 90% برسیم، برای بهبود کار، سعی بر آن شد تا از روش های گروهی [^ensemble]  استفاده شود. همان طور که بیان شد 60000 نمونه آموزشی و 20000 نمونه تست در مجموعه نمونه ها وجود دارد که می توان از آن برای آموزش 7 تا SVM  با 8000 نمونه آموزشی مختلف تولید کرد (در کل 7*8000=56000 نمونه استفاده خواهد شد). در قطعه کد زیر طریقه  تولید SVM ها نشان داده شده است. پس در کل از این داده های آموزشی 7*8000 نمونه آموزشی استفاده می شود و لازم به توجه است که داده های آموزشی برای آموزش هر SVM با هم متفاوت هستند، حتی یک نمونه برابر هم ندارند. بنابراین، این SVM ها هیچ وابستگی ای به هم ندارند.
	
    step = 8000;
    [data, labels, TOTALM] = ReadDATA();
    totalsvmn = 7;
    for i=1:totalsvmn
        traninedsvmStructure((i-1)*10+1:(i)*10) = ReadCDB_Matlab_SVMTraining((i-1)*step+1,(i)*step, data , labels);
    end;
   
 در این آزمایش از هسته های مختلف برای آموزش استفاده شده است که نتایج را در ادامه مقایسه خواهیم کرد. تابع  ReadCDB_Matlab_SVMTraining را در قطعه کد زیر مشاهده می کنید. لازم به توضیح است که برای تولید SVM ها با هسته های مختلف فقط کافی است که نام polynomial را با هسته مورد نظر خود جایگزین کنید مانند rbf و یا اگر خواستید که درجه polynomial  را از حالت معمولی که 3 می باشد تغییر دهید ,'polyorder', p را به ورودی های تابعی svmtrain اضافه کنید که p درجه چند جمله ای از درجه p را نشان می دهد.

    function [ svmStruct ] = ReadCDB_Matlab_SVMTraining(a , b , MALLDATA ,labels)
    
    MALLDATAME = MALLDATA(a:b,1:end);
    labelsME = labels(a:b);
    
    for i=0:9
    Group = MakesGroups_SVM(i,labelsME);
    %'Kernel_Function','rbf','rbf_sigma', 0.1,'boxconstraint',1000    /// ,'polyorder', 5
    svmStruct(i+1) = svmtrain(MALLDATAME,Group, 'kernel_function', 'polynomial');
    end;
    
    end
تا این محل از کار، نمونه ها را با 7 تا SVM که آنها از SVM1 تا SVM7 نام گذاری شده اند و هیچ وابستگی ای به همدیگر ندارند، آموزش داده اید و آماده برای تست هستند. 
برای تست این موارد می توان از قطعه کد زیر استفاده کرد. در این راستا، ابتدا نمونه های تست را می خواند و با استفاده از تابع ReadCDB_Matlab_SVMTesting نمونه ها را مورد تست قرار می دهد. در ادامه نیز میزان خطای هر تک SVM را به ازای هر نمونه تست شده بدست می آورد. 

    [data, labels, TotalRec] = ReadDATATesting();
    
    labels_s = zeros(TotalRec,totalsvmn);
    for i=1:totalsvmn
        svm = traninedsvmStructure((i-1)*10+1:(i)*10);
        labels_s(:,i) = ReadCDB_Matlab_SVMTesting(svm,data,TotalRec);
    end;
           
    ERROR = zeros(1,totalsvmn + 2); % the last col. is final error count voting, + bayes
    % calculate each svm error count.
    for j = 1:totalsvmn
        for i = 1:TotalRec
            if(labels_s(i,j) ~= labels(i))
                ERROR(1,j) = ERROR(1,j) + 1;
            end;
        end;
    end;
    
 در شکل 18 میزان خطای هر روش را نشان می دهد.  برای تولید SVM ها ابتدا از هسته های مختلف از جمله rbf استفاده کردیم و مشاهده شد که در تولید فضای بُرش دچار مشکل می شود و یا دقت خوبی ندارد. بنابراین از هسته polynomial برای این امر استفاده شد. در این راستا، برای این هسته نیز از درجه های چند جمله ای مختلف مانند 1،2،3،4 و 5 استفاده شد. همان طور که در شکل 18 مشاهده می شود میزان دقت هر یک از این 7 تا SVM بیان شده است که در درجه چند جمله ای 3 از همه دقت بهتری دارد. ولی در درجه چند جمله ای 2 دقت کمی از درجه 3 کمتر است. حال کدام بهترند؟ لازم به توضیح است که دقت در درجه های 4 و 5 نیز به شدت در حال کاهش است که نشان می دهد که از درجه 3 به بعد آموزش در حال overtraning می باشد. 
حال می توان نتایج را به صورت یک نتیجه گروهی و تصمیم گروهی در نظر گرفت. در ایجا دو روش رای گیری وزندار و بیز ساده شده [^Naive Bayes]  مد نظر قرار داده شده است و آنها را با هم مقایسه می کند. 
برای انجام رای گیری وزن دار در ابتدا باید وزن ها را استخراج کرد. در اینجا، برای هر SVMiای، یک وزن با فرمول $w_i=log(P_i/1-P_i)$ که $1>P_i>0$ دقت SVMi را نشان می دهد، بدست می آید. قطعه کد زیر وزن ها را بدست می آورد و با استفاده از تابع CountNumberForVoting سعی میکند تا رای گیری وزندار انجام دهد و نتیجه را در متغیر index قرار می دهد. در ادامه نیز میزان خطای این روش محاسبه شده که در شکل 18 میزان خطای رای گیری وزن دار در کنار هر تک SVM بیان شده است. 
   
    ACRate = 100.0 - (ERROR*100.0)/TotalRec;
    w = zeros(totalsvmn,1)*1.0;
    for i=1:totalsvmn
        w(i) = log10(ACRate(i)*.01/(1-ACRate(i)*.01));
    end;
    
    [numbers,index] = CountNumberForVoting(labels_s,TotalRec, totalsvmn,w);
    ERROR(1,totalsvmn + 1) = 0;
    for i = 1:TotalRec
        if(index(i) ~= labels(i))
            ERROR(1,totalsvmn + 1) = ERROR(1,totalsvmn + 1) + 1;
        end;
    end;
    
در شکل ها 9 تا 15 ماتریس اختلال[^confusion matrix] را برای هر یک از  SVMi با هسته چند جمله ای از درجه 3 نشان داده شده است که در قطعه کد طریفه بدست آمدن آن نوشته شده است. در شکل 16 ماتریس اختلال روش رای گیری وزن دار نشان داده شده است. در این ماتریس ها، سطر بیان کننده کلاس های درست و واقعی هستند که از 0 تا 9 نام گذاری می شوند و ستون ها کلاس های پیشبینی شده از ماشین می باشد که بین 0 تا 10 می باشد که ستون 10ام نشان دهنده این است که جزء هیچ یک از کلاس های 0 تا 9 بیشبینی نشده است و آن نمونه ها را اصلاً عدد تشخیص نداده است.

    CM = zeros(10*(totalsvmn+2),11);
    for i=1:totalsvmn
        CM(10*(i-1)+1:10*(i),:) = Confusion_Matrix(labels_s(:,i),labels,TotalRec);
    end;
    CM(10*totalsvmn+1:10*(totalsvmn+1),:) = Confusion_Matrix(index,labels,TotalRec);
 که تابع ماتریس اختلال نیز در ذیل مشاهده می شود. 

    function [ CM ] = Confusion_Matrix( e_labels, t_labels, len )
    
    CM = zeros(10,11);
    for i=1:len
        if(e_labels(i) == -1)
            CM(t_labels(i)+1,11)=CM(t_labels(i)+1,11)+1;
        else CM(t_labels(i)+1,e_labels(i)+1)=CM(t_labels(i)+1,e_labels(i)+1)+1;
        end;
    end;
    end
جهت مقایسه روش، در کنار روش رای گیری وزن دار از روش بیز ساده شده نیز استفاده شد. روش بیز ساده شده نیز با توجه به ماتریس اختلال ها کار خود را برای پیشبینی گروهی انجام می دهد و خاستار یک درصد خطای بهتری از رای گیری وزن دار می باشد. در قطعه کد زیر روش بیز ساده شده و روش بدست آوردن میزان خطای این روش نشان داده شده است. نتیجه حاصله از بیز ساده شده در Bayes_c قرار می گرید. در شکل 17 ماتریس اختلال به خوبی نشان داده شده است.
    
    Bayes_c = NaiveBayes_1(10, step, TOTALM,  CM, TotalRec, labels_s, totalsvmn);
    ERROR(1,totalsvmn + 2) = 0;
    for i = 1:TotalRec
        if(Bayes_c(i) ~= labels(i))
            ERROR(1,totalsvmn + 2) = ERROR(1,totalsvmn + 2) + 1;
        end;
    end;
    
    CM(10*(totalsvmn+1)+1:end,:) = Confusion_Matrix(Bayes_c,labels,TotalRec);
    ACRate = 100.0 - (ERROR*100.0)/TotalRec;
کد بیز ساده شده نیز در زیر مشاهده می کنید.

    function [ Bayes_C ] = NaiveBayes_1( C, Nk, NT, CM, TOTN, e_labels, L )
        %UNTITLED Summary of this function goes here
        %   Detailed explanation goes here
        Bayes_C = ones(TOTN,1)*-1;
        Bayes_R = ones(TOTN,1)*-1.0;
        Nk = Nk*1.0;
        c = 1/C*1.0;
        for p=1:TOTN
            for k=1:C
                PK = Nk/NT;
                for i=1:L
                    x = K(CM, k, e_labels(p,i), i);
                    PK = PK * ((x + c)/(Nk+1));
                end;
                if PK>Bayes_R(p)
                    Bayes_R(p) = PK;
                    Bayes_C(p) = k-1; 
                end;
            end;
        end;
    end
    
    function [r] = K(CM, k, si, i)
        if si ~= -1
            r = CM(10*(i-1) + (k) ,(si+1));
        else r = CM(10*(i-1) + (k) ,11);
        end;
    end

![ شکل 9 confusion matrix برای SVM1](https://dl.dropboxusercontent.com/u/106369898/Pr-Pro_L/EResult/CM1.JPG)  شکل 9 confusion matrix برای SVM1
![ شکل 10 confusion matrix برای SVM2](https://dl.dropboxusercontent.com/u/106369898/Pr-Pro_L/EResult/CM2.JPG)  شکل 10 confusion matrix برای SVM2
![ شکل 11 نمایش اعداد فارسی](https://dl.dropboxusercontent.com/u/106369898/Pr-Pro_L/EResult/CM3.JPG)  شکل 11 confusion matrix برای SVM3
![ شکل 12 confusion matrix برای SVM4](https://dl.dropboxusercontent.com/u/106369898/Pr-Pro_L/EResult/CM4.JPG)  شکل 12 confusion matrix برای SVM4
![ شکل 13 confusion matrix برای SVM5](https://dl.dropboxusercontent.com/u/106369898/Pr-Pro_L/EResult/CM5.JPG)  شکل 13 confusion matrix برای SVM5
![ شکل 14 confusion matrix برای SVM6](https://dl.dropboxusercontent.com/u/106369898/Pr-Pro_L/EResult/CM6.JPG)  شکل 14 confusion matrix برای SVM6
![ شکل 15 confusion matrix برای SVM7](https://dl.dropboxusercontent.com/u/106369898/Pr-Pro_L/EResult/CM7.JPG)  شکل 15 confusion matrix برای SVM7
![ شکل 16 confusion matrix برای رای گیری وزن دار](https://dl.dropboxusercontent.com/u/106369898/Pr-Pro_L/EResult/wvoting.JPG)  شکل 16 confusion matrix برای رای گیری وزن دار
![ شکل 17 confusion matrix برای نایو بیز(NaiveBayes)](https://dl.dropboxusercontent.com/u/106369898/Pr-Pro_L/EResult/Bayes.JPG)  شکل 17 confusion matrix برای نایو بیز(NaiveBayes)
 ![ شکل 18مقایسه دقت روش های مختلف با همدیگر](https://dl.dropboxusercontent.com/u/106369898/Pr-Pro_L/EResult/Result.JPG) شکل 18 مقایسه دقت روش های مختلف با همدیگر

حال که نتیجه های رای گیری وزن دار و روش بیز ساده شده را در دسترس داریم، به راحتی می توانیم آنها را مورد مقایسه هم قرار دهیم که این مباحث را تحت عنوان نتیجه گیری در ادامه مطرح می کنیم.

#نتیجه گیری
همان طور که در شکل های 9 تا 15 نشان داده شده است. هر روش SVM با هم متمایز بوده و میزان خطا و دقت خاص خود را دارا هستند که این در ستون آخر که برای بیش بینی نشدن نمونه ها به عنوان اعداد می باشد به خوبی محسوس می باشد. به همین امر است که بعد از گروهی تصمیم گرفتن در ماتریس تداخل های شکل های 16 و 17  ستون آخر صفر شده اند. لازم به توضیح است که دلیل متمایز بودن SVMi ها متمایز بودن نمونه های آزمایشی است.
همچنین این امر در شکل 18 که نتیجه حاصلی این پروژه می باشد به خوبی نشان داده شده است. ولی با این وجود به دلیل سخت بود روش SVM دقت نهایی به میزان 4 درصد افزایش داشته است که از جمله دلایل آن تعداد کم روش ها SVM می تواند باشد که اگر این تعداد از 7 تا SVM حدود 30 تا 40 SVM برسد شاید دقت بهتری را نشان بدهد.  در ضمن همانطور که در همین شکل نشان داده شده است، در همه موارد میزان دقت روش بیز ساده شده از روش رای گیری وزن دار بهتر است.
در نتیجه، در این پروژه از روش SVM استفاده شده که بتوان اعداد دست نویس فارسی را تشخیص داد. در این راستا 7 SVM آموزش دیدند که در این میان SVM های چند جمله ای از درجه 3 و 2 از همه بهتر بوده اند ولی بعد از تصمیم گیری گروهی با استفاده از دو روش رای گیری وزن دا و بیز ساده شده بر روی آنها دقت نهایی افزایش پیدا کرد، همان طور که در شکل 18 نشان داده شده است میزان دقت روش بیز ساده شده از رای گیری وزن دار بیشتر است. در نهایت نیز SVM های چند جمله درجه 2 با روش تصمیم گیری گروهی بیز ساده شده دقت بهتری بر روی نمونه های تست شده داشته است.

همچنین شما می توانید کد ها و نمونه ها را از [اینجا ](https://dl.dropboxusercontent.com/u/106369898/Pr-Pro_L/mycodes_2.rar)دریافت کنید. همچنین برای اجرای کد نیز با اجرای اسکریپت SVMTraining هم قسمت آموزش و هم قسمت آزمون و نتیجه های مشاهده شده در برنامه به خوبی اجرا و قابل مشاهده می باشد.

# مراجع

[1] 	ا. ابراهمی مقدم, و. فاضلی نیا, ل. رشیدی و م. وفایی جهان, “تشخیص دست نویس رقم لاتین توسط مدل مخفی مارکوف,” در اولین همایش ملی مهندسی رایانه و مدیریت فناوری اطلاعات, 1393. 
[2] 	J. Sadri, C. Suen and T. Bui, "Application of support vector machines for recognition of handwritten Arabic/Persian digits," in Proceedings of Second Iranian Conference on Machine Vision and Image Processing, 2003. 
[3] 	م. اشکواری و م. کبانی, “تشخیص اعداد دست نویس فارسی با استفاده از تکنیک PCA و شبکه عصبی,” در همایش منطقه ای علوم کامپیوتر، مهندسی کامپیوتر و فناوری اطلاعات, خرداد 1391. 
[4] 	J. Franke and M. Oberlander, "Writing style detection by statistical combination of classifiers in form reader applications," in Second International Conference on Document Analysis and Recognition, 1993. 
[5] 	C. Tanprasert and S. Sae Tang, "Thai type style recognition," in IEEE International Symposium on Circuits and Systems. 
[6] 	H. Khosravi and E. Kabir, "Introducing a very large dataset of handwritten Farsi digits and a study on their varieties," Pattern Recognition Letters, vol. 28, pp. 1133-1141, 2007. 
[7] 	M. A. Shayegan and S. Aghabozorgi, "A New Dataset Size Reduction Approach for PCA-Based Classification in OCR Application," Mathematical Problems in Engineering, pp. 1-14, 2014. 
[8] 	ع. جعفرنژاد, “ارائه یک سیستم کارآمد برای شناسایی اعداد دست نویس با استفاده از شبکه عصبی,” در اولین کنفرانس ملی رویکردهای نویس در مهندسی کامپیوتر و بازیابی اطلاعات ایران, 15 مهر 1392. 
[9] 	M. A. Abu-Zanona and B. M. El-Zaghmour, "Current Arabic ( Hindi ) Hand Written Numbers Segmentaion and Recognition Advance ImageProcessing and Neural Network," Journal of Emerging Trends in Computing and Information Sciences, vol. 3, no. 6, pp. 936-941, 2012. 
[10] 	م. ل. افراسیابی, ز. فرهمندپور و ح. ختن لو, “تشخیص اعداد دست نویس عربی با استفاده از ترکیب الگوریتم ژنتیک و شبکه عصبی,” در سومین کنفرانس مهندسی برق و الکترونیک ایران, 22 تیر 1390. 
[11] 	م. زیارت بان, ک. فائز, س. مظفری و م. ازوجی, “ارائه یک روش ساختاری جدید مبتنی بر قطعه بندی تصویر نازک شده برای شناسایی اعداد دست نویس فارسی/عربی,” در سویمن کنفرانس ماشین بینایی و پردازش تصویر ایران, 1383. 
[12] 	م. ر. ارباب شیرانی و م. ت. صادقی, “بازشناسی خودکار اعداد دست نویس لاتین با استفاده از مدل گوسی دو مرحله ای,” در پانزدهمین کنفرانس مهندسی برق ایران. 
[13] 	ع. برومند نیا و ا. امیری, “تشخیص اعداد فارسی (عربی) با استفاده از ساختار ترکیبی SVM/HMM,” در اولین کنفرانس ملی محاسبات نرم و فناوری اطلاعات. 
[14] 	D.-H. Lee, "Pseudo-Label : The Simple and Effcient Semi-Supervised Learning Method for Deep Neural Networks," in Challenges in Representation Learning (WREPL), Atlanta, Georgia, USA, 2013. 
 
# پیوندهای مفید
+ [صفحه رسمی مجموعه دادگان هدی ](http://farsiocr.ir/مجموعه-داده/مجموعه-ارقام-دستنویس-هدی/)
+ [مقاله در مورد مجموعه دادگان فارسی هدی](http://farsiocr.ir/Archive/dataset_PRL.pdf)
+ [Kaggle Competition](https://www.kaggle.com/c/digit-recognizer)
+ [Semeion Handwritten Digit Data Set](http://archive.ics.uci.edu/ml/datasets/Semeion+Handwritten+Digit)
+ [MNIST Handwritten Digits](http://yann.lecun.com/exdb/mnist/)