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

Calling OpenCV trainEM function multiple times with different samples

说话人识别需要用到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 训练)?

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


您可以在 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();
    ...