Aplikasi pengenalan wajah pca

2,773 views
2,598 views

Published on

pengenalan wajah menggunakan PCA (principal component analyst)

Published in: Education
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
2,773
On SlideShare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
140
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Aplikasi pengenalan wajah pca

  1. 1. Pengenalan Wajah dengan Teknik PCA Oleh: mulkan.ms@gmail.com http://softscients.blogspot.com adalah teknik untuk mereduksi sebuah matrix, dengan memanfaatkan egien value dan eigenvector. Kita tahu bahwa dimensi sebuah citra terdiri dari width dan hieght,sebagai misal nya kita mempunyai sebuah matrix citra berukuran 100*120 berjumlah 50 data, maka dengan teknik PCA data tersebut dapat direduksi menjadi 50baris*50kolom saja untuk mempresentasikan data Disusun vector baris
  2. 2. Ukuran nya menjadi 12000baris*50kolom Kemudian menggunakan eigen vector dan eigen value menjadi 50baris*50kolom Maka ini disebut AKU analisis komponen utama alias Principal Component Analyst, teknik tersebut sering digunakan untuk egien face yaitu face recognition alias temu kembali citra wajah, seperti aplikasi yang telahdibuat oleh penulis menggunakan .Net 4.0 yaitu C#
  3. 3. Penggunaan PustakaPCA Kita akan menghitung data pelatihan Akan lebih mudah jika tiap-tiapmatrix diberi nama seperti berikut Pemberiannama pada tiap matrix tersebut kelak akan dipakai sebagai lokasi sebuah file citra! Kemudian dibawah ini adalah matrix pengujian, matrix ini akan diuji, kira-kira mirip dengan nilai yang mana? Ternyata setelah dihitung dengan PCA menghasilkan Data 6.bmp mirip dengan Data 2.bmp
  4. 4. Berikut penggunaanpustaka nya static void Main(string[] args) { /* Kita akan akan mencoba secara sederhana untuk mengitung PCA * yaitu menggunakan class DatabasePCA untuk menciptakan sebuah database PCA * yang didalamnya berisi lokasi file citra dan array pixel nya * tapi dalam contoh kali ini, kita menggunakan dummy data saja! * agar lebih mudah! */ ArrayList arrayPelatihan = new ArrayList(); arrayPelatihan.Insert(0, new DatabasePCA("data 1.bmp", new double[,] { { 1, 3, 4 }, { 6, 7, 8 } })); arrayPelatihan.Insert(1, new DatabasePCA("data 2.bmp", new double[,] { { 4, 5, 3 }, { 2, 1, 6 } })); arrayPelatihan.Insert(2, new DatabasePCA("data 3.bmp", new double[,] { { 6, 7, 4 }, { 2, 4, 1 } })); arrayPelatihan.Insert(3, new DatabasePCA("data 4.bmp", new double[,] { { 8, 4, 3 }, { 1, 1, 1 } })); arrayPelatihan.Insert(4, new DatabasePCA("data 5.bmp", new double[,] { { 9, 9, 6 }, { 5, 4, 8 } })); Console.WriteLine("Data Pelatihan"); for (int i = 0; i < arrayPelatihan.Count;i++ ) { DatabasePCA dataPelatihan = (DatabasePCA)arrayPelatihan[i]; Console.WriteLine(dataPelatihan.NamaFile); Prt.Print(dataPelatihan.Data); } PCA pelatihanPCA = new PCA(); //panggil class PCA pelatihanPCA.Pelatihan(arrayPelatihan); //proses pelatihan! /* setelah proses pelatihan! * maka akan kita harus menyimpan hasil data pelatihan berupa! * Adata,
  5. 5. * rerata data * eigenface, dan * database nya * untuk menyimpan array tersebut! maka kita gunakan konsep serialisasi! * * */ double[,] Adata = pelatihanPCA.AData; double[] rerataData = pelatihanPCA.DataRerata; double[,] eigenface = pelatihanPCA.EigenFace; String lokasiAdata = "pca.adata"; String lokasiRerata = "pca.rerata"; String lokasiEigenFace = "pca.eigenface"; Stream streamWrite = File.Create(lokasiAdata); //simpan dalam bentuk serialiasai BinaryFormatter binaryWrite = new BinaryFormatter(); binaryWrite.Serialize(streamWrite, Adata); streamWrite.Close(); streamWrite = File.Create(lokasiRerata); //simpan dalam bentuk serialiasai binaryWrite = new BinaryFormatter(); binaryWrite.Serialize(streamWrite, rerataData); streamWrite.Close(); streamWrite = File.Create(lokasiEigenFace); //simpan dalam bentuk serialiasai binaryWrite = new BinaryFormatter(); binaryWrite.Serialize(streamWrite, eigenface); streamWrite.Close(); /* juga menyimpan sebuah lokasi untuk database nya! */ String lokasiDataCitra = "pca.pelatihan"; streamWrite = File.Create(lokasiDataCitra); //simpan dalam bentuk serialiasai binaryWrite = new BinaryFormatter(); binaryWrite.Serialize(streamWrite, pelatihanPCA.DataPelatihan); streamWrite.Close(); /* kita akan mencoba proses pengujian dengan data lain nya */ ArrayList arrayPengujian = new ArrayList(); arrayPengujian.Insert(0, new DatabasePCA("data 6.bmp", new double[,] { { 3, 5, 3 }, { 2, 1, 8 } })); /* jangan lupa untuk load data hasil pelatihan! * yaitu dengan konsep deserialisasi! */ double[,] AdataLoad; double[] rerataDataLoad; double[,] eigenfaceLoad; ArrayList arrayPelatihanLoad; Stream streamRead = File.OpenRead(lokasiAdata); BinaryFormatter binaryRead = new BinaryFormatter(); AdataLoad = (double[,])binaryRead.Deserialize(streamRead); streamRead.Close(); streamRead = File.OpenRead(lokasiRerata); binaryRead = new BinaryFormatter(); rerataDataLoad = (double[])binaryRead.Deserialize(streamRead); streamRead.Close(); streamRead = File.OpenRead(lokasiEigenFace); binaryRead = new BinaryFormatter(); eigenfaceLoad = (double[,])binaryRead.Deserialize(streamRead); streamRead.Close(); streamRead = File.OpenRead(lokasiDataCitra); binaryRead = new BinaryFormatter();
  6. 6. arrayPelatihanLoad = (ArrayList)binaryRead.Deserialize(streamRead); streamRead.Close(); /*setelah OK semuanya!*/ PCA pcaPengujian = new PCA(); //panggil class PCA pcaPengujian.Pengujian(rerataDataLoad,AdataLoad, eigenfaceLoad, arrayPengujian);//pengujian dimulai! double[] jarak = pcaPengujian.Shift; /*untuk menghitung jarak antara data pelatihan * dengan data pengujian */ double[] minMax = DataNorm.MinMax(jarak); jarak = DataNorm.Normalisasi(jarak, minMax[0], minMax[1]); /*lakukan normalisasi jarak * sehingga jarak mempunyai nilai kisaran 0 - 1 */ double jarakMin = Matrix.Min(jarak); /* tentu jika mempunyai jarak yang mendekati 0 * maka itulah nilai terkecil nya * sebagai acuan no index */ int noIndex = Array.IndexOf(jarak, jarakMin); DatabasePCA hasilFinal = (DatabasePCA) arrayPelatihanLoad[noIndex]; DatabasePCA uji = (DatabasePCA) arrayPengujian[0]; Console.WriteLine("Data Pengujian"); Console.WriteLine(uji.NamaFile); Prt.Print(uji.Data); Console.WriteLine(uji.NamaFile + " mirip dengan " + hasilFinal.NamaFile); Console.WriteLine("OK"); Console.ReadKey(); } Setelah kamu melihat code diatas,maka bisa diterapkan kepada sebuah citra! Walaupun citra dibawah ini menggunakan truecolor,akan di convert ke grayscale
  7. 7. Diatas adalah citra pelatihan! Terlihat bahwa citra tersebut hanya berisi wajah saja dan mempunyai ukuran yang seragam! Kemudian kita akan menguji, kira-kira citra dibawah ini dikenali atau tidak? Ternyata menghasilkan Yaitu citra diatas miripdengan 15.jpg yaitu
  8. 8. public static void DemoPCACitra() { /* dalam versi PCA untuk digunakan sebagai face recognition * sebaiknya pastikan kamu sudah menyiapkan folder khusus berupa * gambar wajah (saja) bukan foto close up * dan pastikan juga ukuran gambar tersebut harus sama! */ String folderCitraPelatihan ="D:/Sample Citra/TrainDatabase"; string[] lokasiFileTraining = Directory.GetFiles(folderCitraPelatihan, "*.jpg"); /* kemudian kita akan me loop seluruh isi folder * dan membaca citra tersebut */ ArrayList arrayPelatihan = new ArrayList(); for (int i = 0; i < lokasiFileTraining.Length; i++) { Bitmap bitmap = (Bitmap)System.Drawing.Image.FromFile(lokasiFileTraining[i]); //baca file nya! Bitmap gray; if (bitmap.PixelFormat != PixelFormat.Format8bppIndexed) //jika truecolor! convert dulu ke gray! { gray = AForge.Imaging.Filters.Grayscale.CommonAlgorithms.RMY.Apply(bitmap);//convert ke gray } else { gray = bitmap; } ReadImage bacaCitra = new ReadImage(gray); ushort [,] pixel = bacaCitra.Matrix[0]; //ambil nilai pixel nya Console.WriteLine(lokasiFileTraining[i] + " telah dimasukan"); arrayPelatihan.Insert(i, new DatabasePCA(lokasiFileTraining[i],pixel)); //masukan kedalam database! } PCA pelatihanPCA = new PCA(); //panggil class PCA pelatihanPCA.Pelatihan(arrayPelatihan); //proses pelatihan! Console.WriteLine("Pelatihan Selesai"); /* setelah proses pelatihan! * maka akan kita harus menyimpan hasil data pelatihan berupa! * Adata, * rerata data * eigenface, dan * database nya * untuk menyimpan array tersebut! maka kita gunakan konsep serialisasi! * * */ double[,] Adata = pelatihanPCA.AData; double[] rerataData = pelatihanPCA.DataRerata; double[,] eigenface = pelatihanPCA.EigenFace; String lokasiAdata = "pca.adata";
  9. 9. String lokasiRerata = "pca.rerata"; String lokasiEigenFace = "pca.eigenface"; Stream streamWrite = File.Create(lokasiAdata); //simpan dalam bentuk serialiasai BinaryFormatter binaryWrite = new BinaryFormatter(); binaryWrite.Serialize(streamWrite, Adata); streamWrite.Close(); streamWrite = File.Create(lokasiRerata); //simpan dalam bentuk serialiasai binaryWrite = new BinaryFormatter(); binaryWrite.Serialize(streamWrite, rerataData); streamWrite.Close(); streamWrite = File.Create(lokasiEigenFace); //simpan dalam bentuk serialiasai binaryWrite = new BinaryFormatter(); binaryWrite.Serialize(streamWrite, eigenface); streamWrite.Close(); /* juga menyimpan sebuah lokasi untuk database nya! */ String lokasiDataCitra = "pca.pelatihan"; streamWrite = File.Create(lokasiDataCitra); //simpan dalam bentuk serialiasai binaryWrite = new BinaryFormatter(); binaryWrite.Serialize(streamWrite, pelatihanPCA.DataPelatihan); streamWrite.Close(); /* kita akan mencoba proses pengujian dengan data lain nya * yaitu menggunakan citra! */ String lokasiFileCitraPengujian = "D:/Sample Citra/TestDatabase/8.jpg"; Bitmap bitmap2 = (Bitmap)System.Drawing.Image.FromFile(lokasiFileCitraPengujian); //baca file nya! Bitmap gray2; if (bitmap2.PixelFormat != PixelFormat.Format8bppIndexed) //jika truecolor! convert dulu ke gray! { gray2 = AForge.Imaging.Filters.Grayscale.CommonAlgorithms.RMY.Apply(bitmap2);//convert ke gray } else { gray2 = bitmap2; } ReadImage bacaCitra2 = new ReadImage(gray2); ushort[,] pixel2 = bacaCitra2.Matrix[0]; //ambil nilai pixel nya ArrayList arrayPengujian = new ArrayList(); arrayPengujian.Insert(0, new DatabasePCA(lokasiFileCitraPengujian,pixel2)); /* jangan lupa untuk load data hasil pelatihan! * yaitu dengan konsep deserialisasi! */ double[,] AdataLoad; double[] rerataDataLoad; double[,] eigenfaceLoad; ArrayList arrayPelatihanLoad; Stream streamRead = File.OpenRead(lokasiAdata); BinaryFormatter binaryRead = new BinaryFormatter(); AdataLoad = (double[,])binaryRead.Deserialize(streamRead); streamRead.Close(); streamRead = File.OpenRead(lokasiRerata); binaryRead = new BinaryFormatter(); rerataDataLoad = (double[])binaryRead.Deserialize(streamRead); streamRead.Close(); streamRead = File.OpenRead(lokasiEigenFace); binaryRead = new BinaryFormatter(); eigenfaceLoad = (double[,])binaryRead.Deserialize(streamRead); streamRead.Close(); streamRead = File.OpenRead(lokasiDataCitra);
  10. 10. binaryRead = new BinaryFormatter(); arrayPelatihanLoad = (ArrayList)binaryRead.Deserialize(streamRead); streamRead.Close(); /*setelah OK semuanya!*/ PCA pcaPengujian = new PCA(); //panggil class PCA pcaPengujian.Pengujian(rerataDataLoad, AdataLoad, eigenfaceLoad, arrayPengujian);//pengujian dimulai! double[] jarak = pcaPengujian.Shift; /*untuk menghitung jarak antara data pelatihan * dengan data pengujian */ double[] minMax = DataNorm.MinMax(jarak); jarak = DataNorm.Normalisasi(jarak, minMax[0], minMax[1]); /*lakukan normalisasi jarak * sehingga jarak mempunyai nilai kisaran 0 - 1 */ double jarakMin = Matrix.Min(jarak); /* tentu jika mempunyai jarak yang mendekati 0 * maka itulah nilai terkecil nya * sebagai acuan no index */ int noIndex = Array.IndexOf(jarak, jarakMin); DatabasePCA hasilFinal = (DatabasePCA)arrayPelatihanLoad[noIndex]; DatabasePCA uji = (DatabasePCA)arrayPengujian[0]; Console.WriteLine("Data Pengujian"); Console.WriteLine(uji.NamaFile); Console.WriteLine(uji.NamaFile + " mirip dengan " + hasilFinal.NamaFile); Console.WriteLine("OK"); } GUI PCA pun bisa digunakan untuk keperluan lainnya! Misalkan saja untuk pengenalan tulisan tangan
  11. 11. Download Kunjungi ke www.softscients.web.id

×