3/14/2016

Pengenalan Wajah (Face Recognition) menggunakan PCA - Octave Code -

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.

4 comments:

  1. This comment has been removed by the author.

    ReplyDelete
    Replies
    1. Wasslm,
      download 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)


      Delete
  2. This comment has been removed by the author.

    ReplyDelete
  3. Mas ini syntac nya untuk vb .php atau matlab ya


    ReplyDelete