ممنون از توضیحاتتون.
در واقع دارم مقاله ای که رفرنس دادم را پیاده سازی می کنم. در اصل این یک قسمت از پایان نامه ام است که باید اجرا بشه تا بتونم کارمو ادامه بدم.
کلیات کار PCA، LDA رو می دونم اما دقیق با روش کارشون آشنا نیستم. در مورد صحبتی که در مورد پروژکشن روی lda کردید اگر بیشتر توضیح بدید ممنون میشم.
میشه لطف کنید محدودیت های lda رو ذکر کنید.
تا اونجا که خوندم lda نسبت به pca سرعت پایین تری داره به همین دلیل، اول pca اجرا می شود تا تعداد ابعاد کاهش پیدا کند. این حرف درسته؟
اندازه عکس ها 40*26 (البته فعلا) هستند که به صورت آرایه در میایند( آرایه 1040 تایی)
تعداد پایگاه داده ام متفاوت است برای"چشم-غیر چشم" و "چشم باز-چشم بسته" اما به عنوان مثال تعداد عکس های غیر چشمم:2285 و تعداد عکس های چشمم:2611 تا هستن.
کدم تقریبا اینه( یکم خلاصه اش کردم که اینجا زیاد بزرگ نباشه):
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
#include <fstream>
#include <sstream>
#include <ctime>
#include <opencv2/ml/ml.hpp>
#include "opencv2/opencv.hpp"
#include <windows.h>
#include <iostream>
#include <string>
#include <vector>
#include "subspace.hpp"
#include "fisherfaces.hpp"
#include "helper.hpp"
#include "decomposition.hpp"
#include <iostream>
#include <iomanip>
using namespace cv;
using namespace std;
string wchar_t2string(const wchar_t *wchar)
{
string str = "";
int index = 0;
while(wchar[index] != 0)
{
str += (char)wchar[index];
++index;
}
return str;
}
wchar_t *string2wchar_t(const string &str)
{
wchar_t wchar[260];
int index = 0;
while(index < str.size())
{
wchar[index] = (wchar_t)str[index];
++index;
}
wchar[index] = 0;
return wchar;
}
vector<string> listFilesInDirectory(string directoryName)
{
WIN32_FIND_DATA FindFileData;
//wchar_t * FileName = string2wchar_t(directoryName);
HANDLE hFind = FindFirstFile(directoryName.c_str(), &FindFileData);
vector<string> listFileNames;
listFileNames.push_back(FindFileData.cFileName);
while (FindNextFile(hFind, &FindFileData))
listFileNames.push_back(FindFileData.cFileName);
return listFileNames;
}
int main(int argc, const char *argv[]) {
// Holds some images:
vector<Mat> db,db1;
clock_t a,b;
a=clock();
string prefix = "****/train/Used/Eyes_nonEyes/";
string EyesDirectory=prefix+"Eyes1/";
vector<string> Eyes=listFilesInDirectory(EyesDirectory+"*.jpg");
string nonEyesDirectory=prefix+"noneyes/";
vector<string> nonEyes=listFilesInDirectory(nonEyesDirectory+"*.jpg");
string prefix1 = "*****/Data/Eyes/test/";
string testEyesDirectory=prefix1+"eye/";
vector<string> testEyes=listFilesInDirectory(testEyesDirectory+"*.jpg");
string testnonEyesDirectory=prefix1+"non eye/";
vector<string> testnonEyes=listFilesInDirectory(testnonEyesDirectory+"*.jpg");
const int imageEyeNum = Eyes.size();
const int imageAll = imageEyeNum + nonEyes.size(); // Get the number of images
const int imageNonEyeNum = nonEyes.size();
const int testimageEyeNum = testEyes.size();
const int testimageNonEyeNum = testnonEyes.size();
vector<int> _classes(imageAll);
Mat values(imageAll, 1, CV_32SC1);
for(int i=0;i<imageEyeNum;i++){
values.at<int>(i,0) = 1;
db.push_back(imread(EyesDirectory+Eyes[i], IMREAD_GRAYSCALE));
_classes[i]=1;
}
for(int i=0;i<imageNonEyeNum;i++){
values.at<int>(imageEyeNum+i,0) = 0;
db.push_back(imread(nonEyesDirectory+nonEyes[i], IMREAD_GRAYSCALE));
_classes[imageEyeNum+i]=0;
}
// Build a matrix with the observations in row:
Mat data = asRowMatrix(db, CV_32FC1);
// Number of components to keep for the PCA:
int num_components = 13;
//Perform a PCA:
PCA pca(data, Mat(), CV_PCA_DATA_AS_ROW, num_components);
// And copy the PCA results:
Mat mean = pca.mean.clone();
Mat eigenvalues = pca.eigenvalues.clone();
Mat eigenvectors = pca.eigenvectors.clone();
FileStorage fs("pca_eye_nonEye",FileStorage::WRITE);
fs << "mean" << pca.mean;
fs << "e_vectors" << pca.eigenvectors;
fs << "e_values" << pca.eigenvalues;
fs.release();
Mat data1(db.size(), num_components, CV_32FC1); //This Mat will contain all the Eigenfaces that will be used later with SVM for detection
//Project the images onto the PCA subspace
for(int i=0; i<db.size(); i++) {
Mat projectedMat(1, num_components, CV_32FC1);
pca.project(data.row(i), projectedMat);
data1.row(i) = projectedMat.row(0);
for(int j=0;j<num_components;j++){
data1.row(i).at<int>(0,j)=projectedMat.row(0).at<int>(0,j);
}
}
Mat dst;
// perform the lda
subspace::LinearDiscriminantAnalysis lda(data1, _classes,12);
cout << "Eigenvalues:" << endl << lda.eigenvalues() << endl;
cout << "Eigenvectors:" << endl << lda.eigenvectors() << endl;
cout << "project:" << endl << lda.project(data1.row(0)) << endl;
// send to SVM
return 0;
}