در این پروژه می‌خواهیم با آموزش یک سامانه یادگیری ماشین روی از مجموعه تصاویری که از چهره‌ها، به ازای هر تصویر چهره جدیدی که به سامانه نشان می‌دهیم. در صورت وجود چهره بین مجموعه آموزشی، آن را بازشناسی نماید.

مقدمه


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

  • آیا تشخیص چهره در مغز انسان یک فرایند اختصاصی است؟
    در سال ۱۹۸۶ در این مورد چهار آزمایش انجام شد و دانش‌مندان به این نتیجه رسیدند که تشخیص چهره مانند بقیه‌ی پردازش تصویرهای دیگر در مغز انجام می‌شود و مهم‌ترین دلیل آن هم این بود که افرادی که بیماری پروزوپاگنوسیس (Prosopagnosis) دارند،‌ بیماری‌ای که افراد چهره‌ها را به خوبی تشخیص نمی‌دهند، در تشخیص تصاویر دیگر نیز مشکل دارند.
    ولی در سال‌های اخیر دانش‌مندان آزمایش‌هایی انجام داده‌اند و نتایج متفاوتی گرفته‌اند و معتقدند که قسمتی کاملا اختصاصی در مغز برای تشخیص چهره وجود دارد. البته این بحث هنوز هم در بین دانش‌مندان در جریان است.

  • آیا رنگ در تشخیص چهره برای انسان کاربرد دارد؟
    بیش‌تر الگوریتم‌ها از رنگ برای تشخیص چهره استفاده نمی‌کنند ولی جالب است که رنگ یکی از ملاک‌های بسیار مهم برای تشخیص چهره در انسان است؛ مخصوصا برای عکس‌هایی که خراب شده‌اند و یا کیفیت پایینی دارند.

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

حال به بازشناسی چهره در سیستم‌ها می‌پردازیم. پردازش چهره در سیستم‌ها به طور کلی از دو مرحله تشکیل می‌شود.

  1. آموزش: تصویر افراد را به برنامه نشان می‌دهد.

  2. تشخیص: تصویر‌های جدید به سیستم داده می‌شود و انتظار می‌رود افرادی را که قبلاً آموزش دیده را بشناسد.

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

به عنوان قفل تصویری

برنامه‌های تشخیص چهره از سه بخش کلی تشکیل شده‌اند:

  1. تشخیص چهره(Face Detection)

  2. استخراج الگوها(Feature Extraction)

  3. بازشناسی چهره(Face Recognition)

کارهای مرتبط


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

۲-روش EigenFace تاثیر زیادی بر الگوریتم‌های پردازش تصویر گذاشت این روش در سال 1991 توسط ترک و پنتلند پیشنهاد شد. در این روش هدف این است که داده‏‌ها تا حد امکان غیروابسته شوند و به دنبال بردارهای متعامدی می‌گردد که تا حد امکان این خواسته را برآورده کنند و برای این کار از آنالیز المان‌های اصلی یا به اختصار PCA استفاده می‌‏کند. اساس این روش بر این باور است که تمامی قسمت‌های صورت برای بازشناسی به یک اندازه مهم نیستند و مثلا هنگامی که ما به یک فرد نگاه می‌کنیم به چشم‌ها، بینی، گونه‌ها و پیشانی بیشتر نگاه می‌کنیم و این‌ها در تشخیص چهره افراد مهم‌تر است.
هنگامی که ما به یک فرد نگاه می‌کنیم به دنبال قسمت‌های که بیش‌ترین تغییرات در آن‌ها رخ می‌دهد هستیم مثلا فاصله‌ی بین دهان تا بینی. این الگوریتم ابتدا قسمت‌های مهم (دارای بیش‌ترین تغییر) را به دست می‌آورد و سپس آن‌ها را برای تشخیص چهره‌ی فرد مقایسه می‌کند.
مشکل اول این الگوریتم این است که به میزان روشنایی نیز به عنوان یک نکته‌ی مهم در تشخیص چهره اهمیت می‌دهد و چهره‌ی افراد در نور‌های متفاوت و یا با زاویه‌های متفاوت عوض می‌شود و دوم این که این الگوریتم ویژگی‌های کل داده‌ها را با هم دیگر به دست می‌آورد و در واقع ممکن است ویژگی‌های چهره یک فرد در انتخاب ویژگی‌ها در بقیه داده‌های تست تاثیر بگذارد.[2]

یک چهره که با EigenFace قسمت‌های مهم جدا شده

۳-روش FisherFace شباهت زیادی به روش EigenFace دارد فقط کمی پیشرفته‌تر شده است. الگوریتم EigenFace به تمام عکس‌های تست به طور همزمان نگاه می‌کند و قسمت‌های مهم در تشخیص چهره را پیدا می‌کند و در واقع به ویژگی‌هایی که یک فرد مشخص را از بقیه متمایز می‌سازد نگاه نمی‌کند.
این الگوریتم ویژگی‌های چهره‌های افراد را به طور جداگانه به دست می‌آورد و مانند الگوریتم قبلی یک ویژگی از یک فرد بر ویژگی‌های سایر افراد تاثیر نمی‌گذارد.
البته الگوریتم FisherFace یکی از مشکلات الگوریتم EigenFace را برطرف کرد که آن تاثیر ویژگی‌های یک فرد بر بقیه افراد بود ولی تاثیر میزان روشنایی نور در این الگوریتم هنوز وجود دارد.

یک چهره که با FisherFace قسمت‌های مهم جدا شده

۴-روش LBPH تلاش کرده است که ایرادات روش‌های FisherFace و EigenFace را برطرف کند (تاثیر میزان روشنایی). این الگوریتم به طور یک‌جا به کل تصویر نگاه نمی‌کند بلکه به pixelها و مقایسه‌های آن‌ها با pixelهای کناری خود می‌پردازد. این الگوریتم تا میزان خوبی تاثیر میزان روشنایی را کم کرده است.

یک چهره که با LBPH قسمت‌های مهم جدا شده: همان‌طور که می‌بینید میزان تاثیر روشنایی خیلی کم است

۵-یک الگوریتم تشخیص چهره بر اساس روش Modular PCAاست. الگوریتم پیشنهادی با الگوریتم PCA معمولی مقایسه شده است بهبود نرخ تشخیص برای تصاویر چهره با تغییرات زیادی در جهت روشنایی و بیان صورت. در روش پیشنهادی، تصاویر چهره ها را به کوچکتر زیر تصاویر تقسیم و رویکرد PCA است به هر یک از این زیر تصاویر اعمال می شود. از آنجا که برخی از ویژگی های محلی صورت یک فرد انجام است حتی زمانی که ژست، جهت روشنایی و بیان صورت متفاوت است، ما انتظار داریم که روش ارائه شده قادر به مقابله با این تغییرات است.[3]

۶-در مقاله ای از Trupti M. Kodinariya با ترکیب الگوریتم PCA با چند الگوریتم دیگر یک روش ترکیبی ارائه شده است. که در دو حالت کار می‌کند:

  • تمرین

  • دسته‌بندی
    حالت تمرین شامل نرمال سازی و استخراج ویژگی از تصاویر با استفاده از الگوریتم PCA, ICA می باشد. سپس ویژگی های استخراج شده, با استفاده از BPNN ها (back propagation neural network) تمرین داده می شوند تا فضای ویژگی ها به کلاسهای متفاوت دسته بندی شوند.[4]

۷-در مقاله ای از احمد محمودی, روشی با نام EigenFace چند لایه ارائه شده است. در این روش برای محاسبه ی مولفه های اصلی از یک شبکه عصبی خطی استفاده شده است, که علاوه بر کاهش حجم مورد نیاز برای محاسبات, طراحی سخت افزار آن بسیارساده تر خواهد بود. همچنین با توجه به قابلیت های شبکه عصبی در پردازش موازی, سرعت انجام محاسبات افزایش چشم گیری داشته است.

آزمایش‌ها


سه تا از الگوریتم‌های بالا توسط کتاب‌خانه‌ی OpenCV پیاده سازی شده‌اند که در این پروژه ما از این سه الگوریتم استفاده میکنیم:
EigenFace ,FisherFace, LBPH
که البته پیش از بازشناسی چهره باید آن را تشخیص بدهیم برای این‌ کار باز هم از یک روشی استفاده کردیم که در OpenCV پیاده‌سازی شده است؛ الگوریتم Cascade یا آبشاری. در این الگوریتم‌ها در مراحل مختلف ویژگی‌های متفاوتی به ترتیب بررسی می‌شود و اگر در یکی از آن‌ها ویژگی مورد نظر برآورده نشود سراغ مرحله‌ی بعدی نمی‌رود. به ویژگی‌های ذکر شده Haar Features می‌گویند.

ویژگی‌های ‌Haar

برای پیاده‌سازی ابتدا نیاز به یک دیتاست برای یادگیری چهره‌ها داریم برای این‌کار از دو دیتاست متفاوت استفاده کردیم.
۱-دیتاست اول، دیتاستی بود که خودمان به وجود آورده بودیم که شامل ۱۰ نفر و از هر نفر تعداد متفاوتی عکس با حالت‌های چهره‌ی متفاوت مانند خندان،‌ ناراحت، متعجب و ... بود (با کیفیت‌‌های متفاوت)
۲-دیتاست دوم دیتاست دانشگاه کمبریج بود که در آن ۴۰ چهره و در کل ۴۰۰ عکس وجود داشت و برای هر عکس حالت‌های نور از وسط، با عینک و بدون عینک، شاد، نور از چپ و راست، خواب، چشمک زدن و متعجب وجود داشت(۱۰حالت).
۹ تا از این دیتا‌ها را برای Train در نظر گرفتیم و یکی را برای Test.
نکته‌ای که در هنگام پیاده‌سازی با آن مواجه شدیم این بود که EigenFace و ‌FisherFace برای یادگیری و تست به عکس‌هایی با تعداد پیکسل یکسان نیاز دارند و نمی‌توان عکس‌های با کیفیت متفاوت و یا ابعاد متفاوت به آن‌ها داد، البته با کمک OpenCV پیاده‌سازی نسبتا آسانی دارند و فقط کافی است از Face_recognizer مورد نظر استفاده کنیم ولی از آن‌جایی که دیتاستی که داشتیم شامل عکس‌های با سایز یکسان نبود الگوریتم LBPH را توضیح می‌دهیم که تقریبا شبیه به Modular PCA هم است و خروجی بهتری دارد.
الگوریتم LBPH به این ترتیب عمل می‌کند که یک آرایه ۳*۳ می‌سازد و آن را از روی کل عکس عبور می‌دهد و یک پیکسل را با خانه‌های مجاورش مقایسه می‌کند اگر مقدار intensity در آن خانه کمتر یا مساوی با خانه مجاور بود مقدار ۱ را قرار می‌دهیم و در غیر این صورت مقدار صفر. سپس از این این جدول باینری به دست آمده یک دور ساعتگرد می‌چرخیم و عدد را تبدیل به مبنای ۱۰ می‌کنیم.
از جدول باینری یک عدد در مبنای ده در میاوریم

سپس از این عددهای مبنای ده یک نمودار هیستوگرام می‌سازیم.
یک نمونه از این هیستوگرام‌ها

در آخر هر عکس با یک هیستوگرام متناظر می‌شود. حال هنگامی که تمام داده‌های Train را تبدیل به هیستوگرام کرد عکسی که می‌خواهد توسط آن تست را انجام دهد با هیستوگرام‌های قبلی مقایسه می‌کند و فرد مورد نظر را پیدا می‌کند.
حال چند مثال از عکس‌های train و test شده را می‌آوریم(دیتاست دانشگاه کمبریج):
تصویر مربوط به عکس نفر ۱۸ ام در دیتاست اول است (برای یادگیری)

خروجی برنامه:
به درستی تشخیص داده شده که subject۱۸ ام است(تست)

چند مثال از دیتاست شخصی:

عکس‌هایی که برای یادگیری فرد اول داده شده

عکس‌هایی که برای یادگیری فرد دوم داده شده

خروجی برنامه:
خروجی برنامه افراد را به درستی شناخته است!

ارزیابی خروجی

برای ارزیابی خروجی از دیتاست دانشگاه استفاده کردیم و هنگامی که برای هر subject با ۹ عکس یادگیری انجام می‌شد و با ۱ عکس تست انجام می‌شد نتیجه‌ به صورت زیر بود:

ارزیابی نتایج (با دیتاست دانشگاه)

دلیل نسبتا پایین بودن درصد درستی این است که در این دیتاست عکس‌ها کاملا از چهره گرفته شده‌اند و بعضی عکس‌ها حاشیه‌ای ندارد، از آن‌جایی که کد ما ابتدا چهره را پیدا می‌کند و سپس روی آن‌ها الگوریتم را اجرا می‌کند در این موارد نمی‌تواند چهره را به درستی پیدا می‌کند و عکس را به عنوان یک عکسِ اشتباه در نظر می‌گیرد. (در واقع می‌توان گفت بعضی عکس‌ها زیادی زوم شده هستند)

بهبود نتایج

کلاسیفایر Cascade که در برنامه استفاده کردیم دو پارامتر minNeighbors و ScaleFactor دارد که با تغییر آن‌ها می‌توان نتایج را بهبود بخشید. از آن‌جایی که مشکل اصلی یا گلوگاه کار در پیدا کردن چهره در تصویر بود؛ در تصویر ها‌یی که چهره را پیدا نمی‌کرد چند ین بار عکس را با حالت های مختلفی از ScaleFactor و minNeighbors بررسی می‌کند تا بتواند چهره را به درستی تشخیص دهد.(برای اضافه کردن این بهبود باید در کد accuracy را برابر با high قرار دهید زیرا حالت defaul آن برای سرعت بیش‌تر برابر با low قرار داده شده است).
درصد درستی با اضافه کردن این تغییر مانند جدول زیر شد.

ارزیابی نتایج بعد از بهبود (با دیتاست دانشگاه)

میزان بهبود نتایج با این تغییر به طرز عجیبی بالا بود و به ۱۰۰٪ درست تشخیص دادن در مورد دیتاست موجود رسید.

آدرس دسترسی به گیت کد
(قبل از اجرا می‌توانید برای کار کردن راحت‌تر با کد readme.txt را بخوانید)

کارهای آینده


الگوریتم‌های بهتر و قوی‌تری از EigenFace و FisherFace و LBPH نیز وجود دارند که برای بهبود نتایج می‌توان از آن‌ها استفاده کرد برای مثال الگوریتم (HOGs(Histogram of Oriented Gradients و الگوریتم شبکه عصبی.
الگوریتم‌های پیشرفته‌ی تشخیص چهره ترکیبی از OpenCV و یادگیری ماشین هستند که می‌توان برای بهبود از آن‌ها استفاده کرد.

مراجع


  • Chiara Turati, Viola Macchi Cassia, F. S., and Leo, I. Newborns face recognition: Role of inner and outer facial features. Child Development 77, 2 (2006), 297–311.

  • Kanade, T. Picture processing system by computer complex and recognition of human faces. PhD thesis, Kyoto University, November 1973.

  • Brunelli, R., Poggio, T. Face Recognition through Geometrical Features. European Conference on Computer Vision (ECCV) 1992, S. 792–800.[1]

  • M. Turk and A. Pentland, "Eigenfaces for Recognition", Journal of Cognitive Neuroscience, vol.3, no.1, pp.71-86, 1991, hard copy.[2]

  • Trupti M. Kodinariya: Hybrid Approach to Face Recognition System using Principle component and Independent component with score based fusion process. CoRR abs/1401.0395 (2014).[4]

  • Gottumukkal, Rajkiran and Asari, Vijayan K.. An improved face recognition technique based on modular PCA approach. . In Pattern Recognition Letters, (25) 4: 429-436, Year 2004 .[3]

پیوندهای مفید


تایید شده

سلام
1- در بخش مقدمه ترجیحا بهتر بود که ابتدا مواردی که بازشناسی چهره در آن ها کاربرد دارند را گفته و مقداری سعی بر ترغیب کردن و علاقه مند کردن خواننده به موضوع مورد بحث می کردید. اما تنها یک مورد (استفاده در مراکز پلیس) را در آخر بخش ذکر کردید
2- بخش کارهای مرتبط شما خوب و خلاصه است و مقالات مهم درین زمینه را پوشش داد. بهتر بود که معادل لاتین بعضی اصطلاحاتی که ترجمه کردید را هم در ذیل می آوردید تا خوانندگان مقالات اصلی بتوانند با این بخش راحت تر ارتباط برقرار کنند.
3- توضیحات ارائه شده در بخش آزمایش ها با توجه به اهمیت بخش کم بود و به طور کامل با مراحل کار شما آشنا نشدم. در بخش بهبود نتایج به نظرم بدست آوردن و گزارش کردن نتیجه ی "صد در صد درست" علمی نیست. روش کار شما قطعا کاستی هایی دارد و باید بتوان روش های بهتر را با آن مقایسه کرد که درحال حاضر چنین امکانی وجود ندارد. میتوانستید از دیتاست مربوط به تصاویر پیچیده تر استفاده کنید یا برای مثال نمودار مربوط به زمان مورد نیاز برای یادگیری و پاسخ دهی روش خود را می آوردید.
به جز موارد گفته شده در کل کار شما خوب و قابل فهم بود. خسته نباشید!

تایید شده

سلام.
توضیحات شما درباره ی مقدمات و شرح مساله وهم چنین توضیحات پیاده سازی بسیار خوب بود.فقط چند نکته به نظرم رسید.میتوانستید از منابع جدیدتری استفاده کنید اگر به بخش مراجع خود نگاه کنید،منابعی از سال 2014 به بعد را استفاده نکردید.پیشنهاد می‌شود برای فازهای آینده،‌ پیچیدگی الگوریتم‌ها با همدیگر مقایسه شود.این الگوریتم‌ها نیاز به پردازش‌های سنگینی دارند. آیا این الگوریتم‌ها می‌توانند بر روی موبایل‌ها، یا ابزارهای هوشمندی که قدرت محاسباتی بالایی ندارند اجرا شوند؟ در صورت منفی بودن پاسخ این سوال، بسیار خوب است که به روی الگوریتم‌هایی کار کنید که خلاصه و ساده باشند ولی با درصد خوبی جواب دهند یا سعی کنید الگوریتم‌های موجود را، طوری ساده سازی کنید که بسیار سریع اجرا شوند. در کل مقایسه سرعت اجرای الگوریتم های موجود یک اقدام خوب است!بهتر بود کدتون رو از جنبه های بیشتری آزمایش کنید. مثلاْ تغییر میزان روشنایی و ...امیدوارم پیشنهادات بنده به بهبود پروژه شما کمک کند.

تایید شده

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

سعید عادل مهربان

سلام.
قبل از هر چیز باید گله کنم که چرا در مورد ارجاعات مشکلی که بهتون گفته بودم رو حل نکردید؟ متن هم‌چنان ارجاع همراه با شماره نداره.
در مورد این فاز تقریباً کار نظری که خواسته شده رو انجام دادید هر چند می‌تونستید الگوریتم‌ها رو با جزئیات بیشتری بررسی کنید. نقطه ضعف کار شما در این مرحله ارزیابی بود که بخشی از اون به ناآشنایی شما با معیارهای ارزیابی و بخش دیگه به حجم کم مجموعه داده برمی‌گرده. بنابراین در همین مرحله معیارهای ارزیابی نظیر precision و recall رو بررسی کنید و بخش ارزیابی رو به‌روز کنید و برای مرحلهٔ بعد مجموعه دادهٔ LFW رو برای کار انتخاب کنید.