From 826af62605a95f884dee9596c5730025b97cdd79 Mon Sep 17 00:00:00 2001 From: Mark Hoekveen Date: Fri, 31 May 2019 13:32:03 +0200 Subject: [PATCH] Refactor caching --- DescriptorManager.cpp | 73 ++++++++++++++++++++++++++++++------------- DescriptorManager.h | 2 ++ 2 files changed, 53 insertions(+), 22 deletions(-) diff --git a/DescriptorManager.cpp b/DescriptorManager.cpp index 842aff7..cd3ca67 100644 --- a/DescriptorManager.cpp +++ b/DescriptorManager.cpp @@ -47,13 +47,7 @@ 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; - } - } + LoadFeatures(); numImages = std::count_if( fs::directory_iterator(img_path), @@ -98,21 +92,7 @@ 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); - } + SaveFeatures(); delete b1; } for (int i = 0; i < numMutations; i++) { @@ -120,6 +100,12 @@ void DescriptorManager::Init() { fs::path mutationBase(img_path / mutators[i]->ToPath()); if (!fs::is_directory(mutationBase)) fs::create_directory(mutationBase); + bool missing = false; + for (int j = 0; j < numDescriptors; j++) { + if (mutatedFeatures[j][i].count(image_name) <= 0) { + missing = true; + } + } fs::path mutPath(mutationBase / itr->path().filename().generic_string()); Image* mutated; if (!fs::exists(mutPath)) { //only mutate if nothing on disk @@ -179,6 +165,49 @@ void DescriptorManager::Init() { initialized = true; } + +//Saves feature map to disk. +//Makes it so that it can reload easily +void DescriptorManager::SaveFeatures() { + { //Boost serialization + 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; + + ofstream fm("mutated_features.map", ios::binary); + ar::binary_oarchive oam(fm); + oam << mutatedFeatures; + } + { //YAS serialization + 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); + } +} + +//Loads saved feature maps from disk. +void DescriptorManager::LoadFeatures() { + { //Boost + ifstream f("features.map", ios::binary); + if (f.is_open()) { + ar::binary_iarchive bi(f); + bi >> features; + } + ifstream fm("mutated_features.map", ios::binary); + if (fm.is_open()) { + ar::binary_iarchive bim(fm); + bim >> mutatedFeatures; + } + } + { //YAS + + } +} + //Sorts all base (unmutated) images in order of distance from the given image //After this function the distances array will be filled void DescriptorManager::rankImages(string image_name, int method) { diff --git a/DescriptorManager.h b/DescriptorManager.h index e094fd9..575b19d 100644 --- a/DescriptorManager.h +++ b/DescriptorManager.h @@ -44,6 +44,8 @@ public: DescriptorManager(const fs::path & image_path); ~DescriptorManager(); void Init(); + void SaveFeatures(); + void LoadFeatures(); void rankImages(string image_name, int method); multiset> rankMutations(string image_name, int method); void runExperiments();