در این پروژه میخواهیم با آموزش یک سامانه یادگیری ماشین روی از مجموعه تصاویری که از چهرهها، به ازای هر تصویر چهره جدیدی که به سامانه نشان میدهیم. در صورت وجود چهره بین مجموعه آموزشی، آن را بازشناسی نماید.
مقدمه
پردازش چهره برای انسانها کار بسیار سادهای است در یک آزمایش نشان داده شده است که حتی یک نوزاد سه ساله میتواند چهرههای آشنا را تشخیص دهد. ولی اینکه این اطلاعات چگونه در مغز کدگذاری میشوند مشخص نیست و آزمایشهای متعددی برای یافتن کدگذاریهای مغز انجام شده است. برخی از سوالاتی که در این باره مطرح هستند را بیان میکنیم.
آیا تشخیص چهره در مغز انسان یک فرایند اختصاصی است؟
در سال ۱۹۸۶ در این مورد چهار آزمایش انجام شد و دانشمندان به این نتیجه رسیدند که تشخیص چهره مانند بقیهی پردازش تصویرهای دیگر در مغز انجام میشود و مهمترین دلیل آن هم این بود که افرادی که بیماری پروزوپاگنوسیس (Prosopagnosis) دارند، بیماریای که افراد چهرهها را به خوبی تشخیص نمیدهند، در تشخیص تصاویر دیگر نیز مشکل دارند.
ولی در سالهای اخیر دانشمندان آزمایشهایی انجام دادهاند و نتایج متفاوتی گرفتهاند و معتقدند که قسمتی کاملا اختصاصی در مغز برای تشخیص چهره وجود دارد. البته این بحث هنوز هم در بین دانشمندان در جریان است.آیا رنگ در تشخیص چهره برای انسان کاربرد دارد؟
بیشتر الگوریتمها از رنگ برای تشخیص چهره استفاده نمیکنند ولی جالب است که رنگ یکی از ملاکهای بسیار مهم برای تشخیص چهره در انسان است؛ مخصوصا برای عکسهایی که خراب شدهاند و یا کیفیت پایینی دارند.آیا تقارن در پردازش چهره نقش مهمی دارد؟
جواب به این سوال بله است و اثبات شده است که با در نظر گرفتن تقارن صورت مقدار قابل توجهی از ابعاد (در این باره بعداً توضیح داده خواهد شد) کاهش مییابد.
حال به بازشناسی چهره در سیستمها میپردازیم. پردازش چهره در سیستمها به طور کلی از دو مرحله تشکیل میشود.
آموزش: تصویر افراد را به برنامه نشان میدهد.
تشخیص: تصویرهای جدید به سیستم داده میشود و انتظار میرود افرادی را که قبلاً آموزش دیده را بشناسد.
در مرحله آموزش میتوان به سیستم فقط یک فرد را آموزش داد که در این صورت از سیستم به عنوان یک فقط تصویری استفاده شده است و یا یک پایگاه داده از افراد خاص مانند مجرمان به سیستم آموزش داده شود که میتوان از این سیستم در مراکز پلیس استفاده کرد. علاوه بر اینها بازشناسی کاربردهای بسیار زیادی در برنامههایی که ما استفاده میکنیم دارند مثلا فرایند Auto Tagging در بعضی از شبکههای مجازی از بازشناسی چهره استفاده میکند.
برنامههای تشخیص چهره از سه بخش کلی تشکیل شدهاند:
تشخیص چهره(Face Detection)
استخراج الگوها(Feature Extraction)
بازشناسی چهره(Face Recognition)
کارهای مرتبط
پردازش تصویر و بازشناسی چهره الگوریتمهای متعددی دارد که بعضی از آنها را که در مقالات مختلف به آنها اشاره شده بود در زیر میآوریم.
۱-بازشناسی چهره بر اساس ویژگیهای هندسی صورت قابل درکترین روش به نظر میرسد. یکی از اولین روشها نقاط نشانگذاری( محل چشمها، بینی، گوش و ...) شده است که بر این اساس یک بردار ویژگی( فاصلهی بین این نقاط، زاویهی بین این نقاط و ...) ساخته میشود. سپس بین این بردارهای تصویر جدید داده شده و تصویرهای آموزش داده شده فاصله اقلیدسی گرفته میشود. این روش مشکلات زیادی دارد و بعدا به این نتیجه رسیدند که ویژگیهای اجزای منفرد صورت برای تشخیص چهره کار مناسبی نیست.[1]
۲-روش EigenFace تاثیر زیادی بر الگوریتمهای پردازش تصویر گذاشت این روش در سال 1991 توسط ترک و پنتلند پیشنهاد شد. در این روش هدف این است که دادهها تا حد امکان غیروابسته شوند و به دنبال بردارهای متعامدی میگردد که تا حد امکان این خواسته را برآورده کنند و برای این کار از آنالیز المانهای اصلی یا به اختصار PCA استفاده میکند. اساس این روش بر این باور است که تمامی قسمتهای صورت برای بازشناسی به یک اندازه مهم نیستند و مثلا هنگامی که ما به یک فرد نگاه میکنیم به چشمها، بینی، گونهها و پیشانی بیشتر نگاه میکنیم و اینها در تشخیص چهره افراد مهمتر است.
هنگامی که ما به یک فرد نگاه میکنیم به دنبال قسمتهای که بیشترین تغییرات در آنها رخ میدهد هستیم مثلا فاصلهی بین دهان تا بینی. این الگوریتم ابتدا قسمتهای مهم (دارای بیشترین تغییر) را به دست میآورد و سپس آنها را برای تشخیص چهرهی فرد مقایسه میکند.
مشکل اول این الگوریتم این است که به میزان روشنایی نیز به عنوان یک نکتهی مهم در تشخیص چهره اهمیت میدهد و چهرهی افراد در نورهای متفاوت و یا با زاویههای متفاوت عوض میشود و دوم این که این الگوریتم ویژگیهای کل دادهها را با هم دیگر به دست میآورد و در واقع ممکن است ویژگیهای چهره یک فرد در انتخاب ویژگیها در بقیه دادههای تست تاثیر بگذارد.[2]
۳-روش FisherFace شباهت زیادی به روش EigenFace دارد فقط کمی پیشرفتهتر شده است. الگوریتم EigenFace به تمام عکسهای تست به طور همزمان نگاه میکند و قسمتهای مهم در تشخیص چهره را پیدا میکند و در واقع به ویژگیهایی که یک فرد مشخص را از بقیه متمایز میسازد نگاه نمیکند.
این الگوریتم ویژگیهای چهرههای افراد را به طور جداگانه به دست میآورد و مانند الگوریتم قبلی یک ویژگی از یک فرد بر ویژگیهای سایر افراد تاثیر نمیگذارد.
البته الگوریتم FisherFace یکی از مشکلات الگوریتم EigenFace را برطرف کرد که آن تاثیر ویژگیهای یک فرد بر بقیه افراد بود ولی تاثیر میزان روشنایی نور در این الگوریتم هنوز وجود دارد.
۴-روش LBPH تلاش کرده است که ایرادات روشهای FisherFace و EigenFace را برطرف کند (تاثیر میزان روشنایی). این الگوریتم به طور یکجا به کل تصویر نگاه نمیکند بلکه به pixelها و مقایسههای آنها با pixelهای کناری خود میپردازد. این الگوریتم تا میزان خوبی تاثیر میزان روشنایی را کم کرده است.
۵-یک الگوریتم تشخیص چهره بر اساس روش 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 میگویند.
برای پیادهسازی ابتدا نیاز به یک دیتاست برای یادگیری چهرهها داریم برای اینکار از دو دیتاست متفاوت استفاده کردیم.
۱-دیتاست اول، دیتاستی بود که خودمان به وجود آورده بودیم که شامل ۱۰ نفر و از هر نفر تعداد متفاوتی عکس با حالتهای چهرهی متفاوت مانند خندان، ناراحت، متعجب و ... بود (با کیفیتهای متفاوت)
۲-دیتاست دوم دیتاست دانشگاه کمبریج بود که در آن ۴۰ چهره و در کل ۴۰۰ عکس وجود داشت و برای هر عکس حالتهای نور از وسط، با عینک و بدون عینک، شاد، نور از چپ و راست، خواب، چشمک زدن و متعجب وجود داشت(۱۰حالت).
۹ تا از این دیتاها را برای Train در نظر گرفتیم و یکی را برای Test.
نکتهای که در هنگام پیادهسازی با آن مواجه شدیم این بود که EigenFace و FisherFace برای یادگیری و تست به عکسهایی با تعداد پیکسل یکسان نیاز دارند و نمیتوان عکسهای با کیفیت متفاوت و یا ابعاد متفاوت به آنها داد، البته با کمک OpenCV پیادهسازی نسبتا آسانی دارند و فقط کافی است از Face_recognizer مورد نظر استفاده کنیم ولی از آنجایی که دیتاستی که داشتیم شامل عکسهای با سایز یکسان نبود الگوریتم LBPH را توضیح میدهیم که تقریبا شبیه به Modular PCA هم است و خروجی بهتری دارد.
الگوریتم LBPH به این ترتیب عمل میکند که یک آرایه ۳*۳ میسازد و آن را از روی کل عکس عبور میدهد و یک پیکسل را با خانههای مجاورش مقایسه میکند اگر مقدار intensity در آن خانه کمتر یا مساوی با خانه مجاور بود مقدار ۱ را قرار میدهیم و در غیر این صورت مقدار صفر. سپس از این این جدول باینری به دست آمده یک دور ساعتگرد میچرخیم و عدد را تبدیل به مبنای ۱۰ میکنیم.
سپس از این عددهای مبنای ده یک نمودار هیستوگرام میسازیم.
در آخر هر عکس با یک هیستوگرام متناظر میشود. حال هنگامی که تمام دادههای Train را تبدیل به هیستوگرام کرد عکسی که میخواهد توسط آن تست را انجام دهد با هیستوگرامهای قبلی مقایسه میکند و فرد مورد نظر را پیدا میکند.
حال چند مثال از عکسهای train و test شده را میآوریم(دیتاست دانشگاه کمبریج):
خروجی برنامه:
چند مثال از دیتاست شخصی:
خروجی برنامه:
ارزیابی خروجی
برای ارزیابی خروجی از دیتاست دانشگاه استفاده کردیم و هنگامی که برای هر 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]
پیوندهای مفید
[مقاله از شناخت چهره با استفاده از PCA چند لایه و شبکه ی عصبی خطی] http://www.civilica.com/Paper-ACCSI12-ACCSI12_185.htm