2

我正在做一个人脸识别项目,我们正在使用 PCA 来减少图像的特征向量大小。问题是,在训练期间,我通过合并所有训练图像来创建 PCA 对象。现在,在测试期间,我需要之前获得的 PCA 对象。

我似乎无法弄清楚如何将 PCA 对象写入文件,以便在测试期间使用它。一种选择是我将它的特征向量写入文件。但是编写对象本身会方便得多。有没有办法做到这一点?

4

2 回答 2

11

据我所知,没有将 PCA 对象保存到文件的通用方法。您需要将特征向量、特征值和均值保存到文件中,然后在加载后将它们放入新的 PCA 中。您必须记住使用不会丢失精度的格式,尤其是平均值。

这是一些示例代码:

#include "opencv2/core/core.hpp"
#include <iostream>

...

cv::PCA pca1;
cv::PCA pca2;

cv::Mat eigenval,eigenvec,mean;
cv::Mat inputData;
cv::Mat outputData1,outputData2;

//input data has been populated with data to be used
pca1(inputData,Mat()/*dont have previously computed mean*/,
CV_PCA_DATA_AS_ROW /*depends of your data layout*/);//pca is computed
pca1.project(inputData,outputData1);

//here is how to extract matrices from pca
mean=pca1.mean.clone();
eigenval=pca1.eigenvalues.clone();
eigenvec=pca1.eigenvectors.clone();

//here You can save mean,eigenval and eigenvec matrices

//and here is how to use them to make another pca
pca2.eigenvalues=eigenval;
pca2.eigenvectors=eigenvec;
pca2.mean=mean;

pca2.project(inputData,outputData2);

cv::Mat diff;//here some proof that it works
cv::absdiff(outputData1,outputData2,diff);

std::cerr<<sum(diff)[0]<<std::endl; //assuming Youre using one channel data, there
                                    //is data only in first cell of the returned scalar

// if zero was printed, both output data matrices are identical
于 2011-11-10T12:12:16.527 回答
0

你可以试试这个。

void save(const string &file_name,cv::PCA pca_)
{
    FileStorage fs(file_name,FileStorage::WRITE);
    fs << "mean" << pca_.mean;
    fs << "e_vectors" << pca_.eigenvectors;
    fs << "e_values" << pca_.eigenvalues;
    fs.release();
}

int load(const string &file_name,cv::PCA pca_)
{
    FileStorage fs(file_name,FileStorage::READ);
    fs["mean"] >> pca_.mean ;
    fs["e_vectors"] >> pca_.eigenvectors ;
    fs["e_values"] >> pca_.eigenvalues ;
    fs.release();

}

是来源。

于 2015-03-22T05:47:19.820 回答