![](http://www.nec.com/en/global/solutions/safety/face_recognition/images/Face_Recognition_FR_Pic3.PNG)
در این پروژه میخواهیم با آموزش یک سامانه یادگیری ماشین روی از مجموعه تصاویری که از چهرهها، به ازای هر تصویر چهره جدیدی که به سامانه نشان میدهیم. در صورت وجود چهره بین مجموعه آموزشی، آن را بازشناسی نماید.
##مقدمه
---
پردازش چهره برای انسانها کار بسیار سادهای است در یک آزمایش نشان داده شده است که حتی یک نوزاد سه ساله میتواند چهرههای آشنا را تشخیص دهد. ولی اینکه این اطلاعات چگونه در مغز کدگذاری میشوند مشخص نیست و آزمایشهای متعددی برای یافتن کدگذاریهای مغز انجام شده است. برخی از سوالاتی که در این باره مطرح هستند را بیان میکنیم.
+ آیا تشخیص چهره در مغز انسان یک فرایند اختصاصی است؟
در سال ۱۹۸۶ در این مورد چهار آزمایش انجام شد و دانشمندان به این نتیجه رسیدند که تشخیص چهره مانند بقیهی پردازش تصویرهای دیگر در مغز انجام میشود و مهمترین دلیل آن هم این بود که افرادی که بیماری پروزوپاگنوسیس (Prosopagnosis) دارند، بیماریای که افراد چهرهها را به خوبی تشخیص نمیدهند، در تشخیص تصاویر دیگر نیز مشکل دارند.
ولی در سالهای اخیر دانشمندان آزمایشهایی انجام دادهاند و نتایج متفاوتی گرفتهاند و معتقدند که قسمتی کاملا اختصاصی در مغز برای تشخیص چهره وجود دارد. البته این بحث هنوز هم در بین دانشمندان در جریان است.
+ آیا رنگ در تشخیص چهره برای انسان کاربرد دارد؟
بیشتر الگوریتمها از رنگ برای تشخیص چهره استفاده نمیکنند ولی جالب است که رنگ یکی از ملاکهای بسیار مهم برای تشخیص چهره در انسان است؛ مخصوصا برای عکسهایی که خراب شدهاند و یا کیفیت پایینی دارند.
+ آیا تقارن در پردازش چهره نقش مهمی دارد؟
جواب به این سوال بله است و اثبات شده است که با در نظر گرفتن تقارن صورت مقدار قابل توجهی از ابعاد (در این باره بعداً توضیح داده خواهد شد) کاهش مییابد.
حال به بازشناسی چهره در سیستمها میپردازیم. پردازش چهره در سیستمها به طور کلی از دو مرحله تشکیل میشود.
1. آموزش: تصویر افراد را به برنامه نشان میدهد.
2. تشخیص: تصویرهای جدید به سیستم داده میشود و انتظار میرود افرادی را که قبلاً آموزش دیده را بشناسد.
در مرحله آموزش میتوان به سیستم فقط یک فرد را آموزش داد که در این صورت از سیستم به عنوان یک فقط تصویری استفاده شده است و یا یک پایگاه داده از افراد خاص مانند مجرمان به سیستم آموزش داده شود که میتوان از این سیستم در مراکز پلیس استفاده کرد. علاوه بر اینها بازشناسی کاربردهای بسیار زیادی در برنامههایی که ما استفاده میکنیم دارند مثلا فرایند Auto Tagging در بعضی از شبکههای مجازی از بازشناسی چهره استفاده میکند.
![به عنوان قفل تصویری](https://legitreviews.com/images/news/2011/boute.s3.amazonaws.com/232-face-lock.jpg)
برنامههای تشخیص چهره از سه بخش کلی تشکیل شدهاند:
1. تشخیص چهره(Face Detection)
2. استخراج الگوها(Feature Extraction)
3. بازشناسی چهره(Face Recognition)
##کارهای مرتبط
---
پردازش تصویر و بازشناسی چهره الگوریتمهای متعددی دارد که بعضی از آنها را که در مقالات مختلف به آنها اشاره شده بود در زیر میآوریم.
۱-بازشناسی چهره بر اساس ویژگیهای هندسی صورت قابل درکترین روش به نظر میرسد. یکی از اولین روشها نقاط نشانگذاری( محل چشمها، بینی، گوش و ...) شده است که بر این اساس یک بردار ویژگی( فاصلهی بین این نقاط، زاویهی بین این نقاط و ...) ساخته میشود. سپس بین این بردارهای تصویر جدید داده شده و تصویرهای آموزش داده شده فاصله اقلیدسی گرفته میشود. این روش مشکلات زیادی دارد و بعدا به این نتیجه رسیدند که ویژگیهای اجزای منفرد صورت برای تشخیص چهره کار مناسبی نیست.
۲-روش EigenFace تاثیر زیادی بر الگوریتمهای پردازش تصویر گذاشت این روش در سال 1991 توسط ترک و پنتلند پیشنهاد شد. در این روش هدف این است که دادهها تا حد امکان غیروابسته شوند و به دنبال بردارهای متعامدی میگردد که تا حد امکان این خواسته را برآورده کنند و برای این کار از آنالیز المانهای اصلی یا به اختصار PCA استفاده میکند.
۳-در یک مقالهی دیگر روشی به نام Modular PCA آورده شده بود که مبحث اثر زاویهی نور را در الگوریتم PCA ساده بهبود بخشیده بود، در این روش ابتدا عکس را به قسمتهای کوچکتری تبدیل کرده و سپس روی هر قسمت این الگوریتم را استفاده میکند و به این ترتیب از زاویهی تابش نور بر تغییر چهرهی فرد جلوگیری میکند.
۴-در مقاله ای از Trupti M. Kodinariya با ترکیب الگوریتم PCA با چند الگوریتم دیگر یک روش ترکیبی ارائه شده است. که در دو حالت کار میکند:
+ تمرین
+ دستهبندی
حالت تمرین شامل نرمال سازی و استخراج ویژگی از تصاویر با استفاده از الگوریتم PCA, ICA می باشد. . سپس ویژگی های استخراج شده, با استفاده از BPNN ها (back propagation neural network) تمرین داده می شوند تا فضای ویژگی ها به کلاسهای متفاوت دسته بندی شوند.
۵-در مقاله ای از احمد محمودی, روشی با نام PCA چند لایه ارائه شده است. در این روش برای محاسبه ی مولفه های اصلی از یک شبکه عصبی خطی استفاده شده است, که علاوه بر کاهش حجم مورد نیاز برای محاسبات, طراحی سخت افزار آن بسیارساده تر خواهد بود. همچنین با توجه به قابلیت های شبکه عصبی در پردازش موازی, سرعت انجام محاسبات افزایش چشم گیری داشته است.
برخی کارهای مرتبط دیگر نیز در شرکتهای مهمی انجام شده است که بعضی از آنها را میآوریم.
گوگل: Google Cloud Vision که با استفاده Framework TensoFlow کار میکند و به کاربران این امکان را میدهد که این تصاویر در google جستوجو کنند.
آیبیام: این برنامه که به عنوان بخشی از پروژه Watson Developer Cloud شناخته میشود، از امکانات پیشفرض خوب و کارآمدی برخوردار است. این برنامه نیز همچون رابط کاربری گوگل از سیستم OCR و تشخیص NSFW برخوردار است. Clarif.ai میگوید: این سرویس تازه وارد به عرصه تشخیص تصاویر شده است که از رابط برنامه نویسی REST نیز پشتیبانی میکند. یکی از نکات جالب این برنامه، پشتیبانی از ماژولهای مختلفی است که میتوانند در ساخت الگوریتمهایی که قابلیت تشخیص شرایط مختلف از جمله جشن عروسی، مسافرت و غذا و رستوران را دارند، کمک کنند.
##آزمایشها
---
##کارهای آینده
---
##مراجع
---
+ 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.
+ M. Turk and A. Pentland, "Eigenfaces for Recognition", Journal of Cognitive Neuroscience, vol.3, no.1, pp.71-86, 1991, hard copy.
+ 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).
+ 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 .[1]
۲-روش EigenFace تاثیر زیادی بر الگوریتمهای پردازش تصویر گذاشت این روش در سال 1991 توسط ترک و پنتلند پیشنهاد شد. در این روش هدف این است که دادهها تا حد امکان غیروابسته شوند و به دنبال بردارهای متعامدی میگردد که تا حد امکان این خواسته را برآورده کنند و برای این کار از آنالیز المانهای اصلی یا به اختصار PCA استفاده میکند. اساس این روش بر این باور است که تمامی قسمتهای صورت برای بازشناسی به یک اندازه مهم نیستند و مثلا هنگامی که ما به یک فرد نگاه میکنیم به چشمها، بینی، گونهها و پیشانی بیشتر نگاه میکنیم و اینها در تشخیص چهره افراد مهمتر است.
هنگامی که ما به یک فرد نگاه میکنیم به دنبال قسمتهای که بیشترین تغییرات در آنها رخ میدهد هستیم مثلا فاصلهی بین دهان تا بینی. این الگوریتم ابتدا قسمتهای مهم (دارای بیشترین تغییر) را به دست میآورد و سپس آنها را برای تشخیص چهرهی فرد مقایسه میکند.
مشکل اول این الگوریتم این است که به میزان روشنایی نیز به عنوان یک نکتهی مهم در تشخیص چهره اهمیت میدهد و چهرهی افراد در نورهای متفاوت و یا با زاویههای متفاوت عوض میشود و دوم این که این الگوریتم ویژگیهای کل دادهها را با هم دیگر به دست میآورد و در واقع ممکن است ویژگیهای چهره یک فرد در انتخاب ویژگیها در بقیه دادههای تست تاثیر بگذارد.[2]
![یک چهره که با EigenFace قسمتهای مهم جدا شده](https://www.superdatascience.com/wp-content/uploads/2017/08/Image-6-EigenFaces.png)
۳-روش FisherFace شباهت زیادی به روش EigenFace دارد فقط کمی پیشرفتهتر شده است. الگوریتم EigenFace به تمام عکسهای تست به طور همزمان نگاه میکند و قسمتهای مهم در تشخیص چهره را پیدا میکند و در واقع به ویژگیهایی که یک فرد مشخص را از بقیه متمایز میسازد نگاه نمیکند.
این الگوریتم ویژگیهای چهرههای افراد را به طور جداگانه به دست میآورد و مانند الگوریتم قبلی یک ویژگی از یک فرد بر ویژگیهای سایر افراد تاثیر نمیگذارد.
البته الگوریتم FisherFace یکی از مشکلات الگوریتم EigenFace را برطرف کرد که آن تاثیر ویژگیهای یک فرد بر بقیه افراد بود ولی تاثیر میزان روشنایی نور در این الگوریتم هنوز وجود دارد.
![یک چهره که با FisherFace قسمتهای مهم جدا شده](https://www.superdatascience.com/wp-content/uploads/2017/08/Image-9-FisherFaces.png)
۴-روش LBPH تلاش کرده است که ایرادات روشهای FisherFace و EigenFace را برطرف کند (تاثیر میزان روشنایی). این الگوریتم به طور یکجا به کل تصویر نگاه نمیکند بلکه به pixelها و مقایسههای آنها با pixelهای کناری خود میپردازد. این الگوریتم تا میزان خوبی تاثیر میزان روشنایی را کم کرده است.
![یک چهره که با LBPH قسمتهای مهم جدا شده: همانطور که میبینید میزان تاثیر روشنایی خیلی کم است](https://www.superdatascience.com/wp-content/uploads/2017/08/Image-12-LBPH-Faces.jpg)
۵-یک الگوریتم تشخیص چهره بر اساس روش 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](https://boute.s3.amazonaws.com/232-haar_features.jpg)
برای پیادهسازی ابتدا نیاز به یک دیتاست برای یادگیری چهرهها داریم برای اینکار از دو دیتاست متفاوت استفاده کردیم.
۱-دیتاست اول، دیتاستی بود که خودمان به وجود آورده بودیم که شامل ۱۰ نفر و از هر نفر تعداد متفاوتی عکس با حالتهای چهرهی متفاوت مانند خندان، ناراحت، متعجب و ... بود (با کیفیتهای متفاوت)
۲-دیتاست دوم دیتاست دانشگاه کمبریج بود که در آن ۴۰ چهره و در کل ۴۰۰ عکس وجود داشت و برای هر عکس حالتهای نور از وسط، با عینک و بدون عینک، شاد، نور از چپ و راست، خواب، چشمک زدن و متعجب وجود داشت(۱۰حالت).
۹ تا از این دیتاها را برای Train در نظر گرفتیم و یکی را برای Test.
نکتهای که در هنگام پیادهسازی با آن مواجه شدیم این بود که EigenFace و FisherFace برای یادگیری و تست به عکسهایی با تعداد پیکسل یکسان نیاز دارند و نمیتوان عکسهای با کیفیت متفاوت و یا ابعاد متفاوت به آنها داد، البته با کمک OpenCV پیادهسازی نسبتا آسانی دارند و فقط کافی است از Face_recognizer مورد نظر استفاده کنیم ولی از آنجایی که دیتاستی که داشتیم شامل عکسهای با سایز یکسان نبود الگوریتم LBPH را توضیح میدهیم که تقریبا شبیه به Modular PCA هم است و خروجی بهتری دارد.
الگوریتم LBPH به این ترتیب عمل میکند که یک آرایه ۳*۳ میسازد و آن را از روی کل عکس عبور میدهد و یک پیکسل را با خانههای مجاورش مقایسه میکند اگر مقدار intensity در آن خانه کمتر یا مساوی با خانه مجاور بود مقدار ۱ را قرار میدهیم و در غیر این صورت مقدار صفر. سپس از این این جدول باینری به دست آمده یک دور ساعتگرد میچرخیم و عدد را تبدیل به مبنای ۱۰ میکنیم.
![از جدول باینری یک عدد در مبنای ده در میاوریم](https://boute.s3.amazonaws.com/232-Labeling.png)
سپس از این عددهای مبنای ده یک نمودار هیستوگرام میسازیم.
![یک نمونه از این هیستوگرامها](https://boute.s3.amazonaws.com/232-Histogram.png)
در آخر هر عکس با یک هیستوگرام متناظر میشود. حال هنگامی که تمام دادههای Train را تبدیل به هیستوگرام کرد عکسی که میخواهد توسط آن تست را انجام دهد با هیستوگرامهای قبلی مقایسه میکند و فرد مورد نظر را پیدا میکند.
حال چند مثال از عکسهای train و test شده را میآوریم(دیتاست دانشگاه کمبریج):
![تصویر مربوط به عکس نفر ۱۸ ام در دیتاست اول است (برای یادگیری)](https://boute.s3.amazonaws.com/232-s18.png)
خروجی برنامه:
![به درستی تشخیص داده شده که subject۱۸ ام است(تست)](https://boute.s3.amazonaws.com/232-test18.png)
چند مثال از دیتاست شخصی:
![عکسهایی که برای یادگیری فرد اول داده شده](https://boute.s3.amazonaws.com/232-images-2.png)
![عکسهایی که برای یادگیری فرد دوم داده شده](https://boute.s3.amazonaws.com/232-1.png)
خروجی برنامه:
![خروجی برنامه افراد را به درستی شناخته است!](https://boute.s3.amazonaws.com/232-out.png)
###ارزیابی خروجی
برای ارزیابی خروجی از دیتاست دانشگاه استفاده کردیم و هنگامی که برای هر subject با ۹ عکس یادگیری انجام میشد و با ۱ عکس تست انجام میشد نتیجه به صورت زیر بود:
![ارزیابی نتایج (با دیتاست دانشگاه)](https://boute.s3.amazonaws.com/232-Table.png)
دلیل نسبتا پایین بودن درصد درستی این است که در این دیتاست عکسها کاملا از چهره گرفته شدهاند و بعضی عکسها حاشیهای ندارد، از آنجایی که کد ما ابتدا چهره را پیدا میکند و سپس روی آنها الگوریتم را اجرا میکند در این موارد نمیتواند چهره را به درستی پیدا میکند و عکس را به عنوان یک عکسِ اشتباه در نظر میگیرد. (در واقع میتوان گفت بعضی عکسها زیادی زوم شده هستند)
###بهبود نتایج
کلاسیفایر Cascade که در برنامه استفاده کردیم دو پارامتر minNeighbors و ScaleFactor دارد که با تغییر آنها میتوان نتایج را بهبود بخشید. از آنجایی که مشکل اصلی یا گلوگاه کار در پیدا کردن چهره در تصویر بود؛ در تصویر هایی که چهره را پیدا نمیکرد چند ین بار عکس را با حالت های مختلفی از ScaleFactor و minNeighbors بررسی میکند تا بتواند چهره را به درستی تشخیص دهد.(برای اضافه کردن این بهبود باید در کد accuracy را برابر با high قرار دهید زیرا حالت defaul آن برای سرعت بیشتر برابر با low قرار داده شده است).
درصد درستی با اضافه کردن این تغییر مانند جدول زیر شد.
![ارزیابی نتایج بعد از بهبود (با دیتاست دانشگاه)](https://boute.s3.amazonaws.com/232-improve.png)
میزان بهبود نتایج با این تغییر به طرز عجیبی بالا بود و به ۱۰۰٪ درست تشخیص دادن در مورد دیتاست موجود رسید.
[آدرس دسترسی به گیت کد ](https://github.com/kiarash97/AI-Face-Recognition-.git)
(قبل از اجرا میتوانید برای کار کردن راحتتر با کد 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]
## پیوندهای مفید
---
+ [کتابخانه اپنسیوی](http://opencv.org/)
+ [اپنسیوی در پایتون](http://docs.opencv.org/trunk/doc/py_tutorials/py_tutorials.html)
+ [بازشناسی چهره در اپنسیوی](http://docs.opencv.org/trunk/modules/contrib/doc/facerec/facerec_tutorial.html)
+ [مقاله از شناخت چهره با استفاده از PCA چند لایه و شبکه ی عصبی خطی] http://www.civilica.com/Paper-ACCSI12-ACCSI12_185.htm