diff --git a/source/RobotAPI/libraries/armem/server/ltm/detail/MemoryBase.h b/source/RobotAPI/libraries/armem/server/ltm/detail/MemoryBase.h index aa6678e39cde6b12c5469d3bfbc207d9932661d0..e56aa6d1e4d93b52b9f3e52dfa93721f428c94a6 100644 --- a/source/RobotAPI/libraries/armem/server/ltm/detail/MemoryBase.h +++ b/source/RobotAPI/libraries/armem/server/ltm/detail/MemoryBase.h @@ -191,7 +191,7 @@ namespace armarx::armem::server::ltm::detail { disable(); //This can hold information abut the filter statistics, if the LTM recording is properly ended - getFilterStatistics(); + //getFilterStatistics(); } bool diff --git a/source/RobotAPI/libraries/armem/server/ltm/processors/filter/Filter.h b/source/RobotAPI/libraries/armem/server/ltm/processors/filter/Filter.h index 33498ffc0192e73774822456eae9eefc478f870b..10c0361ffa99084a84be4876bd225912dfc8b9be 100644 --- a/source/RobotAPI/libraries/armem/server/ltm/processors/filter/Filter.h +++ b/source/RobotAPI/libraries/armem/server/ltm/processors/filter/Filter.h @@ -40,6 +40,7 @@ namespace armarx::armem::server::ltm::processor aron::similarity::NDArraySimilarity::Type similarity_type; std::chrono::high_resolution_clock::time_point start_time; std::chrono::high_resolution_clock::time_point end_time; + int number_of_compared_objects = 2; } stats; virtual FilterStatistics getFilterStatistics(); diff --git a/source/RobotAPI/libraries/armem/server/ltm/processors/filter/equalityFilter/EqualityFilter.cpp b/source/RobotAPI/libraries/armem/server/ltm/processors/filter/equalityFilter/EqualityFilter.cpp index 5d0abcf4dab0771e0b2ac49237d55cd04b2cadcb..91ed667f213b926b06a77900f51eb7b9d83b83d1 100644 --- a/source/RobotAPI/libraries/armem/server/ltm/processors/filter/equalityFilter/EqualityFilter.cpp +++ b/source/RobotAPI/libraries/armem/server/ltm/processors/filter/equalityFilter/EqualityFilter.cpp @@ -35,10 +35,21 @@ namespace armarx::armem::server::ltm::processor::filter } if(images.size() > 1){ - similarity = aron::similarity::NDArraySimilarity::calculate_similarity( - images.at(images.size() - 2), images.at(images.size() - 1), - this->similarity_type); - ARMARX_INFO << "Similarity: " << similarity << " from type: " << similarity_type; + if(max_images > 2 && images.size() >= max_images){ + std::vector<aron::data::NDArrayPtr> images_to_compare; + for(int i = 1; i < max_images; i++){ + //adding the images that we want to compare to the last image + images_to_compare.insert(images_to_compare.end(), images.at(images.size() - 1 - i)); + } + similarity = aron::similarity::NDArraySimilarity::calculate_similarity_multi + (images_to_compare, images.at(images.size() - 1), this->similarity_type); + ARMARX_INFO << "Similarity: " << similarity << " from type: " << similarity_type << " with " << max_images << " images compared"; + } else { + similarity = aron::similarity::NDArraySimilarity::calculate_similarity( + images.at(images.size() - 2), images.at(images.size() - 1), + this->similarity_type); + ARMARX_INFO << "Similarity: " << similarity << " from type: " << similarity_type; + } }else{ //if we have not accepted at least one image yet, accept it stats.accepted += 1; @@ -90,6 +101,13 @@ namespace armarx::armem::server::ltm::processor::filter ARMARX_WARNING << "Undefined similarity measure detected in JSON file"; } } + if(json.find(PARAM_MAX_OBJECTS) != json.end()){ + max_images = json.at(PARAM_MAX_OBJECTS); + ARMARX_INFO << VAROUT(max_images); + //stats.additional_info += "max objects to compare: "; + //stats.additional_info += std::to_string(max_images); + stats.number_of_compared_objects = max_images; + } stats.start_time = std::chrono::high_resolution_clock::now(); } diff --git a/source/RobotAPI/libraries/armem/server/ltm/processors/filter/equalityFilter/EqualityFilter.h b/source/RobotAPI/libraries/armem/server/ltm/processors/filter/equalityFilter/EqualityFilter.h index 5d666eeb833cade391d5f95f6c5c4dd7d086fdd8..19aefedfe051d7a8910a3beaff7ea0e95a5c6b6e 100644 --- a/source/RobotAPI/libraries/armem/server/ltm/processors/filter/equalityFilter/EqualityFilter.h +++ b/source/RobotAPI/libraries/armem/server/ltm/processors/filter/equalityFilter/EqualityFilter.h @@ -20,6 +20,7 @@ namespace armarx::armem::server::ltm::processor::filter static const constexpr char* NAME = "SnapshotSimilarityFilter"; static const constexpr char* PARAM_THRESHOLD = "Threshold"; static const constexpr char* PARAM_SIM_MEASURE = "SimilarityMeasure"; + static const constexpr char* PARAM_MAX_OBJECTS = "NumberOfObjectsToCompare"; SnapshotSimilarityFilter() = default; @@ -36,7 +37,7 @@ namespace armarx::armem::server::ltm::processor::filter std::double_t threshold; FilterStatistics stats; int max_images = 2; - aron::similarity::NDArraySimilarity::Type similarity_type = aron::similarity::NDArraySimilarity::Type::MSE; + aron::similarity::NDArraySimilarity::Type similarity_type; }; } // namespace armarx::armem::server::ltm::processor::filter diff --git a/source/RobotAPI/libraries/armem/server/plugins/Plugin.cpp b/source/RobotAPI/libraries/armem/server/plugins/Plugin.cpp index ba678a33476511f006c77c693f7f798d405001d9..1390209ac53286177ff93f1ff81d6c3271646c69 100644 --- a/source/RobotAPI/libraries/armem/server/plugins/Plugin.cpp +++ b/source/RobotAPI/libraries/armem/server/plugins/Plugin.cpp @@ -93,7 +93,7 @@ namespace armarx::armem::server::plugins void Plugin::preOnDisconnectComponent() { - //longtermMemory.getFilterStatistics(); does not work correctly at the moment + longtermMemory.getFilterStatistics(); //does not work correctly at the moment if (clientPlugin->isMemoryNameSystemEnabled() and clientPlugin->getMemoryNameSystemClient()) diff --git a/source/RobotAPI/libraries/armem/server/test/ForgettingExperiments.cpp b/source/RobotAPI/libraries/armem/server/test/ForgettingExperiments.cpp index bf617e4431cba4303fb4252667f63e6b93dd4743..7b46adc9fdb6e6aee433d513937cffb6f0da0e96 100644 --- a/source/RobotAPI/libraries/armem/server/test/ForgettingExperiments.cpp +++ b/source/RobotAPI/libraries/armem/server/test/ForgettingExperiments.cpp @@ -21,9 +21,16 @@ void save_statistics(std::map<std::string, ltm::processor::SnapshotFilter::Filte } nlohmann::json jsonData; bool ended_without_recording = false; + + auto now = std::chrono::high_resolution_clock::now(); + auto now_time = std::chrono::high_resolution_clock::to_time_t(now); + auto time = localtime(&now_time); + + for(const auto& pair: stats){ if(pair.second.accepted + pair.second.rejected < 1){ ended_without_recording = true; + ARMARX_INFO << "Trying to not add JSON file because accepted + rejected < 1"; } std::map<std::string, std::string> information; information["additional time needed: "] = (std::to_string(pair.second.additional_time.count()) + " sec"); @@ -31,6 +38,7 @@ void save_statistics(std::map<std::string, ltm::processor::SnapshotFilter::Filte information["number of rejected elements: "] = std::to_string(pair.second.rejected); information["Additional information: "] = pair.second.additional_info; information["Similarity-Type: "] = std::to_string(pair.second.similarity_type); + information["Number of objects compared each time: "] = std::to_string((pair.second.number_of_compared_objects)); auto time = std::chrono::high_resolution_clock::to_time_t(pair.second.start_time); auto t = localtime(&time); std::stringstream ss; @@ -50,9 +58,7 @@ void save_statistics(std::map<std::string, ltm::processor::SnapshotFilter::Filte return; } - auto now = std::chrono::high_resolution_clock::now(); - auto now_time = std::chrono::high_resolution_clock::to_time_t(now); - auto time = localtime(&now_time); + std::stringstream ss; ss << std::put_time(time, "%Y-%m-%d %H:%M:%S"); std::string timeString = ss.str(); diff --git a/source/RobotAPI/libraries/aron/similarity/data/image/NDArraySimilarity.cpp b/source/RobotAPI/libraries/aron/similarity/data/image/NDArraySimilarity.cpp index 6cefda533d76f7a3f4f9b2f9d923b0b221279aa9..d8a6316cd0412e3641060f9e1870145b6158bd11 100644 --- a/source/RobotAPI/libraries/aron/similarity/data/image/NDArraySimilarity.cpp +++ b/source/RobotAPI/libraries/aron/similarity/data/image/NDArraySimilarity.cpp @@ -37,4 +37,13 @@ namespace armarx::aron::similarity{ } } + double NDArraySimilarity::calculate_similarity_multi(std::vector<data::NDArrayPtr>& images, armarx::aron::data::NDArrayPtr& p, Type type) + { + double sim = 0; + for(auto& image: images){ + sim += calculate_similarity(image, p, type); + } + return sim; + } + } diff --git a/source/RobotAPI/libraries/aron/similarity/data/image/NDArraySimilarity.h b/source/RobotAPI/libraries/aron/similarity/data/image/NDArraySimilarity.h index d7f37b6cb62d3475c115f3abfeb67e900553bbdc..862b574d2cf39b774b63e02c9a49bf9ec742e224 100644 --- a/source/RobotAPI/libraries/aron/similarity/data/image/NDArraySimilarity.h +++ b/source/RobotAPI/libraries/aron/similarity/data/image/NDArraySimilarity.h @@ -15,4 +15,13 @@ namespace armarx::aron::similarity::NDArraySimilarity{ double calculate_similarity(armarx::aron::data::NDArrayPtr& p1, armarx::aron::data::NDArrayPtr& p2, Type type); + /** + * @brief calculate_similarity_multi compares the image p with all images from the images vector, the dissimilarity values are simply summed up + * @param images vector of images that are compared to p + * @param p main image that you want to know the dissimilarity from + * @param type Type of dissimilarity measure used + * @return dissimilarity + */ + double calculate_similarity_multi(std::vector<armarx::aron::data::NDArrayPtr>& images, armarx::aron::data::NDArrayPtr& p, Type type); + } diff --git a/source/RobotAPI/libraries/aron/similarity/data/image/mse.h b/source/RobotAPI/libraries/aron/similarity/data/image/mse.h index 461768d99d4624a5a5d92d82ed749845ceef94f1..7908aca0eb7d92af52db8044281078fa812fea5d 100644 --- a/source/RobotAPI/libraries/aron/similarity/data/image/mse.h +++ b/source/RobotAPI/libraries/aron/similarity/data/image/mse.h @@ -30,4 +30,5 @@ namespace armarx::aron::similarity::mse { double compute_similarity(const aron::data::NDArrayPtr& p1, const aron::data::NDArrayPtr& p2); + }