首页 > 解决方案 > 训练 cv:ml::DTrees 时如何修复“断言失败”

问题描述

我想训练一个具有猪特征的决策树。当我尝试训练我的 cv::ml::DTrees 模型时,我收到以下错误:

OpenCV(3.4.3) Error: Assertion failed (n >= 0) in cv::ml::TrainDataImpl::getValues, file C:\build\3_4_winpack-build-win64-vc14\opencv\modules\ml\src\data.cpp, line 890

我知道,样本(特征)的数量必须与响应(标签)的数量相匹配,并且两者都必须> = 0。我的 cv::Mat 壮举和 cv::Mat 标签具有相同的行数 (388)。

这就是我尝试这样做的方式:

cv::Ptr<cv::ml::DTrees> model = cv::ml::DTrees::create();
cv::Ptr<cv::ml::TrainData> data = cv::ml::TrainData::create(feats, cv::ml::ROW_SAMPLE, labels);
model->train(data);

model->train(data) 在调用此函数时失败:

void getValues( int vi, InputArray _sidx, float* values ) const CV_OVERRIDE
    {
        Mat sidx = _sidx.getMat();
        int i, n = sidx.checkVector(1, CV_32S), nsamples = getNSamples();
        CV_Assert( 0 <= vi && vi < getNAllVars() );
        CV_Assert( n >= 0 );
        const int* s = n > 0 ? sidx.ptr<int>() : 0;
        if( n == 0 )
            n = nsamples;
        }
}

谁能指出我正确的方向来解决这个问题?

编辑: 如果我将 MinSampleCount 设置为 388(样本数),我不会收到错误,但预测将无法正常工作(它总是返回标签 5)。

标签: c++opencvdecision-treetraining-data

解决方案


推荐阅读