aplikasi pengenalan wajah pca

12
Pengenalan Wajah dengan Teknik PCA Oleh: [email protected] http://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

Upload: wwwsoftscientswebid

Post on 20-Jun-2015

2.217 views

Category:

Education


4 download

DESCRIPTION

pengenalan wajah menggunakan PCA (principal component analyst)

TRANSCRIPT

Page 1: Aplikasi pengenalan wajah pca

Pengenalan Wajah dengan Teknik PCAOleh: [email protected]

http://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

Page 2: Aplikasi pengenalan wajah pca

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 telah dibuat oleh penulis menggunakan .Net 4.0 yaitu C#

Page 3: Aplikasi pengenalan wajah pca

Penggunaan Pustaka PCA Kita akan menghitung data pelatihan

Akan 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

Page 4: Aplikasi pengenalan wajah pca

Berikut penggunaan pustaka 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, * rerata data

Page 5: Aplikasi pengenalan wajah pca

* 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();

Page 6: Aplikasi pengenalan wajah pca

/*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!

Page 7: Aplikasi pengenalan wajah pca

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()

Page 8: Aplikasi pengenalan wajah pca

{ /* 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!

Page 9: Aplikasi pengenalan wajah pca

*/ 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 */

Page 10: Aplikasi pengenalan wajah pca

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

DownloadKunjungi ke www.softscients.web.id