void getHistomPlusColoFeatures(const Mat& image, Mat& features) { // TODO Mat feature1, feature2; getHistogramFeatures(image, feature1); getColorFeatures(image, feature2); hconcat(feature1.reshape(1, 1), feature2.reshape(1, 1), features); }
cv::Ptr<cv::ml::TrainData> SvmTrain::tdata() { this->prepare(); cv::Mat samples; std::vector<int> responses; for (auto f : train_file_list_) { auto image = cv::imread(f.file); if (!image.data) { fprintf(stdout, ">> Invalid image: %s ignore.\n", f.file.c_str()); continue; } cv::Mat feature; getHistogramFeatures(image, feature); feature = feature.reshape(1, 1); samples.push_back(feature); responses.push_back(int(f.label)); } cv::Mat samples_, responses_; samples.convertTo(samples_, CV_32FC1); cv::Mat(responses).copyTo(responses_); return cv::ml::TrainData::create(samples_, cv::ml::SampleTypes::ROW_SAMPLE, responses_); }
int PlateJudge::plateJudge(const Mat &inMat, int &result) { Mat features; getHistogramFeatures(inMat, features); float response = svm_->predict(features); result = (int) response; return 0; }
void SvmTrain::test() { // 1.4 bug fix: old 1.4 ver there is no null judge if (NULL == svm_) svm_ = cv::ml::SVM::load<cv::ml::SVM>(svm_xml_); if (test_file_list_.empty()) { this->prepare(); } double count_all = test_file_list_.size(); double ptrue_rtrue = 0; double ptrue_rfalse = 0; double pfalse_rtrue = 0; double pfalse_rfalse = 0; for (auto item : test_file_list_) { auto image = cv::imread(item.file); if (!image.data) { std::cout << "no" << std::endl; continue; } cv::Mat feature; getHistogramFeatures(image, feature); //std::cout << "predict: " << result << std::endl; auto predict = int(svm_->predict(feature)); auto real = item.label; if (predict == kForward && real == kForward) ptrue_rtrue++; if (predict == kForward && real == kInverse) ptrue_rfalse++; if (predict == kInverse && real == kForward) pfalse_rtrue++; if (predict == kInverse && real == kInverse) pfalse_rfalse++; } std::cout << "count_all: " << count_all << std::endl; std::cout << "ptrue_rtrue: " << ptrue_rtrue << std::endl; std::cout << "ptrue_rfalse: " << ptrue_rfalse << std::endl; std::cout << "pfalse_rtrue: " << pfalse_rtrue << std::endl; std::cout << "pfalse_rfalse: " << pfalse_rfalse << std::endl; double precise = 0; if (ptrue_rtrue + ptrue_rfalse != 0) { precise = ptrue_rtrue / (ptrue_rtrue + ptrue_rfalse); std::cout << "precise: " << precise << std::endl; } else { std::cout << "precise: " << "NA" << std::endl; } double recall = 0; if (ptrue_rtrue + pfalse_rtrue != 0) { recall = ptrue_rtrue / (ptrue_rtrue + pfalse_rtrue); std::cout << "recall: " << recall << std::endl; } else { std::cout << "recall: " << "NA" << std::endl; } double Fsocre = 0; if (precise + recall != 0) { Fsocre = 2 * (precise * recall) / (precise + recall); std::cout << "Fsocre: " << Fsocre << std::endl; } else { std::cout << "Fsocre: " << "NA" << std::endl; } }