对于说话人识别,我需要使用 GMM 算法,我选择了 OpenCV 库来实现。
我有一个 vector 成员变量 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 data1
和 cv::Mat data2
。如果我这样打电话:
trainEM(data1);
trainEM(data2);
ml::EM
将同时使用 data1
和 data2
进行训练。或者最后一个的训练结果将覆盖第一个(在这种情况下 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();
...
关于c++ - 使用不同样本多次调用 OpenCV trainEM 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34108938/