【发布时间】:2015-10-24 07:38:44
【问题描述】:
#include <opencv2/core.hpp>
#include <opencv2/ml.hpp>
#include <iostream>
#include <vector>
int main()
{
size_t const FeatureSize = 24;
{
auto rtrees = cv::ml::RTrees::create();
rtrees->setMaxDepth(10);
rtrees->setMinSampleCount(2);
rtrees->setRegressionAccuracy(0);
rtrees->setUseSurrogates(false);
rtrees->setMaxCategories(16);
rtrees->setPriors(cv::Mat());
rtrees->setCalculateVarImportance(false);
rtrees->setActiveVarCount(0);
rtrees->setTermCriteria({ cv::TermCriteria::MAX_ITER, 100, 0 });
std::vector<float> labels; //#1
cv::Mat_<float> features;
for(size_t i = 0; i != 500; ++i){
std::vector<float> data;
for(size_t j = 0; j != FeatureSize; ++j){
data.emplace_back(0); //#2
}
labels.emplace_back(i % 2);
features.push_back(cv::Mat(data, true));
}
rtrees->train(features.reshape(1, labels.size()),
cv::ml::ROW_SAMPLE, labels);
rtrees->write(cv::FileStorage("smoke_classifier.xml",
cv::FileStorage::WRITE));
}
{
auto rtrees2 = cv::ml::RTrees::create();
cv::FileStorage read("smoke_classifier.xml",
cv::FileStorage::READ);
rtrees2->read(read.root());
int a = rtrees2->getMinSampleCount();
std::cout<<"a == "<<a<<"\n";
cv::Mat1f feat2(1, FeatureSize, 0.f);
std::cout<<"predict == "<<rtrees2->predict(feat2)<<"\n";
}
}
如果将#1从float改为int并读取xml然后调用predict,程序会崩溃,但是如果我不从xml读取信息,即使#1类型是,函数predict也可以工作诠释
但是如果我将标签从int更改为float,当我调用train训练机器时,rtree会弹出另一个错误消息(代码sn-p(#2)的虚拟数据“0”不会导致程序会崩溃,但真实数据会)。
另一个问题是,将标签从 int 更改为 float 会使其从分类问题变为回归问题,但我真正需要的是分类而不是回归(虽然很容易通过回归来模拟分类,因为只有两个标签)
将标签更改为浮动并调用 train 训练机器时的错误消息
"....\opencv-3.0.0\sources\modules\ml\src\tree.cpp:1190: 错误:(-215) (int)_sleft.size()
【问题讨论】: