این پروژه در راستای ساخت نرم افزاری برای تشخیص حروف و یا تعیین حالات عاطفی متفاوت در افراد مختلف انجام گرفته است.
در ابتدا از افراد مختلف در حالات مختلف و در ضمن ادای حروف متفاوت عکسبرداری شده و برنامه هایی برای تعیین فواصل و ویژگیهای مختلف چهره در این حالات توسط نرم افزار Matlab نوشته شده است.
در این نرم افزار عکس ورودی از منبع گرافیکی خوانده می شود و پس از انجام عملیاتی مثل resize کردن، تبدیل به حالت grayscale در برخی موارد، الگوریتم های لبه یابی، گذراندن از فیلترهای خاص، scan کردن، انجام عملیات dilation و erosion، یافتن رنج RGB نقاط مختلف تصویر، پیدا کردن ضرایب همبستگی و تشابهات و ...
می توان کادر صورت، کادر لب و دهان، کادر چشم، کادر ابروها، فواصل و ابعاد مورد نظر را به دست آورد و با مقایسه این اطلاعات با دیتای موجود حالات و حروف را تشخیص داد.
این نرم افزار می تواند در پروژه های روباتیک یا برای درک حروف برای ناشنوایان مورد استفاده قرار گیرد
مقدمه یا بر پردازش تصویر صورت:
صورت یک منبع قوی از اطلاعات رفتاری انسانهایت.
بیان چهره نشان دهنده حالات رفتارهای اجتماعی رگوله شده سیگنالهای مربوط به صحبت کردن، حالات عاطفی و ...
است که می تواند عملکرد مغز و آسیب شناسی را آشکار سازد.
اغلب سیستمهای توصیف کننده صوت از مدلهای پیچیده دو یا سه بعدی صوت را برای درک حالات مثل پیشانی، ابرو، چشمها، بینی، دهان، گونه و چانه استفاده می کنند.
اغلب شش حالت برای درک حالات چهره وجود دارد که عبارتند از خوشحالی، ترس، عصبانیت، تنفر، ناراحتی و تعجب.
اگر به بررسی صورت به صورت دینامیک بپردازیم تغییرات صوت می تواند به دو دلیل باشد:
1-عوامل درونی و 2-عوامل بیرونی
حالات عضلانی صورت نقش مهمی در رفتار بشر مثل سخنرانی، توصیف چهره و ...
اشارات دارند.
پنفیلد به این نکته دست یافته است که مدارات عصبی که وابسته به دست ها و صورت (بخصوص دهان) هستند نقش مهم در فعل و انفعالات ماشین دارند.
کلاً مراحل درک تصویر 6 مرحله است:
1-گرفتن عکس 2-پردازش اولیه 3-توصیف ویژگیها 4-مرحله دریافت 5-بیس اطلاعات 6-تشخیص
*گرفتن عکس: در این پروژه برای هر حالت یا در مورد ادای هر حرف از 5 الی 9 نفر توسط دوربین دیجیتال عکسبرداری شده که این عکسها با کیفیت بالا در ابعاد 1536×2048 هستند.
برای بالا بردن دقت لازم است که حروف به طور کامل توسط افراد ادا شوند و هم چنین لازم است حالات به خوبی اجرا شوند، پس ممکن است از هر فرد برای هر حالت یا هر خرف عکسهای متعدد گرفته شود.
عکسها با زمینه تیره درنظر گرفته شده اند.
این عکسها اطلاعات آماری از ابعاد و هندسه صورت را در همه این حالات نتیجه می دهد.
خواندن عکس:
خواندن عکس توسط دستور Imread صورت می گیرد.
\filename)آدرسA=(Imread(
این دستور تصویر را از فایلهای گرافیکی می خواند و به صورت دیتا قابل استفاده می سازد.
هر پیکسل عکس حاوی اطلاعات لازم است.
یافتن کادر صورت:
برای resize کردن یک عکس یک function به نام myresize تعریف نموده ایم.
در این function این گونه عمل می کنیم:
ابتدا size عکس را به حدود کاهش داده این چون تصاویر بسیار بزرگ بوده و سرعت انجام برنامه کم است پس از این دستور استفاده می کنیم:
(ضریب کوچک کردن عکس و A=Imresize(filename
2-تبدیل عکس رنگی به حالت grayscale:
برای این کار از دستور زیر استفاده می کنیم.
با انجام این کار اطلاعات از رنج 256 رنگ به رنج 5 تا 1 تبدیل می شوند.
بدین ترتیب انجام بسیاری از عملیات روی تصویر مقدور می گردد.
3-الگوریتم لبه یابی:
برای پیدا کردن کادر صورت نیاز به پیدا کردن لبه های چهره داریم و یک الگ.ریتم نیاز است تا با توجه به تغییرات رنگ کادر نسبت به چهره ما تیرگی ها و روشنی ها و سایه ها و ...
لبه های موجود در عکس را پیدا کنیم تا بتوانیم با scan کردن لبه های مختلف کادر چهره را پیدا کنیم.
الگوریتم مورد نظر به این صورت است.
 برای پیدا کردن کادر صورت نیاز به پیدا کردن لبه های چهره داریم و یک الگ.ریتم نیاز است تا با توجه به تغییرات رنگ کادر نسبت به چهره ما تیرگی ها و روشنی ها و سایه ها و ...
الگوریتم مورد نظر به این صورت است.
عکس را به حالت باینری درمی آورد: A=Im2bw(IC, gray+hresh (IC)) دستور strel بعداً به طور کامل توضیح داده می شود: se = strel (disk,6) A = Imclose (A , se) B = Imopen (B , se) 4-Scan کردن عکس: برای این کار لازم است اطلاعات موجود روی عکس از چهار طرف scan شوند تا به خطوط کادر صورت برسیم.
ما با عکسهایی با Bacjground سیاه یا تیو کار کرده ایم.
پس برای یافتن کادر چهره نکته مهم لبه یابی است.
چهار لبه اطراف صورت این گونه تعریف شده اند.
*Upedge یک function با عنوان updage برای پیدا کردن لبه بالایی صورت درنظر گرفته ایم.
در این function از گوشه بالا سمت چپ شروع به scan کردن نموده و با رسیدن به لبه های مورد نظر مقادیر ثبت می گردد.
Downedge: یک function برای یافتن لبه پائین صورت است مانند upedge می باشد با این تفاوت که از گوشه پائین سمت چپ شروع به scan به صورت افقی می کنیم.
Right edge: در این function، scan کردن از گوشه بالا سمت راست شروع می شود و عملیات جاروب کردن به صورت عمودی صورت می گیرد.
Left edge: نقطه شروع آن مانند upedge می باشد ولی scan کردن به صورت عمودی انجام می گیرد حال با مقادیر به دست آمده از این چهار function کادر صورت به دست می آید.
فیلتر کردن تصویر: برای حذف نویز تصویر نیاز به یک فیلتر پائین گذر داریم تا کمی محوی در تصویر ایجاد کند.
چون ما برای پیدا کردن ناحیه لب و مقادیر آن از رنج RGB رنگ لب استفاده کرده ایم، ممکن است وجود هرگونه لکه روی پوست صورت مشکل ساز باشد، به همین دلیل از یک فیلتر پائین گذر استفاده می کنیم تا گونه ای یکنواختی روی صورت ایجاد سازد.
ما بدین صورت از فیلتر پائین گذر استفاده کرده ایم: I=imfilter (i,h); که با این کار عکس i را از فیلتر h عبور می دهیم.
H یک فیلتر پائین گذر است که آن را خودمان در ابتدای برنامه تعریف می کنیم.
ابعاد I با ابعاد i (تصویر قبل از فیلتر شدن) یکسان است.0 دستور strel: این دستور یک المنت ساختاری مورفولوژیک بوجود می آورد.
SE= strel (shape , parameters) Shape: شل مورد نظر Parameters: ابعاد شکل مورد نظر به این صورت که ما با دادن یک شکل، کادر مورد نظر خود را تعریف می کنیم و ابعاد آن را تعیین می نماییم.
با حرکت دادن آن کادر روی تصویر اصلی عملیات مورد نظر روی آن کادر انجام می گیرد.
این گونه که ما بعضی از نقاط را در واقع 1 کرده و برخی دیگر را 0 می کنیم.
پس عملیاتت فقط روی نقاط 1 صورت می گیرد.
مثلاً ما برای انجام dilation و erosion روی صورت به این صورت از این دستور استفاده کرده ایم: SE=strel (“rectangle” , [15 20]) با این کار روی یک مستطیل این عملیات را انجام می دهیم و یا حرکت آن روی همه عکس در تمام تصویر روی نقاط مورد نظر گسترش و سایش را انجام می دهیم.
یا مثلاً در مورد پیدا کردن کادر چشم و یا ابرو یک کادر تعریف کرده و با حرکت آن کادر روی تمام صورت و پیدا کردن همبستگی بیشتر چشم و ابرو را می یابیم.
* انجام dilation و erosion (گسترش سایش): در هنگام کار با عکسهای رنگی مثلاً برای پیدا کردن لب اگر بخواهم با دادن مقادیر RGB لب، آن را محل یابی کنیم ممکن است وجود لکه روی پوست یا وجود قرمزی های کوچک روی نواحی صورت مشکل ساز شود.
پس لازم است ابتدا این لکه های کوچک را حذف کنیم.
بهترین روش برای این کار درنظرگرفتن مشاع همسایگی است.
به این صورت که نکته هایی که اندازه کوچکی دارند باز هم کوچکتر و کوچکتر شده و محو شوند.
به این عمل erosin می گویند.
در نرم افزار matlab از دستور Imerode برای این منظور استفاده می شود.
A=Imerode (IM , SE) IM همان اسم عکس مورد نظر می باشد.
SE نیز قبلاً تعریف شده است که در دستور strel شرح داده شد.
پس از انجام شرح داده شد.
پس از انجام خسهد (سایش) با این مشکل ممکن است مواجه شویم که برخی از اطلاعات لازم نیز از بین برود.
به همین دلیل لازم است که پس از محو کردن نقاط و لکه های غیرلازم، اطلاعات لازم را تقویت کنیم یعنی نقاطی که شعاع همسایگی خوبی دارند و ممکن است با erosion دچار محوی شده باشند، دوباره تقویت کنیم به همین دلیل عملیات dilation را انجام می دهیم.
برای انجام این کار در نرم افزار matlab از دستور Imedilate استفاده می کنیم.
این دستور به این صورت استفاده می شود.
A=Imedilate (IM , SE) IM در واقع همان عکس مورد نظر اسیت و SE در دستور Strel به طور کامل شرح داده شد.
با تغییر مقادیر SE ضریب گسترش و سایش را تغییر می دهیم یعنی با کم کردن یا زیاد کردن SE مقدار شعاع همسایگی لازم یا بزرگی و کوچکی یک لکه را برای محو شدن یا باقی ماندن و هم چنین تقویت آن تعیین می کنیم.
در dilation و erosion اولیه این مقدار را بزرگ تعیین می کنیم تا لکه های صورت به طور کامل حذف شود و پس از پیدا کردن حدود کادر لب برای اینکه لب را به طور کامل داشته باشیم و نویزهای اطراف آن را حذف کرده و اطلاعات مفید لب را تقویت کنیم بار دیگر erosion و dilation انجام می هیم ولی با مقدار SE کمتر.
*پیدا کردن کادر لب: پس از فیلتر کردن و انجام dilation و erosion بسیاری از نویزهای مزاحم موجود در تصویر حذف شده و می توانیم از اطلاعات موجود در عکس رنگی برای مکان یابی استفاده کنیم.
عکس رنگی از سه لایه رنگی تشکیل شده که مجموع این سه لایه عکس را با رنگ واقع نشام می دهد و هر طیف رنگی روی عکس حاوی اطلاعات R، G و B می باشد.
پس لازم است که سه لایه عکس را جداسازی کرده و رنج رنگهای مورد نظر را بدست آوریم.
ابتدا رنج RGB رنگ لب را در عکسهای متفاوت به دست می آوریم و با میانگین گیری کیا تعیین حدود بالا و پایین رنگ لب را در حالات متفاوت به دست می آوریم.
یعنی نقاطی که مشخصه رنگی آنها در حدود مورد نظر تعیین شده در رنج لب قرار می گیرند جدا می کنیم، سپس این نقاط را با 1 مقدار دهی می کنیم و بقیه نقاط موجود در عکس را 0 می کنیم.
پس از آن با همان function که بریا پیدا کردن کادر صورت تعریف کرده ایم (myresize)، کادر لب را پیدا می کنیم.
در بعضی از حالات پس از این کار در اطراف لب نویز مشاهده می شود، پس بار دیگر عملیات dilation و erosion را با قدرت کمتری نسبت به قبل انجام می دهیم و دوباره با همان function کادر لب را پدیا می کنیم تا به طور واضح ابعاد لب را داشته باشیم.
و سپس همان کادر به دست آمده را روی عکس اصلی به دست می آوریم و * یافتن اندازه های مورد نظر لب: حال که کادر لب را بدست آورده اتیم ابعاد مورد نظر را روی کادر به دست آمده درمی آوریم تا بتوانیم با حالات به دست آمده در ادای حروف متفاوت یا حالات عاطفی مقایسه کنیم.
لازم است که اندازه های به دست آمده نسبت به ابعاد عکس نرمالیزه شود.
زیرا ممکن است ابعاد متفاوت باشد.
عکسهای گرفته شده در ابعاد 1536×2048 می باشند.
پس ما ابتدا ابعاد لب را نسبت به ابعاد عکس به دست می آوریم.
نکته مهم این است که نمی توان ابعاد را بر ابعاد لب در حالت نرمال تقسیم کرد، زیرا برای تشخیص اینکه مردی چه فرمی را ادا می کند یا چه حالتی دارد لزومی ندارد که ما به عکس حالت نرمال او دسترسی داشته باشیم و برنامه این قابلیت را داردت که در محدوده وسیعی برای افراد متفاوت نشخیص داشته باشد.
البته نرمالیزه کردن نسبت به حالت نرمال لب می تواند دقت کار را کمی افزایش دعد ولی در عوض ما، در تشخیص تعداد افراد دچار محدود می شویم.
*مقایسه اندازه ها با اندازه های حالات لب در هنگام ادای حروف یا حالات مختلف: ما ابتدا ابعاد لب را در حالات مختلف ادا، حروف یا حالات مختلف احساسی اندازه گیری کرده ایم.
برای این کار این اندازه ها را در افراد متفاوت به دست می آوریم و سپس نسبت به ابعاد عکس نرمالیزه کرده ایم.
با این کار محدوده اندازه ها در مورد هر حرف یا هر حالت تعیین یم شود.
حال ابعاد لب فردی که عکس او به عنوان دیتای جدید وارد شده با این محدوده ها مقایسه می