OpenCV Записать собственные векторы PCA в файл yaml, теряя точность?

Мне нужно сохранить объект OpenCV PCA (собственные значения, собственные векторы) для набора обучающих изображений в постоянном хранилище, которое я могу перезагрузить для тестирования позже. Я использую функцию OpenCV 2.4 хранилища файлов XML/YAML для записи мои собственные векторы и матрицы собственных значений в файл yaml. Однако при перезагрузке файла и проецировании того же входного изображения в перезагруженное пространство PCA я не вижу разницы между проекциями 0? Я считаю, что каким-то образом теряю точность, но не могу понять, почему? Я основал свой код на ответе, данном @Link в его решении "Сохранение объекта pca в opencv "

int numPrincipalComponents = db.size()-1;
Mat output1, output2;
PCA pca(matrix, global_mean_vec, CV_PCA_DATA_AS_ROW, numPrincipalComponents);

pca.project(matrix.row(0), output1); //Project first image into orig. PCA

Mat eigenvalues = pca.eigenvalues.clone();
Mat eigenvectors = pca.eigenvectors.clone(); 

//Write matrices to pca_happy.yml
FileStorage fs("./Train/FileStore/pca_happy.yml", FileStorage::WRITE);
fs << "Eigenvalues" << eigenvalues;
fs << "Eigenvector" << eigenvectors;
fs.release();

//Load matrices from pca_happy.yml
FileStorage fs1("./Train/FileStore/pca_happy.yml", FileStorage::READ);
Mat loadeigenvectors, loadeigenvalues;
fs1["Eigenvalues"] >> eigenvalues;
fs1["Eigenvector"] >> eigenvectors;
fs1.release();

PCA pca2;
pca2.mean = global_mean_vec;
pca2.eigenvalues = loadeigenvalues;
pca2.eigenvectors = loadeigenvectors;

pca2.project(matrix.row(0), output2);

Mat diff;
absdiff(output1, output2, diff);

cout<<sum(diff)[0]<<endl;

Однако разница составляет 88,4 и должна быть равна 0, так как я проецирую точно такое же изображение. Нужно ли хранить каждую строку матрицы собственных векторов? Любое предложение очень ценится!


person Abhischek    schedule 16.02.2013    source источник


Ответы (3)


Я сделал очень глупую ошибку при установке собственных значений, собственных векторов и средних значений или pca2!

PCA pca2;
pca2.mean = global_mean_vec;
pca2.eigenvalues = loadeigenvalues;
pca2.eigenvectors = loadeigenvectors;

Должно быть:

PCA pca2;
pca2.mean = global_mean_vec.clone();
pca2.eigenvalues = loadeigenvalues.clone();
pca2.eigenvectors = loadeigenvectors.clone();

Надеюсь, это может помочь кому-то еще!

person Abhischek    schedule 16.02.2013

Вы правильно вычислили средний вектор? Я сделал только две небольшие модификации: (со своим matrix)

PCA pca(matrix, Mat(), CV_PCA_DATA_AS_ROW, numPrincipalComponents);//compute mean automatically
pca2.mean = pca.mean;

а diff равно нулю.

person lanpa    schedule 28.08.2014

Я думаю, PCA2 должен быть:

Mat eigenvalues1,eigenvectors1;
FileStorage fs1("fileName.yml", FileStorage::READ);
//Mat loadeigenvectors, loadeigenvalues;
fs1["Eigenvalues"] >> eigenvalues1;
fs1["Eigenvector"] >> eigenvectors1;
fs1.release();

PCA pca2;
pca2.mean = pca.mean;
pca2.eigenvalues = eigenvalues1;
pca2.eigenvectors = eigenvectors1;
person user3319734    schedule 07.11.2014