From a85f7f23158289f400a6194fe8b7733998c66c66 Mon Sep 17 00:00:00 2001 From: Micooz Date: Wed, 4 Feb 2015 23:03:18 +0800 Subject: [PATCH] Fix Issue5. --- CMakeLists.txt | 34 +++++++++++++ src/train/svm_train.cpp | 92 +++++++++++++++++++++--------------- src/util/learn_prepare.cpp | 8 ++-- src/util/mc_data_prepare.cpp | 13 ++--- 4 files changed, 98 insertions(+), 49 deletions(-) create mode 100644 CMakeLists.txt diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..ac98151 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,34 @@ +cmake_minimum_required(VERSION 2.6) + +project (EasyPR) + +list(APPEND CMAKE_CXX_FLAGS "-std=c++0x") + +find_package(OpenCV REQUIRED) + +aux_source_directory(./src SOURCE_FILES) + +set(SOURCE_FILES + src/main.cpp + src/core/chars_identify.cpp + src/core/chars_recognise.cpp + src/core/chars_segment.cpp + src/core/features.cpp + src/core/plate_detect.cpp + src/core/plate_judge.cpp + src/core/plate_locate.cpp + src/core/plate_recognize.cpp + src/test/accuracy_test.cpp + src/test/test.cpp + src/train/ann_train.cpp + src/train/svm_train.cpp + src/util/deface.cpp + src/util/general_test_prepare.cpp + src/util/generate_gdts.cpp + src/util/learn_prepare.cpp + src/util/mc_data_prepare.cpp + src/util/util.cpp +) + +add_executable(EasyPR ${SOURCE_FILES}) +target_link_libraries(EasyPR ${OpenCV_LIBS}) \ No newline at end of file diff --git a/src/train/svm_train.cpp b/src/train/svm_train.cpp index 1390194..f65f1e7 100644 --- a/src/train/svm_train.cpp +++ b/src/train/svm_train.cpp @@ -12,16 +12,17 @@ namespace easypr{ void learn2HasPlate(float bound = 0.7) { - char * filePath = "train/data/plate_detect_svm/learn/HasPlate"; + const char * filePath = "train/data/plate_detect_svm/learn/HasPlate"; vector files; ////获取该路径下的所有文件 getFiles(filePath, files ); int size = files.size(); - if (0 == size) - cout << "No File Found in learn HasPlate!" << endl; - + if (0 == size) { + cout << "File not found in " << filePath << endl; + return; + } ////随机选取70%作为训练数据,30%作为测试数据 srand(unsigned(time(NULL))); random_shuffle(files.begin(), files.end()); @@ -58,15 +59,16 @@ void learn2HasPlate(float bound = 0.7) void learn2NoPlate(float bound = 0.7) { - char * filePath = "train/data/plate_detect_svm/learn/NoPlate"; + const char * filePath = "train/data/plate_detect_svm/learn/NoPlate"; vector files; ////获取该路径下的所有文件 getFiles(filePath, files ); int size = files.size(); - if (0 == size) - cout << "No File Found in learn NoPlate!" << endl; - + if (0 == size) { + cout << "File not found in " << filePath << endl; + return; + } ////随机选取70%作为训练数据,30%作为测试数据 srand(unsigned(time(NULL))); random_shuffle(files.begin(), files.end()); @@ -104,16 +106,17 @@ void getHasPlateTrain(Mat& trainingImages, vector& trainingLabels, svmCallback getFeatures = getHisteqFeatures) { int label = 1; - char * filePath = "train/data/plate_detect_svm/train/HasPlate"; + const char * filePath = "train/data/plate_detect_svm/train/HasPlate"; vector files; ////获取该路径下的所有文件 getFiles(filePath, files ); int size = files.size(); - if (0 == size) - cout << "No File Found in train HasPlate!" << endl; - + if (0 == size) { + cout << "File not found in " << filePath << endl; + return; + } cout << "get HasPlate train!" << endl; for (int i = 0; i < size; i++) { @@ -135,16 +138,17 @@ void getNoPlateTrain(Mat& trainingImages, vector& trainingLabels, svmCallback getFeatures = getHisteqFeatures) { int label = 0; - char * filePath = "train/data/plate_detect_svm/train/NoPlate"; + const char * filePath = "train/data/plate_detect_svm/train/NoPlate"; vector files; ////获取该路径下的所有文件 getFiles(filePath, files ); int size = files.size(); - if (0 == size) - cout << "No File Found in train HasPlate!" << endl; - + if (0 == size) { + cout << "File not found in " << filePath << endl; + return; + } cout << "get NoPlate train!" << endl; for (int i = 0; i < size; i++) { @@ -164,16 +168,17 @@ void getNoPlateTrain(Mat& trainingImages, vector& trainingLabels, void getHasPlateTest(vector& testingImages, vector& testingLabels) { int label = 1; - char * filePath = "train/data/plate_detect_svm/test/HasPlate"; + const char * filePath = "train/data/plate_detect_svm/test/HasPlate"; vector files; ////获取该路径下的所有文件 getFiles(filePath, files ); int size = files.size(); - if (0 == size) - cout << "No File Found in test HasPlate!" << endl; - + if (0 == size) { + cout << "File not found in " << filePath << endl; + return; + } cout << "get HasPlate test!" << endl; for (int i = 0; i < size; i++) { @@ -188,16 +193,17 @@ void getHasPlateTest(vector& testingImages, vector& testingLabels) void getNoPlateTest(vector& testingImages, vector& testingLabels) { int label = 0; - char * filePath = "train/data/plate_detect_svm/test/NoPlate"; + const char * filePath = "train/data/plate_detect_svm/test/NoPlate"; vector files; ////获取该路径下的所有文件 getFiles(filePath, files ); int size = files.size(); - if (0 == size) - cout << "No File Found in test NoPlate!" << endl; - + if (0 == size) { + cout << "File not found in " << filePath << endl; + return; + } cout << "get NoPlate test!" << endl; for (int i = 0; i < size; i++) { @@ -331,7 +337,6 @@ int svmTrain(bool dividePrepared = true, bool trainPrepared = true, } //Test SVM - Mat testingclasses_real; vector testingImages; vector testingLabels_real; @@ -341,7 +346,7 @@ int svmTrain(bool dividePrepared = true, bool trainPrepared = true, getNoPlateTest(testingImages, testingLabels_real); CvSVM svm; - if (trainPrepared == false) + if (trainPrepared == false && !classes.empty() && !trainingData.empty()) { CvSVMParams SVM_params; SVM_params.svm_type = CvSVM::C_SVC; @@ -357,16 +362,20 @@ int svmTrain(bool dividePrepared = true, bool trainPrepared = true, //Train SVM cout << "Begin to generate svm" << endl; - - //CvSVM svm(trainingData, classes, Mat(), Mat(), SVM_params); - svm.train_auto(trainingData, classes, Mat(), Mat(), SVM_params, 10, - CvSVM::get_default_grid(CvSVM::C), - CvSVM::get_default_grid(CvSVM::GAMMA), - CvSVM::get_default_grid(CvSVM::P), - CvSVM::get_default_grid(CvSVM::NU), - CvSVM::get_default_grid(CvSVM::COEF), - CvSVM::get_default_grid(CvSVM::DEGREE), - true); + + try { + //CvSVM svm(trainingData, classes, Mat(), Mat(), SVM_params); + svm.train_auto(trainingData, classes, Mat(), Mat(), SVM_params, 10, + CvSVM::get_default_grid(CvSVM::C), + CvSVM::get_default_grid(CvSVM::GAMMA), + CvSVM::get_default_grid(CvSVM::P), + CvSVM::get_default_grid(CvSVM::NU), + CvSVM::get_default_grid(CvSVM::COEF), + CvSVM::get_default_grid(CvSVM::DEGREE), + true); + } catch (const Exception &err) { + cout << err.what() << endl; + } cout << "Svm generate done!" << endl; @@ -375,8 +384,13 @@ int svmTrain(bool dividePrepared = true, bool trainPrepared = true, } else { - string path = "train/svm.xml"; - svm.load(path.c_str(), "svm"); + try { + string path = "train/svm.xml"; + svm.load(path.c_str(), "svm"); + } catch (const Exception &err) { + cout << err.what() << endl; + return 0; //next predict requires svm + } } cout << "Begin to predict" << endl; @@ -453,4 +467,4 @@ int svmTrain(bool dividePrepared = true, bool trainPrepared = true, return 0; } -} /*! \namespace easypr*/ \ No newline at end of file +} /*! \namespace easypr*/ diff --git a/src/util/learn_prepare.cpp b/src/util/learn_prepare.cpp index 4a50033..f18660e 100644 --- a/src/util/learn_prepare.cpp +++ b/src/util/learn_prepare.cpp @@ -31,11 +31,11 @@ void label_data() CPlateJudge ju; int size = files.size(); - //int size = 200; - - if (0 == size) - cout << "No File Found in notlabelPath!" << endl; + if (0 == size) { + cout << "File not found in " << notlabelPath << endl; + return; + } cout << "Automatic label all the data!" << endl; for (int i = 0; i < size; i++) diff --git a/src/util/mc_data_prepare.cpp b/src/util/mc_data_prepare.cpp index 6b97b41..bc9d714 100644 --- a/src/util/mc_data_prepare.cpp +++ b/src/util/mc_data_prepare.cpp @@ -190,16 +190,17 @@ void getPlateLicense(const string& filepath, string& plateLicense) //! MC:将rawdata截取部分数据到learndata中 void getLearnData() { - char * filePath = "F:/data/easypr-data/rawdata"; + const char * filePath = "F:/data/easypr-data/rawdata"; ////获取该路径下的所有文件 vector files; getFiles(filePath, files ); int size = files.size(); - if (0 == size) - cout << "No File Found in rawdata!" << endl; - + if (0 == size) { + cout << "File not found in " << filePath << endl; + return; + } ////随机排列rawdata srand(unsigned(time(NULL))); random_shuffle(files.begin(), files.end()); @@ -207,7 +208,7 @@ void getLearnData() ////选取前LEARANDATA_COUNT个rawdata数据作为learndata int boundry = LEARANDATA_COUNT; int count = 0; - cout << "Save learndata!" << endl; + cout << "Learndata saved!" << endl; for (int i = 0; i < size; i++) { cout << files[i].c_str() << endl; @@ -273,4 +274,4 @@ void changeFileName() } } -} \ No newline at end of file +}