ekstraksi fitur dan pengenalan citra wajah
DESCRIPTION
EKSTRAKSI FITUR DAN PENGENALAN CITRA WAJAHTRANSCRIPT
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
kf
m
kf
m
kfm
k
n
m
k
m
k 1
,1
1
2,1
1
1,1 )()()(
(2.1)
b. Tentukan zero mean menggunakan persamaan berikut
whkf ,)( (2.2)
c. Hitung Covarian matrik menggunakan persamaan berikut
T
mC *
1
1
(2.3)
d. Tentukan nilai eigen value dan eigen vector menggunakan persamaan
0)*(
0)*(
0)*(
0*)(
0**
**
CI
IC
XIC
XC
XXC
XXC
(2.4)
e. Urutkan nilai eigen value secara decreasing dan nilai eigen vector
mengikuti
f. Tentukan matrik proyeksi menggunakan persamaan berikut
PV T *1 (2.5)
P merupakan nilai eigenvector yang teah terurut
g. Hitung matrik bobot menggunakan persamaan berikut
T
nm VkfW *)( , (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
jiji YXd1 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
Jawaban
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.