LAPORAN RESMI PRAKTIKUM PENGOLAHAN CITRA DIGITAL MODUL 6 “EKSTRAKSI
FITUR DAN PENGENALAN CITRA WAJAH ”
Disusun Oleh :
TGL. PRAKTIKUM NAMA NRP KELOMPOK DOSEN ASISTEN
: 04 Januari 2013 2013 : Tri Cahyo Lutfinanda Amrulloh : 10.04.111.00088 10.04.111.00088 : C-2 : : Ika Nofitasari
Disetujui :......./........../............../Bangkalan :......./........../............../Bangkalan ASISTEN DOSEN
Ika Nofitasari 090411100063 LABORATORIUM COMMON COMPUTING JURUSAN TEKNIK INFORMATIKA FAKULTAS TEKNIK UNIVERSITAS TRUNOJOYO MADURA 2011 / 2012
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’. Jik a 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} TrainingMatric{1,2} TrainingMatric{1,3}
... ... TrainingMatric{100,1} TrainingMatric{100,2} TrainingMatric{100,3}
F(1,1) F(2,1) F(3,1) ... ... F(298,1) F(299,1) F(300,1)
F(1,2) F(2,2) F(3,2) ... ... F(298,2) F(299,2) F(300,2)
F(1,3) F(2,3) F(3,3) ... ... F(298,3) F(299,3) F(300,3)
F(1,4) F(2,4) F(2,4) ... ... F(298,4) F(299,4) F(300,4)
... ... ... ... ... ... ... ...
F(1,165.000) F(2,165.000) F(3,165.000) ... ... F(298,165.000) F(299,165.000) 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 f (k )1,1 k 1 m
m
f (k ) k 1
m
m
f (k )
1, 2
k 1
m
1, n
(2.1)
b. Tentukan zero mean menggunakan persamaan berikut f (k ) h,w
(2.2)
c. Hitung Covarian matrik menggunakan persamaan berikut C
1 m 1
* T
(2.3)
d. Tentukan nilai eigen value dan eigen vector menggunakan persamaan C * X
C * X
* X * X
(C ) * X
(C
I * ) X
(C
I * )
( I *
C )
0
0
0
0
0
(2.4)
e. Urutkan nilai eigen value secara decreasing dan nilai eigen vector mengikuti f. Tentukan matrik proyeksi menggunakan persamaan berikut V 1 T * P
(2.5)
P merupakan nilai eigenvector yang teah terurut g. Hitung matrik bobot menggunakan persamaan berikut W f (k ) m,n *V T
(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
n
d X i , j Y i , j i 1 j 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 MatchKelasKe-62 PoseKe- 2.JPG’.
’Salah-KelasKe-2
PoseKe-2
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.