diff --git a/modules/datasets/include/opencv2/datasets/or_sun.hpp b/modules/datasets/include/opencv2/datasets/or_sun.hpp index be438d4de..09db30b8e 100644 --- a/modules/datasets/include/opencv2/datasets/or_sun.hpp +++ b/modules/datasets/include/opencv2/datasets/or_sun.hpp @@ -56,8 +56,8 @@ namespace datasets struct OR_sunObj : public Object { + int label; std::string name; - std::vector imageNames; }; class CV_EXPORTS OR_sun : public Dataset @@ -66,6 +66,8 @@ public: virtual void load(const std::string &path) = 0; static Ptr create(); + + std::vector paths; }; } diff --git a/modules/datasets/samples/or_sun.cpp b/modules/datasets/samples/or_sun.cpp index 047b9796a..0750777e5 100644 --- a/modules/datasets/samples/or_sun.cpp +++ b/modules/datasets/samples/or_sun.cpp @@ -70,16 +70,15 @@ int main(int argc, char *argv[]) // *************** // dataset contains for each object its images. - // For example, let output dataset size and last object. + // For example, let output splits number, dataset size and last image. + int numSplits = dataset->getNumSplits(); + printf("splits number: %u\n", numSplits); printf("dataset size: %u\n", (unsigned int)dataset->getTrain().size()); + OR_sunObj *example = static_cast(dataset->getTrain().back().get()); - printf("last object name: %s\n", example->name.c_str()); - printf("last object images number: %u\n", (unsigned int)example->imageNames.size()); - vector &imageNames = example->imageNames; - for (vector::iterator it=imageNames.begin(); it!=imageNames.end(); ++it) - { - printf("%s\n", (*it).c_str()); - } + printf("last image:\nname: %s\n", example->name.c_str()); + printf("label: %u\n", example->label); + printf("label path: %s\n", dataset->paths[example->label].c_str()); return 0; } diff --git a/modules/datasets/src/or_sun.cpp b/modules/datasets/src/or_sun.cpp index 29b710922..ab8757bfb 100644 --- a/modules/datasets/src/or_sun.cpp +++ b/modules/datasets/src/or_sun.cpp @@ -43,6 +43,8 @@ #include "opencv2/datasets/util.hpp" #include "precomp.hpp" +#include + namespace cv { namespace datasets @@ -61,6 +63,10 @@ public: private: void loadDataset(const string &path); + + void loadDatasetPart(const string &path, vector< Ptr > &dataset_); + + map pathLabel; }; /*OR_sunImp::OR_sunImp(const string &path) @@ -73,13 +79,40 @@ void OR_sunImp::load(const string &path) loadDataset(path); } -void OR_sunImp::loadDataset(const string &path) +void OR_sunImp::loadDatasetPart(const string &path, vector< Ptr > &dataset_) { - train.push_back(vector< Ptr >()); - test.push_back(vector< Ptr >()); - validation.push_back(vector< Ptr >()); + string line; + ifstream infile(path.c_str()); + while (getline(infile, line)) + { + Ptr curr(new OR_sunObj); + curr->label = 397; + curr->name = line; + + size_t pos = curr->name.rfind('/'); + if (pos != string::npos) + { + string labelStr(curr->name.substr(0, pos+1)); + map::iterator it = pathLabel.find(labelStr); + if (it != pathLabel.end()) + { + curr->label = (*it).second; + } else + { + curr->label = pathLabel.size(); + pathLabel.insert(make_pair(labelStr, curr->label)); + paths.push_back(labelStr); + } + curr->name = curr->name.substr(pos+1); + } - string classNameFile(path + "ClassName.txt"); + dataset_.push_back(curr); + } +} + +void OR_sunImp::loadDataset(const string &path) +{ + /*string classNameFile(path + "ClassName.txt"); ifstream infile(classNameFile.c_str()); string line; while (getline(infile, line)) @@ -96,6 +129,29 @@ void OR_sunImp::loadDataset(const string &path) } train.back().push_back(curr); + }*/ + + for (unsigned int i=1; i<=10; ++i) + { + char tmp[3]; + sprintf(tmp, "%u", i); + string numStr; + if (i<10) + { + numStr = string("0") + string(tmp); + } else + { + numStr = tmp; + } + string trainFile(path + "Partitions/Training_" + numStr + ".txt"); + string testFile(path + "Partitions/Testing_" + numStr + ".txt"); + + train.push_back(vector< Ptr >()); + test.push_back(vector< Ptr >()); + validation.push_back(vector< Ptr >()); + + loadDatasetPart(trainFile, train.back()); + loadDatasetPart(testFile, test.back()); } }