Pengenalan Wajah
Secara umum sistem pengenalan citra wajah dibagi menjadi dua jenis, yaitu sistem feature-based dansistem image-based. Pada sistem pertama digunakan ciri yang diekstraksi dari komponen citra wajah seperti mata, hidung, mulut, dan lain-lain yang kemudian dimodelkan secara geometris hubungan antara ciri-ciri tersebut. Sedangkan pada sistem kedua menggunakan informasi mentah dari piksel citrayang kemudian direpresentasikan dalam metode tertentu, misalnya pada Principal Component Analysis (PCA) atau transformasi wavelet yang digunakan untuk klasifikasi identitas citra.Penelitian tentang deteksi wajah dan pengenalan wajah telah dilakukan sebelumnya, antara lain dengan menggunakan algoritma Eigenface, dengandistribusi Gaussian dan Clustering, dengan Support Vector Machine, dan dengan metode Statistic dan Wavelet.
Seorang peneliti bernama Alan Brooks pernah mengembangkan sebuah penelitian yang membandingkan dua algoritma yaitu Eigenface danFisherface. Penelitian ini difokuskan pada perubahan pose wajah apakah mempengaruhi akurasipengenalan wajah. Diberikan database latih berupa foto wajah manusia, kemudian digunakan untuk melatih sebuah sistem pengenalan wajah, setelah proses latihan selesai, diberikan sebuah masukan image yang sebenarnya sama dengan salah satu image wajah pada fase latihan tetapi dengan pose yang berbeda. Sistem juga diharapkan punya sensitifitas minimal terhadap pencahayaan.
Sistem dikembangkan dengan dua algoritma yaitu Eigenface dan Fisherface, dan dibandingkan hasilnya. Kedua teknik menghasilkan hasil yang memuaskan tetapi ada beberapa perbedaan. Pada Eigenfacekompleksitas komputasi lebih sederhana daripada Fisherface. Dari segi efektifitas karena perubahan pose, Fisherface memberikan hasil yang lebih baik, bahkan dengan data yang lebih terbatas. Teknik Eigenface juga lebih sensitif terhadap pencahayaan dibandingkan dengan Fisherface.
Proses Pengenalan Wajah
Wajah merupakan bagian dari anggota tubuh manusia. Wajah memiliki keunikan sehingga setiap wajah memiliki ciri atau karakteristik yang berbeda. Oleh karena itu, wajah dapat digunakan sebagai pembeda antara wajah satu dengan wajah yang lainnya. Selain wajah, sidik jari, iris mata, bentuk geometi telapang tangan juga bisa dijadikan pembeda. Secara umum sistem pendeteksian dan pengenalan wajah di bagi menjadi 2 proses yaitu proses registrasi dan identifikasi.Proses Registrasi
Pada tahapan registrasi, citra wajah ditangkap (capture) oleh sebuah alat perekam (webcam) kemudian pada citra tersebut akan dilakukan image preprocessing. Image preprocessing adalah pengolahan awal suatu citra. Pada proses ini citra wajah akan dibersihkan dari gangguan seperti gambar buram, bintik-bintik, kurang cahaya (noise). Proses berikutnya akan dilakukan lokalisasi citra. Tujuannya adalah untuk mengetahui lokasi dari citra wajah. Tahapan berikutnya adalah melakukan ekstraksi ciri dari citra wajah yang kemudian akan disimpan ke dalam database.
Proses Identifikasi
Pada tahapan identifikasi, proses yang dilakukan hampir sama dengan proses registrasi. Bedanya adalah pada tahapan ini dilakukan pengukuran kemiripan antara data citra masukan dengan data citra yang sudah disimpan di dalam database. Hal yang cukup sulit dari sistem pendeteksian dan pengenalan wajah adalah bagaimana membuat sebuah sistem pendeteksi dan pengenalan wajah yang cepat (mendekati waktu nyata) dan memiliki tingkat akurasi yang tinggi. Untuk mencapai hal tersebut maka perlu dibuat sistem pengenalan wajah yang cepat dan tingkat akurasi yang tinggi sehingga wajah dapat dikenali dengan cepat dan tepat.
Metode Fisherface
Fisherface Pengenalan Wajah OpenCV @ Wajah adl salah satu ukuran fisiologis yg paling mudah & sering digunakan unt mem-bedakan indentitas individu yg satu dengan yg lainnya. Manusia dapat membedakan wajah antara orang yg satu dengan yg lainnya & mengingat wajah seseorang dengan cepat & mudah. Oleh krn itu, face recognition adl salah satu teknologi biometrics yg banyak dipelajari & dikembangkan oleh para ahli.
Deteksi Wajah (Face Detection)
Langkah pertama pd pengenalan wajah scr otomatis adl mendeteksi keberadaan wajah dr gambar masukan. Setelah wajah terdeteksi, tugas feature extraction adl unt memperoleh ciri-ciri dr wajah yg diperlukan pd klasifikasi wajah. Bergantung pd tipe pengenalan wajahnya, ciri-ciri yg diperlukan dapat berupa ciri-ciri lokal wajah seperti hidung, mata, mulut, & lainnya, maupun ciri-ciri global wajah (seluruh bagian wajah). Metode fisherface memakai seluruh bagian wajah sebagai data dlm pengenalannya.Segmentasi Warna Kulit
Proses yg dilakukan pertama kali pd algoritma deteksi wajah yg digunakan adl membuang sebanyak mungkin bagian bukan wajah dr gambar input. Hal ini dapat dilakukan dengan memberikan batasan pd nilai intensitas warna (color thres-holding) pd gambar input krn pd dasarnya seluruh manusia memiliki range atau cakupan nilai warna (chrominance value) yg hampir sama unt warna kulitnya. Yang membedakannya adl variasi pd nilai intensitas cahayanya (luminance value).
Salah satu cara memisahkan nilai intensitas cahaya dr komponen warna gambar masukan adl dengan mentransformasi komponen warna gambar masukan yg adl gambar berwarna (RGB) ke dlm komponen warna YCbCr (Iluminance, Chrominance-blue, Chrominance-red). Jika pd komponen warna RGB masih terdapat informasi mengenai intensitas pencahayaan pd setiap komponen warnanya (Red, Green, Blue), unt komponen warna YCbCr, komponenCb & Cr adl komponen warna yg bebas dr intensitas cahaya, krn seluruh informasi mengenai cahaya pd gambar disimpan pd komponen Y
Metode Fisherface Pengenalan Wajah OpenCV |
Proses Morfologi
Hasil dr proses segmentasi kulit adl topeng (mask) yg berupa gambar hitam putih (binary image) yg menunjukkan bagian kulit dr gambar masukan. Akan tetapi topeng hasil segmentasi kulit masih terdapat noise & potongan dr beberapa benda lainnya pd gambar, seperti latar belakang gambar. Oleh krn itu, perlu dilakukan beberapa tahapan proses morfologi unt membersihkan gambar dr noise & potongan tersebutTeknik morfologi dapat dilakukan unt suatu gambar biner maupun gambar pd level grayscale (abu-abu). Untuk gambar biner, piksel berwarna putih bernilai biner .1. (ON) & piksel berwarna hitam bernilai biner .0. (OFF).
Proses morfologi unt gamber biner adl proses erosi & dilasi. Proses erosi membuang piksel dr gambar atau ekivalen dengan membuat piksel ON menjadi OFF, yaitu piksel putih yg melekat pd daerah background, sehingga akan menyebabkan piksel putih berkurang luasnya (shrinking) dengan tujuan unt menghilangkan piksel yg adl noise pd topeng. Proses dilasi adl kebalikan dr proses erosi, membuat piksel OFF menjadi ON, sehingga akan menyebabkan piksel putih bertambah luasnya (growing). Tujuan dilakukan proses dilasi adl krn saat proses erosi dilakukan pd topeng, daerah yg adl kulit juga ikut mengalami shrinking sehingga perlu dilakukan suatu proses yg mengembalikan daerah tersebut agar bagian wajah nantinya akan terdeteksi dengan benar.
Metode Fisherface Pengenalan Wajah OpenCV |
Region Analysis
Gambar topeng hasil proses morfologi akan tetap terdapat bagian bukan wajah yg adl bagian tubuh lainnya seperti tangan & bagian lainnya yg memiliki intensitas warna yg menyerupai intensitas warna kulit. Pada proses region analysis akan dianalisa bagian-bagian tersebut unt mendapatkan satu bagian yg adl bagian wajah, yaitu dengan menghitung nilai Euler dr tiap-tiap bagian yg terdapat pd topeng. Nilai Euler pd gambar biner adl selisih antara region (daerah yg memiliki nilai piksel 1) dengan hole (daerah yg memilki nilai piksel 0) yg ada pd region tersebut. Pada umumnya unt wajah manusia setidaknya akan memiliki satu region & tiga buah hole pd region tersebut yg menunjukkan sepasang mata & satu mulutMetode Fisherface Pengenalan Wajah OpenCV |
Ekstraksi Wajah
Setelah didapat satu bagian yg adl wajah, proses selanjutnya adl mengambil (cropping) wajah tersebut dr gambar input dengan ukuran yg sesuai dengan posisi wajah pd gambar topeng & mengubah ukurannya menjadi ukuran yg sama dengan ukuran gambar wajah pd training set yg digunakan unt pengenalan wajahMetode Fisherface Pengenalan Wajah OpenCV |
Perhitungan PCA
Perhitungan PCA dilakukan dengan langkah-langkah sebagai berikut :- Mengambil satu set gambar training & kemudian mentransformasikan setiap gambar tersebut menjadi vektor kolom, sehingga akan didapat satu matriks yg tiap kolomnya mewakili gambar yg berbeda, face space.
- Membentuk average face (Ψ), yaitu nilai rata-rata dr seluruh gambar wajah pd training set, & mengurangi seluruh gambar pd training set terhadap average face unt mencari deviasinya (φ).
- Menghitung matriks kovarian (A), yaitu dengan melakukan operasi perkalian transpose dr training set yg telah dinormalisasikan.
- Menghitung nilai eigen (λ ) & vektor eigen (ν) dr matriks kovarian.
- Mengurutkan vektor eigen berdasarkan dengan besarnya nilai eigen masing-masing vektor.
- Menghitung matriks proyeksi PCA (Wpca) yaitu dengan mengalikan nilai deviasi dengan vektor eigen.
- Mengambil N-C komponen Wpca yg diperlu-kan unt mengkonstruksi fisherface.
Perhitungan FLD
Perhitungan FLD dilakukan dengan langkah-langkah sebagai berikut :- Mentransformasikan training set ke dlm vektor kolom (face space).
- Membentuk average face (Ψ) dr face space, & nilai wajah rata-rata masing-masing kelas (class average face)
- Melakukan perhitungan matriks sebaran dlm kelas (within-calss scatter-matrix) & ma-triks sebaran antar kelas (between-class scatter-matrix).
- Memproyeksikan matriks sebaran (WS dan) ke dlm matriks proyeksi PCA (Wpca).
- Menghitung nilai eigen & vektor eigen dr matriks sebaran.
- Menghitung matriks proyeksi fisher dengan mengurutkan vektor eigen berdasarkan besarnya nilai eigen masing-masing vektor eigen & mengambil komponen vektor eigen yg memiliki nilai eigen tidak nol.Untuk C kelas, akan selalu didapat C-1 vektor eigen yg memiliki nilai eigen tidak nol
- Menghitung matriks proyeksi optimal.
- Melakukan normalisasi pd matriks proyeksi optimal.
- Menghitung bobot tiapfisherfaceterhadap masing-masing gambar wajah pd training set (face key) dengan memproyeksikan nilai deviasi face space terhadap average face ke dlm matriks proyeksi optimal.
Klasifikasi Identitas
Klasifikasi identitas yg digunakan adl dengan membandingkan bobot dr masing-masing fisherfacepd gambar wajah pd training set & gambar wajah masukan dengan menghitung jarak Euclidian-nya. Langkah-langkah klasifikasi identitas adl sebagai berikut :- Mengubah gambar wajah masukan menjadi vektor kolom
- Menormalisasikan gambar wajah masukan terhadap nilai rata-rata training set (average face,Ψ).
- Menghitung bobotfisherfacepd gambar wajah masukan, yaitu dengan memproyeksikan gambar masukan ke dlm matriks proyeksi optimal (Wopt).
- Menghitung jarak euclidian (Emin) antara bobot input & bobot training set (Udatabase).
- Mencari & membandingkan jarak minimum (Emin) dengan satu nilai batas (θ). Sebuah wajah dikatakan cocok jika jarak minimumnya lebih kecil dr nilai batas yg diterapkan. Semakin kecil jarak minimum yg diperoleh, semakin besar kesamaan (similarity) gambar masukan dengan pasangan gambar pd training set. Nilai batas diperoleh dr hasil percobaan-percobaan hingga ditemukan satu nilai yg memuaskan
Metode Fisherface Pengenalan Wajah Dengan OpenCV
Kesulitan dlm pembuatan proses face recognition terutama adl krn kekompleksan dr kondisi wajah, yaitu alam hal kualitas gambar yg ditangkap, dr segi warna, pencahayaan, hingga posisi gambar yg tertangkap, maupun dlm hal peru-bahan geometrinya. Oleh krn itu, dlm tulisan ini akan diujikan metode fisherface unt melakukan pengenalan wajah.Face recognition / pengenalan wajah adl salah satu teknik identifikasi teknologi biometrik dengan memakai wajah individu yg bersangkutan sbg parameter utamanya. Secara garis besar proses pengenalan wajah terdiri dr tiga proses utama [1], yaitu:
1. Deteksi wajah (face detection).
2. Ektraksi ciri/wajah (face/feature extraction).
3. Pengenalan wajah (face recognition).
wajah dapat dikelompokan ke dlm tiga pendekatan berdasarkan data yg dibutuhkannya [1], yaitu:
1. Pendekatan holistik.
Pada pendekatan holistik, seluruh bagian / ciri-ciri global wajah digunakan sbg data masukan unt pengenalan wajah.
Contoh: eigenface, fisherface, nearest feature line (NFL), & support vector machine (SVM).
2. Pendekatan feature-based.
Pada pendekatan feature-based, wajah terbagi berdasarkan ciri-ciri lokal wajah seperti hidung, mulut, mata, & lainnya yg kemudian digunakan sbg data masukan. Contoh : Hidden Markov Model & Dynamic Link Architecture.
3. Pendekatan hybrid.
Pendekatan hybrid memakai seluruh bagian wajah & ciri-ciri lokal wajah sbg data masukan. Contoh : modular eigenface & hybrid local feature.
METODE FISHERFACE
Pengenalan wajah yg akan direalisasikan terbagi ke dlm empat modul utama. Diagram blok yg akan direalisasikan terlihat pd Gambar 1.Gambar 1. Diagram Blok yg akan Direalisasikan
Deteksi Wajah (Face Detection)
Salah satu kunci sukses dlm pengenalan wajah adl deteksi wajah yg akurat krn gambar wajah yg terdeteksi akan sangat mempengaruhi dlm proses pengenalannya [4]. Langkah pertama pd pengenalan wajah scr otomatis adl mendeteksi keberadaan wajah dr gambar masukan. Setelah wajah terdeteksi, tugas feature extraction adl unt memperoleh ciri-ciri dr wajah yang
diperlukan pd klasifikasi wajah. Bergantung pd tipe pengenalan wajahnya, ciri-ciri yg diperlukan dapat berupa ciri-ciri lokal wajah seperti hidung, mata, mulut, & lainnya, maupun ciri-ciri global wajah (seluruh bagian wajah). Metode fisherface memakai seluruh bagian wajah sbg data dlm pengenalannya.
Segmentasi Warna Kulit
Proses yg dilakukan pertama kali pd algoritma deteksi wajah yg digunakan adl membuang sebanyak mungkin bagian bukan wajah dr gambar input. Hal ini dapat dilakukan dengan memberikan batasan pd nilai intensitas warna (color thres-holding) pd gambar input krn pd dasarnya seluruh manusia memiliki range / cakupan nilai warna (chrominance value) yg hampir sama unt warna kulitnya. Yang membedakannya adl variasi pd nilai intensitas cahayanya (luminance value) [3]. Akibatnya, jika nilai chrominance & luminance dapat dipisahkan dr gambar & kemudian dilakukan pembatasan nilai intensitas pd komponen chrominance, akan didapat bagian yg adl bagian berwarna seperti kulit (skin like-hood) dr gambar input.
Pengenalan wajah adl adl suatu pengenalan pola (pattern recognition) yg khusus unt kasus wajah. Ini dapat dideskripsikan sbg pengklasifikasian suatu wajah apakah dikenali (known) / tidak dikenali (unknown), dimana setelah dibandingkan kemudian disimpan scr tersendiri. Beberapa pendekatan unt pengenalan obyek & grafika komputer didasarkan scr langsung pd citra-citra tanpa penggunaan model 3D. Banyak dr teknik ini tergantung pd suatu representasi citra yg membentuk suatu struktur ruang vektor, & dlm prinsip ini memerlukan korespondensi yg padat.
Pendekatan appearance-based kebanyakan digunakan unt pengenalan wajah. Pada metode ini, model wajah dipelajari melalui proses training dengan memakai satu set data pelatihan yg berisi contoh-contoh wajah. Kemudian hasil training ini digunakan unt pengenalan wajah. Secara umum metode ini memakai teknik-teknik analisis statistik & mesin pembelajaran (machine learning) unt menemukan karakteristik-karakteristik yg sesuai dr wajah maupun non-wajah. Yang termasuk dlm kelompok ini adl : Eigenfaces, distribution-based & clustering, jaringan syaraf tiruan, SVM (Support VectorMmachine), dll.
Tiga pengklasifikasi linear appearance-based adl PCA, ICA and LDA. Tiap pengklasifikasi mempunyai representasi (vector basis) tersendiri dr suatu ruang space vector wajah dengan dimensi tinggi didasarkan pd titik pandang scr statistik yg berbeda. Melalui proyeksi vector wajah ke vector basis, koefisien proyeksi digunakan sbg representasi fitur tiap citra wajah. Nilai matching diantara citra wajah tes & pelatihan dihitung (sebagai contoh sudut nilai cosine) diantara vector-vector koefisien. Ketiga representasi dapat dianggap sbg suatu transformasi linier dr vector citra asli ke suatu vector fitur proyeksi.
Proyeksi citra ke dlm ruang eigen (eigenspace) adl suatu prosedur standar unt beberapa algoritma pengenalan obyek yg didasarkan pd tampilan (appearance-based). Penelitian dasar tentang proyeksi eigenspace pertama kali dilakukan oleh Michael Kirby yg memperkenalkan tentang ide karakteristikasi dimensi rendah suatu wajah. Turk and Pentland memakai proyeksi eigenspace unt pengenalan wajah. Eigenspace dihitung melalui identifikasi eigenvector dr matriks kovariansi yg diturunkan dr suatu himpunan citra pelatihan (Turk and Pentland,1991)
Proyeksi ruang eigen (eigenspace) juga dikenal sbg Karhunen-Loeve (KL) / juga dinamakan dengan Principal Component Analysis (PCA). Algoritma eigenface memanfaatkan Principal Component Analysis (PCA) unt mereduksi dimensinya guna menemukan vector-vektor yg mempunyai nilai terbaik unt distribusi citra wajah didlm ruang citra masukan.
Vektor ini mendefinsikan subruang dr citra-citra wajah & subruang tersebut dinamakan ruang wajah. Semua wajah-wajah dlm himpunan pelatihan diproyeksikan ke dlm ruang wajah unt menemukan suatu himpunan bobot-bobot yg mendeskripsikan kontribusi dr tiap vector dlm ruang wajah. Untuk identifikasi suatu citra uji, membutuhkan proyeksi suatu citra ke dlm ruang wajah unt menentukan korespondensi kumpulan bobot-bobot.
Dengan membandingkan kumpulan bobot-bobot wajah dlm training set, Pengujian citra dapat diidentifikasi. Prosedur kunci dlm PCA didasarkan pd tranformasi Karhumen-Loeve. Jika elemen-elemen citra dianggap sbg variable-variabel random, citra mungkin dilihat sbg sample suatu proses stokastik.
Ide utama principal component analysis adl menemukan vektor dengan nilai terbaik unt distribusi citra wajah dlm seluruh ruang citra. Vektor-vektor ini mendefinisikan subruang citra wajah / biasa disebut dengan nama ruang wajah. Tiap vektor dengan panjang N2, mendsikripsikan citra dengan ukuran N x N, yg adl suatu kombinasi linier dr citra wajah asli
Contoh Program Fisherface Pengenalan Wajah OpenCV
Fisherface unt Klasifikasi Jenis Kelamin
Metode fisherface mencapai tingkat pengenalan 98% dlm cross-validasi subjek-independen. Sebuah subjek-independen meansimages lintas validasi dr orang yg diuji tidak pernah digunakan unt belajar model. Dan bisa Anda percaya: Anda hanya dapat memakai facerec_fisherfaces demo, yg inlcuded OpenCV.Kode sumber unt aplikasi demo ini juga tersedia dlm folder src dokumentasi ini:
Source Code C++
#include "opencv2/core.hpp"
#include "opencv2/contrib.hpp"
#include "opencv2/highgui.hpp"
#include <iostream>
#include <fstream>
#include <sstream>
using namespace cv;
using namespace std;
static Mat norm_0_255(InputArray _src) {
Mat src = _src.getMat();
// Membuat & mengembalikan citra normalisasi:
Mat dst;
switch(src.channels()) {
case 1:
cv::normalize(_src, dst, 0, 255, NORM_MINMAX, CV_8UC1);
break;
case 3:
cv::normalize(_src, dst, 0, 255, NORM_MINMAX, CV_8UC3);
break;
default:
src.copyTo(dst);
break;
}
return dst;
}
static void read_csv(const string& filename, vector<Mat>& images, vector<int>& labels, char separator = ';') {
std::ifstream file(filename.c_str(), ifstream::in);
if (!file) {
string error_message = "No valid input file was given, please check the given filename.";
CV_Error(CV_StsBadArg, error_message);
}
string line, path, classlabel;
while (getline(file, line)) {
stringstream liness(line);
getline(liness, path, separator);
getline(liness, classlabel);
if(!path.empty() && !classlabel.empty()) {
images.push_back(imread(path, 0));
labels.push_back(atoi(classlabel.c_str()));
}
}
}
int main(int argc, const char *argv[]) {
// Periksa argumen baris perintah yg sah, penggunaan cetak jika tidak ada argumen yg diberikan.
if (argc < 2) {
cout << "usage: " << argv[0] << " <csv.ext> <output_folder> " << endl;
exit(1);
}
string output_folder;
if (argc == 3) {
output_folder = string(argv[2]);
}
// Dapatkan path ke CSV Anda.
string fn_csv = string(argv[1]);
// Vektor ini memegang gambar & label yg sesuai.
vector<Mat> images;
vector<int> labels;
// Baca di data. Hal ini dapat gagal jika tidak ada nama file input yg valid diberikan.
try {
read_csv(fn_csv, images, labels);
} catch (cv::Exception& e) {
cerr << "Error opening file \"" << fn_csv << "\". Reason: " << e.msg << endl;
exit(1);
}
// Keluar jika tidak ada cukup gambar unt demo ini.
if(images.size() <= 1) {
string error_message = "This demo needs at least 2 images to work. Please add more images to your data set!";
CV_Error(CV_StsError, error_message);
}
// Dapatkan ketinggian dr gambar pertama. Kita akan membutuhkan nanti ini dlm kode unt membentuk kembali gambar ke ukuran aslinya:
int height = images[0].rows;
Mat testSample = images[images.size() - 1];
int testLabel = labels[labels.size() - 1];
images.pop_back();
labels.pop_back();
// Baris berikut membuat model fisherface unt
// Pengenalan wajah & melatihnya dengan gambar dan
// Label membaca dr file CSV yg diberikan.
// Jika Anda hanya ingin menyimpan 10 fisherface, kemudian memanggil
// Metode pabrik seperti ini:
//
// cv::createFisherFaceRecognizer(10);
//
// Namun tidak berguna unt membuang fisherface! mohon Untuk
// Selalu mencoba unt memakai _all_ tersedia fisherface unt
// Klasifikasi.
//
// Jika Anda ingin membuat FaceRecognizer dengan
// Batas kepercayaan (misalnya 123,0) & memakai _all_
// Fisherface, kemudian menyebutnya dengan:
//
// cv::createFisherFaceRecognizer(0, 123.0);
//
Ptr<FaceRecognizer> model = createFisherFaceRecognizer();
model->train(images, labels);
// Baris berikut memprediksi label yg diberikan
// test image:
int predictedLabel = model->predict(testSample);
//
// Untuk mendapatkan kepercayaan dr prediksi panggilan model dengan:
//
// int predictedLabel = -1;
// double confidence = 0.0;
// model->predict(testSample, predictedLabel, confidence);
//
string result_message = format("Predicted class = %d / Actual class = %d.", predictedLabel, testLabel);
cout << result_message << endl;
// Berikut adl cara unt mendapatkan nilai eigen model Eigenfaces ini:
Mat eigenvalues = model->getMat("eigenvalues");
// Dan kita bisa melakukan hal yg sama unt menampilkan Vektor Eigen (baca Eigenfaces):
Mat W = model->getMat("eigenvectors");
// Dapatkan mean sampel dr data pelatihan
Mat mean = model->getMat("mean");
// Menampilkan / menyimpan:
if(argc == 2) {
imshow("mean", norm_0_255(mean.reshape(1, images[0].rows)));
} else {
imwrite(format("%s/mean.png", output_folder.c_str()), norm_0_255(mean.reshape(1, images[0].rows)));
}
// Menampilkan / menyimpan pertama, paling 16 fisherface:
for (int i = 0; i < min(16, W.cols); i++) {
string msg = format("Eigenvalue #%d = %.5f", i, eigenvalues.at<double>(i));
cout << msg << endl;
// dapatkan eigenvector #i
Mat ev = W.col(i).clone();
// Membentuk ke ukuran aslinya & menormalkan ke [0 ... 255] unt imshow.
Mat grayscale = norm_0_255(ev.reshape(1, height));
// Tampilkan gambar & menerapkan colormap tulang unt penginderaan yg lebih baik.
Mat cgrayscale;
applyColorMap(grayscale, cgrayscale, COLORMAP_BONE);
// Menampilkan / menyimpan:
if(argc == 2) {
imshow(format("fisherface_%d", i), cgrayscale);
} else {
imwrite(format("%s/fisherface_%d.png", output_folder.c_str(), i), norm_0_255(cgrayscale));
}
}
// Menampilkan / menyimpan rekonstruksi gambar di beberapa langkah yg telah ditetapkan:
for(int num_component = 0; num_component < min(16, W.cols); num_component++) {
// Potong Fisherface dr model:
Mat ev = W.col(num_component);
Mat projection = subspaceProject(ev, mean, images[0].reshape(1,1));
Mat reconstruction = subspaceReconstruct(ev, mean, projection);
// Menormalkan hasilnya:
reconstruction = norm_0_255(reconstruction.reshape(1, images[0].rows));
// Menampilkan / menyimpan:
if(argc == 2) {
imshow(format("fisherface_reconstruction_%d", num_component), reconstruction);
} else {
imwrite(format("%s/fisherface_reconstruction_%d.png", output_folder.c_str(), num_component), reconstruction);
}
}
// Tampilan jika kita tidak menulis ke folder output:
if(argc == 2) {
waitKey(0);
}
return 0;
}
kak maksud nya yang proyeksikan matriks sw dan sb itu bagaimana ya, sama yang di cari eigen vector sama eigen value itu yang matriks sebaran awal atau yang udah di proyeksikan
ReplyDelete