Face Recognition Berbasis PCA di Matlab
January 5, 2013 24 Comments
Berikut ini adalah step-step dalam pengenalan wajah berbasis PCA
im_rgb = imread(link_im); im_gray_buff = im_rgb(:,:,2);
im_vector_latih(:,i) = double(reshape(im_gray,[],1));
m = mean(im_vector_latih,2);
for i=1:jum_data A(:,i) = im_vector_latih(:,i) - m; end
L = A'*A;
[V D] = eig(L);</pre> L_eigen_vector = []; for i = 1 : size(V,2) if( D(i,i)>1 ) L_eigen_vector = [L_eigen_vector V(:,i)]; end end
Eigenface = A * L_eigen_vector;</pre>
for i=1:jum_data im_proyeksi_latih(:,i) = Eigenface'*A(:,i); end im_proyeksi_test = Eigenface' * A_test; for i=1:jum_data Euc_distance(:,i) = norm( im_proyeksi_test - im_proyeksi_latih(:,i) ); end [Euc_dist_min , Recognized_index] = min(Euc_distance);
Berikut file lengkapnya terdiri dari file create database dan recognition
eigen_database.mat
function [ output_args ] = Untitled2( input_args ) clc clear all close all %buat data base image training jum_data = 30; baris = 180; kolom = 180; im_gray_buff = []; for i=1:jum_data link_im = ['TrainDatabase\',num2str(i),'.jpg']; ukuran_gbr = size(imread(link_im)); if numel(ukuran_gbr)>2 im_rgb = imread(link_im); im_gray_buff = im_rgb(:,:,2); else im_gray_buff = imread(link_im); end im_gray = imresize(im_gray_buff,[baris kolom]); im_vector_latih(:,i) = double(reshape(im_gray,[],1)); end m = mean(im_vector_latih,2); for i=1:jum_data A(:,i) = im_vector_latih(:,i) - m; end L = A'*A; [V D] = eig(L); L_eigen_vector = []; for i = 1 : size(V,2) if( D(i,i)>1 ) L_eigen_vector = [L_eigen_vector V(:,i)]; end end Eigenface = A * L_eigen_vector; for i=1:jum_data im_proyeksi_latih(:,i) = Eigenface'*A(:,i); end save Eigenface_data.mat Eigenface A m jum_data baris kolom im_proyeksi_latih
realtime_webcam_recognition.m
function [ output_args ] = Untitled2( input_args ) clc clear all close all imaqreset load Eigenface_data.mat vid = videoinput('winvideo',1,'YUY2_160x120'); set(vid,'ReturnedColorSpace','rgb'); set(vid,'TriggerRepeat',Inf); set(vid,'FramesPerTrigger',15); figure; set(gcf,'doublebuffer','on'); start(vid) threshold = 0; while(vid.FramesAcquired<=500) data = getdata(vid,1); x = data(:,:,2); imshow(x); s = fdmex(x', threshold); if size(s,1)>0 i=1; h = rectangle('Position',[s(i,1)-s(i,3)/2,s(i,2)-s(i,3)/2,s(i,3),s(i,3)], ... 'EdgeColor', [1,0,0], 'linewidth', 2); im_crop = imcrop(x,[s(i,1)-s(i,3)/2,s(i,2)-s(i,3)/2,s(i,3),s(i,3)]); %recognition im_test = im_crop; im_test = imresize(im_test, [baris kolom]); im_vector_test = double(reshape(im_test,[],1)); A_test = im_vector_test - m; im_proyeksi_test = Eigenface' * A_test; for i=1:jum_data Euc_distance(:,i) = norm( im_proyeksi_test - im_proyeksi_latih(:,i) ); end [Euc_dist_min , Recognized_index] = min(Euc_distance); switch Recognized_index case {1,2,3,4,5,6,7,8,9,10} label = ['endang']; % case {11,12,13,14,15,16,17,18,19,20} % label = ['bona']; otherwise %label = [num2str(Recognized_index)]; label = ['tidak dikenal']; end xlabel(label); end end stop(vid) delete(vid) clear close(gcf)
Face recognition yang saya lakukan menggunakan webcam secara langsung untuk mengambil gambar uji. Berikut link mengenai akuisisi gambar dengan webcam
Untuk mengambil data latih, bisa digunakan kode berikut.
function [ output_args ] = Untitled1( input_args ) %UNTITLED1 Summary of this function goes here % Detailed explanation goes here clc clear all close all imaqreset load Eigenface_data.mat vid = videoinput('winvideo',1,'YUY2_160x120'); set(vid,'ReturnedColorSpace','rgb'); set(vid,'TriggerRepeat',Inf); set(vid,'FramesPerTrigger',15); figure; set(gcf,'doublebuffer','on'); start(vid) threshold = 0; index_gambar_low = 31; index_gambar_high = 40; hitung_jum_gambar = index_gambar_low; %========init sound============= t1=1/10000:1/10000:0.5; si=(sin(2*pi*246.94*t1)); %++++++++++++++++++++++++++++++++++++ sound(si,5000); pause(0.5); sound(si,5000); while((vid.FramesAcquired<=500)&(hitung_jum_gambar<=index_gambar_high)) sound(si,10000);%tanda siap mengambil gambar, 2 detik setelah nada biiiip pause(2); data = getdata(vid,1); x = data(:,:,1); imshow(x); s = fdmex(x', threshold); if size(s,1)>0 i=1; h = rectangle('Position',[s(i,1)-s(i,3)/2,s(i,2)-s(i,3)/2,s(i,3),s(i,3)], ... 'EdgeColor', [1,0,0], 'linewidth', 2); im_crop = imcrop(x,[s(i,1)-s(i,3)/2,s(i,2)-s(i,3)/2,s(i,3),s(i,3)]); nama_gambar = ['TrainDatabase\',num2str(hitung_jum_gambar),'.jpg']; im_act_size = imresize(im_crop,[baris kolom]); imwrite(im_act_size, nama_gambar); hitung_jum_gambar = hitung_jum_gambar + 1; end end stop(vid) delete(vid) clear close(gcf)
Jika data latih mempunyai ukuran yang berbeda, maka kode berikut bisa digunakan untuk me-resize data latih.
function [ output_args ] = Untitled1( input_args ) %UNTITLED1 Summary of this function goes here % Detailed explanation goes here clc clear all close all load Eigenface_data.mat for i=1:jum_data nama_gambar = ['TrainDatabase\',num2str(i),'.jpg']; baca_gambar = imread(nama_gambar); hasil_resize = imresize(baca_gambar,[baris kolom]); imwrite(hasil_resize,nama_gambar); end
_____________________________________________
DAFTAR PUSTAKA
umiacs.umd.edu/~knkim/KG_VISA/PCA/FaceRecog_PCA_Kim.pdf
youtube.com/watch?v=SaEmG4wcFfg
people.kyb.tuebingen.mpg.de/kienzle/fdlib/fdlib.htm
mathworks.com/matlabcentral/fileexchange/17032-pca-based-face-recognition-system