تشخیص چهره، تشخیص نواحی چهره

تشخیص چهره، تشخیص نواحی چهره

به نام خدا

مسئله تشخیص چهره یکی از مسائل معروف در حوزه بینایی کامپیوتر است که بیش از دو دهه به آن توجه می شود و همواره بهبودها رو روش های پایدارتری برای تشخیص ناحیه چهره در تصاویر دیجیتالی ارائه شده است. یکی از روش های بسیار کارآمد برای تشخیص چهره و نواحی چهره (اعم از چشم ها، دهان و بینی) روش مرسوم Viola & Joins می باشد. ایشان در مقاله خود با عنوان Rapid Object Detection using a Boosted Cascade of Simple Features ایده استفاده از تکنیک بوستینگ را ارائه می کنند چنانکه در آن با کمکIntegral Image سرعت پروسه تشخیص را تا Real Time افزایش می دهند.

بطور مختصر بوستینگ یک متاالگوریتم در تکنیک یادگیری بانظارت (Supervised Learning) از شاخه یادگیری ماشینی است که سبب بهبود (تعیین) پارامترهای(موثر) یک مساله می شود؛ معروف ترین الگوریتم بوستیگ، Adaboost است که از آن بطور گسترده در مسائل یادگیری استفاده می شود. می توان گفت آدابوست یک دسته بند (Classifier) است که بر اساس تعداد زیادی یادگیرنده ضعیف (Weak Learner) کار می کند این یادگیرنده ها بخودی خود نمی توانند عاملی برای دسته بندی مطلوب یک پدیده شوند اما ترکیب همه آنها سبب می شود یک دسته بند قوی ایجاد شود.

 

مفهوم دسته بندهای مبتنی بر یادگیرنده های ضعیف را می توان با مثال ساده زیر بیان کرد.

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

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

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

 

شکل1:پروسه تایید یا عدم تایید یک پدیده بر اساس یادگیرنده های ضعیف در آدابوست

 

در موضوع تشخیص چهره، یادگیرنده ها اجزای کوچکی از تصویر هستند (مثلا یک ماسک3*3 که پیکسل های وسط سیاه و پیکسل های اطراف سفید هستند) این ماسک ها با عنوان Haar features شناخته می شوند و شما می توانید آنها را در شکل2 مشاهده کنید اگر چه نوع جدیدتر آن، تعداد بیشتری از این ویژگی ها را شامل می شود و با عنوان Haar-like features معروف است. به هر حال هر کدام از این یادگیرنده ها قرار است در خصوص تصویر نهایی ما مبنی بر اینکه یک بخشی از یک تصویر خاصی ناحیه دلخواه ما(چهره) است یا نه؟ اظهار نظر کنند. بطور خلاصه آنکه معمولا این ماسک ها با روشی سریع (Integral Image) بر روی تصویر کانوالو می شوند و تعداد Patch های مطابقت یافته شمارش می شوند سپس بررسی آماری تعداد مطابقت ها به ما یک میانگین و واریانس می دهد که همین دو مقدار برای ارزیابی نواحی کفایت می کند پس به ازای هر یادگیرنده ضعیف پارامترهایی خواهیم داشت که بعدا در پروسه تست استفاده شده و چهره بودن یا نبودن یک نمونه تست بر اساس آنها تعیین می شود. چنانچه بالاتر گفتم اگر تمام یادگیرنده های ضعیف بر اساس همان پارامترها، نمونه تست را ریجکت نکردند یعنی آن ناحیه چهره است.

 

 

شکل2:ویژگی های هار + ویژگی های شبه هار که بعنوان یادگیرنده ضعیف استفاده می شوند

 

تولباکس متلب برای مسئله شناسایی چهره و نواحی چهره

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

لازم به ذکر است که این تولباکس در نسخه  Matlab 2012bاضافه شده است یعنی حتما باید نرم افزار شما نسخه مذکور یا جدیدتر باشد، ضمن آنکه اشاره می کنم که روش فوق فقط برای تشخیص چهره و نواحی آن کاربرد دارد (اگر چه، خود مسئله بزرگی است) ولی اگر شما قصد داشته باشید بجز چهره، اشیاء دیگری را شناسایی کنید آنوقت باید از نسخه Matlab 2013aیا جدیدتر استفاده کنید که در آن، پروسه آموزش دسته بند بر اساس داده های Annotate شده شما انجام می شود اگر چه متلب این کار را انجام داده است ولی جای بحث زیاد دارد ان شاالله در آنیده درباره آن بیشتر می نویسم چنانکه باید در نظر داشته باشید در آن پارامترهای مهمی همچون FalseAlarmRate و Stage Number  نقش ویژه ای در پروسه آموزش دارند که قطعا در تولید یک دسته بند قوی موثر است.

 

کد کامل برنامه در محیط متلب در ضمیمه ارائه شده است

% This is a basic code for Face & Face parts Detection

% Mahdi Jampour

close all; clc; clear all;

img = imread('img.jpg');

detector = buildDetector();

[bbox bbimg faces bbfaces] = detectFaceParts(detector,img,2);

%===================================================================== Face

y =bbox(1,1); x =bbox(1,2);

w =bbox(1,3); l =bbox(1,4);

Part_Face = img(x:x+l, y:y+w,:);

figure, imshow(Part_Face);

%================================================================= Left eye

y =bbox(1,5); x =bbox(1,6);

w =bbox(1,7); l =bbox(1,8);

Part_LeftEye= img(x:x+l, y:y+w,:);

figure, imshow(Part_LeftEye);

%================================================================ Right eye

y =bbox(1,9); x =bbox(1,10);

w =bbox(1,11); l =bbox(1,12);

Part_RightEye= img(x:x+l, y:y+w,:);

figure, imshow(Part_RightEye);

%==================================================================== Mouth

y =bbox(1,13); x =bbox(1,14);

w =bbox(1,15); l =bbox(1,16);

Part_mouth = img(x:x+l, y:y+w,:);

figure, imshow(Part_mouth);

%===================================================================== Nose

y =bbox(1,17); x =bbox(1,18);

w =bbox(1,19); l =bbox(1,20);

Part_nose = img(x:x+l, y:y+w,:);

figure, imshow(Part_nose);

%=================================================================== Finish

 

نتیجه خروجی یک نمونه در شکل3 نمایش داده شده است.

شکل3: نتیجه خروجی یک مثال

کد برنامه در متلب

 

موفق و سربلند باشید

جم پور


Home  |  Contact me  |  About me  | Mahdi Jampour © 2008-2017