Ketika sedang ber-nostalgia dengan file tugas kuliah zaman S1, kursor tertarik untuk membuka paper yang berjudul "PCA and LDA based Neural Networks for Human Face Recognition". Paper ini adalah salah satu bacaan favorit saya sekitar lima tahun lalu karena isi paper ini disampaikan dengan bahasa yang sederhana dan cukup mudah untuk dipahami. Pada tulisan kali ini, saya akan membahas bagaimana cara membuat Pengenalan Wajah (Face Recognition) menggunakan PCA (Principal Component Analysis) yang dituliskan dalam bahasa pemrograman Octave. Contoh program dilengkapi dengan beberapa sampel gambar dapat di-download di akhir tulisan ini. Selamat membaca.
Pendekatan PCA untuk pengenalan wajah (A Eleyan, 2007) |
Database Wajah
Database |
Pastikan anda memiliki foto wajah yang cukup banyak untuk mencoba tutorial ini. Jika anda tidak memiliki database, jangan khawatir ada banyak sekali database wajah yang bagus dan gratis untuk tujuan penelitian di link ini http://www.face-rec.org/databases/. Dalam tutorial ini, saya menggunakan 10 foto wajah yang terdiri dari 20 pose berbeda (total 200 wajah) dimana database ini bersumber dari link berikut ini http://www.kasrl.org/jaffe.html.
simpan gambar wajah di dalam folder database |
Simpan gambar-gambar wajah tersebut dalam folder bernama "database" dan rename semua file tersebut dengan urutan alphabet dan urutan nomer seperti contoh di bawah ini.
rename semua gambar wajah di dalam folder database |
.
├── database
│ ├── a1.tiff
│ ├── a2.tiff
│ ├── a3.tiff
│ ├── a4.tiff
│ ├── a5.tiff
│ ├── a6.tiff
│ ├── a7.tiff
│ ├── a8.tiff
│ ├── a9.tiff
............
│ ├── j15.tiff
│ ├── j16.tiff
│ ├── j17.tiff
│ ├── j18.tiff
│ ├── j19.tiff
│ └── j20.tiff
└── list
1 directory, 200 files
Data Pelatihan dan Data Uji
Data Pelatihan dan Data Uji |
Pada tahap ini kita akan membagi database ke dalam dua kelompok yaitu data untuk pelatihan dan data untuk pengujian. Dalam tutorial ini, data pelatihan terdiri dari 10 foto wajah dimana masing-masing berisi 15 pose (total 150). Sedangkan data uji terdiri dari 10 foto wajah dimana masing-masing berisi 5 pose (total 50). Untuk membagi ke dalam dua kelompok, buatlah file baru dengan nama "PisahData.m" dimana diletakkan di dalam folder yang sama dengan folder "database".
create "PisahData.m" |
kemudian copy kode di bawah ini pada file "PisahData.m" kemudian jalankan
close all
clear
clc
namafile = 'abcdefghij';
n_pelatihan = 1:15;
n_pengujian = 16:20;
ext = '.tiff';
folder0 = 'database';
folder1 = 'DataPelatihan';
folder2 = 'DataUji';
if isdir(folder1) == 0
mkdir(folder1);
end
if isdir(folder2) == 0
mkdir(folder2);
end
for i = 1:length(namafile)
f2 = namafile(i);
if isdir(['./' folder1 '/' namafile(i)]) == 0
mkdir(['./' folder1 '/' namafile(i)]);
end
for j = 1:length(n_pelatihan)
f1 = [namafile(i) num2str(n_pelatihan(j)) ext];
copyfile(['./' folder0 '/' f1],['./' folder1 '/' f2 '/'],'f');
end
if isdir(['./' folder2 '/' namafile(i)]) == 0
mkdir(['./' folder2 '/' namafile(i)]);
end
for j = 1:length(n_pengujian)
f1 = [namafile(i) num2str(n_pengujian(j)) ext];
copyfile(['./' folder0 '/' f1],['./' folder2 '/' f2 '/'],'f');
end
end
Hasilnya akan seperti pada gambar di bawah ini, dua folder, "Datapelatihan" dan "DataUji", akan muncul dimana masing-masing berisi gambar wajah.
DataPelatihan dan DataUji |
Principal Component Analysis (PCA)
Extraksi Fitur menggunakan PCA |
Menurut paper yang saya baca ini, Principal component analysis (PCA) adalah suatu teknik yang digunakan di pengenalan pola dan pemrosesan sinyal untuk data reduksi dan ekstraksi fitur dimana umumnya suatu pola (pattern) berisi informasi yang berlebihan (redundant information) sehingga hanya informasi dominan dari pola tersebut saja yang perlu untuk diekstrak dan diproses pada tahap berikutnya. Secara singkat, diagram blok dari algoritma PCA dapat dilihat pada gambar di bawah ini.
Ringkasan algoritma PCA |
Dalam bahasa pemrograman octave, persamaan dalam diagram blok di atas dapat dituliskan ke dalam kode octave seperti di bawah ini, dan simpan kode tersebut dengan nama "main.m".
"main.m" |
close all
clear
clc
%% STEP 1 dan 2 (Membuat Database Matrik Pelatihan)
folder1 = 'DataPelatihan';
namafolder = 'abcdefghij';
ext = '.tiff';
n_file = 1:15;
count = 0;
class = '';
for i = namafolder
for j = n_file
namafile = ['./' folder1 '/' i '/' i num2str(j) ext];
image = imread(namafile);
if exist('X') == 0
X = zeros(length(n_file),prod(size(image)));
end
count = count + 1;
X(count,:) = reshape(double(image),1,prod(size(image)));
class(count) = i;
end
end
%% STEP 3 (Rataan Matrik Pelatihan)
Psi = mean(X);
%% STEP 4 (Zero-mean)
Phi = X - repmat(Psi,size(X,1),1);
%% STEP 5 dan 6 (Hitung Kovarian Matrix beserta eigen-nya)
if size(X,1) > size(X,2)
C = Phi.'*Phi;
else
C = Phi*Phi.';
end
[Lambda v] = eig(C);
%% STEP 7 (Hitung eigenface)
[v, id] = sort(diag(v),'descend');
if size(X,1) > size(X,2)
U = Lambda(:,id);
else
U = Phi.'*Lambda;
% normalisasi eigenface
for i = 1:size(X,1)
U(:,i) = U(:,i)/norm(U(:,i));
end
U = U(:,id);
end
% jumlah komponen penting yang digunakan (reduksi)
k = size(X,1); % maksimum (boleh dikurangi)
U = U(:,1:k);
Vektor Fitur Pelatihan
Vektor Fitur |
Vektor fitur pelatihan akan digunakan sebagai referensi untuk menentukan kemiripan. Untuk mendapatkan vektor fitur pelatihan, persamaan yang digunakan adalah seperti di bawah ini
$w_k = U^T_k (\Gamma - \Psi)$
dimana $k = 1, 2,..., M $. Vektor Fitur pelatihan didefinisikan sebagai berikut
$\Omega^T = [w_1, w_2, w_3, ..., w_M]$
Pada kode octave sebelumnya, cukup tambahkan beberapa baris seperti di bawah ini
close all
clear
clc
%% STEP 1 dan 2 (Membuat Database Matrik Pelatihan)
folder1 = 'DataPelatihan';
namafolder = 'abcdefghij';
ext = '.tiff';
n_file = 1:15;
count = 0;
class = '';
for i = namafolder
for j = n_file
namafile = ['./' folder1 '/' i '/' i num2str(j) ext];
image = imread(namafile);
if exist('X') == 0
X = zeros(length(n_file),prod(size(image)));
end
count = count + 1;
X(count,:) = reshape(double(image),1,prod(size(image)));
class(count) = i;
end
end
%% STEP 3 (Rataan Matrik Pelatihan)
Psi = mean(X);
%% STEP 4 (Zero-mean)
Phi = X - repmat(Psi,size(X,1),1);
%% STEP 5 dan 6 (Hitung Kovarian Matrix beserta eigen-nya)
if size(X,1) > size(X,2)
C = Phi.'*Phi;
else
C = Phi*Phi.';
end
[Lambda v] = eig(C);
%% STEP 7 (Hitung eigenface)
[v, id] = sort(diag(v),'descend');
if size(X,1) > size(X,2)
U = Lambda(:,id);
else
U = Phi.'*Lambda;
% normalisasi eigenface
for i = 1:size(X,1)
U(:,i) = U(:,i)/norm(U(:,i));
end
U = U(:,id);
end
% jumlah komponen penting yang digunakan (reduksi)
k = size(X,1); % maksimum (boleh dikurangi)
U = U(:,1:k);
%% Kumpulan Vektor Pelatihan
Omega = (X-repmat(Psi,size(X,1),1))*U;
Proyeksi Gambar Uji dan Vektor Fitur Uji
Vektor Fitur Uji |
Persamaan yang digunakan untuk vektor fitur uji sama persis dengan ketika menentukan vektor fitur pelatihan yakni sebagai berikut
$\Omega_k = U^T (\Gamma_{input}-\Psi)$
dimana $\Gamma_{input}$ adalah vektor 1D dari gambar uji. Maka kode sebelumnya akan menjadi seperti di bawah ini,
close all
clear
clc
%% STEP 1 dan 2 (Membuat Database Matrik Pelatihan)
folder1 = 'DataPelatihan';
namafolder = 'abcdefghij';
ext = '.tiff';
n_file = 1:15;
count = 0;
class = '';
for i = namafolder
for j = n_file
namafile = ['./' folder1 '/' i '/' i num2str(j) ext];
image = imread(namafile);
if exist('X') == 0
X = zeros(length(n_file),prod(size(image)));
end
count = count + 1;
X(count,:) = reshape(double(image),1,prod(size(image)));
class(count) = i;
end
end
%% STEP 3 (Rataan Matrik Pelatihan)
Psi = mean(X);
%% STEP 4 (Zero-mean)
Phi = X - repmat(Psi,size(X,1),1);
%% STEP 5 dan 6 (Hitung Kovarian Matrix beserta eigen-nya)
if size(X,1) > size(X,2)
C = Phi.'*Phi;
else
C = Phi*Phi.';
end
[Lambda v] = eig(C);
%% STEP 7 (Hitung eigenface)
[v, id] = sort(diag(v),'descend');
if size(X,1) > size(X,2)
U = Lambda(:,id);
else
U = Phi.'*Lambda;
% normalisasi eigenface
for i = 1:size(X,1)
U(:,i) = U(:,i)/norm(U(:,i));
end
U = U(:,id);
end
% jumlah komponen penting yang digunakan (reduksi)
k = size(X,1); % maksimum (boleh dikurangi)
U = U(:,1:k);
%% Kumpulan Vektor Pelatihan
Omega = (X-repmat(Psi,size(X,1),1))*U;
%% Proyeksi Gambar Uji dan Vektor Uji
folder2 = 'DataUji';
namafileuji = ['./' folder2 '/' 'j' '/' 'j20' ext];
ImageUji = imread(namafileuji);
Xuji = reshape(double(ImageUji),1,prod(size(ImageUji)));
Omega_k = (Xuji-Psi)*U;
Penggolongan
Penggolongan |
Pada tahap terakhir ini, penggolongan atau penentuan kemiripan dilakukan dengan membandingkan data pelatihan terhadap data uji dengan meminimalkan persamaan Euclidean Distance berikut ini
$\varepsilon_k = \| \Omega-\Omega_k \|$
Dan the final code adalah seperti di bawah ini,
close all
clear
clc
%% STEP 1 dan 2 (Membuat Database Matrik Pelatihan)
folder1 = 'DataPelatihan';
namafolder = 'abcdefghij';
ext = '.tiff';
n_file = 1:15;
count = 0;
class = '';
for i = namafolder
for j = n_file
namafile = ['./' folder1 '/' i '/' i num2str(j) ext];
image = imread(namafile);
if exist('X') == 0
X = zeros(length(n_file),prod(size(image)));
end
count = count + 1;
X(count,:) = reshape(double(image),1,prod(size(image)));
class(count) = i;
end
end
%% STEP 3 (Rataan Matrik Pelatihan)
Psi = mean(X);
%% STEP 4 (Zero-mean)
Phi = X - repmat(Psi,size(X,1),1);
%% STEP 5 dan 6 (Hitung Kovarian Matrix beserta eigen-nya)
if size(X,1) > size(X,2)
C = Phi.'*Phi;
else
C = Phi*Phi.';
end
[Lambda v] = eig(C);
%% STEP 7 (Hitung eigenface)
[v, id] = sort(diag(v),'descend');
if size(X,1) > size(X,2)
U = Lambda(:,id);
else
U = Phi.'*Lambda;
% normalisasi eigenface
for i = 1:size(X,1)
U(:,i) = U(:,i)/norm(U(:,i));
end
U = U(:,id);
end
% jumlah komponen penting yang digunakan (reduksi)
k = size(X,1); % maksimum (boleh dikurangi)
U = U(:,1:k);
%% Kumpulan Vektor Pelatihan
Omega = (X-repmat(Psi,size(X,1),1))*U;
%% Proyeksi Gambar Uji dan Vektor Uji
folder2 = 'DataUji';
namafileuji = ['./' folder2 '/' 'h' '/' 'h17' ext];
ImageUji = imread(namafileuji);
Xuji = reshape(double(ImageUji),1,prod(size(ImageUji)));
Omega_k = (Xuji-Psi)*U;
%% Penggolongan
for i = 1:size(Omega,1)
mini(i) = min(norm(Omega(i,:)-Omega_k));
end
[minimal idmin] = min(mini);
disp(['Gambar uji termasuk gambar pelatihan golongan ' class(idmin)])
figure
subplot(121)
imshow(ImageUji)
title('Gambar Uji')
subplot(122)
imshow(reshape(uint8(X(idmin,:)),size(ImageUji,1),size(ImageUji,2)))
title('Gambar dari Data Pelatihan')
Jalankan program di atas pada octave, dan hasil deteksi akan muncul seperti pada contoh pengenalan di bawah ini.
Gambar uji termasuk gambar pelatihan golongan h |
Seperti terlihat pada gambar di atas, program PCA berhasil mengenali gambar uji (kiri) dengan menampilkan gambar dari data pelatihan (kanan) yang dianggap oleh Euclidean Distance memiki kemiripan paling tinggi.
Download
kode octave dan gambar wajah dapat di download di link ini.
Selamat mencoba dan semoga bermanfaat.
Referensi
Eleyan, Alaa, and Hasan Demirel. PCA and LDA based neural networks for human face recognition. INTECH Open Access Publisher, 2007.
This comment has been removed by the author.
ReplyDeleteWasslm,
Deletedownload dan install Octave terlebih dulu,
http://gear-second19.blogspot.jp/2015/01/octave-alternatif-untuk-komputasi.html
kemudian download code octave yang ada di tulisan ini untuk pengenalan wajah. Ektrak filenya dan buka file berekstensi .m menggunakan octave. Kemudian RUN. (jangan lupa baca readme file)
This comment has been removed by the author.
ReplyDeleteMas ini syntac nya untuk vb .php atau matlab ya
ReplyDelete