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

مقدمه

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

 

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

آشنایی با شبکه های عصبی بازگشتی – RNN

برای درک بهتر این مبحث ابتدا برخی از مساله هایی که با کمک RNN ها قابل حل است را بررسی می کنیم:

  • Music generation : در این نوع از مسائل ما به شبکه یک نت تصادفی (random token) و یا بخشی از یک موسیقی را می دهیم و شبکه ادامه آن موسیقی را برای ما تولید می کند.
  • Sentiment classification : در این مسائل شبکه با داده های افرادی که درباره موارد مختلف هم نظر و هم امتیاز داده اند آموزش می بیند تا بتواند پس از آن با مشاهده نظر هر کاربر با هر تعداد کلمه ای امتیازی که احتمالا وی به آن محصول می داده را مشخص کند.
  • DNA sequence analysis : در این نوع از مسائل معمولا یک رشته DNA نویزی به شبکه داده می شود تا شبکه نویزهای آن را حذف کند و رشته DNA سالم را تحویل بدهد. (کلیک کنید.)
  • Machine Translation : با کمک شبکه های RNN می توان این کار را به صورت دقیق تری از ترجمه لغت به لغت انجام داد. در اصل شبکه پس از آموزش باید بتواند عبارت ها با تعداد کلمات متفاوت را از یک زبان به زبان دیگر ترجمه کند.
  • Video activity recognition : در این نوع از مسائل تلاش می شود تا شبکه طوری آموزش ببیند که پس از مشاهده چندین فریم از یک فیلم بتواند فعالیتی که در آن صحنه اتفاق می افتد تشخیص دهد.
  • Name entity recognition : در تمامی زبان ها بسیاری از کلمات می توانند اسم خاص باشند یا نباشند. (مثلا روحانی یا Harry Potter) در این مسائل هدف آموزش شبکه ای است که بتواند اسامی خاص را در جملات تشخیص دهد.
  • Speech Recognition : در این مساله برای آموزش شبکه ای تلاش می شود که بتواند صدا یا گفتار را به متن یا نوشتار تبدیل کند.

ادامه خواندن آشنایی با شبکه های عصبی بازگشتی – RNN

تطبیق و بازشناسی چهره (1)

جلسه بیستم – Face

برای شروع این مبحث ابتدا لازم تا با مفاهیم Face Verification و Face Recognition آشنا شویم. در مسائل Face Verification ما با دو تصویر سر و کار داریم و باید شبکه ای داشته باشیم که بتواند تشخیص بدهد آیا این عکس ها متعلق به دو فرد مختلف هستند یا خیر. یعنی مسائل Face Verification نوعی از مسائل binary هستند. اما در مسائل Face Recognition دیتابیسی شامل تصاویری از افراد متفاوت داریم و مدل باید تشخیص دهد که عکس ورودی جدید متعلق به کدام یک از این افراد است. هر مساله Face Verification را می توان به n مساله Face Recognition شکست؛ به این صورت که عکس جدید را با تصویر هر کدام از افراد موجود در دیتابیس بررسی کنیم و ببینیم که آیا این دو تصویر متعلق به یک فرد هستند یا خیر.

مفهوم دیگری که در ابتدا لازم است با آن آشنا شویم One Shot Learning است. اگر می خواستیم مساله Face Recognition را با روش های قدیمی حل کنیم، باید تعداد زیادی تصویر از افراد مختلف (مثلا 20 نفر) جمع آوری کنیم و سپس شبکه ای train کنیم که لایه آخر آن یک softmax با 20 نورون باشد. اما این رویکرد در حل مسائل واقعی عملی نیست؛ چون برای اضافه کردن یک فرد جدید، نیاز است تا ساختار شبکه (لایه آخر) را تغییر دهیم و شبکه را مجددا train کنیم. هم چنین ممکن است گاهی نیاز به اضافه کردن فردی به دیتابیس داشته باشیم که تعداد زیادی عکس از او در دسترس نباشد. در این جا نیاز به One Shot Learning داریم. هدف One Shot Learning این است که تنها با یک عکس از هر گروه، بتوانیم شبکه را train کنیم.

(اخیرا مبحثی به نام Zero Shot Learning نیز مطرح شده که در آن برای اضافه کردن یک کلاس به شبکه می توان از عکس جدیدی استفاده نکرد و به جای آن کلاس جدید با توجه به کلاس های قبلی که شبکه یاد گرفته توصیف می شود. هم چنین مفهوم دیگری به نام Low Shot Learning هم مطرح است که در آن از هر کلاس تعداد کمی عکس – مثلا 2 یا 3 تصویر – داریم.)

در مبحث Feature Extraction دیدیم که شبکه های کانولوشنال می توانند از تصاویر Separable Features استخراج کنند که با یک خط از هم تفکیک شوند. اما اگر بخواهیم برای این feature ها یک classifier با KNN داشته باشیم ممکن است به نتیجه خوبی نرسیم. (در شکل زیر نزدیک ترین همسایه به نقطه قرمز درون مربع زرد، نقطه سبز است.) برای همین گاهی لازم است به Discriminative Features داریم؛ یعنی feature ها علاوه بر قابل تفکیک بودن با یک خط، باید از هم فاصله داشته باشند.

رویکرد ما در این مسائل این است که به جای یاد دادن هر فرد به مدل، یک تابع شباهت یا similarity function به مدل یاد بدهیم که به آن اصطلاحا parameter learning گفته می شود. در این نوع از learning از هر عکس یک encoding یا embedding استخراج می کنیم و سپس با تعریف معیار فاصله، سعی می کنیم تا به شرایطی برسیم که فاصله دو عکس متفاوت از دو فرد یکسان عدد کوچک و فاصله دو عکس از فرد متفاوت عدد بزرگی به ما بدهد. با شبکه هایی که تا کنون نوشته ایم هم می توانیم تا حدی به این هدف دست پیدا کنیم. به این صورت که لایه softmax را دور ریخته و فاصله لایه های قبل از آخر را با یکدیگر حساب کنیم. در این صورت احتمالا برای افراد درون training set به performance خوبی هم می رسیم؛ اما شبکه generalize نیست و برای افرادی که در training set نباشند نتیجه خوبی نخواهد داشت. (شبکه های Siamese)

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

بنابراین نیاز است تا cost function ای پیدا کنیم که به ما برای رسیدن به این هدف کمک کند. از انواع cost function هایی که برای این منظور طراحی شده Triplet loss است که در سال ۲۰۱۵ و توسط گوگل معرفی شد. برای استفاده از این cost function لازم است تا batch size مضربی از ۳ باشد. سه عکسی که به شبکه داده می شوند Anchor، Positive (عکس دیگری از Anchor) و Negative (عکسی از فرد دیگری) نام دارند و می خواهیم داشته باشیم:

این فرمول یک ایراد دارد و آن این است که اگر f مستقل از ورودی رفتار کند و به ازای هر ورودی دقیقا یک خروجی یکسان بدهد (مثلا 0) این شرایط همیشه برقرار است. برای حل این مشکل و همچنین برای رسیدن به Discriminative Features به فرمول فوق margin اضافه می کنیم. در نتیجه با این فرمول فاصله دو فرد متفاوت حداقل باید به اندازه آلفا باشد.

اما از این نامساوی نمی توان برای محاسبه loss function استفاده کرد. برای این که این عبارت را به یک فرمول تبدیل کنیم داریم:

با توجه به این فرمول، اگر cost function برابر 0 باشد، به هدف رسیده ایم. اما اگر cost function بزرگ تر از صفر باشد لازم است تلاش کنیم تا آن را کوچک تر کنیم. (بهینه سازی)

نکته قابل تامل این است که این روش نیاز به تعداد تصاویر زیادی دارد؛ درنتیجه تعداد مجموعه عکس های سه تایی ای که می توانیم انتخاب کنیم خیلی زیاد است. اما برای درصد بالایی از آن ها loss function در همان ابتدا یا پس از اولین epoch صفر است. طی کردن کل پروسه train برای تصاویر با cost function برابر 0 هیچ تاثیری در وزن های شبکه ندارد و تنها زمان بر است. پس لازم است گزینه های چالشی تر برای train انتخاب شوند. استفاده از عکس های دوقلوها، گریم های سنگین و … می توانند باعث بهبود عملکرد شبکه شوند.