ویژه‌چهره

از testwiki
پرش به ناوبری پرش به جستجو

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

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

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

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

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

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

  1. آماده کردن یک مجموعه از داده که شرایط ذکر شده (نوری، زاویه دید و…) را داشته باشند
  2. میانگین داده‌ها را صفر می‌کنیم. (با کم کردن عکس میانگین از تمامی عکس‌های مجموعه داده‌ها)
  3. بردار ویژه و مقدار ویژه‌های ماتریس کوواریانس را حساب می‌کنیم.
  4. مولفه‌های اصلی به ترتیب مربوط به بزگرترین مقادیر ویژه هستند و آن‌ها را با مرتب‌سازی به دست می‌آوریم. جمع مقادیر ویژه را ν می‌نامیم.
  5. k را پیدا می‌کنیم به طوری که (λ1+λ2+...+λk)v>ϵ بیشتر شود. اپسیلون بستگی به مقدار دقت ما قابل تنظیم است.

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

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

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

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

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

الگوریتم PCA بر روی داده‌های ۲ بعدی

𝐒𝐯i=𝐓𝐓T𝐯i=λi𝐯i

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

𝐓T𝐓𝐮i=λi𝐮i

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

𝐓𝐓T𝐓𝐮i=λi𝐓𝐮i

درواقع با بدست آوردن بردار ویژه‌های TTT می‌توان با ضرب T به بردار ویژه‌های TTT رسید.[۳]

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

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

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

wi=ViT(UM)

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

d=||WWm||2

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

منابع

الگو:پانویس