| 188 | } |
| 189 | |
| 190 | void |
| 191 | HaarDispAdaClassifier::train(string filename) |
| 192 | { |
| 193 | //CvBoostParams bparams = CvBoostParams(); |
| 194 | //float priorFloat[] = { 1.0, HaarDispAdaPrior_ }; // preliminary priors based on ROC) |
| 195 | //bparams.priors = &priorFloat[0]; |
| 196 | //bparams.use_surrogates = false; |
| 197 | //bparams.weak_count = 100; |
| 198 | vector<double> priors(2); |
| 199 | priors[0] = 1; |
| 200 | priors[1] = 26; |
| 201 | |
| 202 | // copy sub matrix for training |
| 203 | cv::Mat VarIdx; |
| 204 | cv::Mat Features(numSamples_,num_filters_,CV_32F); |
| 205 | for(int i=0;i<numSamples_;i++){ |
| 206 | for(int j=0;j<num_filters_;j++){ |
| 207 | Features.at<float>(i,j) = trainingSamples_.at<float>(i,j); |
| 208 | } |
| 209 | } |
| 210 | cv::Mat Responses(numSamples_,1,CV_32S); |
| 211 | for(int i=0; i<numSamples_;i++){ |
| 212 | if(trainingLabels_.at<int>(i,0) == -1) trainingLabels_.at<int>(i,0) = 0;//classes: 0,1 |
| 213 | Responses.at<int>(i,0) = trainingLabels_.at<int>(i,0); |
| 214 | } |
| 215 | cv::Mat vIdx=cv::Mat::ones(Features.cols,1,CV_8UC1); // variables of interest |
| 216 | cv::Mat sIdx=cv::Mat::ones(Responses.rows,1,CV_8UC1); // samples of interest |
| 217 | cv::Mat vtyp=cv::Mat(Features.cols,1,CV_8UC1,cv::ml::VAR_ORDERED); // could be VAR_CATAGORICAL(discrete) |
| 218 | //Mat MDM; // no missing mask |
| 219 | |
| 220 | //boost->setBoostType(Boost::DISCRETE); |
| 221 | HDAC_->setWeakCount(100); |
| 222 | HDAC_->setWeightTrimRate(0.95); |
| 223 | //HDAC_->setMaxDepth(2); |
| 224 | HDAC_->setUseSurrogates(false); |
| 225 | HDAC_->setPriors(cv::Mat(priors)); |
| 226 | |
| 227 | //prepare_train_data( Features, Responses ); |
| 228 | //HDAC_.train(Features, CV_ROW_SAMPLE, Responses,vIdx,sIdx,vtyp,MDM,bparams,false);// |
| 229 | cv::Ptr<cv::ml::TrainData> tdata = cv::ml::TrainData::create(Features, cv::ml::ROW_SAMPLE, Responses, vIdx, sIdx, cv::noArray(), vtyp); |
| 230 | HDAC_->train(tdata); |
| 231 | ROS_ERROR("saving trained classifier to %s",filename.c_str()); |
| 232 | loaded = true; |
| 233 | HDAC_->save(filename.c_str()); |
| 234 | // Determine Recall Statistics |
| 235 | int num_TP = 0; |
| 236 | int num_FP = 0; |
| 237 | int num_people = 0; |
| 238 | int num_neg = 0; |
| 239 | int num_TN = 0; |
| 240 | int num_FN = 0; |
| 241 | for(int i=0;i<Features.rows;i++){ |
| 242 | float result = HDAC_->predict(Features.row(i));//float s = model->predict( temp_sample, noArray(), StatModel::RAW_OUTPUT ); |
| 243 | if(Responses.at<int>(i,0) == 1) num_people++; |
| 244 | if(Responses.at<int>(i,0) != 1) num_neg++; |
| 245 | if(result==1 && Responses.at<int>(i,0) == 1) num_TP++; // true pos |
| 246 | else if(result==1 && Responses.at<int>(i,0) == 0) num_FP++; // false pos |
| 247 | else if(result==0 && Responses.at<int>(i,0) == 0) num_TN++; // true neg |