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

برخی از چهره های ویژه از AT&T Laboratories Cambridge

تولید بردار های ویژه
--------------------

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

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

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

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

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

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

```

### محسابه بهینه بردار ویژه

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

فرض کنید T ماتریس ورودی ها که میانگینش صفر است می‌باشد. بنا به تعریف ماتریس کوواریانس برابر {\displaystyle S=TT^{T}} است. می‌دانیم بردار ویژه ها از رابطه زیر به دست می‌آیند.

الگوریتم PCA بر روی داده های 2 بعدی
{\displaystyle \mathbf {Sv} \_{i}=\mathbf {T} \mathbf {T} ^{T}\mathbf {v} \_{i}=\lambda \_{i}\mathbf {v} \_{i}}

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

{\displaystyle \mathbf {T} ^{T}\mathbf {T} \mathbf {u} \_{i}=\lambda \_{i}\mathbf {u} \_{i}}

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

{\displaystyle \mathbf {T} \mathbf {T} ^{T}\mathbf {T} \mathbf {u} \_{i}=\lambda \_{i}\mathbf {T} \mathbf {u} \_{i}}

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

استفاده در سیستم های تشخیص چهره
-------------------------------

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

M بردار عکس میانگین و {\displaystyle V\_{i}} بردار ویژه i ام است.

{\displaystyle w\_{i}=V\_{i}^{T}(U-M)}

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

{\displaystyle d=||W-W\_{m}||^{2}}

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

منابع
-----

1. ↑  "سیستم تشخیص چهره". *ویکی‌پدیا، دانشنامهٔ آزاد*. 2022-10-09.
2. ↑  Sirovich, L.; Kirby, M. (1987-03-01). "Low-dimensional procedure for the characterization of human faces". *Journal of the Optical Society of America A* (به انگلیسی). **4** (3): 519. doi:10.1364/JOSAA.4.000519. ISSN 1084-7529.
3. 1 2  Yang, M.-H.; Ahuja, N.; Kriegman, D. (2009). "Face recognition using kernel eigenfaces". *Proceedings 2000 International Conference on Image Processing (Cat. No.00CH37101)*. **1**: 37–40 vol.1. doi:10.1109/ICIP.2000.900886.
4. ↑  "تحلیل مؤلفه‌های اصلی". *ویکی‌پدیا، دانشنامهٔ آزاد*. 2022-10-17.
5. ↑  *Pattern Recognition and Machine Learning (Information Science and Statistics)*.