Algoritma Fisherface 3


Pengenalan Pola adalah cabang kecerdasan yang menitik-beratkan pada metode pengklasifikasian objek ke dalam klas – klas tertentu untuk menyelesaikan masalah tertentu. Contoh yang dibahas kali ini adalah mengenai penentuan pola wajah baru berdasarkan pola wajah yang sudah ada sebelumnya dengan menggunakan metode Fisherface.
Algoritma Fisherface menggunakan pendekatan 2 buah metode, yaitu PCA (Principle Component Analysis) and FLD (Fisher Linear Discriminant). Setelah gambar dipetakan ke dalam ruang eigen menggunakan PCA (Principle Component Analysis), hasil perhitungan tersebut akan dikonversi ke dalam subruang linier menggunakan FLD (Fisher Linear Discriminant). Teknik PCA (Principle Component Analysis) ini juga digunakan pada perhitungan Algoritma Eigenface.



Diasumsikan ada 10 wajah manusia yang sudah diketahui sebelumnya, dengan data sebagai berikut:
ef contoh data

Selanjutnya ada pola wajah baru yang ingin diketahui hasilnya
Maka tentukan pola wajah baru ini cocok dengan pola wajah yang mana
Diasumsikan pola wajah yang baru adalah sebagai berikut:
ef data baru


Langkah-langkah penggunaan algoritma ini adalah

* Lakukan inisialisasi variabel yang digunakan dalam perhitungan (poin 1)

1a. Tentukan path folder dari gambar contoh data dan gambar data baru

pathContohData = 'ContohData';
pathDataBaru = 'DataBaru';

1b. Cari semua gambar contoh wajah dan data baru yang tersedia pada masing-masing folder
Kemudian hitung jumlah gambar untuk masing-masing contoh data dan data baru yang tersedia

bmpContohData=dir(sprintf('%s/*.bmp',pathContohData));    
bmpDataBaru=dir(sprintf('%s/*.bmp',pathDataBaru));
jumlahContohData=size(bmpContohData,1);
jumlahDataBaru=size(bmpDataBaru,1);

1c. Tampilkan data contoh gambar yang tersedia

for i=1:jumlahContohData
    str=strcat(pathContohData,'\',bmpContohData(i).name);    
    bmp=imread(str);

    subplot(1+jumlahDataBaru,jumlahContohData,i)
    imshow(bmp)
    if i==1
        title('Contoh gambar wajah: ','Position',[105,0])
    end
end

2. Lakukan proses pembacaan gambar contoh data ke dalam matriks
Masing-masing gambar 2 dimensi akan dikonversi menjadi vektor 1 dimensi
Kemudian semua vektor tersebut akan disusun ke dalam matriks
Sehingga jika terdapat n gambar dengan masing-masing gambar berukuran p x l,
maka matriks yang terbentuk adalah berukuran n * pl
Penjelasan tentang fungsi ini akan dijelaskan pada perhitungan dibawah ini (poin 2a – 2b)

contohData = BuatMatriksContohData(pathContohData);

Memasuki perhitungan pada fungsi BuatMatriksContohData

2a. Hitung gambar contoh data yang sebenarnya
Semua file yang dihitung adalah file yang memiliki nama selain ‘.’, ‘..’, dan ‘Thumbs.db’

for i = 1:size(bmpContohData,1)
    if not(strcmp(bmpContohData(i).name,'.')|strcmp(bmpContohData(i).name,'..')|strcmp(bmpContohData(i).name,'Thumbs.db'))
        jumlahContohData = jumlahContohData + 1;
    end
end

* Lakukan proses konstruksi matriks berdasarkan kumpulan gambar contoh data (poin 2b)

2b. Lakukan perhitungan sebanyak jumlah file contoh data (poin 2b1 – 2b3)

for i = 1 : jumlahContohData    
. . .

2b1. Lakukan pembacaan file gambar contoh data yang tersedia
Untuk mempermudah cara pembacaan file gambar,
maka nama file yang digunakan adalah menggunakan angka saja (1.bmp, 2.bmp, dst)

contohDataTerpilih = int2str(i);
contohDataTerpilih = strcat(pathContohData,'\',contohDataTerpilih,'.bmp');
im = imread(contohDataTerpilih);

2b2. Jika gambar tersebut bukan gambar hitam putih,
maka lakukan konversi ke gambar hitam putih
Langkah ini tidak wajib apabila gambar contoh data sudah dalam bentuk hitam putih

%im = rgb2gray(im);

2b3. Hitung panjang dan lebar dari gambar tersebut,
Kemudian lakukan konversi data gambar 2 dimensi menjadi vektor 1 dimensi
dan masukkan vektor tersebut ke dalam matriks

[panjang, lebar] = size(im);   
tmp = reshape(im', panjang*lebar, 1);
contohData = [contohData, tmp];

3. Lakukan proses perhitungan menggunakan metode Fisherface
Penjelasan tentang fungsi ini akan dijelaskan pada perhitungan dibawah ini (poin 3a – 3k)

[rata2ContohData, V_PCA, V_Fisher, ProyeksiGambar_Fisher] = Fisherface(contohData);

Memasuki perhitungan pada fungsi Fisherface

Konsep utama fungsi ini adalah:
Diketahui Ti adalah matriks contoh data, P adalah jumlah baris matriks contoh data, C adalah jumlah kolom matriks contoh data

  • Hitung Zi = V_PCA * (Ti – rata2ContohData)
  • Zi adalah Ti yang telah dipetakan ke dalam subruang linier (P-C) menggunakan matriks transfer V_PCA

  • Hitung Yi = V_Fisher’ * Zi = V_Fisher’ * V_PCA’ * (Ti – rata2ContohData)
  • Zi akan dikonversi menjadi Yi dengan cara diproyeksikan kedalam subruang linier (C-1)
    sehingga gambar wajah yang sama akan berada lebih dekat dan gambar wajah yang berbeda akan berada lebih jauh

3a. Tentukan jumlah class dan jumlah gambar per class

jumlahClass = ( size(contohData,2) )/2;     % Jumlah class / gambar / orang / wajah
jumlahGambarPerClass = 2;                   % Jumlah gambar pada masing-masing class
P = jumlahGambarPerClass * jumlahClass;     % Jumlah contoh data

3b. Hitung rata-rata dari matriks contoh data

rata2ContohData = mean(contohData,2); 

3c. Hitung deviasi dari masing-masing gambar terhadap rata-rata matriks contoh data

A = contohData - repmat(rata2ContohData,1,P);

3d. Lakukan proses dekomposisi kovarians matriks L untuk mendapatkan nilai eigenvector dan eigenvalue
Proses ini mirip dengan proses yang dilakukan oleh algoritma Eigenface

L = A'*A;
[V, lambda] = eig(L);

3e. Lakukan eliminasi nilai eigenvalue yang cukup rendah

eigenVectorTerbesar = [];
for i = P : -1 : jumlahClass + 1
    eigenVectorTerbesar = [eigenVectorTerbesar V(:,i)];
end

3f. Hitung eigenvector dari matriks kovarians L

V_PCA = A * eigenVectorTerbesar;

3g. Lakukan proyeksi gambar vektor ke dalam ruang eigen
Gunakan rumus Zi = V_PCA’ * (Ti – rata2ContohData)

ProyeksiGambar_PCA = [];
for i = 1 : P
    tmp = V_PCA'*A(:,i);
    ProyeksiGambar_PCA = [ProyeksiGambar_PCA tmp]; 
end

3h. Hitung rata-rata dari masing-masing class dalam ruang eigen
Proses ini akan menghasilkan matriks Within Scatter dan matriks Between Scatter

rata2PCA = mean(ProyeksiGambar_PCA,2);

rata2 = zeros(P-jumlahClass,jumlahClass); 
Sw = zeros(P-jumlahClass,P-jumlahClass); % Matriks Within Scatter
Sb = zeros(P-jumlahClass,P-jumlahClass); % Matriks Between Scatter

for i = 1 : jumlahClass
    rata2(:,i) = mean( ( ProyeksiGambar_PCA(:,((i-1)*jumlahGambarPerClass+1):i*jumlahGambarPerClass) ), 2 )';    
    
    S  = zeros(P-jumlahClass,P-jumlahClass); 
    for j = ( (i-1)*jumlahGambarPerClass+1 ) : ( i*jumlahGambarPerClass )
        S = S + (ProyeksiGambar_PCA(:,j)-rata2(:,i))*(ProyeksiGambar_PCA(:,j)-rata2(:,i))';
    end
    
    Sw = Sw + S;                                                % Matriks Within Scatter
    Sb = Sb + (rata2(:,i)-rata2PCA) * (rata2(:,i)-rata2PCA)';   % Matriks Between Scatter
end

3i. Hitung nilai basis dari Fisher Discriminant
Tujuan utama yang dilakukan adalah memaksimalkan nilai matriks Between Scatter,
sambil meminimalkan nilai matriks Within Scatter

[J_eig_vec, J_eig_val] = eig(Sb,Sw);
J_eig_vec = fliplr(J_eig_vec);

3j. Hapus nilai eigen yang cukup rendah,
dan lakukan pengurutan dari nilai tertinggi ke nilai terendah

for i = 1 : jumlahClass-1 
    V_Fisher(:,i) = J_eig_vec(:,i); % Eigenvector (C-1) terbesar dari matriks J
end

3k. Lakukan proyeksi gambar kedalam ruang linier Fisher
Gunakan rumus Yi = V_Fisher’ * V_PCA’ * (Ti – rata2ContohData)

for i = 1 : jumlahClass*jumlahGambarPerClass
    ProyeksiGambar_Fisher(:,i) = V_Fisher' * ProyeksiGambar_PCA(:,i);
end

4. Lakukan perhitungan pada masing-masing data baru (poin 4a – 4d)

for i=1:jumlahDataBaru
. . .

4a. Lakukan pembacaan file gambar wajah yang baru
Untuk mempermudah cara pembacaan file gambar,
maka nama file yang digunakan adalah menggunakan angka saja (1.bmp, 2.bmp, dst)

dataBaruTerpilih  = num2str(i);
dataBaruTerpilih = strcat(pathDataBaru,'\',char(dataBaruTerpilih),'.bmp');
im = imread(dataBaruTerpilih);

4b. Lakukan pencarian contoh data yang paling mendekati hasil perhitungan data baru
Penjelasan tentang fungsi ini akan dijelaskan pada perhitungan dibawah ini (poin 4b1 – 4b2)

hasil = PengenalanGambar(dataBaruTerpilih, rata2ContohData, V_PCA, V_Fisher, ProyeksiGambar_Fisher);

Memasuki perhitungan pada fungsi PengenalanGambar

4b1. Lakukan proes perhitungan proyeksi gambar pada data yang baru
Sama seperti perhitungan sebelumnya,
Gunakan rumus Yi = V_Fisher’ * V_PCA’ * (Ti – rata2ContohData)

dataBaru = imread(dataBaruTerpilih);
tmp = dataBaru(:,:,1);

[panjang, lebar] = size(tmp);
vektorGambar = reshape(tmp',panjang*lebar,1);
deviasi = double(vektorGambar) - rata2ContohData;
ProyeksiGambar = V_Fisher' * V_PCA' * deviasi;

4b2. Hitung jarak Euclidean antara proyeksi gambar data baru dengan proyeksi Fisher dari semua contoh data
Ambil jarak paling minimal sebagai jawaban gambar contoh data yang paling sesuai dengan gambar data baru

jarakEuclidean = [];
for i = 1 : jumlahContohData
    q = ProyeksiGambar_Fisher(:,i);
    tmp = ( norm( ProyeksiGambar - q ) )^2;
    jarakEuclidean = [jarakEuclidean tmp];
end

[~, idxMinimal] = min(jarakEuclidean);
hasil = strcat(int2str(idxMinimal),'.bmp');

4c. Lakukan pencocokan nama file contoh data sesuai hasil pengenalan wajah yang telah dilakukan sebelumnya

contohDataTerpilih = strcat(pathContohData,'\',hasil);
contohDataTerpilih = imread(contohDataTerpilih);

4d. Tampilkan hasil akhir pada layar

subplot(1+jumlahDataBaru,jumlahContohData,(i*jumlahContohData)+1)
imshow(im)
title(strcat('Data ',int2str(i)),'Position',[25,0])

subplot(1+jumlahDataBaru,jumlahContohData,(i*jumlahContohData)+2)
imshow(contohDataTerpilih)
title('Dikenali sebagai','Position',[75,0])


Hasil akhir adalah: (klik untuk perbesar gambar)

ef hasil akhir


Contoh modul / source code menggunakan Matlab dapat didownload disini:



Jika membutuhkan jasa kami dalam pembuatan program, keterangan selanjutnya dapat dilihat di Fasilitas dan Harga
Jika ada yang kurang paham dengan langkah-langkah algoritma diatas, silahkan berikan komentar Anda.
Selamat mencoba.


Tinggalkan sebuah komentar

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *

3 pemikiran di “Algoritma Fisherface

    • pip Penulis

      Setelah melalui tahapan PCA maka selanjutnya adalah melakukan perhitungan untuk mencari matriks within scatter dan between scatter, dimana kedua matriks ini akan dijadikan sebagai input untuk dicari vektor eigennya. Hasilnya kemudian akan diproyeksikan kedalam ruang linier Fisher yang sekaligus merupakan nilai output dari algoritma tersebut.