1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106
| #include "GetSIFTFeature.h" #include "GetBOW.h" #include "SVMHelper.h"
#include <Windows.h>
void print_log(std::string log) { SYSTEMTIME sys; GetLocalTime(&sys); char buff[MAXBYTE]; memset(buff, 0, sizeof(buff) / sizeof(char)); sprintf_s(buff, "[%04d-%02d-%02d %02d-%02d-%02d.%04d]", sys.wYear, sys.wMonth, sys.wDay, sys.wHour, sys.wMinute, sys.wSecond, sys.wMilliseconds);
std::string msg; msg.append(buff).append(log);
std::cout << msg << std::endl; }
int main() { const std::string path = "./15-Scene"; const std::string file_format = "jpg"; const size_t train_count = 150;
print_log("Begin!");
std::vector<SIFTFeature> train_feature; std::vector<int> train_label; GetSIFTFeature::GetInstance().GetFeatureSet(path, file_format, train_count, train_feature, train_label); print_log("GetTrainFeatureSet Done!");
cv::Mat bow_dic = GetBow::GetInstance().GetDic(train_feature, 1000, false); print_log("GetDic Done!");
std::vector<cv::Mat> train_bow_list = GetBow::GetInstance().FeatureToSVMSet(bow_dic, "./train_bow_list.yml", train_feature); print_log("TrainFeatureToSVMSet Done!");
SVMHelper::GetInstance().SVMTrain(train_bow_list, train_label); print_log("SVMTrain Done!");
auto calculateConfusionMatrix = [](std::vector<int> groundTruth, std::vector<int> predictions, int numClasses) -> std::vector<std::vector<int>> { std::vector<std::vector<int>> confusionMatrix(numClasses, std::vector<int>(numClasses, 0)); for (size_t i = 0; i < groundTruth.size(); i++) { int trueClass = groundTruth[i]; int predictedClass = predictions[i]; confusionMatrix[trueClass][predictedClass]++; } return confusionMatrix; };
std::vector<SIFTFeature> test_feature; std::vector<int> test_label; GetSIFTFeature::GetInstance().GetFeatureSet(path, file_format, train_count, test_feature, test_label, false); print_log("GetTestFeatureSet Done!");
std::vector<cv::Mat> test_bow_list = GetBow::GetInstance().FeatureToSVMSet(bow_dic, "./test_bow_list.yml", test_feature); print_log("TestFeatureToSVMSet Done!");
cv::Ptr<cv::ml::SVM> svm = SVMHelper::GetInstance().GetSVMTrain(); std::vector<int> predictions; for (size_t i = 0; i < test_bow_list.size(); i++) { predictions.push_back(svm->predict(test_bow_list[i])); } print_log("SVM Predict Done!");
std::vector<std::vector<int>> confusionMatrix = calculateConfusionMatrix(test_label, predictions, 15); { cv::FileStorage fs("./confusionMatrix.yml", cv::FileStorage::WRITE); fs << "confusionMatrix" << confusionMatrix; fs.release(); } print_log("ConfusionMatrix Done!"); }
|