تطبیق و بازشناسی چهره (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 انتخاب شوند. استفاده از عکس های دوقلوها، گریم های سنگین و … می توانند باعث بهبود عملکرد شبکه شوند.

فوتر سایت

اسلایدر سایدبار

درباره ما

درباره ما

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

شبکه های اجتماعی

مطالب اخیر