Anda di halaman 1dari 13

LAPORAN RESMI

PRAKTIKUM
PENGOLAHAN CITRA DIGITAL
MODUL 6
EKSTRAKSI FITUR DAN PENGENALAN CITRA WAJAH

Disusun Oleh :



















LABORATORIUM COMMON COMPUTING
JURUSAN TEKNIK INFORMATIKA
FAKULTAS TEKNIK
UNIVERSITAS TRUNOJOYO MADURA
2011 / 2012


TGL. PRAKTIKUM : 04 Januari 2013
NAMA : Tri Cahyo Lutfinanda Amrulloh
NRP : 10.04.111.00088
KELOMPOK : C-2
DOSEN :
ASISTEN : Ika Nofitasari
Disetujui :......./........../............../Bangkalan
ASISTEN DOSEN


Ika Nofitasari
090411100063

BAB I
PENDAHULUAN

1.1 Latar Belakang
Dalam proses pengenalan citra wajah diperlukan beberapa cara agar hasil yang
diinginkan bisa tercapai dengan sempurna. Ada beberapa langkah langkah
yang harus di penuhi dalam memproses pengenalan citra wajah. Antara lain
dengan mengambil beberapa contoh citra yang akan digunakan untuk testing,
pemrosesan zero mean dan masih banyak langkah yang harus dilakukan yang
selebihnya akan di bahas pada modul ini.
1.2 Tujuan
Tujuan mahasiswa mengikuti praktikum modul 6 ini adalah :
1. Mahasiswa dapat memahami ekstraksi fitur
2. Mahasiswa dapat membuat program pengenalan citra wajah menggunakan
matlab

















BAB II
DASAR TEORI

Modul 6 menggunakan hasil penyiapan dan pemisahan data yang dilakukan pada
modul 5. Pada modul 6 ini dilakukan ekstraksi fitur menggunakan Principal
Component Analysis (PCA) dan pengukuran kemiripan menggunakan Euclidian
Distance. Sebelum masuk pada penjelesan ekstraksi fitur menggunakan PCA,
maka dalam modul ini dijelaskan terlebih dahulu pemodalan pada PCA. Sebelum
ekstraksi fitur, data pelatihan matrik 2 dimensi dirubah menjadi matrik baris 1
dimensi. Jika dimensi masing-masing citra adalah 150x110, maka dirubah
menjadi 1x165.000. Jika jumlah data sampel yang digunakan adalah 100,
masing-masing sampel mempunyai 3 pose yang berbeda, maka jumlah data
sampel untuk pelatihan adalah sebanyak 300. Sehingga struktur matrik data
pelatihan yang baru berubah dimensinya menjadi dalam bentuk array dengan
ukuran 300x165.000. Dalam contoh ini hasil pembentukan matrik tersebut
hanya dalam variabel memory dengan nama TrainingMatric sebagaimana
terlihat pada Gambar 6.1 berikut ini :
TrainingMatric{1,1} F(1,1) F(1,2) F(1,3) F(1,4) . . . F(1,165.000)
TrainingMatric{1,2} F(2,1) F(2,2) F(2,3) F(2,4) . . . F(2,165.000)
TrainingMatric{1,3} F(3,1) F(3,2) F(3,3) F(2,4) . . . F(3,165.000)
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
TrainingMatric{100,1} F(298,1) F(298,2) F(298,3) F(298,4) . . . F(298,165.000)
TrainingMatric{100,2} F(299,1) F(299,2) F(299,3) F(299,4) . . . F(299,165.000)
TrainingMatric{100,3} F(300,1) F(300,2) F(300,3) F(300,4) . . . F(300,165.000)
Gambar 2.1. Struktur Array Matrik Data Pelatihan
2.1 Ekstraksi Fitur Menggunakan PCA
Setelah diperoleh data matrik tersebut, proses selanjutnya adalah melakukan
ekstrakasi fitur menggunakan PCA. Adapun proses PCA dapat dituliskan
menggunakan algoritma berikut ini
a. Hitung nilai rata-rata citra wajah menggunakan persamaan
(
(
(
(

=

= = =
m
k f
m
k f
m
k f
m
k
n
m
k
m
k 1
, 1
1
2 , 1
1
1 , 1
) ( ) ( ) (

(2.1)
b. Tentukan zero mean menggunakan persamaan berikut
| =
w h
k f
,
) (
(2.2)
c. Hitung Covarian matrik menggunakan persamaan berikut
T
m
C | | *
1
1

=
(2.3)
d. Tentukan nilai eigen value dan eigen vector menggunakan persamaan
0 ) * (
0 ) * (
0 ) * (
0 * ) (
0 * *
* *
=
=
=
=
=
=
C I
I C
X I C
X C
X X C
X X C

(2.4)
e. Urutkan nilai eigen value secara decreasing dan nilai eigen vector
mengikuti
f. Tentukan matrik proyeksi menggunakan persamaan berikut
P V
T
* 1 | =
(2.5)
P merupakan nilai eigenvector yang teah terurut
g. Hitung matrik bobot menggunakan persamaan berikut
T
n m
V k f W * ) (
,
=
(2.6)
Code program dalam matlab untuk melakukan konversi matrik data pelatihan
dan ekstraksi fitur menggunakan PCA adalah sebagaimana berikut ini :
function [MatrikBobot, MatrikProyeksi,eigvector,Average,ZeroMean] =
TrainingProcess(ImageTraining);
[nClassTotal nMemberClassTotal]=size(ImageTraining);
[Height Width]=size(ImageTraining{1,1});
TrainingMatric=[];
%% Konversi ke matrik 1D
Number=0;
h = waitbar(0,'Sistem Melakukan Process Konversi ke Matrik 1D dan Training PCA . . . .');
for j=1:nClassTotal
for k=1:nMemberClassTotal
Flat=reshape(ImageTraining{j,k},1,Height*Width);
TrainingMatric=[TrainingMatric;Flat];
Number=Number+1;
waitbar(Number/(nClassTotal*nMemberClassTotal));
end
end

%% Training PCA
TrainingMatric=double(TrainingMatric);
[HeightTrainingMatric, WidthTrainingMatric]=size(TrainingMatric)
Average = repmat(mean(TrainingMatric), HeightTrainingMatric,1);
ZeroMean=TrainingMatric-Average;
CovMatric =ZeroMean*ZeroMean';


if det(CovMatric)<0.000000001
[eigvector, eigvalue] = svd(CovMatric);
eigvalue=diag(eigvalue);
else
[eigvector, eigvalue] = eig(CovMatric);
eigvalue = diag(eigvalue);
[junk, index] = sort(-eigvalue);
eigvalue = eigvalue(index);
eigvector = eigvector(:, index);
end
xMatrikProyeksi = ZeroMean'*eigvector;
yMatrikProyeksi = xMatrikProyeksi *diag(1./(sum(xMatrikProyeksi.^2).^0.5));
MatrikProyeksi =transpose(xMatrikProyeksi);
MatrikBobot = TrainingMatric*transpose(MatrikProyeksi);
close(h)
Pada code program diatas, hasil proses disimpan dalam 5 veriabel yang
mempunyai fungsi berbeda, diantarnya adalah MatrikBobot, MatrikProyeksi,
eigvector, Averagei dan ZeroMean. Output dari program tersebut akan
digunakan sebagai input pada proses pengukuran kemiripan.
2.2 Pengukuran Kemiripan
Dua buah output dari ekstraksi fitur yang penting adalah MatrikBobot dan
MatrikProyeksi. MatrikBobot digunakan sebagai referensi untuk mengukur
kemiripan dari hasil proyeksi matrik ujicoba setelah diproyeksikan dengan
MatrikProyeksi output PCA. Pengukuran kemiripannya menggunakan
persamaan yang sederhana, yaitu Euclidian Distance sebagaimana dalam
persamaan berikut ini:

= =
=
m
i
n
j
j i j i
Y X d
1 1
, ,
(2.7)
Code untuk melakukan perhitungan menggunakan Persamaan (2.7) adalah
sebagaimana berikut ini :
function [Kelas, Urutan] = SmEuclidDistance(TrainingWeightMatric,
MatrikBobotUjiCoba,nSamplePerClass);
[HeightTrainingWeightMatric, WidthTrainingWeightMatric]=size(TrainingWeightMatric);
Distance = ones(1,HeightTrainingWeightMatric);
for k=1 : HeightTrainingWeightMatric
EucDist= (TrainingWeightMatric(k,:) - MatrikBobotUjiCoba(1,:));
EucDist=sum(EucDist.^2);
EucDist=EucDist^0.5;
Distance(1,k)=EucDist;
end;
[aMin, Urutan]=min(Distance);
Kelas=ceil(Urutan/nSamplePerClass);
Urutan=mod(Urutan,nSamplePerClass);
if Urutan==0
Urutan=nSamplePerClass
end
Sebelum diukur kemiripannya menggunakan Persamaan (6.8), data ujicoba
matrik 2D dikonversi dulu menjadi matrik 1D.
%% Training
load ImageTraining.mat
FolderHasil='D:\CItra Digital\Praktikum\Hasil Process\';
[nClassTotalTraining nMemberClassTotalTraining]=size(ImageTraining);

[MatrikBobot, MatrikProyeksi,eigvector,Average,ZeroMean] =
TrainingProcess(ImageTraining);


%% Testing
load ImageTesting.mat
[nClassTotalTesting nMemberClassTotalTesting]=size(ImageTesting);
[Height Width]=size(ImageTesting{1,1});
Number=0;
h = waitbar(0,'Sistem Melakukan Process Konversi ke Matrik 1D dan Training PCA . . . .');
TotalBenar=0;
TotalSalah=0
for j=1:nClassTotalTesting
for k=1:nMemberClassTotalTesting
HasilProyeksiTest=reshape(ImageTesting{j,k},1,Height*Width);
HasilProyeksiTest=double(HasilProyeksiTest)* transpose(MatrikProyeksi);

%% Bandingkan Dengan Matrik Bobot dengan
[Kelas, Urutan] = SmEuclidDistance(MatrikBobot,
HasilProyeksiTest,nMemberClassTotalTraining);
%% Simpan hasil pengenalan
CitraTes=ImageTesting{j,k};
CitraHas=ImageTraining{Kelas,Urutan};
Hasil=[CitraTes CitraHas];

if Kelas==j
TotalBenar=TotalBenar+1
NamaHasil=[FolderHasil 'Benar-KelasKe-' num2str(j) ' PoseKe-' num2str(k) ' Match
PoseKe-' num2str(Urutan) '.jpg'];
else
TotalSalah=TotalSalah+1
NamaHasil=[FolderHasil 'Salah-KelasKe-' num2str(j) ' PoseKe-' num2str(k) '
MatchKelasKe-' num2str(Kelas) ' PoseKe-' num2str(Urutan) '.jpg'];
end
imwrite(Hasil,NamaHasil);
Number=Number+1;
waitbar(Number/(nClassTotalTesting*nMemberClassTotalTesting));
end
end
close(h)

%% Prosentase Dikenali dan Tidak Dikenali
ProsenSalah=(TotalSalah/(TotalSalah+TotalBenar))*100;
ProsentBenar=(TotalBenar/(TotalSalah+TotalBenar))*100;
Hasil proses pengenalan disimpan secara berpasangan, dan diberikan nama
sesuai dengan hasil pengukuran kemiripan. Untuk data ujicoba yang dikenali,
diberi nama awal file Benar diikuti dengan pasangan yang sesuai, misalnya
Benar-KelasKe-6 PoseKe-2 Match PoseKe-1.JPG. Sedangkan untuk data
ujicoba yang salah hasilnya, diberi nama awal file Salah diikuti dengan
urutan sampel dan pose yang diuji, dan diikuti dengan kata MatchKelasKe
dan PoseKe. Sebagai contoh nama file yang salah dalam pengukuran
kemiripannya adalah sebagaimana berikut Salah-KelasKe-2 PoseKe-2
MatchKelasKe-62 PoseKe-2.JPG.





















BAB III
IMPLEMENTASI

1. Gunakan data citra wajah ORL untuk melakukan pengenalan, data pelatihan
yang digunakan 4 citra pada masing-masing kelas dan sisanya digunakan
ujicoba
2. Tampilkan hasil pengenalan setiap kelas dalam bentuk grafik untuk
keseluruhan data sampel
J awaban
1. Set Data Training
function [UrutanPoseTraining UrutanPoseTesting] =
SetDataTrainTest(Sample, IndekTraining)
UrutanPoseTraining=IndekTraining;
c=ismember(Sample,UrutanPoseTraining);
UrutanPoseTesting=[];
for j=1:length(Sample);
if c(j)==0;
UrutanPoseTesting=[UrutanPoseTesting j];
end
end

Pengukuran Kemiripan
function [Kelas, Urutan] =
SmEuclidDistance(TrainingWeightMatric,
MatrikBobotUjiCoba,nSamplePerClass);
[HeightTrainingWeightMatric,
WidthTrainingWeightMatric]=size(TrainingWeightMatric);
Distance = ones(1,HeightTrainingWeightMatric);
for k=1 : HeightTrainingWeightMatric
EucDist= (TrainingWeightMatric(k,:) -
MatrikBobotUjiCoba(1,:));
EucDist=sum(EucDist.^2);
EucDist=EucDist^0.5;
Distance(1,k)=EucDist;
end;
[aMin, Urutan]=min(Distance);
Kelas=ceil(Urutan/nSamplePerClass);
Urutan=mod(Urutan,nSamplePerClass);
if Urutan==0
Urutan=nSamplePerClass
end

Training Proses
function [MatrikBobot,
MatrikProyeksi,eigvector,Average,ZeroMean] =
TrainingProcess(ImageTraining);
[nClassTotal nMemberClassTotal]=size(ImageTraining);
[Height Width]=size(ImageTraining{1,1});
TrainingMatric=[];
%% Konversi ke matrik 1D
Number=0;
h = waitbar(0,'Sistem Melakukan Process Konversi ke Matrik 1D
dan Training PCA . . . .');
for j=1:nClassTotal
for k=1:nMemberClassTotal
Flat=reshape(ImageTraining{j,k},1,Height*Width);
TrainingMatric=[TrainingMatric;Flat];
Number=Number+1;
waitbar(Number/(nClassTotal*nMemberClassTotal));
end
end

%% Training PCA
TrainingMatric=double(TrainingMatric);
[HeightTrainingMatric,
WidthTrainingMatric]=size(TrainingMatric)
Average = repmat(mean(TrainingMatric),
HeightTrainingMatric,1);
ZeroMean=TrainingMatric-Average;
CovMatric =ZeroMean*ZeroMean';

if det(CovMatric)<0.000000001
[eigvector, eigvalue] = svd(CovMatric);
eigvalue=diag(eigvalue);
else
[eigvector, eigvalue] = eig(CovMatric);
eigvalue = diag(eigvalue);
[junk, index] = sort(-eigvalue);
eigvalue = eigvalue(index);
eigvector = eigvector(:, index);
end

xMatrikProyeksi = ZeroMean'*eigvector;
yMatrikProyeksi = xMatrikProyeksi
*diag(1./(sum(xMatrikProyeksi.^2).^0.5));
MatrikProyeksi =transpose(xMatrikProyeksi);
MatrikBobot = TrainingMatric*transpose(MatrikProyeksi);
close(h)

Pembentukan data training
%% Set Data Training
Sample=(1:10);
IndekTraining=[1 2 3 4];
[UrutanPoseTraining UrutanPoseTesting] =
SetDataTrainTest(Sample, IndekTraining);

%% Pembentukan data training
load MatP.mat
[nClassTotal nMemberClassTotalTesting]=size(MatP);
nMemberClassTotal=length(UrutanPoseTraining);
h = waitbar(0,'Pembentukan Data Training . . . .');
Number = 0;
for k=1:nClassTotal
for j=1:nMemberClassTotal
ImageTraining{k,j}=MatP{k,UrutanPoseTraining(j)};
Number=Number+1;
waitbar(Number/(nClassTotal*nMemberClassTotal));
end
end

%% Simpan data training
save ImageTraining ImageTraining;
close(h);

%% Pembentukan data testing
load MatP.mat
nMemberClassTotal=length(UrutanPoseTesting);
h = waitbar(0,'Pembentukan Data Testing . . . .');
Number = 0;
for k=1:nClassTotal
for j=1:nMemberClassTotal
ImageTesting{k,j}=MatP{k,UrutanPoseTesting(j)};
Number=Number+1;
waitbar(Number/(nClassTotal*nMemberClassTotal));
end
end

%% Simpan Data Testing
save ImageTesting ImageTesting;
close(h);

Testing Proses
%% Training
load ImageTraining.mat
FolderHasil='H:\KULIAH\SEMESTER V\PRAK. PENGOLAHAN CITRA
DIGITAL\Citra Digital\Hasil Process\';
[nClassTotalTraining
nMemberClassTotalTraining]=size(ImageTraining);

[MatrikBobot, MatrikProyeksi,eigvector,Average,ZeroMean] =
TrainingProcess(ImageTraining);


%% Testing
load ImageTesting.mat
[nClassTotalTesting
nMemberClassTotalTesting]=size(ImageTesting);
[Height Width]=size(ImageTesting{1,1});
Number=0;
h = waitbar(0,'Sistem Melakukan Process Konversi ke Matrik 1D
dan Training PCA . . . .');
TotalBenar=0;
TotalSalah=0;
for j=1:nClassTotalTesting
for k=1:nMemberClassTotalTesting

HasilProyeksiTest=reshape(ImageTesting{j,k},1,Height*Width);
HasilProyeksiTest=double(HasilProyeksiTest)*
transpose(MatrikProyeksi);

%% Bandingkan Dengan Matrik Bobot dengan
[Kelas, Urutan] = SmEuclidDistance(MatrikBobot,
HasilProyeksiTest,nMemberClassTotalTraining);
%% Simpan hasil pengenalan
CitraTes=ImageTesting{j,k};
CitraHas=ImageTraining{Kelas,Urutan};
Hasil=[CitraTes CitraHas];

if Kelas==j
TotalBenar=TotalBenar+1
NamaHasil=[FolderHasil 'Benar-KelasKe-' num2str(j)
' PoseKe-' num2str(k) ' Match PoseKe-' num2str(Urutan)
'.jpg'];
else
TotalSalah=TotalSalah+1
NamaHasil=[FolderHasil 'Salah-KelasKe-' num2str(j)
' PoseKe-' num2str(k) ' MatchKelasKe-' num2str(Kelas) '
PoseKe-' num2str(Urutan) '.jpg'];
end
imwrite(Hasil,NamaHasil);
Number=Number+1;

waitbar(Number/(nClassTotalTesting*nMemberClassTotalTesting));
end
end
close(h)

%% Prosentase Dikenali dan Tidak Dikenali
ProsenSalah=(TotalSalah/(TotalSalah+TotalBenar))*100;
ProsentBenar=(TotalBenar/(TotalSalah+TotalBenar))*100;

Running Program:



Hasil dari proses : Tersimpan di folder H:\KULIAH\SEMESTER V\PRAK.
PENGOLAHAN CITRA DIGITAL\Citra Digital\Hasil Process

Menampilkan prosentase kebenaran dan kesalahan pencocokan citra :

2. Menampilkan data per kelas

BAB V
PENUTUP

5.1 Kesimpulan
Pada saat proses pencocokan citra wajah yang dilakukan banyak atau tidak
cocoknya citra wajah tersebut tergantung dari jumlah data training dan data
testing yang digunakan. Semua proses yang dilakukan harus berurutan karena
apabila satu proses dilewatkan maka ada satu file yang tidak akan terbentuk
dan proses selanjutnya tidak akan berjalan dengan sempurna.

5.2 Saran
Pada saat melakukan pengetesan source code harus di perhatikan destinasi
folder yang di tuju. Karena kesalahan destinasi folder akan menyebabkan
program eror dan tidak dapat berjalan dengan baik.