ویژه‌چهره

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

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

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

درواقع اگر بخواهیم پنج گام اصلی به دست آوردن چهره‌های ویژه را توصیف کنیم به صورت زیر است:
# آماده کردن یک مجموعه از داده که شرایط ذکر شده (نوری، زاویه دید و…) را داشته باشند
# میانگین داده‌ها را صفر می‌کنیم. (با کم کردن عکس میانگین از تمامی عکس‌های مجموعه داده‌ها)
# بردار ویژه و مقدار ویژه‌های ماتریس کوواریانس را حساب می‌کنیم.
# مولفه‌های اصلی به ترتیب مربوط به بزگرترین مقادیر ویژه هستند و آن‌ها را با مرتب‌سازی به دست می‌آوریم. جمع مقادیر ویژه را \nu می‌نامیم.
# k را پیدا می‌کنیم به طوری که {\displaystyle {\frac {(\lambda _{1}+\lambda _{2}+...+\lambda _{k})}{v}}>\epsilon } بیشتر شود. اپسیلون بستگی به مقدار دقت ما قابل تنظیم است.

### نمونه کد پایتون

```python3
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)
```


### نمونه کد متلب

```matlab
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
```


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

فرض کنید T ماتریس ورودی‌ها که میانگینش صفر است می‌باشد. بنا به تعریف ماتریس کوواریانس برابر S = TT^{T} است. می‌دانیم بردار ویژه‌ها از رابطه زیر به دست می‌آیند.
بندانگشتی|الگوریتم PCA بر روی داده‌های ۲ بعدی
\mathbf{Sv}_i = \mathbf{T}\mathbf{T}^T\mathbf{v}_i = \lambda_i \mathbf{v}_i

ماتریس TT^{T} ماتریس از ابعاد n^2 است. بجای بردار ویژه‌های TT^{T} ، بردار ویژه‌های T^{T}T را بدست می‌آوریم.

\mathbf{T}^T\mathbf{T}\mathbf{u}_i = \lambda_i \mathbf{u}_i

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

\mathbf{T}\mathbf{T}^T\mathbf{T}\mathbf{u}_i = \lambda_i \mathbf{T}\mathbf{u}_i

درواقع با بدست آوردن بردار ویژه‌های TT^{T} می‌توان با ضرب T به بردار ویژه‌های T^{T}T رسید.

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

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

w_i = V_i^T(U-M)

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

d = || W-W_m ||^2

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

## منابع

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