From 72da7f7df82c0ed8c5d4f58f646d41d0f15064ff Mon Sep 17 00:00:00 2001 From: Mark Hoekveen Date: Tue, 16 Apr 2019 00:23:11 +0200 Subject: [PATCH] WIP: Serialization --- DescriptorManager.cpp | 39 ++++++++++++++++++++++++++++++++++++++- DescriptorManager.h | 14 ++++++++++++++ Makefile | 2 +- main.cpp | 22 +++++----------------- 4 files changed, 58 insertions(+), 19 deletions(-) diff --git a/DescriptorManager.cpp b/DescriptorManager.cpp index d86d156..842aff7 100644 --- a/DescriptorManager.cpp +++ b/DescriptorManager.cpp @@ -47,6 +47,14 @@ void DescriptorManager::Init() { } fs::ifstream ifs; fs::ofstream ofs; + { + ifstream f("features.map", ios::binary); + if (f.is_open()) { + ar::binary_iarchive bi(f); + bi >> features; + } + } + numImages = std::count_if( fs::directory_iterator(img_path), fs::directory_iterator(), @@ -62,6 +70,11 @@ void DescriptorManager::Init() { image->read(itr->path().string()); //foreach descriptor for (int i = 0; i < numDescriptors; i++) { + //First check if we already have this information from the loaded cache + if (features[i].count(image_name) > 0) { + cout << "We already have feature for " << image_name << endl; + continue; + } //folder to store descriptors; create if not exists fs::path descriptorBase("meta" / descriptor_types[i]->ToPath()); if (!fs::is_directory(descriptorBase)) @@ -85,6 +98,21 @@ void DescriptorManager::Init() { ofs.close(); } features[i][image_name] = *b1; + { + ofstream f("features.map", ios::binary); + //ofstream feature_cache_backup("features.map.bak", ios::binary); + //feature_cache_backup << feature_cache.rdbuf(); + ar::binary_oarchive oa(f); + oa << features; + } + + { + yas::file_ostream os("features.yas", yas::file_mode::file_trunc); + //const std::size_t flg = yas::binary|yas::file; + yas::binary_oarchive oa(os); + oa & features; + //yas::save(image_name, features); + } delete b1; } for (int i = 0; i < numMutations; i++) { @@ -95,12 +123,21 @@ void DescriptorManager::Init() { fs::path mutPath(mutationBase / itr->path().filename().generic_string()); Image* mutated; if (!fs::exists(mutPath)) { //only mutate if nothing on disk + //Measured: about 10ms + auto start = high_resolution_clock::now(); mutated = mutators[i]->getMutated(image); mutated->write(mutPath.generic_string()); + auto duration = duration_cast(high_resolution_clock::now() - start); + cout << "Calculating mutation " << mutators[i]->ToString() << " took " << duration.count() << "μs." << endl; + } - else { + else { + //Measured: about 4ms + auto start = high_resolution_clock::now(); mutated = new Image; mutated->read(mutPath.generic_string()); + auto duration = duration_cast(high_resolution_clock::now() - start); + cout << "Loading mutation " << mutators[i]->ToString() << " took " << duration.count() << "μs." << endl; } //now calculate all the features for the mutated images as well diff --git a/DescriptorManager.h b/DescriptorManager.h index 7b74188..e094fd9 100644 --- a/DescriptorManager.h +++ b/DescriptorManager.h @@ -8,6 +8,18 @@ #include #include #include +//Boost serialization test: +#include +#include +#include +#include +#include + +//YAS Serialization: +#include +#include + +#include //Debug, for measuring execution times #include #include @@ -15,11 +27,13 @@ #include "Mutation.h" using namespace std; +using namespace chrono; using namespace Magick; //ENUM_STRING(descriptorss, (totalColors)(averageColor)(numDescriptors)) namespace fs = boost::filesystem; +namespace ar = boost::archive; //Manager class for descriptors. //Contains functions to load, store, process diff --git a/Makefile b/Makefile index 1fcacd3..abff920 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,7 @@ CXX = g++ CC = $(CXX) CPPFLAGS = `Magick++-config --cppflags` -BOOST_LIBS = -lboost_system -lboost_filesystem +BOOST_LIBS = -lboost_system -lboost_filesystem -lboost_serialization LDFLAGS = `Magick++-config --ldflags` $(BOOST_LIBS) SOURCES = DescriptorManager.cpp main.cpp OBJECTS = $(SOURCES:.cpp=.o) diff --git a/main.cpp b/main.cpp index 85a3dc1..4ee849c 100644 --- a/main.cpp +++ b/main.cpp @@ -23,7 +23,7 @@ using namespace Magick; int main(int argc, char **argv) { - string imagename = "im80.jpg"; + string imagename = "spook.jpg"; int method = 6; int count = 1000; if (argc > 2) { @@ -39,24 +39,12 @@ int main(int argc, char **argv) { cout << "Continuing.." << endl; } InitializeMagick(*argv); - DescriptorManager* manager = new DescriptorManager("data"); - cout << "Intializing..." << endl; + DescriptorManager* manager = new DescriptorManager("test"); + //smanager->generatePreviews(imagename); + //cout << "Intializing..." << endl; manager->Init(); - cout << "done!" << endl; + //cout << "done!" << endl; manager->runExperiments(); - //manager->rankImages(imagename, method); - //manager->rankMutations(imagename, method); - //manager->outputMap(method); - //manager->outputRank(imagename, method); - //cout << "Loading descriptiors.."; - //manager->loadDescriptors(); - //manager->createMutations(); - //cout << "done?" << endl; - //manager->similarImages(imagename, method, count); - //manager->insertMutations(imagename, method); - //cout << "done!" << endl << "Calculating distances.." << endl; - //cout << "done!" << endl << "Outputting map.." << endl; - //manager->outputMap(); return 0; }