ویژه‌چهره

چهره های ویژه (به انگلیسی: Eigenface) به یک سری از بردارویژه ها گفته می‌شود که برای حل مسئله تشخیص چهره در بینایی ماشین استفاده می‌شوند. این روش توسط Sirovich and Kirby ابداع شده است.  بردار ویژه های استفاده شده در این روش با استفاده از ماتریس کوواریانس داده های در ابعاد بالا تولید می‌شوند. این روش به ما کمک می‌کند تا داده ها را از بعد بالا به یک بعد پایین تر بیاوریم.

تولید بردار های ویژه 
برای تولید بردار ویژه های کافی که فضای مسئله را توصیف کنند نیاز به داده های چهره های انسان داریم که از نظر شرایط نوری و زاویه دید و محل قرارگیری چهره و اجزای آن مانند بینی و چشم شرایط مشابهی داشته باشند. ما از روش بررسی مولفه های اصلی (به انگلیسی: : Principal Component Analysis) یا PCA استفاده می‌کنیم. 

در واقع چهره های به دست آمده از PCA یک سری پایه برای فضای تمامی چهره ها می‌توان در نظر گرفت به طوری که تمامی چهره ها را به صورت ترکیب خطی مولفه‌های اصلی می‌نویسیم. این روش ها قابل استفاده در کاربرد های دیگر همچون لب‌خوانی، تشخیص صوت و تشخیص دست نوشته نیز است.

درواقع اگر بخواهیم پنچ گام اصلی به دست آوردن چهره های ویژه را توصیف کنیم به صورت زیر است:

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

نمونه کد پایتون 
import numpy as np
import math
#gamma_v is the dataset images
mean_vector = np.mean(gamma_v, axis = 1)
phi = []
for i in range(OBSERVATION):
    phi.append(gamma_v[:,i] - mean_vector)
phi = np.array(phi).T
gram = phi.T @ phi
v,s_2,v_T = np.linalg.svd(gram)
indices = s_2.argsort()
v = v[indices[::-1]]
#A = u s vT => u = A v sT
u = phi @ v @ np.linalg.inv(np.diag(np.sqrt(s_2)))
eigen_face = u[:,0:5]
print(eigen_face)

نمونه کد متلب 
clear all;
close all;
load yalefaces
[h, w, n] = size(yalefaces);
d = h * w;
% vectorize images
x = reshape(yalefaces, [d n]);
x = double(x);
% subtract mean
mean_matrix = mean(x, 2);
x = bsxfun(@minus, x, mean_matrix);
% calculate covariance
s = cov(x');
% obtain eigenvalue & eigenvector
[V, D] = eig(s);
eigval = diag(D);
% sort eigenvalues in descending order
eigval = eigval(end: - 1:1);
V = fliplr(V);
% show mean and 1st through 15th principal eigenvectors
figure, subplot(4, 4, 1)
imagesc(reshape(mean_matrix, [h, w]))
colormap gray
for i = 1:15
    subplot(4, 4, i + 1)
    imagesc(reshape(V(:, i), h, w))
end

محسابه بهینه بردار ویژه 
خیلی از اوقات محسابه بردارویژه ها هزینه بر و عملا غیر ممکن است. زیرا اندازه ماتریس کوواریانس برابر با  که  تعداد پیکسل های عکس است می‌شود. برای حل این مشکل از رویکرد زیر استفاده می‌کنیم.

فرض کنید  ماتریس ورودی ها که میانگینش صفر است می‌باشد. بنا به تعریف ماتریس کوواریانس برابر  است. می‌دانیم بردار ویژه ها از رابطه زیر به دست می‌آیند.

ماتریس  ماتریس از ابعاد  است. بجای بردار ویژه های  ، بردار ویژه های  را بدست می آوریم.

با ضرب  در دو طرف رابطه به رابطه زیر می‌رسیم.

درواقع با بدست آوردن بردار ویژه های  می توان با ضرب  به بردار ویژه های  رسید.

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

 بردار عکس میانگین و  بردار ویژه i ام است.

سپس با استفاده از یک متریک مانند فاصله L2 یا ضریب پیرسن می‌توانیم نزدیک بودن عکس جدید به عکس های مجموعه خود را تایید کنیم. برای مثال استفاده از نرم L2 به شکل زیر می‌شود.

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

منابع 

یادگیری ماشینی
جبر خطی
تشخیص هویت