From cf6694250529a7066664f1b7d1f0e4d26a775da0 Mon Sep 17 00:00:00 2001 From: "marina.kolpakova" <marina.kolpakova@itseez.com> Date: Wed, 13 Mar 2013 13:40:11 +0400 Subject: [PATCH] enable training test. refactor globbing --- apps/sft/dataset.cpp | 96 ++------------------ modules/softcascade/test/test_training.cpp | 101 ++------------------- 2 files changed, 12 insertions(+), 185 deletions(-) diff --git a/apps/sft/dataset.cpp b/apps/sft/dataset.cpp index 52ec8ac840..d89a38e888 100644 --- a/apps/sft/dataset.cpp +++ b/apps/sft/dataset.cpp @@ -46,116 +46,32 @@ #include <iostream> #include <queue> -inline std::string itoa(long i) { return cv::format("%ld", i); } - -#if !defined (_WIN32) && ! defined(__MINGW32__) -# include <glob.h> - -namespace { -using namespace sft; -void glob(const string& path, svector& ret) -{ - glob_t glob_result; - glob(path.c_str(), GLOB_TILDE, 0, &glob_result); - - ret.clear(); - ret.reserve(glob_result.gl_pathc); - - for(unsigned int i = 0; i < glob_result.gl_pathc; ++i) - { - ret.push_back(std::string(glob_result.gl_pathv[i])); - dprintf("%s\n", ret[i].c_str()); - } - - globfree(&glob_result); -} - -} -#else - -# include <windows.h> -namespace { -using namespace sft; -void glob(const string& refRoot, const string& refExt, svector &refvecFiles) -{ - std::string strFilePath; // File path - std::string strExtension; // Extension - - std::string strPattern = refRoot + "\\*.*"; - - WIN32_FIND_DATA FileInformation; // File information - HANDLE hFile = ::FindFirstFile(strPattern.c_str(), &FileInformation); - - if(hFile == INVALID_HANDLE_VALUE) - CV_Error(CV_StsBadArg, "Your dataset search path is incorrect"); - - do - { - if(FileInformation.cFileName[0] != '.') - { - strFilePath.erase(); - strFilePath = refRoot + "\\" + FileInformation.cFileName; - - if( !(FileInformation.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ) - { - // Check extension - strExtension = FileInformation.cFileName; - strExtension = strExtension.substr(strExtension.rfind(".") + 1); - - if(strExtension == refExt) - // Save filename - refvecFiles.push_back(strFilePath); - } - } - } - while(::FindNextFile(hFile, &FileInformation) == TRUE); - - // Close handle - ::FindClose(hFile); - - DWORD dwError = ::GetLastError(); - if(dwError != ERROR_NO_MORE_FILES) - CV_Error(CV_StsBadArg, "Your dataset search path is incorrect"); -} -} - -#endif - // in the default case data folders should be aligned as following: // 1. positives: <train or test path>/octave_<octave number>/pos/*.png // 2. negatives: <train or test path>/octave_<octave number>/neg/*.png -ScaledDataset::ScaledDataset(const string& path, const int oct) +sft::ScaledDataset::ScaledDataset(const string& path, const int oct) { dprintf("%s\n", "get dataset file names..."); dprintf("%s\n", "Positives globing..."); - -#if !defined (_WIN32) && ! defined(__MINGW32__) - glob(path + "/pos/octave_" + itoa(oct) + "/*.png", pos); -#else - glob(path + "/pos/octave_" + itoa(oct), "png", pos); -#endif + cv::glob(path + "/pos/octave_" + cv::format("%d", oct) + "/*.png", pos); dprintf("%s\n", "Negatives globing..."); -#if !defined (_WIN32) && ! defined(__MINGW32__) - glob(path + "/neg/octave_" + itoa(oct) + "/*.png", neg); -#else - glob(path + "/neg/octave_" + itoa(oct), "png", neg); -#endif + cv::glob(path + "/neg/octave_" + cv::format("%d", oct) + "/*.png", neg); // Check: files not empty CV_Assert(pos.size() != size_t(0)); CV_Assert(neg.size() != size_t(0)); } -cv::Mat ScaledDataset::get(SampleType type, int idx) const +cv::Mat sft::ScaledDataset::get(SampleType type, int idx) const { const std::string& src = (type == POSITIVE)? pos[idx]: neg[idx]; return cv::imread(src); } -int ScaledDataset::available(SampleType type) const +int sft::ScaledDataset::available(SampleType type) const { return (int)((type == POSITIVE)? pos.size():neg.size()); } -ScaledDataset::~ScaledDataset(){} \ No newline at end of file +sft::ScaledDataset::~ScaledDataset(){} \ No newline at end of file diff --git a/modules/softcascade/test/test_training.cpp b/modules/softcascade/test/test_training.cpp index a03ab8abd5..0d9f632aff 100644 --- a/modules/softcascade/test/test_training.cpp +++ b/modules/softcascade/test/test_training.cpp @@ -46,13 +46,6 @@ #include <fstream> #include <vector> -#include "test_precomp.hpp" -#if !defined (_WIN32) && ! defined(__MINGW32__) -# include <glob.h> -#else -# include <windows.h> -#endif - using namespace std; namespace { @@ -74,92 +67,10 @@ private: svector neg; }; -string itoa(long i) -{ - char s[65]; - sprintf(s, "%ld", i); - return std::string(s); -} - - -#if !defined (_WIN32) && ! defined(__MINGW32__) - -void glob(const string& path, svector& ret) -{ - glob_t glob_result; - glob(path.c_str(), GLOB_TILDE, 0, &glob_result); - - ret.clear(); - ret.reserve(glob_result.gl_pathc); - - for(unsigned int i = 0; i < glob_result.gl_pathc; ++i) - { - ret.push_back(std::string(glob_result.gl_pathv[i])); - } - - globfree(&glob_result); -} - -#else - -void glob(const string& refRoot, const string& refExt, svector &refvecFiles) -{ - std::string strFilePath; // File path - std::string strExtension; // Extension - - std::string strPattern = refRoot + "\\*.*"; - - WIN32_FIND_DATA FileInformation; // File information - HANDLE hFile = ::FindFirstFile(strPattern.c_str(), &FileInformation); - - if(hFile == INVALID_HANDLE_VALUE) - CV_Error(CV_StsBadArg, "Your dataset search path is incorrect"); - - do - { - if(FileInformation.cFileName[0] != '.') - { - strFilePath.erase(); - strFilePath = refRoot + "\\" + FileInformation.cFileName; - - if( !(FileInformation.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ) - { - // Check extension - strExtension = FileInformation.cFileName; - strExtension = strExtension.substr(strExtension.rfind(".") + 1); - - if(strExtension == refExt) - // Save filename - refvecFiles.push_back(strFilePath); - } - } - } - while(::FindNextFile(hFile, &FileInformation) == TRUE); - - // Close handle - ::FindClose(hFile); - - DWORD dwError = ::GetLastError(); - if(dwError != ERROR_NO_MORE_FILES) - CV_Error(CV_StsBadArg, "Your dataset search path is incorrect"); -} - -#endif - ScaledDataset::ScaledDataset(const string& path, const int oct) { - -#if !defined (_WIN32) && ! defined(__MINGW32__) - glob(path + "/pos/octave_" + itoa(oct) + "/*.png", pos); -#else - glob(path + "/pos/octave_" + itoa(oct), "png", pos); -#endif - -#if !defined (_WIN32) && ! defined(__MINGW32__) - glob(path + "/neg/octave_" + itoa(oct) + "/*.png", neg); -#else - glob(path + "/neg/octave_" + itoa(oct), "png", neg); -#endif + cv::glob(path + cv::format("/octave_%d/*.png", oct), pos); + cv::glob(path + "/*.png", neg); // Check: files not empty CV_Assert(pos.size() != size_t(0)); @@ -181,7 +92,7 @@ ScaledDataset::~ScaledDataset(){} } -TEST(DISABLED_SoftCascade, training) +TEST(SoftCascade, training) { // // 2. check and open output file string outXmlPath = cv::tempfile(".xml"); @@ -214,8 +125,8 @@ TEST(DISABLED_SoftCascade, training) cv::Ptr<FeaturePool> pool = FeaturePool::create(model, nfeatures, 10); nfeatures = pool->size(); - int npositives = 20; - int nnegatives = 40; + int npositives = 10; + int nnegatives = 20; cv::Rect boundingBox = cv::Rect( cvRound(20 * octave), cvRound(20 * octave), cvRound(64 * octave), cvRound(128 * octave)); @@ -223,7 +134,7 @@ TEST(DISABLED_SoftCascade, training) cv::Ptr<ChannelFeatureBuilder> builder = ChannelFeatureBuilder::create("HOG6MagLuv"); cv::Ptr<Octave> boost = Octave::create(boundingBox, npositives, nnegatives, *it, shrinkage, builder); - std::string path = cvtest::TS::ptr()->get_data_path() + "softcascade/sample_training_set"; + std::string path = cvtest::TS::ptr()->get_data_path() + "cascadeandhog/sample_training_set"; ScaledDataset dataset(path, *it); if (boost->train(&dataset, pool, 3, 2))