pengenalan wajah dengan teknik pca

Upload: mulkan-syarief

Post on 04-Nov-2015

32 views

Category:

Documents


0 download

DESCRIPTION

face recognition dengan teknik PCA,Pengenalan Wajah Dengan Teknik PCA, ahli matlab, softscients, IT outsourcing service

TRANSCRIPT

Pengenalan Wajah dengan Teknik PCAOleh: [email protected]://softscients.blogspot.com

adalah teknik untuk mereduksi sebuah matrix, dengan memanfaatkan egien value dan eigen vector. 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

Ukuran nya menjadi 12000baris*50kolomKemudian 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 telah dibuat oleh penulis menggunakan .Net 4.0 yaitu C#

Penggunaan Pustaka PCA Kita akan menghitung data pelatihanAkan lebih mudah jika tiap-tiap matrix diberi nama seperti berikut

Pemberian nama 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

Berikut penggunaan pustaka nyastatic 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, * 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(); 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

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 mirip dengan 15.jpg yaitu

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"; 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); 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 tanganDownloadKunjungi ke www.softscients.web.id