Apakah pernah melihat film yang bercerita tentang betapa mudahnya sebuah komputer melakukan pelacakan sebuah wajah seseorang seketika dari ribuan database wajah. Salah satu teknologi olah citra dalam biometrika adalah pengenal wajah atau yang lebih dikenal dengan face recognition (berbeda dengan face detection - bila anda penggunan facebook akan ditemui pada fitur tag foto).
Teknologi face recognition berkembang begitu cepat seiring dengan berkembangnya teknologi komputasi dari sisi hardware nya. Secara garis besar teknologi face recognition dapat dibedakan dalam 2 hal yaitu berbasis tektur dan berbasis geometri (mengukur jarak bagian wajah seperti hidung, mata, mulut, dahi).
Apa hubungan PCA dengan face recognition? Hubungannya pada teknologi yang akan dipakai dalam face recognition dengan basis analisis tekstur. Citra wajah 2D sangat sulit dikenali / dihitung oleh sebuah komputer sehingga kita perlu membantu nya dengan teknik reduksi dimensi. Teknik reduksi dimensi yaitu Analisis Komponen Utama atau Principal Component Analyst (PCA)adalah teknik untuk melakukan reduksi suatu dimensi dalam ruang berdimensi Я.
PCA 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 menjadi vektor baris
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#
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?
.png)
Ternyata setelah dihitung dengan PCA menghasilkan Data 6.bmp mirip dengan Data 2.bmp
.png)
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
* 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
.png)
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?
.png)
Ternyata menghasilkan
.png)
Yaitu citra diatas mirip dengan 15.jpg yaitu
.png)
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");
}
PCA pun bisa digunakan untuk keperluan lainnya!
Misalkan saja untuk pengenalan tulisan tangan
Tidak ada komentar:
Posting Komentar