بازشناسی دست نوشته های فارسی

مقدمه

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

 

 

کلیات

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

  • حل مساله با استفاده از Segmentation و قطعه بندی
  • حل مساله با استفاده از شبکه های CNN + RNN + CTC
  • حل مساله با کمک مدل بازشناسی Tesseract
  • حل مساله با استفاده از شبکه های دارای لایه Attention

در ادامه بررسی های مربوط به سه رویکرد اول بیان می شوند.

 

حل مساله با استفاده از Segmentation و قطعه بندی

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

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

 

نمونه ای از کلمات فارسی با پیچیدگی هایشان

 

حل مساله با استفاده از شبکه های CNN + RNN + CTC

برای آشنایی بیشتر با هرکدام از اجزای این مدل می توانید از صفحات مربوطه استفاده کنید. ( CNN / RNN / CTC )

این روش معمول ترین روش OCR است و در مقالات مختلفی از آن استفاده شده بود. در این رویکرد یک قاب بر روی تصویر حرکت می کند. در هر قاب ابتدا تصویر به یک شبکه convolutional داده می شود تا ویژگی هایش استخراج شوند. سپس ویژگی های استخراج شده به یک شبکه بازگشتی دارای حافظه (LSTM) داده می شوند و سپس از CTC Loss و CTC decode برای تعین مقدار خطا و خروجی مدل استفاده می شود. در حین حرکت قاب ممکن است بعضی حروف چندین بار دیده شوند. با توجه به آموزش ها از شبکه انتظار می رود فاصله بین کاراکترها را با blank تشخیص دهد.

چگونگی عملکرد مدل

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

 

نمونه داده های تولید شده

 

حل مساله با کمک مدل بازشناسی Tesseract

Tesseract یکی از کتابخانه های open source پایتون است که توسط تیم شرکت HP در حدود سال 1985 تا 1993 توسعه داده شده است و درسال 2006 توسط گوگل خریداری شده است. بیشتر این کتابخانه به زبان C و C++ نوشته شده است.

برای استفاده از Tesseract باید مراحل زیر طی شوند:

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

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

مدل از پیش آموزش داده شده Tesseract برای نوشته های تایپی با دقت بالایی عمل می کند اما بازشناسی دستخط عملکرد ضعیفی دارد.

 

 

کدهای مربوط به آموزش شبکه را می توانید از طریق این لینک دریافت کنید.