使用不同的样本多次调用OpenCV trainEM函数

时间:2015-12-05 17:58:56

标签: c++ opencv opencv3.0

对于说话人识别我需要使用GMM算法,我选择了OpenCV库来实现。

我为每位发言者提供了task2(argument[1], argument[2], callbackFn)的向量成员变量:

ml::EM

我有一种方法只需要给定的发言者std::vector< cv::Ptr<cv::ml::EM> > gMFCCVec;

trainEM

我的问题可以用不同的样本调用void train(size_t speakerID, cv::Mat& samples) { gMFCCVec[speakerID]->trainEM(samples); } 方法。我有trainEMcv::Mat data1。如果我打电话给:

cv::Mat data2

trainEM(data1); trainEM(data2); ml::EM同时对data1进行培训。或者最后一个的训练结果将覆盖第一个(在这种情况下,data2将仅使用ml::EM进行训练?)

1 个答案:

答案 0 :(得分:1)

最后一个训练结果将覆盖第一个。

您可以在implementation中看到trainEM来电setTrainData

bool trainEM(InputArray samples,
           OutputArray logLikelihoods,
           OutputArray labels,
           OutputArray probs)
{
    Mat samplesMat = samples.getMat();
    setTrainData(START_AUTO_STEP, samplesMat, 0, 0, 0, 0);
    return doTrain(START_AUTO_STEP, logLikelihoods, labels, probs);
}

setTrainData来电clear()

void setTrainData(int startStep, const Mat& samples,
                  const Mat* probs0,
                  const Mat* means0,
                  const std::vector<Mat>* covs0,
                  const Mat* weights0)
{
    clear();
    ...

并且clear只是清除以前训练过的数据:

void clear()
{
    trainSamples.release();
    ...