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
https://wangready.wordpress.com/2012/12/30/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

24 Responses to Face Recognition Berbasis PCA di Matlab

  1. Audrya says:

    Saya pengen tau lebih lanjut tentang PCA ini, apa saya boleh tau no yang bisa dihubungi ?
    Terima Kasih,

    • wangready says:

      mungkin enaknya lewat blog aja gan, soalnya sya jg lg ada kerjaan…πŸ™‚

      • Audrya says:

        kalau lewat ym boleh ga ya atau emang lewat blog ini aja ?

      • wangready says:

        lewat ym jg boleh gan…

      • Audrya says:

        kalau mau bikin create database apa sebelumnya harus punya file foto ?
        soalnya saya sudah coba create database tapi ada pesan error seperti ini :

        ???error using==> imread at 329
        file “angga\1.jpg” does not exist
        error in==>create_database at 13
        ukuran_gbr = size(imread(link_im));

      • wangready says:

        iya gan, harus ada kumpulan foto wajah/objectnya dulu untuk jadi data latih. Kalo saya untuk satu orang ada 10 foto. jadi orang pertama mempunyai nama foto 1.jpg sampai 10.jpg dan seterusnya untuk orang kedua dst. jadi nanti terakhir pas pengujian nomor indeks tersebut yang jadi dasar klasifikasi.
        file contoh nya saya dapat dari link ini gan
        mathworks.com/matlabcentral/fileexchange/17032-pca-based-face-recognition-system

      • Audrya says:

        Terima kasih atas bimbingan nya gan,

  2. angga says:

    saya mau tanya, klau mau ngecek kecepatan waktu akurasi sama ngecek kurva recognition pada proses pca diatas bgmana yaw?? mohon bimbingan nyaπŸ™‚

    • wangready says:

      kalo ngitung waktunya mungkin bisa pake fungsi tic toc gan. kalo kurva data kemiripannya bisa di plot im_proyeksi_test sama im_proyeksi_latih(:,i) keknya gan…

      • angga says:

        yang tic-toc sudah berhasil, tpi yang plot saya belum paham heheh

      • angga says:

        jika saya mau bikin plot proses pca kira2 bisa gag yaw?

      • wangready says:

        maksud agan plot data PCA nya atau jarak kemiripan datanya?
        kalo data hasil PCA nya im_proyeksi_test sama im_proyeksi_latih(:,i), kalo jarak kemiripan datanya yg Euc_dist_min (semakin kecil semakin mirip)

  3. Edo says:

    gan boleh minta file nya ??

  4. Edo Winarta says:

    mau nanya gan ,,pca ini hampir sama ama eigenface nggak ??

  5. anony says:

    Gan numpang nanya, itu gambar nya difilter dlu ya? sebelum di recog?

    • wangready says:

      gk gan… di resize aja… tp keknya boleh jg difilter biar imagenya bagus…
      soal resize, ane pernah nyoba kalo image latih atau test diresize pixel nya terlalu kecil hasil recognya jd tidak akurat

      • anony says:

        Oh gitu, kalo pake filter susah ya gan?

      • wangready says:

        kalo di matlab tinggal panggil aja gan, cuman kalo buat aplikasi real time kalo proses nya banyak nanti waktu eksekusinya tambah lama…

      • anony says:

        Oh, mending diresize aja ya? itu diubah dlu ga warna nya dari RGB ke Grayscale?

        maap gan banyak nanya, buat bahan skripsi soalnya. hehehe

      • wangready says:

        ane gunain resize buat memastikan input image punya ukuran yg sama aja gan, jadi setiap data input punya dimensi yang sama… tp kalo diresize jadi lebih kecil otomatis informasi gambar berkurang, biasanya proses pengenalan kemungkinan errornya makin besar, tp kalo ukuran gambar terlalu besar proses pengolahan makin lama, jadi ya disesuaikan dg spek komputernya jg gan biar optimum… gambar diambil yg grayscale gan, soalnya kita cuma perlu pola gambarnya aja, kalo pake RGB datanya kebanyakan karena RGB punya 3 layer image untuk Red, Green, Blue… dan dari artikel yg ane baca jg mereka pake grayscale…

      • anony says:

        Kalo secara real time alur buat recognition nya gimana gan? cara buat bikin GUI nya sama kaya yang diatas? masih rada bingung. buat bikin program nya. mksh sblm nya.

      • wangready says:

        saya jg gk tau spesifikasi real time itu persisnya seperti apa, cuma yg saya maksud ya buat aplikasi recognition secara continue dengan input image video dg frame rate misal 30 frame per second agar video terlihat nyata oleh mata manusia, pergerakannya tidak patah2… alurnya proses pengenalannya dilooping saja dengan input image dari camera atau webcam… kalo GUI nya coba di google aja gan, yg di atas cuma script m-file aja…

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s