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:
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:
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)
- Hitung Yi = V_Fisher’ * Zi = V_Fisher’ * V_PCA’ * (Ti – rata2ContohData)
Zi adalah Ti yang telah dipetakan ke dalam subruang linier (P-C) menggunakan matriks transfer V_PCA
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)
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.
Kak boleh tanya tanya ttg fisherface gak?
Agak bingung di transisi pca ke lda nya yang bagian mereduksi nya
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.