pca+lda ==>opencv - هفت خط کد انجمن پرسش و پاسخ برنامه نویسی

pca+lda ==>opencv

0 امتیاز
با سلام

دوستان مشکلی در اپن سی وی برام پیش اومده. اونم اینه که نمی تونم از یک عکس ویژگی هاشو استخراج کنم.

برای تشخیص چشم بودن و نبودن عکس ویژگی های pca اونو استخراج کردم( 13 ویژگی)

بعد می خوام این 13 ویژگی رو به lda بدم که 12 ویژگی رو استخراج کنه.

اما متاسفانه این کارو نمی تونم بکنم. چون دو تا کلاس ( چشم و غیر چشم) بیشتر ندارم فقط یک ویژگی بهم میده!!!

می خواستم ببینم مشکل کارم کجاست؟

تو مفهوم مشکل دارم یا اینکه توی کد نویسی؟

https://github.com/bytefish/opencv
سوال شده شهریور 26, 1394  بوسیله ی mehrangol (امتیاز 13)   2 2 3
سلام.
این 13 ویژگی که استخراج کردید را ذکر کنید. pca ویژگی ها بدست آمده را کاهش ابعاد میده تولید ویژگی نمی کنه در واقع همانند یک تبدیل عمل می کنه.
در ضمن دقیق مشخص کنید مشکل کجاست.
بله حق با شماست کمی بد توضیح دادم.
اول عکس مورد نظرمو رو به آرایه خطی تبدیل می کنم(1040 تایی) بعد اونو به pca می دم که کاهش بعد بدهد(13 تا)
این آرایه 13 تایی رو به lda باید بدم تا به 12 تا کاهش بعد بدهد.
----------
مشکل من اینه که می تونم با pca آرایه ام(عکس به صورت خطی) را به 13 کاهش بعد بدهم اما با الگوریتم lda نمی تونم این کار را انجام دهم. دقیقا نمی دونم مشکل کارم چیه. اگر احتیاج باشه کدم را هم می زارم. اما چون یکم اینجا رو شلوغ می کنه فعلا نگذاشتم.

طبیعتا تعداد کلاس های من دو تاست. توی کتابخانه opencv-master توی lda\src\subspace.cpp
توی تابع compute نوشته
if ((_num_components <= 0) || (_num_components > (C - 1)))
        _num_components = (C - 1);
یعنی ابعادم را به 1 تبدیل می کنه!!

اگه کدی در این زمینه دارید یا اینکه کتابخانه مناسبی برای اینکار می توانید پیشنهاد کنید، ممنون میشم(مخصوصا از کدهای داخلی opencv)

برای این کار از این مقاله استفاده می کنم:
Lee, Sung Joo, et al. "Real-time gaze estimator based on driver's head orientation for forward collision warning system." Intelligent Transportation Systems, IEEE Transactions on 12.1 (2011): 254-267
دوست عزیز لطفاً کدی که نوشتید را اینجا قرار بدید.lda به خاطر محدودیت هایی که داره ما در ابتدا کار از pca برای کاهش ابعاد استفاده می کنیم و مجددا نیاز به کاهش ابعاد نداریم که اینکارو با lda مجدداً انجام بدیم فقط projection نهایی با lda صورت می گیره در ضمن ابعاد تصویر را ذکر کنید تعداد تصاویر در پایگاه داده را ذکر کنید.

1 پاسخ

0 امتیاز

ممنون از توضیحاتتون.

در واقع دارم مقاله ای که رفرنس دادم را پیاده سازی می کنم. در اصل این یک قسمت از پایان نامه ام است که باید اجرا بشه تا بتونم کارمو ادامه بدم.

کلیات کار 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;
}

 

پاسخ داده شده شهریور 30, 1394 بوسیله ی mehrangol (امتیاز 13)   2 2 3
...