oreillymedia/Learning-OpenCV-3_examples

Random forest gives incorrect prediction.

sandeepganage opened this issue · 1 comments

I have trained a random forest model in opencv. Following is my code

cv::Ptr<cv::ml::RTrees> dtree = cv::ml::RTrees::create();
dtree->setMaxDepth(18);

int numTrees = 50;
dtree->setTermCriteria(TermCriteria(TermCriteria::COUNT, numTrees, 1e-6));

cv::Ptr<cv::ml::TrainData> train_data_set = cv::ml::TrainData::loadFromCSV(
    "Train_Data.csv",  1, 0, 1);

dtree->train(train_data_set);
dtree->save("E:/RFModel.xml");

Train_Data.csv contains 28 columns (features/attributes) in integer format. After training I saved the model as RFModel.xml.

Now, I want to perform prediction. I have my features saved in vector data structure.

Following is my code for performing prediction:

// I will extract my attribute values and push in `mRFParams`
vector<int> mRFParams;

/*
Feature extraction and push in mRFParams vector happens here
*/

// Load the model
cv::Ptr<cv::ml::RTrees> model = cv::ml::RTrees::load("E:/RFModel.xml");

auto numParams = mRFParams.size();
cv::Mat RFParamMat(1, numParams, CV_32FC1);
memcpy(RFParamMat.data, &mRFParams, numParams);
cv::Mat predict_labels;
auto prediction = model->predict(RFParamMat);
std::cout<<"Prediction : ", prediction);

This gives me totally incorrect output. Am I correctly calling prediction? Or am I doing something totally wrong?
Thanks in advance

Correct Solution :

			cv::Mat RFParamMat=cv::Mat(mRFParams);
			auto prediction = model->predict(RFParamMat);

Also, mRFParams should be a float vector