0

次のように、opencvドキュメントのサンプルコードを使用して、opencv EMアルゴリズムを使用して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();

では、要素が最も多いモデルと最も少ないモデル、つまり最大モデルと最小モデルを取得するにはどうすればよいでしょうか?

次に、opencv のサンプル コードのように、サンプル データはここでは 100 しかありませんが、サイズが 600x800 のフレームを読み取っていて、その中のすべてのピクセル (480000) をサンプリングしたいのですが、約 10 ミリ秒かかります。これらの 100 個のサンプルは、次のように設定すると非常に遅くなることを意味します。

int nsamples = 480000;

私はここで正しい道を進んでいますか?

4

1 に答える 1

1

質問が正しければ、「最大」および「最小」モデルと呼ばれるものは、混合物内の各ガウス分布の重みを指します。を使用して、ガウス分布に関連付けられた重みを取得できますEM::getWeights

2 番目の質問に関しては、100 ではなく 480000 サンプルを使用してモデルをトレーニングすると、確かに長くなります。「遅すぎる」ことは、要件によって異なります。しかし、EM は分類モデルであるため、通常は、十分な量のサンプルを使用してモデルをトレーニングする必要があります。これは長いプロセスですが、通常は「オフライン」で行われます。次に、モデルを使用して新しいサンプルを「予測」できます。つまり、新しい入力サンプルに関連付けられた確率を取得できます。関数を呼び出すgetProbs()と、トレーニング サンプルに関連付けられた確率が取得されます。未知のサンプル (通常はビデオ フレーム内のピクセル) の確率を取得する場合は、関数 を呼び出しますpredict

于 2012-10-16T07:56:39.723 に答える