ویژهچهره
چهرههای ویژه (به انگلیسی: 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 به شکل زیر میشود.
سپس با استفاده از یک آستانه مانند وجود داده در مجموعه خود را رد میکنیم. همچنین از این الگوریتم برای تشخیص این که تصویر چهره انسان است یا خیر نیز میتوان استفاده کرد. کافی است دو آستانه مانند و را در نظر بگیریم و هایی که از بیشتر هستند را عکس غیرانسان (چهره) و هایی که بین و هستند را عکسهایی که در مجموعه داده نیستند اما همچنان مربوط به چهره یک انسان ناشناخته هستند در نظر بگیریم.