使用不同样本多次调用 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 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();
...
说话人识别需要用到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 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();
...