Ask Your Question

Revision history [back]

click to hide/show revision 1
initial version

using EM of opencv, same training samples, but different results

Hi everyone,

I'm using the EM module of opencv(tried 2.4.2 and 2.4.3). I wants to try my samples(676*64) which is generated by SIFT+PCA by EM. but I have tried to use the same samples to train the EM to get the Gaussian mixture model. But the results are different.

here is a test code.

CvEM m_emModel1;
CvEMParams params1;
cv::Mat labels1;

params1.covs      = NULL;
params1.means     = NULL;
params1.weights   = NULL;
params1.probs     = NULL;
params1.nclusters = 10;
params1.cov_mat_type       = CvEM::COV_MAT_SPHERICAL;
params1.start_step         = CvEM::START_AUTO_STEP;
params1.term_crit.max_iter = 300;
params1.term_crit.epsilon  = 0.1;
params1.term_crit.type     = CV_TERMCRIT_ITER|CV_TERMCRIT_EPS;
m_emModel1.train(samples, cv::Mat(), params1, &labels1);

std::cout<<"means1"<<std::endl;
for(int j=0; j<10; ++j)
    std::cout<<m_emModel1.getMeans().at<double>(0, j)<<" ";
std::cout<<std::endl;

std::cout<<"weightes1"<<std::endl;
for(int j=0; j<10; ++j)
    std::cout<<m_emModel1.getWeights().at<double>(j)<<" ";
std::cout<<std::endl;

CvEM m_emModel;
CvEMParams params;
cv::Mat labels;

params.covs      = NULL;
params.means     = NULL;
params.weights   = NULL;
params.probs     = NULL;
params.nclusters = 10;
params.cov_mat_type       = CvEM::COV_MAT_SPHERICAL;
params.start_step         = CvEM::START_M_STEP;//CvEM::START_AUTO_STEP;
params.term_crit.max_iter = 300;
params.term_crit.epsilon  = 0.001;
params.term_crit.type     = CV_TERMCRIT_ITER|CV_TERMCRIT_EPS;
m_emModel.train(samples, cv::Mat(), params, &labels);

std::cout<<"means"<<std::endl;
for(int j=0; j<10; ++j)
    std::cout<<m_emModel.getMeans().at<double>(0, j)<<" ";
std::cout<<std::endl;

std::cout<<"weightes"<<std::endl;
for(int j=0; j<10; ++j)
    std::cout<<m_emModel.getWeights().at<double>(j)<<" ";
std::cout<<std::endl;

here is a result: image description

I really hope your replys, thanks your reading.

using EM of opencv, same training samples, but different results

Sorry for the mistake!! I have update this post? Can you try this and show me the results running on your machine??

Hi everyone,

I'm using the EM module of opencv(tried 2.4.2 and 2.4.3). I wants to try my samples(676*64) which is generated by SIFT+PCA by EM. but I have tried to use the same samples to train the EM to get the Gaussian mixture model. But the results are different.

here is a test code.

cv::Mat samples(50,2,CV_32FC1);
samples = samples.reshape(2,0);

int N=9, n1 = sqrt(9.0);
for(int i=0; i<N; ++i)
{
    cv::Mat subSamples = samples.rowRange(i*50/N, (i+1)*50/N );
    cv::Scalar mean((i%3 +1)*256/4, (i/3+1)*256/4);
    cv::Scalar var(30,30);
    cv::randn(subSamples, mean, var);
}
samples = samples.reshape(1,0);

samples.convertTo(samples, CV_64FC1);

std::cout<<"samples"<<std::endl;
for(int j=0; j<samples.rows; ++j){
    for(int i=0; i<samples.cols; ++i)
        std::cout<<samples.at<double>(j, i)<<" ";
    std::cout<<std::endl;
}
std::cout<<std::endl;

CvEM m_emModel1;
CvEMParams params1;
cv::Mat labels1;

params1.covs      = NULL;
params1.means     = NULL;
params1.weights   = NULL;
params1.probs     = NULL;
params1.nclusters = 10;
params1.cov_mat_type       = CvEM::COV_MAT_SPHERICAL;
params1.start_step         = CvEM::START_AUTO_STEP;
params1.term_crit.max_iter = 300;
params1.term_crit.epsilon  = 0.1;
params1.term_crit.type     = CV_TERMCRIT_ITER|CV_TERMCRIT_EPS;
m_emModel1.train(samples, cv::Mat(), params1, &labels1);

std::cout<<"means1"<<std::endl;
for(int j=0; j<10; ++j)
    std::cout<<m_emModel1.getMeans().at<double>(0, j)<<" ++j){
    for(int i=0; i<2; ++i)
        std::cout<<m_emModel1.getMeans().at<double>(j, i)<<" ";
std::cout<<std::endl;
    std::cout<<std::endl;
}

std::cout<<"weightes1"<<std::endl;
for(int j=0; j<10; ++j)
    std::cout<<m_emModel1.getWeights().at<double>(j)<<" ";
std::cout<<std::endl;

CvEM m_emModel;
CvEMParams params;
cv::Mat labels;

params.covs      = NULL;
params.means     = NULL;
params.weights   = NULL;
params.probs     = NULL;
params.nclusters = 10;
params.cov_mat_type       = CvEM::COV_MAT_SPHERICAL;
params.start_step         = CvEM::START_M_STEP;//CvEM::START_AUTO_STEP;
params.term_crit.max_iter = 300;
params.term_crit.epsilon  = 0.001;
CvEM::START_AUTO_STEP;
params.term_crit.type     = CV_TERMCRIT_ITER|CV_TERMCRIT_EPS;
m_emModel.train(samples, cv::Mat(), params, &labels);

std::cout<<"means"<<std::endl;
for(int j=0; j<10; ++j)
    std::cout<<m_emModel.getMeans().at<double>(0, j)<<" ++j){
    for(int i=0; i<2; ++i)
        std::cout<<m_emModel.getMeans().at<double>(j, i)<<" ";
std::cout<<std::endl;
    std::cout<<std::endl;
}

std::cout<<"weightes"<<std::endl;
for(int j=0; j<10; ++j)
    std::cout<<m_emModel.getWeights().at<double>(j)<<" ";
std::cout<<std::endl;

here is a result: image descriptionimage description

I really hope your replys, thanks your reading.