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

Calling OpenCV trainEM function multiple times with different samples

本文关键字:调用 OpenCV trainEM 函数 本多 样本      更新时间:2023-10-16

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

我为每个说话人都有一个 ml::EM 的向量成员变量:

std::vector< cv::Ptr<cv::ml::EM> > gMFCCVec;

我有一个方法,可以简单地为给定的扬声器调用trainEM

void train(size_t speakerID, cv::Mat& samples)
{
    gMFCCVec[speakerID]->trainEM(samples);
} 

我的问题可以用不同的样本调用trainEM方法。我有cv::Mat data1cv::Mat data2.如果我打电话像:

 trainEM(data1);
 trainEM(data2);

ml::EM将接受data1data2的培训.或者最后一个的训练结果将覆盖第一个(在这种情况下,ml::EM将只用data2训练(?

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


您可以在实现中看到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);
}

setTrainDataclear()

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();
    ...