Face Recognition Berbasis PCA di Matlab

Berikut ini adalah step-step dalam pengenalan wajah berbasis PCA
PCA15

PCA1

im_rgb = imread(link_im);
im_gray_buff = im_rgb(:,:,2);

PCA2

PCA3

im_vector_latih(:,i) = double(reshape(im_gray,[],1));

PCA4

PCA5

m = mean(im_vector_latih,2);

PCA6
PCA7

for i=1:jum_data
A(:,i) = im_vector_latih(:,i) - m;
end

PCA8

PCA9

L = A'*A;

PCA10

PCA11

PCA12

[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

PCA13

Eigenface = A * L_eigen_vector;</pre>

PCA14

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

Akuisisi Gambar Dari Webcam Di Matlab


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