【问题标题】:OpenCV: how to categorize GMM calculated probsOpenCV:如何对 GMM 计算的概率进行分类
【发布时间】:2012-10-06 05:40:57
【问题描述】:

我正在使用opencv EM算法借助opencv文档中的示例代码获取GMM模型如下:

cv::Mat capturedFrame
const int N = 5; 
int nsamples = 100;
cv::Mat samples ( nsamples, 2, CV_32FC1 );
samples = samples.reshape ( 2, 0 );
cv::Mat sample ( 1, 2, CV_32FC1 );
CvEM em_model;
CvEMParams params;

for ( i = 0; i < N; i++ )
{           
//from the training samples
cv::Mat samples_part = samples.rowRange ( i*nsamples/N, (i+1)*nsamples/N);
cv::Scalar mean (((i%N)+1)*img.rows/(N1+1),((i/N1)+1)*img.rows/(N1+1));
cv::Scalar sigma (30,30);
cv::randn(samples_part,mean,sigma);                     

}
samples = samples.reshape ( 1, 0 );
//initialize model parameters
params.covs         = NULL;
params.means        = NULL;
params.weights      = NULL;
params.probs        = NULL;
params.nclusters    = N;
params.cov_mat_type = CvEM::COV_MAT_SPHERICAL;
params.start_step   = CvEM::START_AUTO_STEP;
params.term_crit.max_iter = 300;
params.term_crit.epsilon  = 0.1;
params.term_crit.type   = CV_TERMCRIT_ITER|CV_TERMCRIT_EPS;     
//cluster the data
em_model.train ( samples, Mat(), params, &labels );

作为 GMM 和 openCV 的新手,现在我有一些问题:

首先,执行上述代码后,我可以得到如下问题:

cv::Mat probs = em_model.getProbs();

那我怎样才能得到元素最多和最少的模型,即最大和最小的模型呢?

其次,我这里的样本数据只有100个,和opencv的示例代码一样,但是我正在读取一个大小为600x800的帧,我想对其中的所有像素进行采样,是480000。但是这100个样本大约需要10毫秒,这意味着如果我设置它会太慢:

int nsamples = 480000;

我在这里走对了吗?

【问题讨论】:

    标签: video opencv model background gaussian


    【解决方案1】:

    如果我的问题是正确的,那么您所说的“最大”和“最小”模型是指混合中每个高斯的权重。您可以使用EM::getWeights 获取与高斯相关的权重。

    关于第二个问题,如果您使用 480000 个样本而不是 100 个样本来训练模型,是的,它肯定会更长。 “太慢”取决于您的要求。但是 EM 是一个分类模型,所以通常要做的就是你必须训练模型,使用足够数量的样本。这是一个漫长的过程,但通常是“离线”完成的。然后,您可以使用该模型来“预测”新样本,即获取与新输入样本相关联的概率。当您调用getProbs() 函数时,您将获得与您的训练样本相关联的概率。如果您想获得未知样本的概率,通常是视频帧中的像素,请调用函数predict

    【讨论】:

    • 非常感谢您的回答。还有一个问题:我发现“预测”给了我当前像素属于哪个模型的索引。所以我想做的是,提取那些具有最大和最小模型索引的像素,并将它们的像素值保存到两个不同的矩阵中。我尝试将索引保存在两个 cvScalar 中,并在原始帧矩阵中读取相应的像素值,但它不起作用。你有什么主意吗?再次感谢您。
    • predict 返回与具有最大后验概率的高斯索引对应的浮点数。您可以将矩阵作为附加参数传递,以预测与模型中每个高斯相关的概率将存储在何处。使用此矩阵,您可以获得每个像素的最小和最大概率。该矩阵将具有“number_of_samples”行和“number_of_gaussian”列,因此该矩阵中位置x,y的值对应于样本x根据高斯y的后验概率
    猜你喜欢
    • 2015-02-13
    • 2016-07-28
    • 1970-01-01
    • 2013-04-21
    • 2023-03-12
    • 2011-09-30
    • 2019-11-10
    • 1970-01-01
    • 2021-05-31
    相关资源
    最近更新 更多